ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3J5cHRvL2FwaS1pbnRyby50eHQgYi9Eb2N1bWVudGF0aW9uL2NyeXB0by9hcGktaW50cm8udHh0CmluZGV4IDVhMDNhMjguLmU0MWE3OWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3J5cHRvL2FwaS1pbnRyby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcnlwdG8vYXBpLWludHJvLnR4dApAQCAtMTkzLDYgKzE5Myw3IEBACiAgIEthcnRpa2V5IE1haGVuZHJhIEJoYXR0IChDQVNUNikKICAgSm9uIE9iZXJoZWlkZSAoQVJDNCkKICAgSm91bmkgTWFsaW5lbiAoTWljaGFlbCBNSUMpCisgIE5UVChOaXBwb24gVGVsZWdyYXBoIGFuZCBUZWxlcGhvbmUgQ29ycG9yYXRpb24pIChDYW1lbGxpYSkKIAogU0hBMSBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogICBKZWFuLUZyYW5jb2lzIERpdmUKQEAgLTI0Niw2ICsyNDcsOSBAQAogVklBIFBhZExvY2sgY29udHJpYnV0b3JzOgogICBNaWNoYWwgTHVkdmlnCiAKK0NhbWVsbGlhIGFsZ29yaXRobSBjb250cmlidXRvcnM6CisgIE5UVChOaXBwb24gVGVsZWdyYXBoIGFuZCBUZWxlcGhvbmUgQ29ycG9yYXRpb24pIChDYW1lbGxpYSkKKwogR2VuZXJpYyBzY2F0dGVyd2FsayBjb2RlIGJ5IEFkYW0gSi4gUmljaHRlciA8YWRhbUB5Z2dkcmFzaWwuY29tPgogCiBQbGVhc2Ugc2VuZCBhbnkgY3JlZGl0cyB1cGRhdGVzIG9yIGNvcnJlY3Rpb25zIHRvOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CmluZGV4IDJkYzVlNWQuLjRhMWQ4OTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKQEAgLTE4NiwxOCArMTg2LDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoYXQ6CWZpbmRfdHJ5bG9ja19wYWdlCi1XaGVuOglKYW51YXJ5IDIwMDcKLVdoeToJVGhlIGludGVyZmFjZSBubyBsb25nZXIgaGFzIGFueSBjYWxsZXJzIGxlZnQgaW4gdGhlIGtlcm5lbC4gSXQKLQlpcyBhbiBvZGQgaW50ZXJmYWNlIChjb21wYXJlZCB3aXRoIG90aGVyIGZpbmRfKl9wYWdlIGZ1bmN0aW9ucyksIGluCi0JdGhhdCBpdCBkb2VzIG5vdCB0YWtlIGEgcmVmY291bnQgdG8gdGhlIHBhZ2UsIG9ubHkgdGhlIHBhZ2UgbG9jay4KLQlJdCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBmaW5kX2dldF9wYWdlIG9yIGZpbmRfbG9ja19wYWdlIGlmIHBvc3NpYmxlLgotCVRoaXMgZmVhdHVyZSByZW1vdmFsIGNhbiBiZSByZWV2YWx1YXRlZCBpZiB1c2VycyBvZiB0aGUgaW50ZXJmYWNlCi0JY2Fubm90IGNsZWFubHkgdXNlIHNvbWV0aGluZyBlbHNlLgotV2hvOglOaWNrIFBpZ2dpbiA8bnBpZ2dpbkBzdXNlLmRlPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJSW50ZXJydXB0IG9ubHkgU0FfKiBmbGFncwogV2hlbjoJSmFudWFyIDIwMDcKIFdoeToJVGhlIGludGVycnVwdCByZWxhdGVkIFNBXyogZmxhZ3MgYXJlIHJlcGxhY2VkIGJ5IElSUUZfKiB0byBtb3ZlIHRoZW0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKaW5kZXggOWZlZjIxMC4uYzMwZmYxYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKQEAgLTI0Miw2ICsyNDIsMTIgQEAKICAgICBhYzk3X2Nsb2NrCQktIEFDJzk3IGNsb2NrIChkZWZhdWx0ID0gNDgwMDApCiAgICAgYWM5N19xdWlyawkJLSBBQyc5NyB3b3JrYXJvdW5kIGZvciBzdHJhbmdlIGhhcmR3YXJlCiAJCQkgIFNlZSAiQUM5NyBRdWlyayBPcHRpb24iIHNlY3Rpb24gYmVsb3cuCisgICAgYWM5N19jb2RlYwkJLSBXb3JrYXJvdW5kIHRvIHNwZWNpZnkgd2hpY2ggQUMnOTcgY29kZWMgCisJCQkgIGluc3RlYWQgb2YgcHJvYmluZy4gIElmIHRoaXMgd29ya3MgZm9yIHlvdQorCQkJICBmaWxlIGEgYnVnIHdpdGggeW91ciBgbHNwY2kgLXZuYCBvdXRwdXQuCisJCQkgIC0yICAtLSBGb3JjZSBwcm9iaW5nLgorCQkJICAtMSAgLS0gRGVmYXVsdCBiZWhhdmlvci4KKwkJCSAgMC0yIC0tIFVzZSB0aGUgc3BlY2lmaWVkIGNvZGVjLgogICAgIHNwZGlmX2FjbGluawktIFMvUERJRiB0cmFuc2ZlciBvdmVyIEFDLWxpbmsgKGRlZmF1bHQgPSAxKQogCiAgICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgb25lIGNhcmQgYW5kIGF1dG9wcm9iZS4KQEAgLTc3OSw2ICs3ODUsNyBAQAogCSAgYXN1cy1kaWcJQVNVUyB3aXRoIFNQRElGIG91dAogCSAgYXN1cy1kaWcyCUFTVVMgd2l0aCBTUERJRiBvdXQgKHVzaW5nIEdQSU8yKQogCSAgdW5pd2lsbAkzLWphY2sKKwkgIGZ1aml0c3UJRnVqaXRzdSBMYXB0b3BzIChQaTE1MzYpCiAJICBGMTczNAkJMi1qYWNrCiAJICBsZwkJTEcgbGFwdG9wIChtMSBleHByZXNzIGR1YWwpCiAJICBsZy1sdwkJTEcgTFcyMC9MVzI1IGxhcHRvcApAQCAtODAwLDE0ICs4MDcsMTggQEAKIAlBTEMyNjIKIAkgIGZ1aml0c3UJRnVqaXRzdSBMYXB0b3AKIAkgIGhwLWJwYwlIUCB4dzQ0MDAvNjQwMC84NDAwLzk0MDAgbGFwdG9wcworCSAgaHAtYnBjLWQ3MDAwCUhQIEJQQyBENzAwMAogCSAgYmVucQkJQmVucSBFRDgKKwkgIGhpcHBvCQlIaXBwbyAoQVRJKSB3aXRoIGphY2sgZGV0ZWN0aW9uLCBTb255IFVYLTkwcworCSAgaGlwcG9fMQlIaXBwbyAoQmVucSkgd2l0aCBqYWNrIGRldGVjdGlvbgogCSAgYmFzaWMJCWZpeGVkIHBpbiBhc3NpZ25tZW50IHcvbyBTUERJRgogCSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCiAJQUxDODgyLzg4NQogCSAgM3N0YWNrLWRpZwkzLWphY2sgd2l0aCBTUERJRiBJL08KLQkgIDZzdGNrLWRpZwk2LWphY2sgZGlnaXRhbCB3aXRoIFNQRElGIEkvTworCSAgNnN0YWNrLWRpZwk2LWphY2sgZGlnaXRhbCB3aXRoIFNQRElGIEkvTwogCSAgYXJpbWEJCUFyaW1hIFc4MjBEaTEKKwkgIG1hY3BybwlNYWNQcm8gc3VwcG9ydAogCSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCiAJQUxDODgzLzg4OApAQCAtODE3LDYgKzgyOCwxMCBAQAogCSAgM3N0YWNrLTZjaC1kaWcgMy1qYWNrIDYtY2hhbm5lbCB3aXRoIFNQRElGIEkvTwogCSAgNnN0YWNrLWRpZy1kZW1vICA2LWphY2sgZGlnaXRhbCBmb3IgSW50ZWwgZGVtbyBib2FyZAogCSAgYWNlcgkJQWNlciBsYXB0b3BzIChUcmF2ZWxtYXRlIDMwMTJXVE1pLCBBc3BpcmUgNTYwMCwgZXRjKQorCSAgbWVkaW9uCU1lZGlvbiBMYXB0b3BzCisJICB0YXJnYS1kaWcJVGFyZ2EvTVNJCisJICB0YXJnYS0yY2gtZGlnCVRhcmdzL01TSSB3aXRoIDItY2hhbm5lbAorCSAgbGFwdG9wLWVhcGQgICAzLWphY2sgd2l0aCBTUERJRiBJL08gYW5kIEVBUEQgKENsZXZvIE01NDBKRSwgTTU1MEpFKQogCSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCiAJQUxDODYxLzY2MApAQCAtODI1LDYgKzg0MCwxNiBAQAogCSAgNnN0YWNrLWRpZwk2LWphY2sgd2l0aCBTUERJRiBJL08KIAkgIDNzdGFjay02NjAJMy1qYWNrIChmb3IgQUxDNjYwKQogCSAgdW5pd2lsbC1tMzEJVW5pd2lsbCBNMzEgbGFwdG9wCisJICB0b3NoaWJhCVRvc2hpYmEgbGFwdG9wIHN1cHBvcnQKKwkgIGFzdXMJCUFzdXMgbGFwdG9wIHN1cHBvcnQKKwkgIGFzdXMtbGFwdG9wCUFTVVMgRjIvRjMgbGFwdG9wcworCSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQorCisJQUxDODYxVkQvNjYwVkQKKwkgIDNzdGFjawkzLWphY2sKKwkgIDNzdGFjay1kaWcJMy1qYWNrIHdpdGggU1BESUYgT1VUCisJICA2c3RhY2stZGlnCTYtamFjayB3aXRoIFNQRElGIE9VVAorCSAgM3N0YWNrLTY2MAkzLWphY2sgKGZvciBBTEM2NjBWRCkKIAkgIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKIAogCUNNSTk4ODAKQEAgLTg0NSw2ICs4NzAsNyBAQAogCSAgM3N0YWNrCTMtc3RhY2ssIHNoYXJlZCBzdXJyb3VuZHMKIAkgIGxhcHRvcAkyLWNoYW5uZWwgb25seSAoRlNDIFYyMDYwLCBTYW1zdW5nIE01MCkKIAkgIGxhcHRvcC1lYXBkCTItY2hhbm5lbCB3aXRoIEVBUEQgKFNhbXN1bmcgUjY1LCBBU1VTIEE2SikKKwkgIHVsdHJhCQkyLWNoYW5uZWwgd2l0aCBFQVBEIChTYW1zdW5nIFVsdHJhIHRhYmxldCBQQykKIAogCUFEMTk4OAogCSAgNnN0YWNrCTYtamFjawpAQCAtODU0LDEyICs4ODAsMzEgQEAKIAkgIGxhcHRvcAkzLWphY2sgd2l0aCBocC1qYWNrIGF1dG9tdXRlCiAJICBsYXB0b3AtZGlnCWRpdHRvIHdpdGggU1BESUYKIAkgIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKKwkKKwlDb25leGFudCA1MDQ1CisJICBsYXB0b3AJTGFwdG9wIGNvbmZpZyAKKwkgIHRlc3QJCWZvciB0ZXN0aW5nL2RlYnVnZ2luZyBwdXJwb3NlLCBhbG1vc3QgYWxsIGNvbnRyb2xzCisJCQljYW4gYmUgYWRqdXN0ZWQuICBBcHBlYXJpbmcgb25seSB3aGVuIGNvbXBpbGVkIHdpdGgKKwkJCSRDT05GSUdfU05EX0RFQlVHPXkKKworCUNvbmV4YW50IDUwNDcKKwkgIGxhcHRvcAlCYXNpYyBMYXB0b3AgY29uZmlnIAorCSAgbGFwdG9wLWhwCUxhcHRvcCBjb25maWcgZm9yIHNvbWUgSFAgbW9kZWxzIChzdWJkZXZpY2UgMzBBNSkKKwkgIGxhcHRvcC1lYXBkCUxhcHRvcCBjb25maWcgd2l0aCBFQVBEIHN1cHBvcnQKKwkgIHRlc3QJCWZvciB0ZXN0aW5nL2RlYnVnZ2luZyBwdXJwb3NlLCBhbG1vc3QgYWxsIGNvbnRyb2xzCisJCQljYW4gYmUgYWRqdXN0ZWQuICBBcHBlYXJpbmcgb25seSB3aGVuIGNvbXBpbGVkIHdpdGgKKwkJCSRDT05GSUdfU05EX0RFQlVHPXkKIAogCVNUQUM5MjAwLzkyMDUvOTIyMC85MjIxLzkyNTQKIAkgIHJlZgkJUmVmZXJlbmNlIGJvYXJkCiAJICAzc3RhY2sJRDk0NSAzc3RhY2sKIAkgIDVzdGFjawlEOTQ1IDVzdGFjayArIFNQRElGCiAKKwlTVEFDOTIwMi85MjUwLzkyNTEKKwkgIHJlZgkJUmVmZXJlbmNlIGJvYXJkLCBiYXNlIGNvbmZpZworCSAgbTItMgkJU29tZSBHYXRld2F5IE1YIHNlcmllcyBsYXB0b3BzCisJICBtNgkJU29tZSBHYXRld2F5IE5YIHNlcmllcyBsYXB0b3BzCisKIAlTVEFDOTIyNy85MjI4LzkyMjkvOTI3eAogCSAgcmVmCQlSZWZlcmVuY2UgYm9hcmQKIAkgIDNzdGFjawlEOTY1IDNzdGFjawpAQCAtOTc0LDYgKzEwMTksNyBAQAogICAgIE1vZHVsZSBmb3IgRW52eTI0SFQgKFZUL0lDRTE3MjQpLCBFbnZ5MjRQVCAoVlQxNzIwKSBiYXNlZCBQQ0kgc291bmQgY2FyZHMuCiAJCQkqIE1pZGlNYW4gTSBBdWRpbyBSZXZvbHV0aW9uIDUuMQogCQkJKiBNaWRpTWFuIE0gQXVkaW8gUmV2b2x1dGlvbiA3LjEKKwkJCSogTWlkaU1hbiBNIEF1ZGlvIEF1ZGlvcGhpbGUgMTkyCiAJCQkqIEFNUCBMdGQgQVVESU8yMDAwCiAJCQkqIFRlcnJhVGVjIEF1cmVvbiA1LjEgU2t5CiAJCQkqIFRlcnJhVGVjIEF1cmVvbiA3LjEgU3BhY2UKQEAgLTk5Myw3ICsxMDM5LDcgQEAKIAogICAgIG1vZGVsICAgICAgIC0gVXNlIHRoZSBnaXZlbiBib2FyZCBtb2RlbCwgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiAJCSAgcmV2bzUxLCByZXZvNzEsIGFtcDIwMDAsIHByb2RpZ3k3MSwgcHJvZGlneTcxbHQsCi0JCSAgcHJvZGlneTE5MiwgYXVyZW9uNTEsIGF1cmVvbjcxLCB1bml2ZXJzZSwKKwkJICBwcm9kaWd5MTkyLCBhdXJlb241MSwgYXVyZW9uNzEsIHVuaXZlcnNlLCBhcDE5MiwKIAkJICBrOHg4MDAsIHBoYXNlMjIsIHBoYXNlMjgsIG1zMzAwLCBhdjcxMAogCiAgICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgbXVsdGlwbGUgY2FyZHMgYW5kIGF1dG9wcm9iZS4KQEAgLTEwNDksNiArMTA5NSw5IEBACiAgICAgYnVnZ3lfc2VtYXBob3JlIC0gRW5hYmxlIHdvcmthcm91bmQgZm9yIGhhcmR3YXJlcyB3aXRoIGJ1Z2d5CiAJCSAgICBzZW1hcGhvcmVzIChlLmcuIG9uIHNvbWUgQVNVUyBsYXB0b3BzKQogCQkgICAgKGRlZmF1bHQgb2ZmKQorICAgIHNwZGlmX2FjbGluayAgLSBVc2UgUy9QRElGIG92ZXIgQUMtbGluayBpbnN0ZWFkIG9mIGRpcmVjdCBjb25uZWN0aW9uCisJCSAgICBmcm9tIHRoZSBjb250cm9sbGVyIGNoaXAKKwkJICAgICgwID0gb2ZmLCAxID0gb24sIC0xID0gZGVmYXVsdCkKIAogICAgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIG9uZSBjaGlwIGFuZCBhdXRvcHJvYmUuCiAKQEAgLTEzNzEsNiArMTQyMCwxMyBAQAogCiAgICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgbXVsdGlwbGUgY2FyZHMuCiAKKyAgTW9kdWxlIHNuZC1wb3J0bWFuMng0CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTW9kdWxlIGZvciBNaWRpbWFuIFBvcnRtYW4gMng0IHBhcmFsbGVsIHBvcnQgTUlESSBpbnRlcmZhY2UKKworICAgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIG11bHRpcGxlIGNhcmRzLgorCiAgIE1vZHVsZSBzbmQtcG93ZXJtYWMgKG9uIHBwYyBvbmx5KQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0RvY0Jvb2svYWxzYS1kcml2ZXItYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay9hbHNhLWRyaXZlci1hcGkudG1wbAppbmRleCAxZjNhZTNlLi5jNGQyZTM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay9hbHNhLWRyaXZlci1hcGkudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay9hbHNhLWRyaXZlci1hcGkudG1wbApAQCAtMzYsNyArMzYsNyBAQAogICA8L2Jvb2tpbmZvPgogCiAgIDxjaGFwdGVyPjx0aXRsZT5NYW5hZ2VtZW50IG9mIENhcmRzIGFuZCBEZXZpY2VzPC90aXRsZT4KLSAgICAgPHNlY3QxPjx0aXRsZT5DYXJkIE1hbmFnbWVudDwvdGl0bGU+CisgICAgIDxzZWN0MT48dGl0bGU+Q2FyZCBNYW5hZ2VtZW50PC90aXRsZT4KICFFc291bmQvY29yZS9pbml0LmMKICAgICAgPC9zZWN0MT4KICAgICAgPHNlY3QxPjx0aXRsZT5EZXZpY2UgQ29tcG9uZW50czwvdGl0bGU+CkBAIC01OSw3ICs1OSw3IEBACiAgICAgIDxzZWN0MT48dGl0bGU+UENNIEZvcm1hdCBIZWxwZXJzPC90aXRsZT4KICFFc291bmQvY29yZS9wY21fbWlzYy5jCiAgICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+UENNIE1lbW9yeSBNYW5hZ21lbnQ8L3RpdGxlPgorICAgICA8c2VjdDE+PHRpdGxlPlBDTSBNZW1vcnkgTWFuYWdlbWVudDwvdGl0bGU+CiAhRXNvdW5kL2NvcmUvcGNtX21lbW9yeS5jCiAgICAgIDwvc2VjdDE+CiAgIDwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbAppbmRleCBjY2QwYTk1Li43NGQzYTM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCkBAIC0xMzYwLDggKzEzNjAsNyBAQAogICAgICAgICA8aW5mb3JtYWxleGFtcGxlPgogICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KIDwhW0NEQVRBWwotICBzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX215Y2hpcF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisgIHN0YXRpYyBpcnFyZXR1cm5fdCBzbmRfbXljaGlwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiAgIHsKICAgICAgICAgICBzdHJ1Y3QgbXljaGlwICpjaGlwID0gZGV2X2lkOwogICAgICAgICAgIC4uLi4KQEAgLTIxMjcsNyArMjEyNiw3IEBACiAJYWNjZXNzaWJsZSB2aWEgPGNvbnN0YW50PnN1YnN0cmVhbS0mZ3Q7cnVudGltZTwvY29uc3RhbnQ+LgogCVRoaXMgcnVudGltZSBwb2ludGVyIGhvbGRzIHRoZSB2YXJpb3VzIGluZm9ybWF0aW9uOyBpdCBob2xkcwogCXRoZSBjb3B5IG9mIGh3X3BhcmFtcyBhbmQgc3dfcGFyYW1zIGNvbmZpZ3VyYXRpb25zLCB0aGUgYnVmZmVyCi0JcG9pbnRlcnMsIG1tYXAgcmVjb3Jkcywgc3BpbmxvY2tzLCBldGMuICBBbG1vc3QgZXZlcnloaW5nIHlvdQorCXBvaW50ZXJzLCBtbWFwIHJlY29yZHMsIHNwaW5sb2NrcywgZXRjLiAgQWxtb3N0IGV2ZXJ5dGhpbmcgeW91CiAJbmVlZCBmb3IgY29udHJvbGxpbmcgdGhlIFBDTSBjYW4gYmUgZm91bmQgdGhlcmUuCiAJPC9wYXJhPgogCkBAIC0yMzQwLDcgKzIzMzksNyBAQAogCiAJPHBhcmE+CiAJICBXaGVuIHRoZSBQQ00gc3Vic3RyZWFtcyBjYW4gYmUgc3luY2hyb25pemVkICh0eXBpY2FsbHksCi0Jc3luY2hvcmluaXplZCBzdGFydC9zdG9wIG9mIGEgcGxheWJhY2sgYW5kIGEgY2FwdHVyZSBzdHJlYW1zKSwKKwlzeW5jaHJvbml6ZWQgc3RhcnQvc3RvcCBvZiBhIHBsYXliYWNrIGFuZCBhIGNhcHR1cmUgc3RyZWFtcyksCiAJeW91IGNhbiBnaXZlIDxjb25zdGFudD5TTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUPC9jb25zdGFudD4sCiAJdG9vLiAgSW4gdGhpcyBjYXNlLCB5b3UnbGwgbmVlZCB0byBjaGVjayB0aGUgbGlua2VkLWxpc3Qgb2YKIAlQQ00gc3Vic3RyZWFtcyBpbiB0aGUgdHJpZ2dlciBjYWxsYmFjay4gIFRoaXMgd2lsbCBiZQpAQCAtMzA2Miw4ICszMDYxLDcgQEAKIAkgICAgPHRpdGxlPkludGVycnVwdCBIYW5kbGVyIENhc2UgIzE8L3RpdGxlPgogICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgogPCFbQ0RBVEFbCi0gIHN0YXRpYyBpcnFyZXR1cm5fdCBzbmRfbXljaGlwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyAgc3RhdGljIGlycXJldHVybl90IHNuZF9teWNoaXBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKICAgewogICAgICAgICAgIHN0cnVjdCBteWNoaXAgKmNoaXAgPSBkZXZfaWQ7CiAgICAgICAgICAgc3Bpbl9sb2NrKCZjaGlwLT5sb2NrKTsKQEAgLTMxMDYsOCArMzEwNCw3IEBACiAJICAgIDx0aXRsZT5JbnRlcnJ1cHQgSGFuZGxlciBDYXNlICMyPC90aXRsZT4KICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KIDwhW0NEQVRBWwotICBzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX215Y2hpcF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisgIHN0YXRpYyBpcnFyZXR1cm5fdCBzbmRfbXljaGlwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiAgIHsKICAgICAgICAgICBzdHJ1Y3QgbXljaGlwICpjaGlwID0gZGV2X2lkOwogICAgICAgICAgIHNwaW5fbG9jaygmY2hpcC0+bG9jayk7CkBAIC0zMjQ3LDcgKzMyNDQsNyBAQAogICAgICAgICBZb3UgY2FuIGV2ZW4gZGVmaW5lIHlvdXIgb3duIGNvbnN0cmFpbnQgcnVsZXMuCiAgICAgICAgIEZvciBleGFtcGxlLCBsZXQncyBzdXBwb3NlIG15X2NoaXAgY2FuIG1hbmFnZSBhIHN1YnN0cmVhbSBvZiAxIGNoYW5uZWwKICAgICAgICAgaWYgYW5kIG9ubHkgaWYgdGhlIGZvcm1hdCBpcyBTMTZfTEUsIG90aGVyd2lzZSBpdCBzdXBwb3J0cyBhbnkgZm9ybWF0Ci0gICAgICAgIHNwZWNpZmllZCBpbiB0aGUgPHN0cnVjdG5hbWU+c25kX3BjbV9oYXJkd2FyZTwvc3RydWN0bmFtZT4gc3R1Y3R1cmUgKG9yIGluIGFueQorICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIDxzdHJ1Y3RuYW1lPnNuZF9wY21faGFyZHdhcmU8L3N0cnVjdG5hbWU+IHN0cnVjdHVyZSAob3IgaW4gYW55CiAgICAgICAgIG90aGVyIGNvbnN0cmFpbnRfbGlzdCkuIFlvdSBjYW4gYnVpbGQgYSBydWxlIGxpa2UgdGhpczoKIAogICAgICAgICA8ZXhhbXBsZT4KQEAgLTM2OTEsMTYgKzM2ODgsNiBAQAogICAgICAgICA8L3BhcmE+CiAKICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgSGVyZSwgdGhlIGNoaXAgaW5zdGFuY2UgaXMgcmV0cmlldmVkIHZpYQotICAgICAgICA8ZnVuY3Rpb24+c25kX2tjb250cm9sX2NoaXAoKTwvZnVuY3Rpb24+IG1hY3JvLiAgVGhpcyBtYWNybwotICAgICAgICBqdXN0IGFjY2Vzc2VzIHRvIGtjb250cm9sLSZndDtwcml2YXRlX2RhdGEuIFRoZQotICAgICAgICBrY29udHJvbC0mZ3Q7cHJpdmF0ZV9kYXRhIGZpZWxkIGlzIAotICAgICAgICBnaXZlbiBhcyB0aGUgYXJndW1lbnQgb2YgPGZ1bmN0aW9uPnNuZF9jdGxfbmV3KCk8L2Z1bmN0aW9uPgotICAgICAgICAoc2VlIHRoZSBsYXRlciBzdWJzZWN0aW9uCi0gICAgICAgIDxsaW5rIGxpbmtlbmQ9ImNvbnRyb2wtaW50ZXJmYWNlLWNvbnN0cnVjdG9yIj48Y2l0ZXRpdGxlPkNvbnN0cnVjdG9yPC9jaXRldGl0bGU+PC9saW5rPikuCi0gICAgICAgIDwvcGFyYT4KLQotICAgICAgICA8cGFyYT4KIAlUaGUgPHN0cnVjdGZpZWxkPnZhbHVlPC9zdHJ1Y3RmaWVsZD4gZmllbGQgaXMgZGVwZW5kaW5nIG9uCiAgICAgICAgIHRoZSB0eXBlIG9mIGNvbnRyb2wgYXMgd2VsbCBhcyBvbiBpbmZvIGNhbGxiYWNrLiAgRm9yIGV4YW1wbGUsCiAJdGhlIHNiIGRyaXZlciB1c2VzIHRoaXMgZmllbGQgdG8gc3RvcmUgdGhlIHJlZ2lzdGVyIG9mZnNldCwKQEAgLTM3ODAsNyArMzc2Nyw3IEBACiAgICAgICAgIDxwYXJhPgogCUxpa2UgPHN0cnVjdGZpZWxkPmdldDwvc3RydWN0ZmllbGQ+IGNhbGxiYWNrLAogCXdoZW4gdGhlIGNvbnRyb2wgaGFzIG1vcmUgdGhhbiBvbmUgZWxlbWVudHMsCi0JYWxsIGVsZW1laHRzIG11c3QgYmUgZXZhbHVhdGVkIGluIHRoaXMgY2FsbGJhY2ssIHRvby4KKwlhbGwgZWxlbWVudHMgbXVzdCBiZSBldmFsdWF0ZWQgaW4gdGhpcyBjYWxsYmFjaywgdG9vLgogICAgICAgICA8L3BhcmE+CiAgICAgICA8L3NlY3Rpb24+CiAKQEAgLTU1NDEsMTIgKzU1MjgsMTIgQEAKICAgI2lmZGVmIENPTkZJR19QTQogICBzdGF0aWMgaW50IHNuZF9teV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2ksIHBtX21lc3NhZ2VfdCBzdGF0ZSkKICAgewotICAgICAgICAgIC4uLi4gLyogZG8gdGhpbmdzIGZvciBzdXNwc2VuZCAqLworICAgICAgICAgIC4uLi4gLyogZG8gdGhpbmdzIGZvciBzdXNwZW5kICovCiAgICAgICAgICAgcmV0dXJuIDA7CiAgIH0KICAgc3RhdGljIGludCBzbmRfbXlfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2kpCiAgIHsKLSAgICAgICAgICAuLi4uIC8qIGRvIHRoaW5ncyBmb3Igc3VzcHNlbmQgKi8KKyAgICAgICAgICAuLi4uIC8qIGRvIHRoaW5ncyBmb3Igc3VzcGVuZCAqLwogICAgICAgICAgIHJldHVybiAwOwogICB9CiAgICNlbmRpZgpAQCAtNjExMSw3ICs2MDk4LDcgQEAKIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgogPCEtLSBBY2tub3dsZWRnbWVudHMgIC0tPgogPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIDxjaGFwdGVyIGlkPSJhY2tub3dsZWRtZW50cyI+CisgIDxjaGFwdGVyIGlkPSJhY2tub3dsZWRnbWVudHMiPgogICAgIDx0aXRsZT5BY2tub3dsZWRnbWVudHM8L3RpdGxlPgogICAgIDxwYXJhPgogICAgICAgSSB3b3VsZCBsaWtlIHRvIHRoYW5rIFBoaWwgS2VyciBmb3IgaGlzIGhlbHAgZm9yIGltcHJvdmVtZW50IGFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL2hkYV9jb2RlYy50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvaGRhX2NvZGVjLnR4dAppbmRleCAwYmU1N2VkLi40ZWFhZTJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvaGRhX2NvZGVjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvaGRhX2NvZGVjLnR4dApAQCAtMjc3LDExICsyNzcsMTEgQEAKIHNuZF9oZGFfZ2V0X2NvZGVjX25hbWUoKSBzdG9yZXMgdGhlIGNvZGVjIG5hbWUgb24gdGhlIGdpdmVuIHN0cmluZy4KIAogc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoKSBjYW4gYmUgdXNlZCB0byBvYnRhaW4gdGhlIGNvbmZpZ3VyYXRpb24KLWluZm9ybWF0aW9uIG1hdGNoaW5nIHdpdGggdGhlIGRldmljZS4gIERlZmluZSB0aGUgdGFibGUgd2l0aCBzdHJ1Y3QKLWhkYV9ib2FyZF9jb25maWcgZW50cmllcyAoemVyby10ZXJtaW5hdGVkKSwgYW5kIHBhc3MgaXQgdG8gdGhlCi1mdW5jdGlvbi4gIFRoZSBmdW5jdGlvbiBjaGVja3MgdGhlIG1vZGVsbmFtZSBnaXZlbiBhcyBhIG1vZHVsZQotcGFyYW1ldGVyLCBhbmQgUENJIHN1YnN5c3RlbSBJRHMuICBJZiB0aGUgbWF0Y2hpbmcgZW50cnkgaXMgZm91bmQsIGl0Ci1yZXR1cm5zIHRoZSBjb25maWcgZmllbGQgdmFsdWUuCitpbmZvcm1hdGlvbiBtYXRjaGluZyB3aXRoIHRoZSBkZXZpY2UuICBEZWZpbmUgdGhlIG1vZGVsIHN0cmluZyB0YWJsZQorYW5kIHRoZSB0YWJsZSB3aXRoIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGVudHJpZXMgKHplcm8tdGVybWluYXRlZCksCithbmQgcGFzcyBpdCB0byB0aGUgZnVuY3Rpb24uICBUaGUgZnVuY3Rpb24gY2hlY2tzIHRoZSBtb2RlbG5hbWUgZ2l2ZW4KK2FzIGEgbW9kdWxlIHBhcmFtZXRlciwgYW5kIFBDSSBzdWJzeXN0ZW0gSURzLiAgSWYgdGhlIG1hdGNoaW5nIGVudHJ5CitpcyBmb3VuZCwgaXQgcmV0dXJucyB0aGUgY29uZmlnIGZpZWxkIHZhbHVlLgogCiBzbmRfaGRhX2FkZF9uZXdfY3RscygpIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbmQgYWRkIGNvbnRyb2wgZW50cmllcy4KIFBhc3MgdGhlIHplcm8tdGVybWluYXRlZCBhcnJheSBvZiBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldy4gIFRoZSBzYW1lIGFycmF5CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL0RBSS50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL0RBSS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjYmZkMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvREFJLnR4dApAQCAtMCwwICsxLDU2IEBACitBU29DIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgdGhyZWUgbWFpbiBEaWdpdGFsIEF1ZGlvIEludGVyZmFjZXMgKERBSSkgZm91bmQgb24KK1NvQyBjb250cm9sbGVycyBhbmQgcG9ydGFibGUgYXVkaW8gQ09ERUNTIHRvZGF5LCBuYW1lbHkgQUM5NywgSTJTIGFuZCBQQ00uCisKKworQUM5NworPT09PQorCisgIEFDOTcgaXMgYSBmaXZlIHdpcmUgaW50ZXJmYWNlIGNvbW1vbmx5IGZvdW5kIG9uIG1hbnkgUEMgc291bmQgY2FyZHMuIEl0IGlzCitub3cgYWxzbyBwb3B1bGFyIGluIG1hbnkgcG9ydGFibGUgZGV2aWNlcy4gVGhpcyBEQUkgaGFzIGEgcmVzZXQgbGluZSBhbmQgdGltZQorbXVsdGlwbGV4ZXMgaXRzIGRhdGEgb24gaXRzIFNEQVRBX09VVCAocGxheWJhY2spIGFuZCBTREFUQV9JTiAoY2FwdHVyZSkgbGluZXMuCitUaGUgYml0IGNsb2NrIChCQ0xLKSBpcyBhbHdheXMgZHJpdmVuIGJ5IHRoZSBDT0RFQyAodXN1YWxseSAxMi4yODhNSHopIGFuZCB0aGUKK2ZyYW1lIChGUkFNRSkgKHVzdWFsbHkgNDhrSHopIGlzIGFsd2F5cyBkcml2ZW4gYnkgdGhlIGNvbnRyb2xsZXIuIEVhY2ggQUM5NworZnJhbWUgaXMgMjF1UyBsb25nIGFuZCBpcyBkaXZpZGVkIGludG8gMTMgdGltZSBzbG90cy4KKworVGhlIEFDOTcgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgYXQgOi0KK2h0dHA6Ly93d3cuaW50ZWwuY29tL2Rlc2lnbi9jaGlwc2V0cy9hdWRpby9hYzk3X3IyMy5wZGYKKworCitJMlMKKz09PQorCisgSTJTIGlzIGEgY29tbW9uIDQgd2lyZSBEQUkgdXNlZCBpbiBIaUZpLCBTVEIgYW5kIHBvcnRhYmxlIGRldmljZXMuIFRoZSBUeCBhbmQKK1J4IGxpbmVzIGFyZSB1c2VkIGZvciBhdWRpbyB0cmFuc21pc2lvbiwgd2hpbHN0IHRoZSBiaXQgY2xvY2sgKEJDTEspIGFuZAorbGVmdC9yaWdodCBjbG9jayAoTFJDKSBzeW5jaHJvbmlzZSB0aGUgbGluay4gSTJTIGlzIGZsZXhpYmxlIGluIHRoYXQgZWl0aGVyIHRoZQorY29udHJvbGxlciBvciBDT0RFQyBjYW4gZHJpdmUgKG1hc3RlcikgdGhlIEJDTEsgYW5kIExSQyBjbG9jayBsaW5lcy4gQml0IGNsb2NrCit1c3VhbGx5IHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIHNhbXBsZSByYXRlIGFuZCB0aGUgbWFzdGVyIHN5c3RlbSBjbG9jaworKFNZU0NMSykuIExSQ0xLIGlzIHRoZSBzYW1lIGFzIHRoZSBzYW1wbGUgcmF0ZS4gQSBmZXcgZGV2aWNlcyBzdXBwb3J0IHNlcGFyYXRlCitBREMgYW5kIERBQyBMUkNMSydzLCB0aGlzIGFsbG93cyBmb3Igc2ltaWx0YW5pb3VzIGNhcHR1cmUgYW5kIHBsYXliYWNrIGF0CitkaWZmZXJlbnQgc2FtcGxlIHJhdGVzLgorCitJMlMgaGFzIHNldmVyYWwgZGlmZmVyZW50IG9wZXJhdGluZyBtb2RlczotCisKKyBvIEkyUyAtIE1TQiBpcyB0cmFuc21pdHRlZCBvbiB0aGUgZmFsbGluZyBlZGdlIG9mIHRoZSBmaXJzdCBCQ0xLIGFmdGVyIExSQworICAgICAgICAgdHJhbnNpdGlvbi4KKworIG8gTGVmdCBKdXN0aWZpZWQgLSBNU0IgaXMgdHJhbnNtaXR0ZWQgb24gdHJhbnNpdGlvbiBvZiBMUkMuCisKKyBvIFJpZ2h0IEp1c3RpZmllZCAtIE1TQiBpcyB0cmFuc21pdHRlZCBzYW1wbGUgc2l6ZSBCQ0xLJ3MgYmVmb3JlIExSQworICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbi4KKworUENNCis9PT0KKworUENNIGlzIGFub3RoZXIgNCB3aXJlIGludGVyZmFjZSwgdmVyeSBzaW1pbGFyIHRvIEkyUywgdGhhdCBjYW4gc3VwcG9ydCBhIG1vcmUKK2ZsZXhpYmxlIHByb3RvY29sLiBJdCBoYXMgYml0IGNsb2NrIChCQ0xLKSBhbmQgc3luYyAoU1lOQykgbGluZXMgdGhhdCBhcmUgdXNlZAordG8gc3luY2hyb25pc2UgdGhlIGxpbmsgd2hpbHN0IHRoZSBUeCBhbmQgUnggbGluZXMgYXJlIHVzZWQgdG8gdHJhbnNtaXQgYW5kCityZWNlaXZlIHRoZSBhdWRpbyBkYXRhLiBCaXQgY2xvY2sgdXN1YWxseSB2YXJpZXMgZGVwZW5kaW5nIG9uIHNhbXBsZSByYXRlCit3aGlsc3Qgc3luYyBydW5zIGF0IHRoZSBzYW1wbGUgcmF0ZS4gUENNIGFsc28gc3VwcG9ydHMgVGltZSBEaXZpc2lvbgorTXVsdGlwbGV4aW5nIChURE0pIGluIHRoYXQgc2V2ZXJhbCBkZXZpY2VzIGNhbiB1c2UgdGhlIGJ1cyBzaW1pbHRhbml1b3NseSAoVGhpcworaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIG5ldHdvcmsgbW9kZSkuCisKK0NvbW1vbiBQQ00gb3BlcmF0aW5nIG1vZGVzOi0KKworIG8gTW9kZSBBIC0gTVNCIGlzIHRyYW5zbWl0dGVkIG9uIGZhbGxpbmcgZWRnZSBvZiBmaXJzdCBCQ0xLIGFmdGVyIEZSQU1FL1NZTkMuCisKKyBvIE1vZGUgQiAtIE1TQiBpcyB0cmFuc21pdHRlZCBvbiByaXNpbmcgZWRnZSBvZiBGUkFNRS9TWU5DLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9jbG9ja2luZy50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL2Nsb2NraW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTM5NjBkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9jbG9ja2luZy50eHQKQEAgLTAsMCArMSw1MSBAQAorQXVkaW8gQ2xvY2tpbmcKKz09PT09PT09PT09PT09CisKK1RoaXMgdGV4dCBkZXNjcmliZXMgdGhlIGF1ZGlvIGNsb2NraW5nIHRlcm1zIGluIEFTb0MgYW5kIGRpZ2l0YWwgYXVkaW8gaW4KK2dlbmVyYWwuIE5vdGU6IEF1ZGlvIGNsb2NraW5nIGNhbiBiZSBjb21wbGV4ICEKKworCitNYXN0ZXIgQ2xvY2sKKy0tLS0tLS0tLS0tLQorCitFdmVyeSBhdWRpbyBzdWJzeXN0ZW0gaXMgZHJpdmVuIGJ5IGEgbWFzdGVyIGNsb2NrIChzb21ldGltZXMgcmVmZXJlZCB0byBhcyBNQ0xLCitvciBTWVNDTEspLiBUaGlzIGF1ZGlvIG1hc3RlciBjbG9jayBjYW4gYmUgZGVyaXZlZCBmcm9tIGEgbnVtYmVyIG9mIHNvdXJjZXMKKyhlLmcuIGNyeXN0YWwsIFBMTCwgQ1BVIGNsb2NrKSBhbmQgaXMgcmVzcG9uc2libGUgZm9yIHByb2R1Y2luZyB0aGUgY29ycmVjdAorYXVkaW8gcGxheWJhY2sgYW5kIGNhcHR1cmUgc2FtcGxlIHJhdGVzLgorCitTb21lIG1hc3RlciBjbG9ja3MgKGUuZy4gUExMJ3MgYW5kIENQVSBiYXNlZCBjbG9ja3MpIGFyZSBjb25maWd1YXJibGUgaW4gdGhhdAordGhlaXIgc3BlZWQgY2FuIGJlIGFsdGVyZWQgYnkgc29mdHdhcmUgKGRlcGVuZGluZyBvbiB0aGUgc3lzdGVtIHVzZSBhbmQgdG8gc2F2ZQorcG93ZXIpLiBPdGhlciBtYXN0ZXIgY2xvY2tzIGFyZSBmaXhlZCBhdCBhdCBzZXQgZnJlcXVlbmN5IChpLmUuIGNyeXN0YWxzKS4KKworCitEQUkgQ2xvY2tzCistLS0tLS0tLS0tCitUaGUgRGlnaXRhbCBBdWRpbyBJbnRlcmZhY2UgaXMgdXN1YWxseSBkcml2ZW4gYnkgYSBCaXQgQ2xvY2sgKG9mdGVuIHJlZmVycmVkIHRvCithcyBCQ0xLKS4gVGhpcyBjbG9jayBpcyB1c2VkIHRvIGRyaXZlIHRoZSBkaWdpdGFsIGF1ZGlvIGRhdGEgYWNyb3NzIHRoZSBsaW5rCitiZXR3ZWVuIHRoZSBjb2RlYyBhbmQgQ1BVLgorCitUaGUgREFJIGFsc28gaGFzIGEgZnJhbWUgY2xvY2sgdG8gc2lnbmFsIHRoZSBzdGFydCBvZiBlYWNoIGF1ZGlvIGZyYW1lLiBUaGlzCitjbG9jayBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgTFJDIChsZWZ0IHJpZ2h0IGNsb2NrKSBvciBGUkFNRS4gVGhpcyBjbG9jaworcnVucyBhdCBleGFjdGx5IHRoZSBzYW1wbGUgcmF0ZSAoTFJDID0gUmF0ZSkuCisKK0JpdCBDbG9jayBjYW4gYmUgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6LQorCitCQ0xLID0gTUNMSyAvIHgKKworIG9yCisKK0JDTEsgPSBMUkMgKiB4CisKKyBvcgorCitCQ0xLID0gTFJDICogQ2hhbm5lbHMgKiBXb3JkIFNpemUKKworVGhpcyByZWxhdGlvbnNoaXAgZGVwZW5kcyBvbiB0aGUgY29kZWMgb3IgU29DIENQVSBpbiBwYXJ0aWN1bGFyLiBJbiBnZW5lcmFsCitpdCdzIGJlc3QgdG8gY29uZmlndXJlIEJDTEsgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSBzcGVlZCAoZGVwZW5kaW5nIG9uIHlvdXIKK3JhdGUsIG51bWJlciBvZiBjaGFubmVscyBhbmQgd29yZHNpemUpIHRvIHNhdmUgb24gcG93ZXIuCisKK0l0J3MgYWxzbyBkZXNpcmVhYmxlIHRvIHVzZSB0aGUgY29kZWMgKGlmIHBvc3NpYmxlKSB0byBkcml2ZSAob3IgbWFzdGVyKSB0aGUKK2F1ZGlvIGNsb2NrcyBhcyBpdCdzIHVzdWFsbHkgZ2l2ZXMgbW9yZSBhY2N1cmF0ZSBzYW1wbGUgcmF0ZXMgdGhhbiB0aGUgQ1BVLgorCisKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9jb2RlYy50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL2NvZGVjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODk4M2M3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9jb2RlYy50eHQKQEAgLTAsMCArMSwxOTcgQEAKK0FTb0MgQ29kZWMgRHJpdmVyCis9PT09PT09PT09PT09PT09PQorCitUaGUgY29kZWMgZHJpdmVyIGlzIGdlbmVyaWMgYW5kIGhhcmR3YXJlIGluZGVwZW5kZW50IGNvZGUgdGhhdCBjb25maWd1cmVzIHRoZQorY29kZWMgdG8gcHJvdmlkZSBhdWRpbyBjYXB0dXJlIGFuZCBwbGF5YmFjay4gSXQgc2hvdWxkIGNvbnRhaW4gbm8gY29kZSB0aGF0IGlzCitzcGVjaWZpYyB0byB0aGUgdGFyZ2V0IHBsYXRmb3JtIG9yIG1hY2hpbmUuIEFsbCBwbGF0Zm9ybSBhbmQgbWFjaGluZSBzcGVjaWZpYworY29kZSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHBsYXRmb3JtIGFuZCBtYWNoaW5lIGRyaXZlcnMgcmVzcGVjdGl2ZWx5LgorCitFYWNoIGNvZGVjIGRyaXZlciAqbXVzdCogcHJvdmlkZSB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOi0KKworIDEpIENvZGVjIERBSSBhbmQgUENNIGNvbmZpZ3VyYXRpb24KKyAyKSBDb2RlYyBjb250cm9sIElPIC0gdXNpbmcgSTJDLCAzIFdpcmUoU1BJKSBvciBib3RoIEFQSSdzCisgMykgTWl4ZXJzIGFuZCBhdWRpbyBjb250cm9scworIDQpIENvZGVjIGF1ZGlvIG9wZXJhdGlvbnMKKworT3B0aW9uYWxseSwgY29kZWMgZHJpdmVycyBjYW4gYWxzbyBwcm92aWRlOi0KKworIDUpIERBUE0gZGVzY3JpcHRpb24uCisgNikgREFQTSBldmVudCBoYW5kbGVyLgorIDcpIERBQyBEaWdpdGFsIG11dGUgY29udHJvbC4KKworSXQncyBwcm9iYWJseSBiZXN0IHRvIHVzZSB0aGlzIGd1aWRlIGluIGNvbmp1Y3Rpb24gd2l0aCB0aGUgZXhpc3RpbmcgY29kZWMKK2RyaXZlciBjb2RlIGluIHNvdW5kL3NvYy9jb2RlY3MvCisKK0FTb0MgQ29kZWMgZHJpdmVyIGJyZWFrZG93bgorPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzEgLSBDb2RlYyBEQUkgYW5kIFBDTSBjb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRWFjaCBjb2RlYyBkcml2ZXIgbXVzdCBoYXZlIGEgc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpIHRvIGRlZmluZSBpdCdzIERBSSBhbmQKK1BDTSdzIGNhcGFibGl0aWVzIGFuZCBvcGVyYXRpb25zLiBUaGlzIHN0cnVjdCBpcyBleHBvcnRlZCBzbyB0aGF0IGl0IGNhbiBiZQorcmVnaXN0ZXJlZCB3aXRoIHRoZSBjb3JlIGJ5IHlvdXIgbWFjaGluZSBkcml2ZXIuCisKK2UuZy4KKworc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpIHdtODczMV9kYWkgPSB7CisJLm5hbWUgPSAiV004NzMxIiwKKwkvKiBwbGF5YmFjayBjYXBhYmlsaXRpZXMgKi8KKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV004NzMxX1JBVEVTLAorCQkuZm9ybWF0cyA9IFdNODczMV9GT1JNQVRTLH0sCisJLyogY2FwdHVyZSBjYXBhYmlsaXRpZXMgKi8KKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkNhcHR1cmUiLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFdNODczMV9SQVRFUywKKwkJLmZvcm1hdHMgPSBXTTg3MzFfRk9STUFUUyx9LAorCS8qIHBjbSBvcGVyYXRpb25zIC0gc2VlIHNlY3Rpb24gNCBiZWxvdyAqLworCS5vcHMgPSB7CisJCS5wcmVwYXJlID0gd204NzMxX3BjbV9wcmVwYXJlLAorCQkuaHdfcGFyYW1zID0gd204NzMxX2h3X3BhcmFtcywKKwkJLnNodXRkb3duID0gd204NzMxX3NodXRkb3duLAorCX0sCisJLyogREFJIG9wZXJhdGlvbnMgLSBzZWUgREFJLnR4dCAqLworCS5kYWlfb3BzID0geworCQkuZGlnaXRhbF9tdXRlID0gd204NzMxX211dGUsCisJCS5zZXRfc3lzY2xrID0gd204NzMxX3NldF9kYWlfc3lzY2xrLAorCQkuc2V0X2ZtdCA9IHdtODczMV9zZXRfZGFpX2ZtdCwKKwl9Cit9OworRVhQT1JUX1NZTUJPTF9HUEwod204NzMxX2RhaSk7CisKKworMiAtIENvZGVjIGNvbnRyb2wgSU8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgY29kZWMgY2FuIHVzdXNhbGx5IGJlIGNvbnRyb2xsZWQgdmlhIGFuIEkyQyBvciBTUEkgc3R5bGUgaW50ZXJmYWNlIChBQzk3Citjb21iaW5lcyBjb250cm9sIHdpdGggZGF0YSBpbiB0aGUgREFJKS4gVGhlIGNvZGVjIGRyaXZlcnMgd2lsbCBoYXZlIHRvIHByb3ZpZGUKK2Z1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSB0aGUgY29kZWMgcmVnaXN0ZXJzIGFsb25nIHdpdGggc3VwcGx5aW5nIGEgcmVnaXN0ZXIKK2NhY2hlOi0KKworCS8qIElPIGNvbnRyb2wgZGF0YSBhbmQgcmVnaXN0ZXIgY2FjaGUgKi8KKyAgICB2b2lkICpjb250cm9sX2RhdGE7IC8qIGNvZGVjIGNvbnRyb2wgKGkyYy8zd2lyZSkgZGF0YSAqLworICAgIHZvaWQgKnJlZ19jYWNoZTsKKworQ29kZWMgcmVhZC93cml0ZSBzaG91bGQgZG8gYW55IGRhdGEgZm9ybWF0dGluZyBhbmQgY2FsbCB0aGUgaGFyZHdhcmUgcmVhZCB3cml0ZQorYmVsb3cgdG8gcGVyZm9ybSB0aGUgSU8uIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJ5IHRoZSBjb3JlIGFuZCBhbHNhIHdoZW4KK3BlcmZvcm1pbmcgREFQTSBvciBjaGFuZ2luZyB0aGUgbWl4ZXI6LQorCisgICAgdW5zaWduZWQgaW50ICgqcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKKyAgICBpbnQgKCp3cml0ZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworCitDb2RlYyBoYXJkd2FyZSBJTyBmdW5jdGlvbnMgLSB1c3VhbGx5IHBvaW50cyB0byBlaXRoZXIgdGhlIEkyQywgU1BJIG9yIEFDOTcKK3JlYWQvd3JpdGU6LQorCisJaHdfd3JpdGVfdCBod193cml0ZTsKKwlod19yZWFkX3QgaHdfcmVhZDsKKworCiszIC0gTWl4ZXJzIGFuZCBhdWRpbyBjb250cm9scworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FsbCB0aGUgY29kZWMgbWl4ZXJzIGFuZCBhdWRpbyBjb250cm9scyBjYW4gYmUgZGVmaW5lZCB1c2luZyB0aGUgY29udmVuaWVuY2UKK21hY3JvcyBkZWZpbmVkIGluIHNvYy5oLgorCisgICAgI2RlZmluZSBTT0NfU0lOR0xFKHhuYW1lLCByZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQpCisKK0RlZmluZXMgYSBzaW5nbGUgY29udHJvbCBhcyBmb2xsb3dzOi0KKworICB4bmFtZSA9IENvbnRyb2wgbmFtZSBlLmcuICJQbGF5YmFjayBWb2x1bWUiCisgIHJlZyA9IGNvZGVjIHJlZ2lzdGVyCisgIHNoaWZ0ID0gY29udHJvbCBiaXQocykgb2Zmc2V0IGluIHJlZ2lzdGVyCisgIG1hc2sgPSBjb250cm9sIGJpdCBzaXplKHMpIGUuZy4gbWFzayBvZiA3ID0gMyBiaXRzCisgIGludmVydCA9IHRoZSBjb250cm9sIGlzIGludmVydGVkCisKK090aGVyIG1hY3JvcyBpbmNsdWRlOi0KKworICAgICNkZWZpbmUgU09DX0RPVUJMRSh4bmFtZSwgcmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgbWFzaywgaW52ZXJ0KQorCitBIHN0ZXJlbyBjb250cm9sCisKKyAgICAjZGVmaW5lIFNPQ19ET1VCTEVfUih4bmFtZSwgcmVnX2xlZnQsIHJlZ19yaWdodCwgc2hpZnQsIG1hc2ssIGludmVydCkKKworQSBzdGVyZW8gY29udHJvbCBzcGFubmluZyAyIHJlZ2lzdGVycworCisgICAgI2RlZmluZSBTT0NfRU5VTV9TSU5HTEUoeHJlZywgeHNoaWZ0LCB4bWFzaywgeHRleHRzKQorCitEZWZpbmVzIGFuIHNpbmdsZSBlbnVtZXJhdGVkIGNvbnRyb2wgYXMgZm9sbG93czotCisKKyAgIHhyZWcgPSByZWdpc3RlcgorICAgeHNoaWZ0ID0gY29udHJvbCBiaXQocykgb2Zmc2V0IGluIHJlZ2lzdGVyCisgICB4bWFzayA9IGNvbnRyb2wgYml0KHMpIHNpemUKKyAgIHh0ZXh0cyA9IHBvaW50ZXIgdG8gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IGRlc2NyaWJlIGVhY2ggc2V0dGluZworCisgICAjZGVmaW5lIFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCB4dGV4dHMpCisKK0RlZmluZXMgYSBzdGVyZW8gZW51bWVyYXRlZCBjb250cm9sCisKKworNCAtIENvZGVjIEF1ZGlvIE9wZXJhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgY29kZWMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhbHNhIG9wZXJhdGlvbnM6LQorCisvKiBTb0MgYXVkaW8gb3BzICovCitzdHJ1Y3Qgc25kX3NvY19vcHMgeworCWludCAoKnN0YXJ0dXApKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKTsKKwlpbnQgKCpod19wYXJhbXMpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKik7CisJaW50ICgqaHdfZnJlZSkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopOworCWludCAoKnByZXBhcmUpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKTsKK307CisKK1BsZWFzZSByZWZlciB0byB0aGUgYWxzYSBkcml2ZXIgUENNIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCitodHRwOi8vd3d3LmFsc2EtcHJvamVjdC5vcmcvfml3YWkvd3JpdGluZy1hbi1hbHNhLWRyaXZlci9jNDM2Lmh0bQorCisKKzUgLSBEQVBNIGRlc2NyaXB0aW9uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgRHluYW1pYyBBdWRpbyBQb3dlciBNYW5hZ2VtZW50IGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUgY29kZWMncyBwb3dlcgorY29tcG9uZW50cywgdGhlaXIgcmVsYXRpb25zaGlwcyBhbmQgcmVnaXN0ZXJzIHRvIHRoZSBBU29DIGNvcmUuIFBsZWFzZSByZWFkCitkYXBtLnR4dCBmb3IgZGV0YWlscyBvZiBidWlsZGluZyB0aGUgZGVzY3JpcHRpb24uCisKK1BsZWFzZSBhbHNvIHNlZSB0aGUgZXhhbXBsZXMgaW4gb3RoZXIgY29kZWMgZHJpdmVycy4KKworCis2IC0gREFQTSBldmVudCBoYW5kbGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGZ1bmN0aW9uIGlzIGEgY2FsbGJhY2sgdGhhdCBoYW5kbGVzIGNvZGVjIGRvbWFpbiBQTSBjYWxscyBhbmQgc3lzdGVtCitkb21haW4gUE0gY2FsbHMgKGUuZy4gc3VzcGVuZCBhbmQgcmVzdW1lKS4gSXQncyB1c2VkIHRvIHB1dCB0aGUgY29kZWMgdG8gc2xlZXAKK3doZW4gbm90IGluIHVzZS4KKworUG93ZXIgc3RhdGVzOi0KKworCVNORFJWX0NUTF9QT1dFUl9EMDogLyogZnVsbCBPbiAqLworCS8qIHZyZWYvbWlkLCBjbGsgYW5kIG9zYyBvbiwgYWN0aXZlICovCisKKwlTTkRSVl9DVExfUE9XRVJfRDE6IC8qIHBhcnRpYWwgT24gKi8KKwlTTkRSVl9DVExfUE9XRVJfRDI6IC8qIHBhcnRpYWwgT24gKi8KKworCVNORFJWX0NUTF9QT1dFUl9EM2hvdDogLyogT2ZmLCB3aXRoIHBvd2VyICovCisJLyogZXZlcnl0aGluZyBvZmYgZXhjZXB0IHZyZWYvdm1pZCwgaW5hY3RpdmUgKi8KKworCVNORFJWX0NUTF9QT1dFUl9EM2NvbGQ6IC8qIEV2ZXJ5dGhpbmcgT2ZmLCB3aXRob3V0IHBvd2VyICovCisKKworNyAtIENvZGVjIERBQyBkaWdpdGFsIG11dGUgY29udHJvbC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTW9zdCBjb2RlY3MgaGF2ZSBhIGRpZ2l0YWwgbXV0ZSBiZWZvcmUgdGhlIERBQydzIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWluaW1pc2UKK2FueSBzeXN0ZW0gbm9pc2UuICBUaGUgbXV0ZSBzdG9wcyBhbnkgZGlnaXRhbCBkYXRhIGZyb20gZW50ZXJpbmcgdGhlIERBQy4KKworQSBjYWxsYmFjayBjYW4gYmUgY3JlYXRlZCB0aGF0IGlzIGNhbGxlZCBieSB0aGUgY29yZSBmb3IgZWFjaCBjb2RlYyBEQUkgd2hlbiB0aGUKK211dGUgaXMgYXBwbGllZCBvciBmcmVlZC4KKworaS5lLgorCitzdGF0aWMgaW50IHdtODk3NF9tdXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJdTE2IG11dGVfcmVnID0gd204OTc0X3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg5NzRfREFDKSAmIDB4ZmZiZjsKKwlpZihtdXRlKQorCQl3bTg5NzRfd3JpdGUoY29kZWMsIFdNODk3NF9EQUMsIG11dGVfcmVnIHwgMHg0MCk7CisJZWxzZQorCQl3bTg5NzRfd3JpdGUoY29kZWMsIFdNODk3NF9EQUMsIG11dGVfcmVnKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvZGFwbS50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL2RhcG0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTg3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL2RhcG0udHh0CkBAIC0wLDAgKzEsMjk3IEBACitEeW5hbWljIEF1ZGlvIFBvd2VyIE1hbmFnZW1lbnQgZm9yIFBvcnRhYmxlIERldmljZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisxLiBEZXNjcmlwdGlvbgorPT09PT09PT09PT09PT0KKworRHluYW1pYyBBdWRpbyBQb3dlciBNYW5hZ2VtZW50IChEQVBNKSBpcyBkZXNpZ25lZCB0byBhbGxvdyBwb3J0YWJsZSBMaW51eCBkZXZpY2VzCit0byB1c2UgdGhlIG1pbmltdW0gYW1vdW50IG9mIHBvd2VyIHdpdGhpbiB0aGUgYXVkaW8gc3Vic3lzdGVtIGF0IGFsbCB0aW1lcy4gSXQKK2lzIGluZGVwZW5kZW50IG9mIG90aGVyIGtlcm5lbCBQTSBhbmQgYXMgc3VjaCwgY2FuIGVhc2lseSBjby1leGlzdCB3aXRoIHRoZQorb3RoZXIgUE0gc3lzdGVtcy4KKworREFQTSBpcyBhbHNvIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgdG8gYWxsIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIGFzIGFsbCBwb3dlcgorc3dpdGNoaW5nIGlzIGRvbmUgd2l0aGluIHRoZSBBU29DIGNvcmUuIE5vIGNvZGUgY2hhbmdlcyBvciByZWNvbXBpbGluZyBhcmUKK3JlcXVpcmVkIGZvciB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucy4gREFQTSBtYWtlcyBwb3dlciBzd2l0Y2hpbmcgZGVzY2lzaW9ucyBiYXNlZAordXBvbiBhbnkgYXVkaW8gc3RyZWFtIChjYXB0dXJlL3BsYXliYWNrKSBhY3Rpdml0eSBhbmQgYXVkaW8gbWl4ZXIgc2V0dGluZ3MKK3dpdGhpbiB0aGUgZGV2aWNlLgorCitEQVBNIHNwYW5zIHRoZSB3aG9sZSBtYWNoaW5lLiBJdCBjb3ZlcnMgcG93ZXIgY29udHJvbCB3aXRoaW4gdGhlIGVudGlyZSBhdWRpbworc3Vic3lzdGVtLCB0aGlzIGluY2x1ZGVzIGludGVybmFsIGNvZGVjIHBvd2VyIGJsb2NrcyBhbmQgbWFjaGluZSBsZXZlbCBwb3dlcgorc3lzdGVtcy4KKworVGhlcmUgYXJlIDQgcG93ZXIgZG9tYWlucyB3aXRoaW4gREFQTQorCisgICAxLiBDb2RlYyBkb21haW4gLSBWUkVGLCBWTUlEIChjb3JlIGNvZGVjIGFuZCBhdWRpbyBwb3dlcikKKyAgICAgIFVzdWFsbHkgY29udHJvbGxlZCBhdCBjb2RlYyBwcm9iZS9yZW1vdmUgYW5kIHN1c3BlbmQvcmVzdW1lLCBhbHRob3VnaAorICAgICAgY2FuIGJlIHNldCBhdCBzdHJlYW0gdGltZSBpZiBwb3dlciBpcyBub3QgbmVlZGVkIGZvciBzaWRldG9uZSwgZXRjLgorCisgICAyLiBQbGF0Zm9ybS9NYWNoaW5lIGRvbWFpbiAtIHBoeXNpY2FsbHkgY29ubmVjdGVkIGlucHV0cyBhbmQgb3V0cHV0cworICAgICAgSXMgcGxhdGZvcm0vbWFjaGluZSBhbmQgdXNlciBhY3Rpb24gc3BlY2lmaWMsIGlzIGNvbmZpZ3VyZWQgYnkgdGhlCisgICAgICBtYWNoaW5lIGRyaXZlciBhbmQgcmVzcG9uZHMgdG8gYXN5bmNocm9ub3VzIGV2ZW50cyBlLmcgd2hlbiBIUAorICAgICAgYXJlIGluc2VydGVkCisKKyAgIDMuIFBhdGggZG9tYWluIC0gYXVkaW8gc3VzYnN5c3RlbSBzaWduYWwgcGF0aHMKKyAgICAgIEF1dG9tYXRpY2FsbHkgc2V0IHdoZW4gbWl4ZXIgYW5kIG11eCBzZXR0aW5ncyBhcmUgY2hhbmdlZCBieSB0aGUgdXNlci4KKyAgICAgIGUuZy4gYWxzYW1peGVyLCBhbWl4ZXIuCisKKyAgIDQuIFN0cmVhbSBkb21haW4gLSBEQUMncyBhbmQgQURDJ3MuCisgICAgICBFbmFibGVkIGFuZCBkaXNhYmxlZCB3aGVuIHN0cmVhbSBwbGF5YmFjay9jYXB0dXJlIGlzIHN0YXJ0ZWQgYW5kCisgICAgICBzdG9wcGVkIHJlc3BlY3RpdmVseS4gZS5nLiBhcGxheSwgYXJlY29yZC4KKworQWxsIERBUE0gcG93ZXIgc3dpdGNoaW5nIGRlc2Npc29ucyBhcmUgbWFkZSBhdXRvbWF0aWNhbGx5IGJ5IGNvbnN1bHRpbmcgYW4gYXVkaW8KK3JvdXRpbmcgbWFwIG9mIHRoZSB3aG9sZSBtYWNoaW5lLiBUaGlzIG1hcCBpcyBzcGVjaWZpYyB0byBlYWNoIG1hY2hpbmUgYW5kCitjb25zaXN0cyBvZiB0aGUgaW50ZXJjb25uZWN0aW9ucyBiZXR3ZWVuIGV2ZXJ5IGF1ZGlvIGNvbXBvbmVudCAoaW5jbHVkaW5nCitpbnRlcm5hbCBjb2RlYyBjb21wb25lbnRzKS4gQWxsIGF1ZGlvIGNvbXBvbmVudHMgdGhhdCBlZmZlY3QgcG93ZXIgYXJlIGNhbGxlZAord2lkZ2V0cyBoZXJlYWZ0ZXIuCisKKworMi4gREFQTSBXaWRnZXRzCis9PT09PT09PT09PT09PT0KKworQXVkaW8gREFQTSB3aWRnZXRzIGZhbGwgaW50byBhIG51bWJlciBvZiB0eXBlczotCisKKyBvIE1peGVyICAgICAgLSBNaXhlcyBzZXZlcmFsIGFuYWxvZyBzaWduYWxzIGludG8gYSBzaW5nbGUgYW5hbG9nIHNpZ25hbC4KKyBvIE11eCAgICAgICAgLSBBbiBhbmFsb2cgc3dpdGNoIHRoYXQgb3V0cHV0cyBvbmx5IDEgb2YgaXQncyBpbnB1dHMuCisgbyBQR0EgICAgICAgIC0gQSBwcm9ncmFtbWFibGUgZ2FpbiBhbXBsaWZpZXIgb3IgYXR0ZW51YXRpb24gd2lkZ2V0LgorIG8gQURDICAgICAgICAtIEFuYWxvZyB0byBEaWdpdGFsIENvbnZlcnRlcgorIG8gREFDICAgICAgICAtIERpZ2l0YWwgdG8gQW5hbG9nIENvbnZlcnRlcgorIG8gU3dpdGNoICAgICAtIEFuIGFuYWxvZyBzd2l0Y2gKKyBvIElucHV0ICAgICAgLSBBIGNvZGVjIGlucHV0IHBpbgorIG8gT3V0cHV0ICAgICAtIEEgY29kZWMgb3V0cHV0IHBpbgorIG8gSGVhZHBob25lICAtIEhlYWRwaG9uZSAoYW5kIG9wdGlvbmFsIEphY2spCisgbyBNaWMgICAgICAgIC0gTWljIChhbmQgb3B0aW9uYWwgSmFjaykKKyBvIExpbmUgICAgICAgLSBMaW5lIElucHV0L091dHB1dCAoYW5kIG9wdGlvbmFsIEphY2spCisgbyBTcGVha2VyICAgIC0gU3BlYWtlcgorIG8gUHJlICAgICAgICAtIFNwZWNpYWwgUFJFIHdpZGdldCAoZXhlYyBiZWZvcmUgYWxsIG90aGVycykKKyBvIFBvc3QgICAgICAgLSBTcGVjaWFsIFBPU1Qgd2lkZ2V0IChleGVjIGFmdGVyIGFsbCBvdGhlcnMpCisKKyhXaWRnZXRzIGFyZSBkZWZpbmVkIGluIGluY2x1ZGUvc291bmQvc29jLWRhcG0uaCkKKworV2lkZ2V0cyBhcmUgdXN1YWxseSBhZGRlZCBpbiB0aGUgY29kZWMgZHJpdmVyIGFuZCB0aGUgbWFjaGluZSBkcml2ZXIuIFRoZXJlIGFyZQorY29udmllbmNlIG1hY3JvcyBkZWZpbmVkIGluIHNvYy1kYXBtLmggdGhhdCBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGJ1aWxkIGEKK2xpc3Qgb2Ygd2lkZ2V0cyBvZiB0aGUgY29kZWNzIGFuZCBtYWNoaW5lcyBEQVBNIHdpZGdldHMuCisKK01vc3Qgd2lkZ2V0cyBoYXZlIGEgbmFtZSwgcmVnaXN0ZXIsIHNoaWZ0IGFuZCBpbnZlcnQuIFNvbWUgd2lkZ2V0cyBoYXZlIGV4dHJhCitwYXJhbWV0ZXJzIGZvciBzdHJlYW0gbmFtZSBhbmQga2NvbnRyb2xzLgorCisKKzIuMSBTdHJlYW0gRG9tYWluIFdpZGdldHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3RyZWFtIFdpZGdldHMgcmVsYXRlIHRvIHRoZSBzdHJlYW0gcG93ZXIgZG9tYWluIGFuZCBvbmx5IGNvbnNpc3Qgb2YgQURDJ3MKKyhhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJ0ZXJzKSBhbmQgREFDJ3MgKGRpZ2l0YWwgdG8gYW5hbG9nIGNvbnZlcnRlcnMpLgorCitTdHJlYW0gd2lkZ2V0cyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0Oi0KKworU05EX1NPQ19EQVBNX0RBQyhuYW1lLCBzdHJlYW0gbmFtZSwgcmVnLCBzaGlmdCwgaW52ZXJ0KSwKKworTk9URTogdGhlIHN0cmVhbSBuYW1lIG11c3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgc3RyZWFtIG5hbWUgaW4geW91ciBjb2RlY3MKK3NuZF9zb2NfY29kZWNfZGFpLgorCitlLmcuIHN0cmVhbSB3aWRnZXRzIGZvciBIaUZpIHBsYXliYWNrIGFuZCBjYXB0dXJlCisKK1NORF9TT0NfREFQTV9EQUMoIkhpRmkgREFDIiwgIkhpRmkgUGxheWJhY2siLCBSRUcsIDMsIDEpLAorU05EX1NPQ19EQVBNX0FEQygiSGlGaSBBREMiLCAiSGlGaSBDYXB0dXJlIiwgUkVHLCAyLCAxKSwKKworCisyLjIgUGF0aCBEb21haW4gV2lkZ2V0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUGF0aCBkb21haW4gd2lkZ2V0cyBoYXZlIGEgYWJpbGl0eSB0byBjb250cm9sIG9yIGVmZmVjdCB0aGUgYXVkaW8gc2lnbmFsIG9yCithdWRpbyBwYXRocyB3aXRoaW4gdGhlIGF1ZGlvIHN1YnN5c3RlbS4gVGhleSBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybTotCisKK1NORF9TT0NfREFQTV9QR0EobmFtZSwgcmVnLCBzaGlmdCwgaW52ZXJ0LCBjb250cm9scywgbnVtX2NvbnRyb2xzKQorCitBbnkgd2lkZ2V0IGtjb250cm9scyBjYW4gYmUgc2V0IHVzaW5nIHRoZSBjb250cm9scyBhbmQgbnVtX2NvbnRyb2xzIG1lbWJlcnMuCisKK2UuZy4gTWl4ZXIgd2lkZ2V0ICh0aGUga2NvbnRyb2xzIGFyZSBkZWNsYXJlZCBmaXJzdCkKKworLyogT3V0cHV0IE1peGVyICovCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHdtODczMV9vdXRwdXRfbWl4ZXJfY29udHJvbHNbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiTGluZSBCeXBhc3MgU3dpdGNoIiwgV004NzMxX0FQQU5BLCAzLCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiTWljIFNpZGV0b25lIFN3aXRjaCIsIFdNODczMV9BUEFOQSwgNSwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkhpRmkgUGxheWJhY2sgU3dpdGNoIiwgV004NzMxX0FQQU5BLCA0LCAxLCAwKSwKK307CisKK1NORF9TT0NfREFQTV9NSVhFUigiT3V0cHV0IE1peGVyIiwgV004NzMxX1BXUiwgNCwgMSwgd204NzMxX291dHB1dF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKHdtODczMV9vdXRwdXRfbWl4ZXJfY29udHJvbHMpKSwKKworCisyLjMgUGxhdGZvcm0vTWFjaGluZSBkb21haW4gV2lkZ2V0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWFjaGluZSB3aWRnZXRzIGFyZSBkaWZmZXJlbnQgZnJvbSBjb2RlYyB3aWRnZXRzIGluIHRoYXQgdGhleSBkb24ndCBoYXZlIGEKK2NvZGVjIHJlZ2lzdGVyIGJpdCBhc3NvY2lhdGVkIHdpdGggdGhlbS4gQSBtYWNoaW5lIHdpZGdldCBpcyBhc3NpZ25lZCB0byBlYWNoCittYWNoaW5lIGF1ZGlvIGNvbXBvbmVudCAobm9uIGNvZGVjKSB0aGF0IGNhbiBiZSBpbmRlcGVuZGVudGx5IHBvd2VyZWQuIGUuZy4KKworIG8gU3BlYWtlciBBbXAKKyBvIE1pY3JvcGhvbmUgQmlhcworIG8gSmFjayBjb25uZWN0b3JzCisKK0EgbWFjaGluZSB3aWRnZXQgY2FuIGhhdmUgYW4gb3B0aW9uYWwgY2FsbCBiYWNrLgorCitlLmcuIEphY2sgY29ubmVjdG9yIHdpZGdldCBmb3IgYW4gZXh0ZXJuYWwgTWljIHRoYXQgZW5hYmxlcyBNaWMgQmlhcword2hlbiB0aGUgTWljIGlzIGluc2VydGVkOi0KKworc3RhdGljIGludCBzcGl0el9taWNfYmlhcyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCogdywgaW50IGV2ZW50KQoreworCWlmKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCisJCXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wMl9kZXZpY2UuZGV2LCBTUElUWl9TQ1AyX01JQ19CSUFTKTsKKwllbHNlCisJCXJlc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3AyX2RldmljZS5kZXYsIFNQSVRaX1NDUDJfTUlDX0JJQVMpOworCisJcmV0dXJuIDA7Cit9CisKK1NORF9TT0NfREFQTV9NSUMoIk1pYyBKYWNrIiwgc3BpdHpfbWljX2JpYXMpLAorCisKKzIuNCBDb2RlYyBEb21haW4KKy0tLS0tLS0tLS0tLS0tLS0KKworVGhlIENvZGVjIHBvd2VyIGRvbWFpbiBoYXMgbm8gd2lkZ2V0cyBhbmQgaXMgaGFuZGxlZCBieSB0aGUgY29kZWNzIERBUE0gZXZlbnQKK2hhbmRsZXIuIFRoaXMgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiB0aGUgY29kZWMgcG93ZXJzdGF0ZSBpcyBjaGFuZ2VkIHdydCB0byBhbnkKK3N0cmVhbSBldmVudCBvciBieSBrZXJuZWwgUE0gZXZlbnRzLgorCisKKzIuNSBWaXJ0dWFsIFdpZGdldHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworU29tZXRpbWVzIHdpZGdldHMgZXhpc3QgaW4gdGhlIGNvZGVjIG9yIG1hY2hpbmUgYXVkaW8gbWFwIHRoYXQgZG9uJ3QgaGF2ZSBhbnkKK2NvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgYml0IGZvciBwb3dlciBjb250cm9sLiBJbiB0aGlzIGNhc2UgaXQncyBuZWNlc3NhcnkgdG8KK2NyZWF0ZSBhIHZpcnR1YWwgd2lkZ2V0IC0gYSB3aWRnZXQgd2l0aCBubyBjb250cm9sIGJpdHMgZS5nLgorCitTTkRfU09DX0RBUE1fTUlYRVIoIkFDOTcgTWl4ZXIiLCBTTkRfU09DX0RBUE1fTk9QTSwgMCwgMCwgTlVMTCwgMCksCisKK1RoaXMgY2FuIGJlIHVzZWQgdG8gbWVyZ2UgdG8gc2lnbmFsIHBhdGhzIHRvZ2V0aGVyIGluIHNvZnR3YXJlLgorCitBZnRlciBhbGwgdGhlIHdpZGdldHMgaGF2ZSBiZWVuIGRlZmluZWQsIHRoZXkgY2FuIHRoZW4gYmUgYWRkZWQgdG8gdGhlIERBUE0KK3N1YnN5c3RlbSBpbmRpdmlkdWFsbHkgd2l0aCBhIGNhbGwgdG8gc25kX3NvY19kYXBtX25ld19jb250cm9sKCkuCisKKworMy4gQ29kZWMgV2lkZ2V0IEludGVyY29ubmVjdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dpZGdldHMgYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyIHdpdGhpbiB0aGUgY29kZWMgYW5kIG1hY2hpbmUgYnkgYXVkaW8KK3BhdGhzIChjYWxsZWQgaW50ZXJjb25uZWN0aW9ucykuIEVhY2ggaW50ZXJjb25uZWN0aW9uIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlcgordG8gY3JlYXRlIGEgbWFwIG9mIGFsbCBhdWRpbyBwYXRocyBiZXR3ZWVuIHdpZGdldHMuCitUaGlzIGlzIGVhc2llc3Qgd2l0aCBhIGRpYWdyYW0gb2YgdGhlIGNvZGVjIChhbmQgc2NoZW1hdGljIG9mIHRoZSBtYWNoaW5lIGF1ZGlvCitzeXN0ZW0pLCBhcyBpdCByZXF1aXJlcyBqb2luaW5nIHdpZGdldHMgdG9nZXRoZXIgdmlhIHRoZWlyIGF1ZGlvIHNpZ25hbCBwYXRocy4KKworaS5lLiBmcm9tIHRoZSBXTTg3MzEgY29kZWMncyBvdXRwdXQgbWl4ZXIgKHdtODczMS5jKQorCitUaGUgV004NzMxIG91dHB1dCBtaXhlciBoYXMgMyBpbnB1dHMgKHNvdXJjZXMpCisKKyAxLiBMaW5lIEJ5cGFzcyBJbnB1dAorIDIuIERBQyAoSGlGaSBwbGF5YmFjaykKKyAzLiBNaWMgU2lkZXRvbmUgSW5wdXQKKworRWFjaCBpbnB1dCBpbiB0aGlzIGV4YW1wbGUgaGFzIGEga2NvbnRyb2wgYXNzb2NpYXRlZCB3aXRoIGl0IChkZWZpbmVkIGluIGV4YW1wbGUKK2Fib3ZlKSBhbmQgaXMgY29ubmVjdGVkIHRvIHRoZSBvdXRwdXQgbWl4ZXIgdmlhIGl0J3Mga2NvbnRyb2wgbmFtZS4gV2UgY2FuIG5vdworY29ubmVjdCB0aGUgZGVzdGluYXRpb24gd2lkZ2V0ICh3cnQgYXVkaW8gc2lnbmFsKSB3aXRoIGl0J3Mgc291cmNlIHdpZGdldHMuCisKKwkvKiBvdXRwdXQgbWl4ZXIgKi8KKwl7Ik91dHB1dCBNaXhlciIsICJMaW5lIEJ5cGFzcyBTd2l0Y2giLCAiTGluZSBJbnB1dCJ9LAorCXsiT3V0cHV0IE1peGVyIiwgIkhpRmkgUGxheWJhY2sgU3dpdGNoIiwgIkRBQyJ9LAorCXsiT3V0cHV0IE1peGVyIiwgIk1pYyBTaWRldG9uZSBTd2l0Y2giLCAiTWljIEJpYXMifSwKKworU28gd2UgaGF2ZSA6LQorCisJRGVzdGluYXRpb24gV2lkZ2V0ICA8PT09IFBhdGggTmFtZSA8PT09IFNvdXJjZSBXaWRnZXQKKworT3I6LQorCisJU2luaywgUGF0aCwgU291cmNlCisKK09yIDotCisKKwkiT3V0cHV0IE1peGVyIiBpcyBjb25uZWN0ZWQgdG8gdGhlICJEQUMiIHZpYSB0aGUgIkhpRmkgUGxheWJhY2sgU3dpdGNoIi4KKworV2hlbiB0aGVyZSBpcyBubyBwYXRoIG5hbWUgY29ubmVjdGluZyB3aWRnZXRzIChlLmcuIGEgZGlyZWN0IGNvbm5lY3Rpb24pIHdlCitwYXNzIE5VTEwgZm9yIHRoZSBwYXRoIG5hbWUuCisKK0ludGVyY29ubmVjdGlvbnMgYXJlIGNyZWF0ZWQgd2l0aCBhIGNhbGwgdG86LQorCitzbmRfc29jX2RhcG1fY29ubmVjdF9pbnB1dChjb2RlYywgc2luaywgcGF0aCwgc291cmNlKTsKKworRmluYWxseSwgc25kX3NvY19kYXBtX25ld193aWRnZXRzKGNvZGVjKSBtdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgd2lkZ2V0cyBhbmQKK2ludGVyY29ubmVjdGlvbnMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY29yZS4gVGhpcyBjYXVzZXMgdGhlIGNvcmUgdG8KK3NjYW4gdGhlIGNvZGVjIGFuZCBtYWNoaW5lIHNvIHRoYXQgdGhlIGludGVybmFsIERBUE0gc3RhdGUgbWF0Y2hlcyB0aGUKK3BoeXNpY2FsIHN0YXRlIG9mIHRoZSBtYWNoaW5lLgorCisKKzMuMSBNYWNoaW5lIFdpZGdldCBJbnRlcmNvbm5lY3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTWFjaGluZSB3aWRnZXQgaW50ZXJjb25uZWN0aW9ucyBhcmUgY3JlYXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgY29kZWMgb25lcyBhbmQKK2RpcmVjdGx5IGNvbm5lY3QgdGhlIGNvZGVjIHBpbnMgdG8gbWFjaGluZSBsZXZlbCB3aWRnZXRzLgorCitlLmcuIGNvbm5lY3RzIHRoZSBzcGVha2VyIG91dCBjb2RlYyBwaW5zIHRvIHRoZSBpbnRlcm5hbCBzcGVha2VyLgorCisJLyogZXh0IHNwZWFrZXIgY29ubmVjdGVkIHRvIGNvZGVjIHBpbnMgTE9VVDIsIFJPVVQyICAqLworCXsiRXh0IFNwayIsIE5VTEwgLCAiUk9VVDIifSwKKwl7IkV4dCBTcGsiLCBOVUxMICwgIkxPVVQyIn0sCisKK1RoaXMgYWxsb3dzIHRoZSBEQVBNIHRvIHBvd2VyIG9uIGFuZCBvZmYgcGlucyB0aGF0IGFyZSBjb25uZWN0ZWQgKGFuZCBpbiB1c2UpCithbmQgcGlucyB0aGF0IGFyZSBOQyByZXNwZWN0aXZlbHkuCisKKworNCBFbmRwb2ludCBXaWRnZXRzCis9PT09PT09PT09PT09PT09PT09CitBbiBlbmRwb2ludCBpcyBhIHN0YXJ0IG9yIGVuZCBwb2ludCAod2lkZ2V0KSBvZiBhbiBhdWRpbyBzaWduYWwgd2l0aGluIHRoZQorbWFjaGluZSBhbmQgaW5jbHVkZXMgdGhlIGNvZGVjLiBlLmcuCisKKyBvIEhlYWRwaG9uZSBKYWNrCisgbyBJbnRlcm5hbCBTcGVha2VyCisgbyBJbnRlcm5hbCBNaWMKKyBvIE1pYyBKYWNrCisgbyBDb2RlYyBQaW5zCisKK1doZW4gYSBjb2RlYyBwaW4gaXMgTkMgaXQgY2FuIGJlIG1hcmtlZCBhcyBub3QgdXNlZCB3aXRoIGEgY2FsbCB0bworCitzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiV2lkZ2V0IE5hbWUiLCAwKTsKKworVGhlIGxhc3QgYXJndW1lbnQgaXMgMCBmb3IgaW5hY3RpdmUgYW5kIDEgZm9yIGFjdGl2ZS4gVGhpcyB3YXkgdGhlIHBpbiBhbmQgaXRzCitpbnB1dCB3aWRnZXQgd2lsbCBuZXZlciBiZSBwb3dlcmVkIHVwIGFuZCBjb25zdW1lIHBvd2VyLgorCitUaGlzIGFsc28gYXBwbGllcyB0byBtYWNoaW5lIHdpZGdldHMuIGUuZy4gaWYgYSBoZWFkcGhvbmUgaXMgY29ubmVjdGVkIHRvIGEKK2phY2sgdGhlbiB0aGUgamFjayBjYW4gYmUgbWFya2VkIGFjdGl2ZS4gSWYgdGhlIGhlYWRwaG9uZSBpcyByZW1vdmVkLCB0aGVuCit0aGUgaGVhZHBob25lIGphY2sgY2FuIGJlIG1hcmtlZCBpbmFjdGl2ZS4KKworCis1IERBUE0gV2lkZ2V0IEV2ZW50cworPT09PT09PT09PT09PT09PT09PT0KKworU29tZSB3aWRnZXRzIGNhbiByZWdpc3RlciB0aGVpciBpbnRlcmVzdCB3aXRoIHRoZSBEQVBNIGNvcmUgaW4gUE0gZXZlbnRzLgorZS5nLiBBIFNwZWFrZXIgd2l0aCBhbiBhbXBsaWZpZXIgcmVnaXN0ZXJzIGEgd2lkZ2V0IHNvIHRoZSBhbXBsaWZpZXIgY2FuIGJlCitwb3dlcmVkIG9ubHkgd2hlbiB0aGUgc3BrIGlzIGluIHVzZS4KKworLyogdHVybiBzcGVha2VyIGFtcGxpZmllciBvbi9vZmYgZGVwZW5kaW5nIG9uIHVzZSAqLworc3RhdGljIGludCBjb3JnaV9hbXBfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCBldmVudCkKK3sKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKKwkJc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX0FQTV9PTik7CisJZWxzZQorCQlyZXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9BUE1fT04pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNvcmdpIG1hY2hpbmUgZGFwbSB3aWRnZXRzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd204NzMxX2RhcG1fd2lkZ2V0cyA9CisJU05EX1NPQ19EQVBNX1NQSygiRXh0IFNwayIsIGNvcmdpX2FtcF9ldmVudCk7CisKK1BsZWFzZSBzZWUgc29jLWRhcG0uaCBmb3IgYWxsIG90aGVyIHdpZGdldHMgdGhhdCBzdXBwb3J0IGV2ZW50cy4KKworCis1LjEgRXZlbnQgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIGV2ZW50IHR5cGVzIGFyZSBzdXBwb3J0ZWQgYnkgZXZlbnQgd2lkZ2V0cy4KKworLyogZGFwbSBldmVudCB0eXBlcyAqLworI2RlZmluZSBTTkRfU09DX0RBUE1fUFJFX1BNVQkweDEgCS8qIGJlZm9yZSB3aWRnZXQgcG93ZXIgdXAgKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1BPU1RfUE1VCTB4MgkJLyogYWZ0ZXIgd2lkZ2V0IHBvd2VyIHVwICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9QUkVfUE1ECTB4NCAJLyogYmVmb3JlIHdpZGdldCBwb3dlciBkb3duICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9QT1NUX1BNRAkweDgJCS8qIGFmdGVyIHdpZGdldCBwb3dlciBkb3duICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9QUkVfUkVHCTB4MTAJLyogYmVmb3JlIGF1ZGlvIHBhdGggc2V0dXAgKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1BPU1RfUkVHCTB4MjAJLyogYWZ0ZXIgYXVkaW8gcGF0aCBzZXR1cCAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9tYWNoaW5lLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvbWFjaGluZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiZDIyMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvbWFjaGluZS50eHQKQEAgLTAsMCArMSwxMTMgQEAKK0FTb0MgTWFjaGluZSBEcml2ZXIKKz09PT09PT09PT09PT09PT09PT0KKworVGhlIEFTb0MgbWFjaGluZSAob3IgYm9hcmQpIGRyaXZlciBpcyB0aGUgY29kZSB0aGF0IGdsdWVzIHRvZ2V0aGVyIHRoZSBwbGF0Zm9ybQorYW5kIGNvZGVjIGRyaXZlcnMuCisKK1RoZSBtYWNoaW5lIGRyaXZlciBjYW4gY29udGFpbiBjb2RlYyBhbmQgcGxhdGZvcm0gc3BlY2lmaWMgY29kZS4gSXQgcmVnaXN0ZXJzCit0aGUgYXVkaW8gc3Vic3lzdGVtIHdpdGggdGhlIGtlcm5lbCBhcyBhIHBsYXRmb3JtIGRldmljZSBhbmQgaXMgcmVwcmVzZW50ZWQgYnkKK3RoZSBmb2xsb3dpbmcgc3RydWN0Oi0KKworLyogU29DIG1hY2hpbmUgKi8KK3N0cnVjdCBzbmRfc29jX21hY2hpbmUgeworCWNoYXIgKm5hbWU7CisKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKworCS8qIHRoZSBwcmUgYW5kIHBvc3QgUE0gZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGRvIGFueSBQTSB3b3JrIGJlZm9yZSBhbmQKKwkgKiBhZnRlciB0aGUgY29kZWMgYW5kIERBSSdzIGRvIGFueSBQTSB3b3JrLiAqLworCWludCAoKnN1c3BlbmRfcHJlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludCAoKnN1c3BlbmRfcG9zdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpyZXN1bWVfcHJlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwlpbnQgKCpyZXN1bWVfcG9zdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisKKwkvKiBtYWNoaW5lIHN0cmVhbSBvcGVyYXRpb25zICovCisJc3RydWN0IHNuZF9zb2Nfb3BzICpvcHM7CisKKwkvKiBDUFUgPC0tPiBDb2RlYyBEQUkgbGlua3MgICovCisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOworCWludCBudW1fbGlua3M7Cit9OworCitwcm9iZSgpL3JlbW92ZSgpCistLS0tLS0tLS0tLS0tLS0tCitwcm9iZS9yZW1vdmUgYXJlIG9wdGlvbmFsLiBEbyBhbnkgbWFjaGluZSBzcGVjaWZpYyBwcm9iZSBoZXJlLgorCisKK3N1c3BlbmQoKS9yZXN1bWUoKQorLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbWFjaGluZSBkcml2ZXIgaGFzIHByZSBhbmQgcG9zdCB2ZXJzaW9ucyBvZiBzdXNwZW5kIGFuZCByZXN1bWUgdG8gdGFrZSBjYXJlCitvZiBhbnkgbWFjaGluZSBhdWRpbyB0YXNrcyB0aGF0IGhhdmUgdG8gYmUgZG9uZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGNvZGVjLCBEQUkncworYW5kIERNQSBpcyBzdXNwZW5kZWQgYW5kIHJlc3VtZWQuIE9wdGlvbmFsLgorCisKK01hY2hpbmUgb3BlcmF0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbWFjaGluZSBzcGVjaWZpYyBhdWRpbyBvcGVyYXRpb25zIGNhbiBiZSBzZXQgaGVyZS4gQWdhaW4gdGhpcyBpcyBvcHRpb25hbC4KKworCitNYWNoaW5lIERBSSBDb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbWFjaGluZSBEQUkgY29uZmlndXJhdGlvbiBnbHVlcyBhbGwgdGhlIGNvZGVjIGFuZCBDUFUgREFJJ3MgdG9nZXRoZXIuIEl0IGNhbgorYWxzbyBiZSB1c2VkIHRvIHNldCB1cCB0aGUgREFJIHN5c3RlbSBjbG9jayBhbmQgZm9yIGFueSBtYWNoaW5lIHJlbGF0ZWQgREFJCitpbml0aWFsaXNhdGlvbiBlLmcuIHRoZSBtYWNoaW5lIGF1ZGlvIG1hcCBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZSBjb2RlYyBhdWRpbworbWFwLCB1bmNvbm5uZWN0ZWQgY29kZWMgcGlucyBjYW4gYmUgc2V0IGFzIHN1Y2guIFBsZWFzZSBzZWUgY29yZ2kuYywgc3BpdHouYworZm9yIGV4YW1wbGVzLgorCitzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBpcyB1c2VkIHRvIHNldCB1cCBlYWNoIERBSSBpbiB5b3VyIG1hY2hpbmUuIGUuZy4KKworLyogY29yZ2kgZGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgY29yZ2lfZGFpID0geworCS5uYW1lID0gIldNODczMSIsCisJLnN0cmVhbV9uYW1lID0gIldNODczMSIsCisJLmNwdV9kYWkgPSAmcHhhX2kyc19kYWksCisJLmNvZGVjX2RhaSA9ICZ3bTg3MzFfZGFpLAorCS5pbml0ID0gY29yZ2lfd204NzMxX2luaXQsCisJLm9wcyA9ICZjb3JnaV9vcHMsCit9OworCitzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHRoZW4gc2V0cyB1cCB0aGUgbWFjaGluZSB3aXRoIGl0J3MgREFJJ3MuIGUuZy4KKworLyogY29yZ2kgYXVkaW8gbWFjaGluZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHNuZF9zb2NfbWFjaGluZV9jb3JnaSA9IHsKKwkubmFtZSA9ICJDb3JnaSIsCisJLmRhaV9saW5rID0gJmNvcmdpX2RhaSwKKwkubnVtX2xpbmtzID0gMSwKK307CisKKworTWFjaGluZSBBdWRpbyBTdWJzeXN0ZW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBtYWNoaW5lIHNvYyBkZXZpY2UgZ2x1ZXMgdGhlIHBsYXRmb3JtLCBtYWNoaW5lIGFuZCBjb2RlYyBkcml2ZXIgdG9nZXRoZXIuCitQcml2YXRlIGRhdGEgY2FuIGFsc28gYmUgc2V0IGhlcmUuIGUuZy4KKworLyogY29yZ2kgYXVkaW8gcHJpdmF0ZSBkYXRhICovCitzdGF0aWMgc3RydWN0IHdtODczMV9zZXR1cF9kYXRhIGNvcmdpX3dtODczMV9zZXR1cCA9IHsKKwkuaTJjX2FkZHJlc3MgPSAweDFiLAorfTsKKworLyogY29yZ2kgYXVkaW8gc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlIGNvcmdpX3NuZF9kZXZkYXRhID0geworCS5tYWNoaW5lID0gJnNuZF9zb2NfbWFjaGluZV9jb3JnaSwKKwkucGxhdGZvcm0gPSAmcHhhMnh4X3NvY19wbGF0Zm9ybSwKKwkuY29kZWNfZGV2ID0gJnNvY19jb2RlY19kZXZfd204NzMxLAorCS5jb2RlY19kYXRhID0gJmNvcmdpX3dtODczMV9zZXR1cCwKK307CisKKworTWFjaGluZSBQb3dlciBNYXAKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBtYWNoaW5lIGRyaXZlciBjYW4gb3B0aW9uYWxseSBleHRlbmQgdGhlIGNvZGVjIHBvd2VyIG1hcCBhbmQgdG8gYmVjb21lIGFuCithdWRpbyBwb3dlciBtYXAgb2YgdGhlIGF1ZGlvIHN1YnN5c3RlbS4gVGhpcyBhbGxvd3MgZm9yIGF1dG9tYXRpYyBwb3dlciB1cC9kb3duCitvZiBzcGVha2VyL0hQIGFtcGxpZmllcnMsIGV0Yy4gQ29kZWMgcGlucyBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZSBtYWNoaW5lcyBqYWNrCitzb2NrZXRzIGluIHRoZSBtYWNoaW5lIGluaXQgZnVuY3Rpb24uIFNlZSBzb2MvcHhhL3NwaXR6LmMgYW5kIGRhcG0udHh0IGZvcgorZGV0YWlscy4KKworCitNYWNoaW5lIENvbnRyb2xzCistLS0tLS0tLS0tLS0tLS0tCisKK01hY2hpbmUgc3BlY2lmaWMgYXVkaW8gbWl4ZXIgY29udHJvbHMgY2FuIGJlIGFkZGVkIGluIHRoZSBkYWkgaW5pdCBmdW5jdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL292ZXJ2aWV3LnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2Mvb3ZlcnZpZXcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1M2M1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL292ZXJ2aWV3LnR4dApAQCAtMCwwICsxLDgzIEBACitBTFNBIFNvQyBMYXllcgorPT09PT09PT09PT09PT0KKworVGhlIG92ZXJhbGwgcHJvamVjdCBnb2FsIG9mIHRoZSBBTFNBIFN5c3RlbSBvbiBDaGlwIChBU29DKSBsYXllciBpcyB0byBwcm92aWRlCitiZXR0ZXIgQUxTQSBzdXBwb3J0IGZvciBlbWJlZGRlZCBzeXN0ZW0gb24gY2hpcCBwcm9jZXNvcnMgKGUuZy4gcHhhMnh4LCBhdTF4MDAsCitpTVgsIGV0YykgYW5kIHBvcnRhYmxlIGF1ZGlvIGNvZGVjcy4gQ3VycmVudGx5IHRoZXJlIGlzIHNvbWUgc3VwcG9ydCBpbiB0aGUKK2tlcm5lbCBmb3IgU29DIGF1ZGlvLCBob3dldmVyIGl0IGhhcyBzb21lIGxpbWl0YXRpb25zOi0KKworICAqIEN1cnJlbnRseSwgY29kZWMgZHJpdmVycyBhcmUgb2Z0ZW4gdGlnaHRseSBjb3VwbGVkIHRvIHRoZSB1bmRlcmx5aW5nIFNvQworICAgIGNwdS4gVGhpcyBpcyBub3QgaWRlYWwgYW5kIGxlYWRzIHRvIGNvZGUgZHVwbGljYXRpb24gaS5lLiBMaW51eCBub3cgaGFzIDQKKyAgICBkaWZmZXJlbnQgd204NzMxIGRyaXZlcnMgZm9yIDQgZGlmZmVyZW50IFNvQyBwbGF0Zm9ybXMuCisKKyAgKiBUaGVyZSBpcyBubyBzdGFuZGFyZCBtZXRob2QgdG8gc2lnbmFsIHVzZXIgaW5pdGlhdGVkIGF1ZGlvIGV2ZW50cy4KKyAgICBlLmcuIEhlYWRwaG9uZS9NaWMgaW5zZXJ0aW9uLCBIZWFkcGhvbmUvTWljIGRldGVjdGlvbiBhZnRlciBhbiBpbnNlcnRpb24KKyAgICBldmVudC4gVGhlc2UgYXJlIHF1aXRlIGNvbW1vbiBldmVudHMgb24gcG9ydGFibGUgZGV2aWNlcyBhbmQgb2Z0ZXIgcmVxdWlyZQorICAgIG1hY2hpbmUgc3BlY2lmaWMgY29kZSB0byByZSByb3V0ZSBhdWRpbywgZW5hYmxlIGFtcHMgZXRjIGFmdGVyIHN1Y2ggYW4gZXZlbnQuCisKKyAgKiBDdXJyZW50IGRyaXZlcnMgdGVuZCB0byBwb3dlciB1cCB0aGUgZW50aXJlIGNvZGVjIHdoZW4gcGxheWluZworICAgIChvciByZWNvcmRpbmcpIGF1ZGlvLiBUaGlzIGlzIGZpbmUgZm9yIGEgUEMsIGJ1dCB0ZW5kcyB0byB3YXN0ZSBhIGxvdCBvZgorICAgIHBvd2VyIG9uIHBvcnRhYmxlIGRldmljZXMuIFRoZXJlIGlzIGFsc28gbm8gc3VwcG9ydCBmb3Igc2F2aW5nIHBvd2VyIHZpYQorICAgIGNoYW5naW5nIGNvZGVjIG92ZXJzYW1wbGluZyByYXRlcywgYmlhcyBjdXJyZW50cywgZXRjLgorCisKK0FTb0MgRGVzaWduCis9PT09PT09PT09PQorCitUaGUgQVNvQyBsYXllciBpcyBkZXNpZ25lZCB0byBhZGRyZXNzIHRoZXNlIGlzc3VlcyBhbmQgcHJvdmlkZSB0aGUgZm9sbG93aW5nCitmZWF0dXJlcyA6LQorCisgICogQ29kZWMgaW5kZXBlbmRlbmNlLiBBbGxvd3MgcmV1c2Ugb2YgY29kZWMgZHJpdmVycyBvbiBvdGhlciBwbGF0Zm9ybXMKKyAgICBhbmQgbWFjaGluZXMuCisKKyAgKiBFYXN5IEkyUy9QQ00gYXVkaW8gaW50ZXJmYWNlIHNldHVwIGJldHdlZW4gY29kZWMgYW5kIFNvQy4gRWFjaCBTb0MgaW50ZXJmYWNlCisgICAgYW5kIGNvZGVjIHJlZ2lzdGVycyBpdCdzIGF1ZGlvIGludGVyZmFjZSBjYXBhYmlsaXRpZXMgd2l0aCB0aGUgY29yZSBhbmQgYXJlCisgICAgc3Vic2VxdWVudGx5IG1hdGNoZWQgYW5kIGNvbmZpZ3VyZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaHcgcGFyYW1zIGFyZSBrbm93bi4KKworICAqIER5bmFtaWMgQXVkaW8gUG93ZXIgTWFuYWdlbWVudCAoREFQTSkuIERBUE0gYXV0b21hdGljYWxseSBzZXRzIHRoZSBjb2RlYyB0bworICAgIGl0J3MgbWluaW11bSBwb3dlciBzdGF0ZSBhdCBhbGwgdGltZXMuIFRoaXMgaW5jbHVkZXMgcG93ZXJpbmcgdXAvZG93bgorICAgIGludGVybmFsIHBvd2VyIGJsb2NrcyBkZXBlbmRpbmcgb24gdGhlIGludGVybmFsIGNvZGVjIGF1ZGlvIHJvdXRpbmcgYW5kIGFueQorICAgIGFjdGl2ZSBzdHJlYW1zLgorCisgICogUG9wIGFuZCBjbGljayByZWR1Y3Rpb24uIFBvcHMgYW5kIGNsaWNrcyBjYW4gYmUgcmVkdWNlZCBieSBwb3dlcmluZyB0aGUKKyAgICBjb2RlYyB1cC9kb3duIGluIHRoZSBjb3JyZWN0IHNlcXVlbmNlIChpbmNsdWRpbmcgdXNpbmcgZGlnaXRhbCBtdXRlKS4gQVNvQworICAgIHNpZ25hbHMgdGhlIGNvZGVjIHdoZW4gdG8gY2hhbmdlIHBvd2VyIHN0YXRlcy4KKworICAqIE1hY2hpbmUgc3BlY2lmaWMgY29udHJvbHM6IEFsbG93IG1hY2hpbmVzIHRvIGFkZCBjb250cm9scyB0byB0aGUgc291bmQgY2FyZAorICAgIGUuZy4gdm9sdW1lIGNvbnRyb2wgZm9yIHNwZWFrZXIgYW1wLgorCitUbyBhY2hpZXZlIGFsbCB0aGlzLCBBU29DIGJhc2ljYWxseSBzcGxpdHMgYW4gZW1iZWRkZWQgYXVkaW8gc3lzdGVtIGludG8gMworY29tcG9uZW50cyA6LQorCisgICogQ29kZWMgZHJpdmVyOiBUaGUgY29kZWMgZHJpdmVyIGlzIHBsYXRmb3JtIGluZGVwZW5kZW50IGFuZCBjb250YWlucyBhdWRpbworICAgIGNvbnRyb2xzLCBhdWRpbyBpbnRlcmZhY2UgY2FwYWJpbGl0aWVzLCBjb2RlYyBkYXBtIGRlZmluaXRpb24gYW5kIGNvZGVjIElPCisgICAgZnVuY3Rpb25zLgorCisgICogUGxhdGZvcm0gZHJpdmVyOiBUaGUgcGxhdGZvcm0gZHJpdmVyIGNvbnRhaW5zIHRoZSBhdWRpbyBkbWEgZW5naW5lIGFuZCBhdWRpbworICAgIGludGVyZmFjZSBkcml2ZXJzIChlLmcuIEkyUywgQUM5NywgUENNKSBmb3IgdGhhdCBwbGF0Zm9ybS4KKworICAqIE1hY2hpbmUgZHJpdmVyOiBUaGUgbWFjaGluZSBkcml2ZXIgaGFuZGxlcyBhbnkgbWFjaGluZSBzcGVjaWZpYyBjb250cm9scyBhbmQKKyAgICBhdWRpbyBldmVudHMuIGkuZS4gdHVyaW5nIG9uIGFuIGFtcCBhdCBzdGFydCBvZiBwbGF5YmFjay4KKworCitEb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09CisKK1RoZSBkb2N1bWVudGF0aW9uIGlzIHNwaWx0IGludG8gdGhlIGZvbGxvd2luZyBzZWN0aW9uczotCisKK292ZXJ2aWV3LnR4dDogVGhpcyBmaWxlLgorCitjb2RlYy50eHQ6IENvZGVjIGRyaXZlciBpbnRlcm5hbHMuCisKK0RBSS50eHQ6IERlc2NyaXB0aW9uIG9mIERpZ2l0YWwgQXVkaW8gSW50ZXJmYWNlIHN0YW5kYXJkcyBhbmQgaG93IHRvIGNvbmZpZ3VyZQorYSBEQUkgd2l0aGluIHlvdXIgY29kZWMgYW5kIENQVSBEQUkgZHJpdmVycy4KKworZGFwbS50eHQ6IER5bmFtaWMgQXVkaW8gUG93ZXIgTWFuYWdlbWVudAorCitwbGF0Zm9ybS50eHQ6IFBsYXRmb3JtIGF1ZGlvIERNQSBhbmQgREFJLgorCittYWNoaW5lLnR4dDogTWFjaGluZSBkcml2ZXIgaW50ZXJuYWxzLgorCitwb3BfY2xpY2tzLnR4dDogSG93IHRvIG1pbmltaXNlIGF1ZGlvIGFydGlmYWN0cy4KKworY2xvY2tpbmcudHh0OiBBU29DIGNsb2NraW5nIGZvciBiZXN0IHBvd2VyIHBlcmZvcm1hbmNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvcGxhdGZvcm0udHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9wbGF0Zm9ybS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1YjE2ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvcGxhdGZvcm0udHh0CkBAIC0wLDAgKzEsNTggQEAKK0FTb0MgUGxhdGZvcm0gRHJpdmVyCis9PT09PT09PT09PT09PT09PT09PQorCitBbiBBU29DIHBsYXRmb3JtIGRyaXZlciBjYW4gYmUgZGl2aWRlZCBpbnRvIGF1ZGlvIERNQSBhbmQgU29DIERBSSBjb25maWd1cmF0aW9uCithbmQgY29udHJvbC4gVGhlIHBsYXRmb3JtIGRyaXZlcnMgb25seSB0YXJnZXQgdGhlIFNvQyBDUFUgYW5kIG11c3QgaGF2ZSBubyBib2FyZAorc3BlY2lmaWMgY29kZS4KKworQXVkaW8gRE1BCis9PT09PT09PT0KKworVGhlIHBsYXRmb3JtIERNQSBkcml2ZXIgb3B0aW9uYWxseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFsc2Egb3BlcmF0aW9uczotCisKKy8qIFNvQyBhdWRpbyBvcHMgKi8KK3N0cnVjdCBzbmRfc29jX29wcyB7CisJaW50ICgqc3RhcnR1cCkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopOworCXZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopOworCWludCAoKmh3X3BhcmFtcykoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICosIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqKTsKKwlpbnQgKCpod19mcmVlKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKik7CisJaW50ICgqcHJlcGFyZSkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopOworCWludCAoKnRyaWdnZXIpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqLCBpbnQpOworfTsKKworVGhlIHBsYXRmb3JtIGRyaXZlciBleHBvcnRzIGl0J3MgRE1BIGZ1bmN0aW9uYWlsdHkgdmlhIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtOi0KKworc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0geworCWNoYXIgKm5hbWU7CisKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpKTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkpOworCisJLyogcGNtIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLworCWludCAoKnBjbV9uZXcpKHN0cnVjdCBzbmRfY2FyZCAqLCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKiwgc3RydWN0IHNuZF9wY20gKik7CisJdm9pZCAoKnBjbV9mcmVlKShzdHJ1Y3Qgc25kX3BjbSAqKTsKKworCS8qIHBsYXRmb3JtIHN0cmVhbSBvcHMgKi8KKwlzdHJ1Y3Qgc25kX3BjbV9vcHMgKnBjbV9vcHM7Cit9OworCitQbGVhc2UgcmVmZXIgdG8gdGhlIGFsc2EgZHJpdmVyIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb2YgYXVkaW8gRE1BLgoraHR0cDovL3d3dy5hbHNhLXByb2plY3Qub3JnL35pd2FpL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIvYzQzNi5odG0KKworQW4gZXhhbXBsZSBETUEgZHJpdmVyIGlzIHNvYy9weGEvcHhhMnh4LXBjbS5jCisKKworU29DIERBSSBEcml2ZXJzCis9PT09PT09PT09PT09PT0KKworRWFjaCBTb0MgREFJIGRyaXZlciBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBmZWF0dXJlczotCisKKyAxKSBEaWdpdGFsIGF1ZGlvIGludGVyZmFjZSAoREFJKSBkZXNjcmlwdGlvbgorIDIpIERpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24KKyAzKSBQQ00ncyBkZXNjcmlwdGlvbgorIDQpIFN5c2NsayBjb25maWd1cmF0aW9uCisgNSkgU3VzcGVuZCBhbmQgcmVzdW1lIChvcHRpb25hbCkKKworUGxlYXNlIHNlZSBjb2RlYy50eHQgZm9yIGEgZGVzY3JpcHRpb24gb2YgaXRlbXMgMSAtIDQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL3BvcHNfY2xpY2tzLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvcG9wc19jbGlja3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjdlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL3BvcHNfY2xpY2tzLnR4dApAQCAtMCwwICsxLDUyIEBACitBdWRpbyBQb3BzIGFuZCBDbGlja3MKKz09PT09PT09PT09PT09PT09PT09PQorCitQb3BzIGFuZCBjbGlja3MgYXJlIHVud2FudGVkIGF1ZGlvIGFydGlmYWN0cyBjYXVzZWQgYnkgdGhlIHBvd2VyaW5nIHVwIGFuZCBkb3duCitvZiBjb21wb25lbnRzIHdpdGhpbiB0aGUgYXVkaW8gc3Vic3lzdGVtLiBUaGlzIGlzIG5vdGljYWJsZSBvbiBQQydzIHdoZW4gYW4KK2F1ZGlvIG1vZHVsZSBpcyBlaXRoZXIgbG9hZGVkIG9yIHVubG9hZGVkIChhdCBtb2R1bGUgbG9hZCB0aW1lIHRoZSBzb3VuZCBjYXJkIGlzCitwb3dlcmVkIHVwIGFuZCBjYXVzZXMgYSBwb3BwaW5nIG5vaXNlIG9uIHRoZSBzcGVha2VycykuCisKK1BvcHMgYW5kIGNsaWNrcyBjYW4gYmUgbW9yZSBmcmVxdWVudCBvbiBwb3J0YWJsZSBzeXN0ZW1zIHdpdGggREFQTS4gVGhpcyBpcworYmVjYXVzZSB0aGUgY29tcG9uZW50cyB3aXRoaW4gdGhlIHN1YnN5c3RlbSBhcmUgYmVpbmcgZHluYW1pY2FsbHkgcG93ZXJlZAorZGVwZW5kaW5nIG9uIHRoZSBhdWRpbyB1c2FnZSBhbmQgdGhpcyBjYW4gc3Vic2VxdWVudGx5IGNhdXNlIGEgc21hbGwgcG9wIG9yCitjbGljayBldmVyeSB0aW1lIGEgY29tcG9uZW50IHBvd2VyIHN0YXRlIGlzIGNoYW5nZWQuCisKKworTWluaW1pc2luZyBQbGF5YmFjayBQb3BzIGFuZCBDbGlja3MKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1BsYXliYWNrIHBvcHMgaW4gcG9ydGFibGUgYXVkaW8gc3Vic3lzdGVtcyBjYW5ub3QgYmUgY29tcGxldGVseSBlbGltaW5hdGVkIGF0bSwKK2hvd2V2ZXIgZnV0dXJlIGF1ZGlvIGNvZGVjIGhhcmR3YXJlIHdpbGwgaGF2ZSBiZXR0ZXIgcG9wIGFuZCBjbGljayBzdXByZXNzaW9uLgorUG9wcyBjYW4gYmUgcmVkdWNlZCB3aXRoaW4gcGxheWJhY2sgYnkgcG93ZXJpbmcgdGhlIGF1ZGlvIGNvbXBvbmVudHMgaW4gYQorc3BlY2lmaWMgb3JkZXIuIFRoaXMgb3JkZXIgaXMgZGlmZmVyZW50IGZvciBzdGFydHVwIGFuZCBzaHV0ZG93biBhbmQgZm9sbG93cworc29tZSBiYXNpYyBydWxlczotCisKKyBTdGFydHVwIE9yZGVyIDotIERBQyAtLT4gTWl4ZXJzIC0tPiBPdXRwdXQgUEdBIC0tPiBEaWdpdGFsIFVubXV0ZQorCisgU2h1dGRvd24gT3JkZXIgOi0gRGlnaXRhbCBNdXRlIC0tPiBPdXRwdXQgUEdBIC0tPiBNaXhlcnMgLS0+IERBQworCitUaGlzIGFzc3VtZXMgdGhhdCB0aGUgY29kZWMgUENNIG91dHB1dCBwYXRoIGZyb20gdGhlIERBQyBpcyB2aWEgYSBtaXhlciBhbmQgdGhlbgorYSBQR0EgKHByb2dyYW1tYWJsZSBnYWluIGFtcGxpZmllcikgYmVmb3JlIGJlaW5nIG91dHB1dCB0byB0aGUgc3BlYWtlcnMuCisKKworTWluaW1pc2luZyBDYXB0dXJlIFBvcHMgYW5kIENsaWNrcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDYXB0dXJlIGFydGlmYWN0cyBhcmUgc29tZXdoYXQgZWFzaWVyIHRvIGdldCByaWQgYXMgd2UgY2FuIGRlbGF5IGFjdGl2YXRpbmcgdGhlCitBREMgdW50aWwgYWxsIHRoZSBwb3BzIGhhdmUgb2NjdXJlZC4gVGhpcyBmb2xsb3dzIHNpbWlsYXIgcG93ZXIgcnVsZXMgdG8KK3BsYXliYWNrIGluIHRoYXQgY29tcG9uZW50cyBhcmUgcG93ZXJlZCBpbiBhIHNlcXVlbmNlIGRlcGVuZGluZyB1cG9uIHN0cmVhbQorc3RhcnR1cCBvciBzaHV0ZG93bi4KKworIFN0YXJ0dXAgT3JkZXIgLSBJbnB1dCBQR0EgLS0+IE1peGVycyAtLT4gQURDCisKKyBTaHV0ZG93biBPcmRlciAtIEFEQyAtLT4gTWl4ZXJzIC0tPiBJbnB1dCBQR0EKKworCitaaXBwZXIgTm9pc2UKKz09PT09PT09PT09PQorQW4gdW53YW50ZWQgemlwcGVyIG5vaXNlIGNhbiBvY2N1ciB3aXRoaW4gdGhlIGF1ZGlvIHBsYXliYWNrIG9yIGNhcHR1cmUgc3RyZWFtCit3aGVuIGEgdm9sdW1lIGNvbnRyb2wgaXMgY2hhbmdlZCBuZWFyIGl0cyBtYXhpbXVtIGdhaW4gdmFsdWUuIFRoZSB6aXBwZXIgbm9pc2UKK2lzIGhlYXJkIHdoZW4gdGhlIGdhaW4gaW5jcmVhc2Ugb3IgZGVjcmVhc2UgY2hhbmdlcyB0aGUgbWVhbiBhdWRpbyBzaWduYWwKK2FtcGxpdHVkZSB0b28gcXVpY2tseS4gSXQgY2FuIGJlIG1pbmltaXNlZCBieSBlbmFibGluZyB0aGUgemVybyBjcm9zcyBzZXR0aW5nCitmb3IgZWFjaCB2b2x1bWUgY29udHJvbC4gVGhlIFpDIGZvcmNlcyB0aGUgZ2FpbiBjaGFuZ2UgdG8gb2NjdXIgd2hlbiB0aGUgc2lnbmFsCitjcm9zc2VzIHRoZSB6ZXJvIGFtcGxpdHVkZSBsaW5lLgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCBmZTM1ZjNhLi5hNmMxZWJkIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMTExNCw3ICsxMTE0LDcgQEAKIERBVklDT00gRkFTVCBFVEhFUk5FVCAoRE1GRSkgTkVUV09SSyBEUklWRVIKIFA6CVRvYmlhcyBSaW5nc3Ryb20KIE06CXRvcmlAdW5oYXBweS5taW5lLm51Ci1MOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKIERPQ0JPT0sgRk9SIERPQ1VNRU5UQVRJT04KQEAgLTIzNjEsNyArMjM2MSw3IEBACiBORVRXT1JLSU5HIFtXSVJFTEVTU10KIFA6CUpvaG4gVy4gTGludmlsbGUKIE06CWxpbnZpbGxlQHR1eGRyaXZlci5jb20KLUw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9saW52aWxsZS93aXJlbGVzcy0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKQEAgLTMwMzcsNiArMzAzNywxMiBAQAogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnCiBTOglNYWludGFpbmVkCiAKK1NPVU5EIC0gU09DIExBWUVSIC8gRFlOQU1JQyBBVURJTyBQT1dFUiBNQU5BR0VNRU5UCitQOglMaWFtIEdpcmR3b29kCitNOglsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20KK0w6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZworUzoJU3VwcG9ydGVkCisKIFNQSSBTVUJTWVNURU0KIFA6CURhdmlkIEJyb3duZWxsCiBNOglkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0CkBAIC0zMjg3LDYgKzMyOTMsMTEgQEAKIFc6CWh0dHA6Ly92dHVuLnNvdXJjZWZvcmdlLm5ldC90dW4KIFM6CU1haW50YWluZWQKIAorVFVSQk9DSEFOTkVMIFNVQlNZU1RFTQorUDoJTWFjaWVqIFcuIFJvenlja2kKK006CW1hY3JvQGxpbnV4LW1pcHMub3JnCitTOglNYWludGFpbmVkCisKIFUxNC0zNEYgU0NTSSBEUklWRVIKIFA6CURhcmlvIEJhbGxhYmlvCiBNOgliYWxsYWJpb19kYXJpb0BlbWMuY29tCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvTWFrZWZpbGUKaW5kZXggZGY5NDk5NC4uOGUwOTkyMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL01ha2VmaWxlCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9NYWtlZmlsZQpAQCAtMSwyICsxLDIgQEAKLW9iai15CQkJCSs9IHNldHVwLm8gc3BpLm8gZmxhc2gubworb2JqLXkJCQkJKz0gc2V0dXAubyBmbGFzaC5vCiBvYmotJChDT05GSUdfQk9BUkRfQVRTVEsxMDAyKQkrPSBhdHN0azEwMDIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCmluZGV4IDMyYjM2MWYuLmQ0N2UzOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKQEAgLTgsMTcgKzgsMjQgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDMyYXA3MDAwLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcG9ydG11eC5oPgorCisKKyNkZWZpbmUJU1cyX0RFRkFVTFQJCS8qIE1NQ0kgYW5kIFVBUlRfQSBhdmFpbGFibGUgKi8KIAogc3RydWN0IGV0aF9hZGRyIHsKIAl1OCBhZGRyWzZdOwpAQCAtMjksNiArMzYsMTYgQEAKIHN0YXRpYyBzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBldGhfZGF0YVsyXTsKIGV4dGVybiBzdHJ1Y3QgbGNkY19wbGF0Zm9ybV9kYXRhIGF0c3RrMTAwMF9mYjBfZGF0YTsKIAorc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBzcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkubW9kYWxpYXMJPSAibHR2MzUwcXYiLAorCQkuY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKilHUElPX1BJTl9QQSg0KSwKKwkJLm1heF9zcGVlZF9oegk9IDE2MDAwMDAwLAorCQkuYnVzX251bQk9IDAsCisJCS5jaGlwX3NlbGVjdAk9IDEsCisJfSwKK307CisKIC8qCiAgKiBUaGUgbmV4dCB0d28gZnVuY3Rpb25zIHNob3VsZCBnbyBhd2F5IGFzIHRoZSBib290IGxvYWRlciBpcwogICogc3VwcG9zZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbWFjYiBhZGRyZXNzIHJlZ2lzdGVycyB3aXRoIGEgdmFsaWQKQEAgLTg2LDIzICsxMDMsNTMgQEAKIAogdm9pZCBfX2luaXQgc2V0dXBfYm9hcmQodm9pZCkKIHsKLQlhdDMyX21hcF91c2FydCgxLCAwKTsJLyogL2Rldi90dHlTMCAqLwotCWF0MzJfbWFwX3VzYXJ0KDIsIDEpOwkvKiAvZGV2L3R0eVMxICovCi0JYXQzMl9tYXBfdXNhcnQoMywgMik7CS8qIC9kZXYvdHR5UzIgKi8KKyNpZmRlZglTVzJfREVGQVVMVAorCWF0MzJfbWFwX3VzYXJ0KDEsIDApOwkvKiBVU0FSVCAxL0E6IC9kZXYvdHR5UzAsIERCOSAqLworI2Vsc2UKKwlhdDMyX21hcF91c2FydCgwLCAxKTsJLyogVVNBUlQgMC9COiAvZGV2L3R0eVMxLCBJUkRBICovCisjZW5kaWYKKwkvKiBVU0FSVCAyL3VudXNlZDogZXhwYW5zaW9uIGNvbm5lY3RvciAqLworCWF0MzJfbWFwX3VzYXJ0KDMsIDIpOwkvKiBVU0FSVCAzL0M6IC9kZXYvdHR5UzIsIERCOSAqLwogCiAJYXQzMl9zZXR1cF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgYXRzdGsxMDAyX2luaXQodm9pZCkKIHsKKwkvKgorCSAqIEFUU1RLMTAwMCB1c2VzIDMyLWJpdCBTRFJBTSBpbnRlcmZhY2UuIFJlc2VydmUgdGhlCisJICogU0RSQU0tc3BlY2lmaWMgcGlucyBzbyB0aGF0IG5vYm9keSBtZXNzZXMgd2l0aCB0aGVtLgorCSAqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMCkpOwkvKiBEQVRBWzE2XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMSkpOwkvKiBEQVRBWzE3XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMikpOwkvKiBEQVRBWzE4XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMykpOwkvKiBEQVRBWzE5XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNCkpOwkvKiBEQVRBWzIwXQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNSkpOwkvKiBEQVRBWzIxXQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNikpOwkvKiBEQVRBWzIyXQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNykpOwkvKiBEQVRBWzIzXQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoOCkpOwkvKiBEQVRBWzI0XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoOSkpOwkvKiBEQVRBWzI1XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTApKTsJLyogREFUQVsyNl0JKi8KKwlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDExKSk7CS8qIERBVEFbMjddCSovCisJYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMikpOwkvKiBEQVRBWzI4XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTMpKTsJLyogREFUQVsyOV0JKi8KKwlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDE0KSk7CS8qIERBVEFbMzBdCSovCisJYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxNSkpOwkvKiBEQVRBWzMxXQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMjYpKTsJLyogU0RDUwkJKi8KKwogCWF0MzJfYWRkX3N5c3RlbV9kZXZpY2VzKCk7CiAKKyNpZmRlZglTVzJfREVGQVVMVAogCWF0MzJfYWRkX2RldmljZV91c2FydCgwKTsKKyNlbHNlCiAJYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KDEpOworI2VuZGlmCiAJYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KDIpOwogCiAJc2V0X2h3X2FkZHIoYXQzMl9hZGRfZGV2aWNlX2V0aCgwLCAmZXRoX2RhdGFbMF0pKTsKIAorCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHNwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKHNwaV9ib2FyZF9pbmZvKSk7CiAJYXQzMl9hZGRfZGV2aWNlX3NwaSgwKTsKIAlhdDMyX2FkZF9kZXZpY2VfbGNkYygwLCAmYXRzdGsxMDAwX2ZiMF9kYXRhKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL3NwaS5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL3NwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njc3MjZjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9zcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBBVFNUSzEwMDAgU1BJIGRldmljZXMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgQXRtZWwgTm9yd2F5Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLQotc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBzcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkubW9kYWxpYXMJPSAibHR2MzUwcXYiLAotCQkubWF4X3NwZWVkX2h6CT0gMTYwMDAwMDAsCi0JCS5idXNfbnVtCT0gMCwKLQkJLmNoaXBfc2VsZWN0CT0gMSwKLQl9LAotfTsKLQotc3RhdGljIGludCBib2FyZF9pbml0X3NwaSh2b2lkKQotewotCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHNwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKHNwaV9ib2FyZF9pbmZvKSk7Ci0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKGJvYXJkX2luaXRfc3BpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL2NwdS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMKaW5kZXggMzQyNDUyYi4uMmU3MmZkMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9pcnEuYyBiL2FyY2gvYXZyMzIva2VybmVsL2lycS5jCmluZGV4IDg1NmYzNTQuLmZkMzExMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL2lycS5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL2lycS5jCkBAIC01Nyw2ICs1Nyw3IEBACiAJCXNlcV9wcmludGYocCwgIiUzZDogIiwgaSk7CiAJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQogCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9jcHUoY3B1KS5pcnFzW2ldKTsKKwkJc2VxX3ByaW50ZihwLCAiICU4cyIsIGlycV9kZXNjW2ldLmNoaXAtPm5hbWUgPyA6ICItIik7CiAJCXNlcV9wcmludGYocCwgIiAgJXMiLCBhY3Rpb24tPm5hbWUpOwogCQlmb3IgKGFjdGlvbiA9IGFjdGlvbi0+bmV4dDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCiAJCQlzZXFfcHJpbnRmKHAsICIsICVzIiwgYWN0aW9uLT5uYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3NldHVwLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9zZXR1cC5jCmluZGV4IGEzNDIxMTYuLmM2NzM0YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvc2V0dXAuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC0xNzQsOCArMTc1LDcgQEAKIAkgKiBDb3B5IHRoZSBkYXRhIHNvIHRoZSBib290bWVtIGluaXQgY29kZSBkb2Vzbid0IG5lZWQgdG8gY2FyZQogCSAqIGFib3V0IGl0LgogCSAqLwotCWlmIChtZW1fcmFuZ2VfbmV4dF9mcmVlID49Ci0JICAgIChzaXplb2YobWVtX3JhbmdlX2NhY2hlKSAvIHNpemVvZihtZW1fcmFuZ2VfY2FjaGVbMF0pKSkKKwlpZiAobWVtX3JhbmdlX25leHRfZnJlZSA+PSBBUlJBWV9TSVpFKG1lbV9yYW5nZV9jYWNoZSkpCiAJCXBhbmljKCJQaHlzaWNhbCBtZW1vcnkgbWFwIHRvbyBjb21wbGV4IVxuIik7CiAKIAluZXcgPSAmbWVtX3JhbmdlX2NhY2hlW21lbV9yYW5nZV9uZXh0X2ZyZWUrK107CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2xpYi9saWJnY2MuaCBiL2FyY2gvYXZyMzIvbGliL2xpYmdjYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTA5MWI1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXZyMzIvbGliL2xpYmdjYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgZnVuY3Rpb25zICdib3Jyb3dlZCcgZnJvbSBnY2MtMy40LjMgKi8KLQotI2RlZmluZSBCSVRTX1BFUl9VTklUCTgKLQotdHlwZWRlZgkJIGludCBRSXR5cGUJX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFFJKSkpOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVVFJdHlwZQlfX2F0dHJpYnV0ZV9fICgobW9kZSAoUUkpKSk7Ci10eXBlZGVmCQkgaW50IEhJdHlwZQlfX2F0dHJpYnV0ZV9fICgobW9kZSAoSEkpKSk7Ci10eXBlZGVmIHVuc2lnbmVkIGludCBVSEl0eXBlCV9fYXR0cmlidXRlX18gKChtb2RlIChISSkpKTsKLXR5cGVkZWYgCSBpbnQgU0l0eXBlCV9fYXR0cmlidXRlX18gKChtb2RlIChTSSkpKTsKLXR5cGVkZWYgdW5zaWduZWQgaW50IFVTSXR5cGUJX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNJKSkpOwotdHlwZWRlZgkJIGludCBESXR5cGUJX19hdHRyaWJ1dGVfXyAoKG1vZGUgKERJKSkpOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVURJdHlwZQlfX2F0dHJpYnV0ZV9fICgobW9kZSAoREkpKSk7Ci10eXBlZGVmIAlmbG9hdCBTRnR5cGUJX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNGKSkpOwotdHlwZWRlZgkJZmxvYXQgREZ0eXBlCV9fYXR0cmlidXRlX18gKChtb2RlIChERikpKTsKLXR5cGVkZWYgaW50IHdvcmRfdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoX193b3JkX18pKSk7Ci0KLSNkZWZpbmUgV19UWVBFX1NJWkUgKDQgKiBCSVRTX1BFUl9VTklUKQotI2RlZmluZSBXdHlwZQlTSXR5cGUKLSNkZWZpbmUgVVd0eXBlCVVTSXR5cGUKLSNkZWZpbmUgSFd0eXBlCVNJdHlwZQotI2RlZmluZSBVSFd0eXBlCVVTSXR5cGUKLSNkZWZpbmUgRFd0eXBlCURJdHlwZQotI2RlZmluZSBVRFd0eXBlCVVESXR5cGUKLSNkZWZpbmUgX19OVyhhLGIpCV9fICMjIGEgIyMgc2kgIyMgYgotI2RlZmluZSBfX05EVyhhLGIpCV9fICMjIGEgIyMgZGkgIyMgYgotCi1zdHJ1Y3QgRFdzdHJ1Y3Qge1d0eXBlIGhpZ2gsIGxvdzt9OwotCi10eXBlZGVmIHVuaW9uCi17Ci0gIHN0cnVjdCBEV3N0cnVjdCBzOwotICBEV3R5cGUgbGw7Ci19IERXdW5pb247CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2xpYi9sb25nbG9uZy5oIGIvYXJjaC9hdnIzMi9saWIvbG9uZ2xvbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1ZTM2OS4uMDAwMDAwMAotLS0gYS9hcmNoL2F2cjMyL2xpYi9sb25nbG9uZy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyogbG9uZ2xvbmcuaCAtLSBkZWZpbml0aW9ucyBmb3IgbWl4ZWQgc2l6ZSAzMi82NCBiaXQgYXJpdGhtZXRpYy4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZGVmaW5pdGlvbiBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci0gICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBkZWZpbml0aW9uIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBCb3Jyb3dlZCBmcm9tIGdjYy0zLjQuMyAqLwotCi0jZGVmaW5lIF9fQklUUzQgKFdfVFlQRV9TSVpFIC8gNCkKLSNkZWZpbmUgX19sbF9CICgoVVd0eXBlKSAxIDw8IChXX1RZUEVfU0laRSAvIDIpKQotI2RlZmluZSBfX2xsX2xvd3BhcnQodCkgKChVV3R5cGUpICh0KSAmIChfX2xsX0IgLSAxKSkKLSNkZWZpbmUgX19sbF9oaWdocGFydCh0KSAoKFVXdHlwZSkgKHQpID4+IChXX1RZUEVfU0laRSAvIDIpKQotCi0jZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpICgoY291bnQpID0gX19idWlsdGluX2Nseih4KSkKLQotI2RlZmluZSBfX3VkaXZfcXJubmRfYyhxLCByLCBuMSwgbjAsIGQpIFwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBVV3R5cGUgX19kMSwgX19kMCwgX19xMSwgX19xMDsJCQkJCVwKLSAgICBVV3R5cGUgX19yMSwgX19yMCwgX19tOwkJCQkJCVwKLSAgICBfX2QxID0gX19sbF9oaWdocGFydCAoZCk7CQkJCQkJXAotICAgIF9fZDAgPSBfX2xsX2xvd3BhcnQgKGQpOwkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICBfX3IxID0gKG4xKSAlIF9fZDE7CQkJCQkJCVwKLSAgICBfX3ExID0gKG4xKSAvIF9fZDE7CQkJCQkJCVwKLSAgICBfX20gPSAoVVd0eXBlKSBfX3ExICogX19kMDsJCQkJCQlcCi0gICAgX19yMSA9IF9fcjEgKiBfX2xsX0IgfCBfX2xsX2hpZ2hwYXJ0IChuMCk7CQkJCVwKLSAgICBpZiAoX19yMSA8IF9fbSkJCQkJCQkJXAotICAgICAgewkJCQkJCQkJCVwKLQlfX3ExLS0sIF9fcjEgKz0gKGQpOwkJCQkJCVwKLQlpZiAoX19yMSA+PSAoZCkpIC8qIGkuZS4gd2UgZGlkbid0IGdldCBjYXJyeSB3aGVuIGFkZGluZyB0byBfX3IxICovXAotCSAgaWYgKF9fcjEgPCBfX20pCQkJCQkJXAotCSAgICBfX3ExLS0sIF9fcjEgKz0gKGQpOwkJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICBfX3IxIC09IF9fbTsJCQkJCQkJXAotCQkJCQkJCQkJXAotICAgIF9fcjAgPSBfX3IxICUgX19kMTsJCQkJCQkJXAotICAgIF9fcTAgPSBfX3IxIC8gX19kMTsJCQkJCQkJXAotICAgIF9fbSA9IChVV3R5cGUpIF9fcTAgKiBfX2QwOwkJCQkJCVwKLSAgICBfX3IwID0gX19yMCAqIF9fbGxfQiB8IF9fbGxfbG93cGFydCAobjApOwkJCQlcCi0gICAgaWYgKF9fcjAgPCBfX20pCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0JX19xMC0tLCBfX3IwICs9IChkKTsJCQkJCQlcCi0JaWYgKF9fcjAgPj0gKGQpKQkJCQkJCVwKLQkgIGlmIChfX3IwIDwgX19tKQkJCQkJCVwKLQkgICAgX19xMC0tLCBfX3IwICs9IChkKTsJCQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0gICAgX19yMCAtPSBfX207CQkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICAocSkgPSAoVVd0eXBlKSBfX3ExICogX19sbF9CIHwgX19xMDsJCQkJXAotICAgIChyKSA9IF9fcjA7CQkJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgdWRpdl9xcm5uZCBfX3VkaXZfcXJubmRfYwotCi0jZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAotICBkbyB7CQkJCQkJCQkJXAotICAgIFVXdHlwZSBfX3g7CQkJCQkJCQlcCi0gICAgX194ID0gKGFsKSAtIChibCk7CQkJCQkJCVwKLSAgICAoc2gpID0gKGFoKSAtIChiaCkgLSAoX194ID4gKGFsKSk7CQkJCQlcCi0gICAgKHNsKSA9IF9feDsJCQkJCQkJCVwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KQkJCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBVV3R5cGUgX194MCwgX194MSwgX194MiwgX194MzsJCQkJCVwKLSAgICBVSFd0eXBlIF9fdWwsIF9fdmwsIF9fdWgsIF9fdmg7CQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgX191bCA9IF9fbGxfbG93cGFydCAodSk7CQkJCQkJXAotICAgIF9fdWggPSBfX2xsX2hpZ2hwYXJ0ICh1KTsJCQkJCQlcCi0gICAgX192bCA9IF9fbGxfbG93cGFydCAodik7CQkJCQkJXAotICAgIF9fdmggPSBfX2xsX2hpZ2hwYXJ0ICh2KTsJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgX194MCA9IChVV3R5cGUpIF9fdWwgKiBfX3ZsOwkJCQkJXAotICAgIF9feDEgPSAoVVd0eXBlKSBfX3VsICogX192aDsJCQkJCVwKLSAgICBfX3gyID0gKFVXdHlwZSkgX191aCAqIF9fdmw7CQkJCQlcCi0gICAgX194MyA9IChVV3R5cGUpIF9fdWggKiBfX3ZoOwkJCQkJXAotCQkJCQkJCQkJXAotICAgIF9feDEgKz0gX19sbF9oaWdocGFydCAoX194MCk7LyogdGhpcyBjYW4ndCBnaXZlIGNhcnJ5ICovCQlcCi0gICAgX194MSArPSBfX3gyOwkJLyogYnV0IHRoaXMgaW5kZWVkIGNhbiAqLwkJXAotICAgIGlmIChfX3gxIDwgX194MikJCS8qIGRpZCB3ZSBnZXQgaXQ/ICovCQkJXAotICAgICAgX194MyArPSBfX2xsX0I7CQkvKiB5ZXMsIGFkZCBpdCBpbiB0aGUgcHJvcGVyIHBvcy4gICovCVwKLQkJCQkJCQkJCVwKLSAgICAodzEpID0gX194MyArIF9fbGxfaGlnaHBhcnQgKF9feDEpOwkJCQkJXAotICAgICh3MCkgPSBfX2xsX2xvd3BhcnQgKF9feDEpICogX19sbF9CICsgX19sbF9sb3dwYXJ0IChfX3gwKTsJCVwKLSAgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL01ha2VmaWxlCmluZGV4IGY2MmViNjkuLmIyMWJlYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvTWFrZWZpbGUKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9NYWtlZmlsZQpAQCAtMSwyICsxLDIgQEAKLW9iai15CQkJCSs9IGF0MzJhcC5vIGNsb2NrLm8gcGlvLm8gaW50Yy5vIGV4dGludC5vIGhzbWMubworb2JqLXkJCQkJKz0gYXQzMmFwLm8gY2xvY2subyBpbnRjLm8gZXh0aW50Lm8gcGlvLm8gaHNtYy5vCiBvYmotJChDT05GSUdfQ1BVX0FUMzJBUDcwMDApCSs9IGF0MzJhcDcwMDAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMDAuYwppbmRleCA0OGY0ZWYzLi5jMWU0NzdlIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMDAuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMDAuYwpAQCAtNDk2LDkgKzQ5NiwxNiBAQAogREVGSU5FX0RFVihwaW8sIDMpOwogREVWX0NMSyhtY2ssIHBpbzMsIHBiYSwgMTMpOwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBpbzRfcmVzb3VyY2VbXSA9IHsKKwlQQk1FTSgweGZmZTAzODAwKSwKKwlJUlEoMTcpLAorfTsKK0RFRklORV9ERVYocGlvLCA0KTsKK0RFVl9DTEsobWNrLCBwaW80LCBwYmEsIDE0KTsKKwogdm9pZCBfX2luaXQgYXQzMl9hZGRfc3lzdGVtX2RldmljZXModm9pZCkKIHsKLQlzeXN0ZW1fbWFuYWdlci5laW1fZmlyc3RfaXJxID0gTlJfSU5URVJOQUxfSVJRUzsKKwlzeXN0ZW1fbWFuYWdlci5laW1fZmlyc3RfaXJxID0gRUlNX0lSUV9CQVNFOwogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDMyX3NtX2RldmljZSk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDMyX2ludGMwX2RldmljZSk7CkBAIC01MDksNiArNTE2LDcgQEAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBpbzFfZGV2aWNlKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBpbzJfZGV2aWNlKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBpbzNfZGV2aWNlKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBpbzRfZGV2aWNlKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUyMSw3ICs1MjksNyBAQAogfTsKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXRtZWxfdXNhcnQwX3Jlc291cmNlW10gPSB7CiAJUEJNRU0oMHhmZmUwMGMwMCksCi0JSVJRKDcpLAorCUlSUSg2KSwKIH07CiBERUZJTkVfREVWX0RBVEEoYXRtZWxfdXNhcnQsIDApOwogREVWX0NMSyh1c2FydCwgYXRtZWxfdXNhcnQwLCBwYmEsIDQpOwpAQCAtNTgzLDcgKzU5MSw3IEBACiAJc2VsZWN0X3BlcmlwaGVyYWwoUEIoMTcpLCBQRVJJUEhfQiwgMCk7CS8qIFRYRAkqLwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXQzMl91c2FydHNbNF07CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0ZGF0YSBhdDMyX3VzYXJ0c1s0XTsKIAogdm9pZCBfX2luaXQgYXQzMl9tYXBfdXNhcnQodW5zaWduZWQgaW50IGh3X2lkLCB1bnNpZ25lZCBpbnQgbGluZSkKIHsKQEAgLTcyOCwxMiArNzM2LDE5IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIFNQSQogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3BpMF9yZXNvdXJjZVtdID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdG1lbF9zcGkwX3Jlc291cmNlW10gPSB7CiAJUEJNRU0oMHhmZmUwMDAwMCksCiAJSVJRKDMpLAogfTsKLURFRklORV9ERVYoc3BpLCAwKTsKLURFVl9DTEsobWNrLCBzcGkwLCBwYmEsIDApOworREVGSU5FX0RFVihhdG1lbF9zcGksIDApOworREVWX0NMSyhzcGlfY2xrLCBhdG1lbF9zcGkwLCBwYmEsIDApOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGF0bWVsX3NwaTFfcmVzb3VyY2VbXSA9IHsKKwlQQk1FTSgweGZmZTAwNDAwKSwKKwlJUlEoNCksCit9OworREVGSU5FX0RFVihhdG1lbF9zcGksIDEpOworREVWX0NMSyhzcGlfY2xrLCBhdG1lbF9zcGkxLCBwYmEsIDEpOwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgYXQzMl9hZGRfZGV2aWNlX3NwaSh1bnNpZ25lZCBpbnQgaWQpCiB7CkBAIC03NDEsMTMgKzc1NiwzMyBAQAogCiAJc3dpdGNoIChpZCkgewogCWNhc2UgMDoKLQkJcGRldiA9ICZzcGkwX2RldmljZTsKKwkJcGRldiA9ICZhdG1lbF9zcGkwX2RldmljZTsKIAkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoMCksICBQRVJJUEhfQSwgMCk7CS8qIE1JU08JICovCiAJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDEpLCAgUEVSSVBIX0EsIDApOwkvKiBNT1NJCSAqLwogCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgyKSwgIFBFUklQSF9BLCAwKTsJLyogU0NLCSAqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgzKSwgIFBFUklQSF9BLCAwKTsJLyogTlBDUzAgKi8KLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoNCksICBQRVJJUEhfQSwgMCk7CS8qIE5QQ1MxICovCi0JCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDUpLCAgUEVSSVBIX0EsIDApOwkvKiBOUENTMiAqLworCisJCS8qIE5QQ1NbMjowXSAqLworCQlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BBKDMpLAorCQkJCSBBVDMyX0dQSU9GX09VVFBVVCB8IEFUMzJfR1BJT0ZfSElHSCk7CisJCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEEoNCksCisJCQkJIEFUMzJfR1BJT0ZfT1VUUFVUIHwgQVQzMl9HUElPRl9ISUdIKTsKKwkJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQSg1KSwKKwkJCQkgQVQzMl9HUElPRl9PVVRQVVQgfCBBVDMyX0dQSU9GX0hJR0gpOworCQlicmVhazsKKworCWNhc2UgMToKKwkJcGRldiA9ICZhdG1lbF9zcGkxX2RldmljZTsKKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEIoMCksICBQRVJJUEhfQiwgMCk7CS8qIE1JU08gICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDEpLCAgUEVSSVBIX0IsIDApOwkvKiBNT1NJICAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQig1KSwgIFBFUklQSF9CLCAwKTsJLyogU0NLICAgKi8KKworCQkvKiBOUENTWzI6MF0gKi8KKwkJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQigyKSwKKwkJCQkgQVQzMl9HUElPRl9PVVRQVVQgfCBBVDMyX0dQSU9GX0hJR0gpOworCQlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BCKDMpLAorCQkJCSBBVDMyX0dQSU9GX09VVFBVVCB8IEFUMzJfR1BJT0ZfSElHSCk7CisJCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEIoNCksCisJCQkJIEFUMzJfR1BJT0ZfT1VUUFVUIHwgQVQzMl9HUElPRl9ISUdIKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtODYwLDYgKzg5NSw3IEBACiAJJnBpbzFfbWNrLAogCSZwaW8yX21jaywKIAkmcGlvM19tY2ssCisJJnBpbzRfbWNrLAogCSZhdG1lbF91c2FydDBfdXNhcnQsCiAJJmF0bWVsX3VzYXJ0MV91c2FydCwKIAkmYXRtZWxfdXNhcnQyX3VzYXJ0LApAQCAtODY4LDcgKzkwNCw4IEBACiAJJm1hY2IwX3BjbGssCiAJJm1hY2IxX2hjbGssCiAJJm1hY2IxX3BjbGssCi0JJnNwaTBfbWNrLAorCSZhdG1lbF9zcGkwX3NwaV9jbGssCisJJmF0bWVsX3NwaTFfc3BpX2NsaywKIAkmbGNkYzBfaGNsaywKIAkmbGNkYzBfcGl4Y2xrLAogfTsKQEAgLTg4MCw2ICs5MTcsNyBAQAogCWF0MzJfaW5pdF9waW8oJnBpbzFfZGV2aWNlKTsKIAlhdDMyX2luaXRfcGlvKCZwaW8yX2RldmljZSk7CiAJYXQzMl9pbml0X3BpbygmcGlvM19kZXZpY2UpOworCWF0MzJfaW5pdF9waW8oJnBpbzRfZGV2aWNlKTsKIH0KIAogdm9pZCBfX2luaXQgYXQzMl9jbG9ja19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2V4dGludC5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9leHRpbnQuYwppbmRleCBiNTkyNzJlLi40YTYwZWNjIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2V4dGludC5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvZXh0aW50LmMKQEAgLTU1LDIwICs1NSwxMSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKKwlmbG93X3R5cGUgJj0gSVJRX1RZUEVfU0VOU0VfTUFTSzsKIAlpZiAoZmxvd190eXBlID09IElSUV9UWVBFX05PTkUpCiAJCWZsb3dfdHlwZSA9IElSUV9UWVBFX0xFVkVMX0xPVzsKIAogCWRlc2MgPSAmaXJxX2Rlc2NbaXJxXTsKLQlkZXNjLT5zdGF0dXMgJj0gfihJUlFfVFlQRV9TRU5TRV9NQVNLIHwgSVJRX0xFVkVMKTsKLQlkZXNjLT5zdGF0dXMgfD0gZmxvd190eXBlICYgSVJRX1RZUEVfU0VOU0VfTUFTSzsKLQotCWlmIChmbG93X3R5cGUgJiAoSVJRX1RZUEVfTEVWRUxfTE9XIHwgSVJRX1RZUEVfTEVWRUxfSElHSCkpIHsKLQkJZGVzYy0+c3RhdHVzIHw9IElSUV9MRVZFTDsKLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7Ci0JfSBlbHNlIHsKLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmc20tPmxvY2ssIGZsYWdzKTsKIAogCW1vZGUgPSBzbV9yZWFkbChzbSwgRUlNX01PREUpOwpAQCAtOTcsOSArODgsMTYgQEAKIAkJYnJlYWs7CiAJfQogCi0Jc21fd3JpdGVsKHNtLCBFSU1fTU9ERSwgbW9kZSk7Ci0Jc21fd3JpdGVsKHNtLCBFSU1fRURHRSwgZWRnZSk7Ci0Jc21fd3JpdGVsKHNtLCBFSU1fTEVWRUwsIGxldmVsKTsKKwlpZiAocmV0ID09IDApIHsKKwkJc21fd3JpdGVsKHNtLCBFSU1fTU9ERSwgbW9kZSk7CisJCXNtX3dyaXRlbChzbSwgRUlNX0VER0UsIGVkZ2UpOworCQlzbV93cml0ZWwoc20sIEVJTV9MRVZFTCwgbGV2ZWwpOworCisJCWlmIChmbG93X3R5cGUgJiAoSVJRX1RZUEVfTEVWRUxfTE9XIHwgSVJRX1RZUEVfTEVWRUxfSElHSCkpCisJCQlmbG93X3R5cGUgfD0gSVJRX0xFVkVMOworCQlkZXNjLT5zdGF0dXMgJj0gfihJUlFfVFlQRV9TRU5TRV9NQVNLIHwgSVJRX0xFVkVMKTsKKwkJZGVzYy0+c3RhdHVzIHw9IGZsb3dfdHlwZTsKKwl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbS0+bG9jaywgZmxhZ3MpOwogCkBAIC0xMjIsOCArMTIwLDYgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXR1cywgcGVuZGluZzsKIAl1bnNpZ25lZCBpbnQgaSwgZXh0X2lycTsKIAotCXNwaW5fbG9jaygmc20tPmxvY2spOwotCiAJc3RhdHVzID0gc21fcmVhZGwoc20sIEVJTV9JU1IpOwogCXBlbmRpbmcgPSBzdGF0dXMgJiBzbV9yZWFkbChzbSwgRUlNX0lNUik7CiAKQEAgLTEzMywxMCArMTI5LDExIEBACiAKIAkJZXh0X2lycSA9IGkgKyBzbS0+ZWltX2ZpcnN0X2lycTsKIAkJZXh0X2Rlc2MgPSBpcnFfZGVzYyArIGV4dF9pcnE7Ci0JCWV4dF9kZXNjLT5oYW5kbGVfaXJxKGV4dF9pcnEsIGV4dF9kZXNjKTsKKwkJaWYgKGV4dF9kZXNjLT5zdGF0dXMgJiBJUlFfTEVWRUwpCisJCQloYW5kbGVfbGV2ZWxfaXJxKGV4dF9pcnEsIGV4dF9kZXNjKTsKKwkJZWxzZQorCQkJaGFuZGxlX2VkZ2VfaXJxKGV4dF9pcnEsIGV4dF9kZXNjKTsKIAl9Ci0KLQlzcGluX3VubG9jaygmc20tPmxvY2spOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBlaW1faW5pdCh2b2lkKQpAQCAtMTY4LDggKzE2NSw5IEBACiAJc20tPmVpbV9jaGlwID0gJmVpbV9jaGlwOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgeworCQkvKiBOT1RFIHRoZSBoYW5kbGVyIHdlIHNldCBoZXJlIGlzIGlnbm9yZWQgYnkgdGhlIGRlbXV4ICovCiAJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihzbS0+ZWltX2ZpcnN0X2lycSArIGksICZlaW1fY2hpcCwKLQkJCQkJIGhhbmRsZV9lZGdlX2lycSk7CisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9jaGlwX2RhdGEoc20tPmVpbV9maXJzdF9pcnEgKyBpLCBzbSk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYwppbmRleCBmMTI4MGVkLi45YmE1NjU0IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMKQEAgLTEyLDcgKzEyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9wb3J0bXV4Lmg+CkBAIC0yNiw3ICsyOCw4IEBACiAJY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJdTMyIHBpbm11eF9tYXNrOwotCWNoYXIgbmFtZVszMl07CisJdTMyIGdwaW9fbWFzazsKKwljaGFyIG5hbWVbOF07CiB9OwogCiBzdGF0aWMgc3RydWN0IHBpb19kZXZpY2UgcGlvX2RldltNQVhfTlJfUElPX0RFVklDRVNdOwpAQCAtNzYsNiArNzksOSBAQAogCWlmICghKGZsYWdzICYgQVQzMl9HUElPRl9QVUxMVVApKQogCQlwaW9fd3JpdGVsKHBpbywgUFVEUiwgbWFzayk7CiAKKwkvKiBncGlvX3JlcXVlc3QgTk9UIGFsbG93ZWQgKi8KKwlzZXRfYml0KHBpbl9pbmRleCwgJnBpby0+Z3Bpb19tYXNrKTsKKwogCXJldHVybjsKIAogZmFpbDoKQEAgLTk5LDE5ICsxMDUsMjkgQEAKIAkJZ290byBmYWlsOwogCX0KIAotCXBpb193cml0ZWwocGlvLCBQVUVSLCBtYXNrKTsKLQlpZiAoZmxhZ3MgJiBBVDMyX0dQSU9GX0hJR0gpCi0JCXBpb193cml0ZWwocGlvLCBTT0RSLCBtYXNrKTsKLQllbHNlCi0JCXBpb193cml0ZWwocGlvLCBDT0RSLCBtYXNrKTsKLQlpZiAoZmxhZ3MgJiBBVDMyX0dQSU9GX09VVFBVVCkKKwlpZiAoZmxhZ3MgJiBBVDMyX0dQSU9GX09VVFBVVCkgeworCQlpZiAoZmxhZ3MgJiBBVDMyX0dQSU9GX0hJR0gpCisJCQlwaW9fd3JpdGVsKHBpbywgU09EUiwgbWFzayk7CisJCWVsc2UKKwkJCXBpb193cml0ZWwocGlvLCBDT0RSLCBtYXNrKTsKKwkJcGlvX3dyaXRlbChwaW8sIFBVRFIsIG1hc2spOwogCQlwaW9fd3JpdGVsKHBpbywgT0VSLCBtYXNrKTsKLQllbHNlCisJfSBlbHNlIHsKKwkJaWYgKGZsYWdzICYgQVQzMl9HUElPRl9QVUxMVVApCisJCQlwaW9fd3JpdGVsKHBpbywgUFVFUiwgbWFzayk7CisJCWVsc2UKKwkJCXBpb193cml0ZWwocGlvLCBQVURSLCBtYXNrKTsKKwkJaWYgKGZsYWdzICYgQVQzMl9HUElPRl9ERUdMSVRDSCkKKwkJCXBpb193cml0ZWwocGlvLCBJRkVSLCBtYXNrKTsKKwkJZWxzZQorCQkJcGlvX3dyaXRlbChwaW8sIElGRFIsIG1hc2spOwogCQlwaW9fd3JpdGVsKHBpbywgT0RSLCBtYXNrKTsKKwl9CiAKIAlwaW9fd3JpdGVsKHBpbywgUEVSLCBtYXNrKTsKLQlpZiAoIShmbGFncyAmIEFUMzJfR1BJT0ZfUFVMTFVQKSkKLQkJcGlvX3dyaXRlbChwaW8sIFBVRFIsIG1hc2spOworCisJLyogZ3Bpb19yZXF1ZXN0IG5vdyBhbGxvd2VkICovCisJY2xlYXJfYml0KHBpbl9pbmRleCwgJnBpby0+Z3Bpb19tYXNrKTsKIAogCXJldHVybjsKIApAQCAtMTE5LDIwICsxMzUsMjIwIEBACiAJZHVtcF9zdGFjaygpOwogfQogCisvKiBSZXNlcnZlIGEgcGluLCBwcmV2ZW50aW5nIGFueW9uZSBlbHNlIGZyb20gY2hhbmdpbmcgaXRzIGNvbmZpZ3VyYXRpb24uICovCit2b2lkIF9faW5pdCBhdDMyX3Jlc2VydmVfcGluKHVuc2lnbmVkIGludCBwaW4pCit7CisJc3RydWN0IHBpb19kZXZpY2UgKnBpbzsKKwl1bnNpZ25lZCBpbnQgcGluX2luZGV4ID0gcGluICYgMHgxZjsKKworCXBpbyA9IGdwaW9fdG9fcGlvKHBpbik7CisJaWYgKHVubGlrZWx5KCFwaW8pKSB7CisJCXByaW50aygicGlvOiBpbnZhbGlkIHBpbiAldVxuIiwgcGluKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICh1bmxpa2VseSh0ZXN0X2FuZF9zZXRfYml0KHBpbl9pbmRleCwgJnBpby0+cGlubXV4X21hc2spKSkgeworCQlwcmludGsoIiVzOiBwaW4gJXUgaXMgYnVzeVxuIiwgcGlvLT5uYW1lLCBwaW5faW5kZXgpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuOworCitmYWlsOgorCWR1bXBfc3RhY2soKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdQSU8gQVBJICovCisKK2ludCBncGlvX3JlcXVlc3QodW5zaWduZWQgaW50IGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQoreworCXN0cnVjdCBwaW9fZGV2aWNlICpwaW87CisJdW5zaWduZWQgaW50IHBpbjsKKworCXBpbyA9IGdwaW9fdG9fcGlvKGdwaW8pOworCWlmICghcGlvKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBpbiA9IGdwaW8gJiAweDFmOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KHBpbiwgJnBpby0+Z3Bpb19tYXNrKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChncGlvX3JlcXVlc3QpOworCit2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlzdHJ1Y3QgcGlvX2RldmljZSAqcGlvOworCXVuc2lnbmVkIGludCBwaW47CisKKwlwaW8gPSBncGlvX3RvX3BpbyhncGlvKTsKKwlpZiAoIXBpbykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJncGlvOiBhdHRlbXB0ZWQgdG8gZnJlZSBpbnZhbGlkIHBpbiAldVxuIiwgZ3Bpbyk7CisJCXJldHVybjsKKwl9CisKKwlwaW4gPSBncGlvICYgMHgxZjsKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChwaW4sICZwaW8tPmdwaW9fbWFzaykpCisJCXByaW50ayhLRVJOX0VSUiAiZ3BpbzogZnJlZWluZyBmcmVlIG9yIG5vbi1ncGlvIHBpbiAlcy0ldVxuIiwKKwkJICAgICAgIHBpby0+bmFtZSwgcGluKTsKK30KK0VYUE9SVF9TWU1CT0woZ3Bpb19mcmVlKTsKKworaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCBwaW9fZGV2aWNlICpwaW87CisJdW5zaWduZWQgaW50IHBpbjsKKworCXBpbyA9IGdwaW9fdG9fcGlvKGdwaW8pOworCWlmICghcGlvKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBpbiA9IGdwaW8gJiAweDFmOworCXBpb193cml0ZWwocGlvLCBPRFIsIDEgPDwgcGluKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChncGlvX2RpcmVjdGlvbl9pbnB1dCk7CisKK2ludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgaW50IGdwaW8pCit7CisJc3RydWN0IHBpb19kZXZpY2UgKnBpbzsKKwl1bnNpZ25lZCBpbnQgcGluOworCisJcGlvID0gZ3Bpb190b19waW8oZ3Bpbyk7CisJaWYgKCFwaW8pCisJCXJldHVybiAtRU5PREVWOworCisJcGluID0gZ3BpbyAmIDB4MWY7CisJcGlvX3dyaXRlbChwaW8sIE9FUiwgMSA8PCBwaW4pOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX291dHB1dCk7CisKK2ludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlzdHJ1Y3QgcGlvX2RldmljZSAqcGlvID0gJnBpb19kZXZbZ3BpbyA+PiA1XTsKKworCXJldHVybiAocGlvX3JlYWRsKHBpbywgUERTUikgPj4gKGdwaW8gJiAweDFmKSkgJiAxOworfQorRVhQT1JUX1NZTUJPTChncGlvX2dldF92YWx1ZSk7CisKK3ZvaWQgZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgaW50IGdwaW8sIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcGlvX2RldmljZSAqcGlvID0gJnBpb19kZXZbZ3BpbyA+PiA1XTsKKwl1MzIgbWFzazsKKworCW1hc2sgPSAxIDw8IChncGlvICYgMHgxZik7CisJaWYgKHZhbHVlKQorCQlwaW9fd3JpdGVsKHBpbywgU09EUiwgbWFzayk7CisJZWxzZQorCQlwaW9fd3JpdGVsKHBpbywgQ09EUiwgbWFzayk7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fc2V0X3ZhbHVlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdQSU8gSVJRIHN1cHBvcnQgKi8KKworc3RhdGljIHZvaWQgZ3Bpb19pcnFfbWFzayh1bnNpZ25lZCBpcnEpCit7CisJdW5zaWduZWQJCWdwaW8gPSBpcnFfdG9fZ3BpbyhpcnEpOworCXN0cnVjdCBwaW9fZGV2aWNlCSpwaW8gPSAmcGlvX2RldltncGlvID4+IDVdOworCisJcGlvX3dyaXRlbChwaW8sIElEUiwgMSA8PCAoZ3BpbyAmIDB4MWYpKTsKK30KKworc3RhdGljIHZvaWQgZ3Bpb19pcnFfdW5tYXNrKHVuc2lnbmVkIGlycSkKK3sKKwl1bnNpZ25lZAkJZ3BpbyA9IGlycV90b19ncGlvKGlycSk7CisJc3RydWN0IHBpb19kZXZpY2UJKnBpbyA9ICZwaW9fZGV2W2dwaW8gPj4gNV07CisKKwlwaW9fd3JpdGVsKHBpbywgSUVSLCAxIDw8IChncGlvICYgMHgxZikpOworfQorCitzdGF0aWMgaW50IGdwaW9faXJxX3R5cGUodW5zaWduZWQgaXJxLCB1bnNpZ25lZCB0eXBlKQoreworCWlmICh0eXBlICE9IElSUV9UWVBFX0VER0VfQk9USCAmJiB0eXBlICE9IElSUV9UWVBFX05PTkUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZ3Bpb19pcnFjaGlwID0geworCS5uYW1lCQk9ICJncGlvIiwKKwkubWFzawkJPSBncGlvX2lycV9tYXNrLAorCS51bm1hc2sJCT0gZ3Bpb19pcnFfdW5tYXNrLAorCS5zZXRfdHlwZQk9IGdwaW9faXJxX3R5cGUsCit9OworCitzdGF0aWMgdm9pZCBncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBwaW9fZGV2aWNlCSpwaW8gPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXVuc2lnbmVkCQlncGlvX2lycTsKKworCWdwaW9faXJxID0gKHVuc2lnbmVkKSBnZXRfaXJxX2RhdGEoaXJxKTsKKwlmb3IgKDs7KSB7CisJCXUzMgkJaXNyOworCQlzdHJ1Y3QgaXJxX2Rlc2MJKmQ7CisKKwkJLyogYWNrIHBlbmRpbmcgR1BJTyBpbnRlcnJ1cHRzICovCisJCWlzciA9IHBpb19yZWFkbChwaW8sIElTUikgJiBwaW9fcmVhZGwocGlvLCBJTVIpOworCQlpZiAoIWlzcikKKwkJCWJyZWFrOworCQlkbyB7CisJCQlpbnQgaTsKKworCQkJaSA9IGZmcyhpc3IpIC0gMTsKKwkJCWlzciAmPSB+KDEgPDwgaSk7CisKKwkJCWkgKz0gZ3Bpb19pcnE7CisJCQlkID0gJmlycV9kZXNjW2ldOworCisJCQlkLT5oYW5kbGVfaXJxKGksIGQpOworCQl9IHdoaWxlIChpc3IpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0CitncGlvX2lycV9zZXR1cChzdHJ1Y3QgcGlvX2RldmljZSAqcGlvLCBpbnQgaXJxLCBpbnQgZ3Bpb19pcnEpCit7CisJdW5zaWduZWQJaTsKKworCXNldF9pcnFfY2hpcF9kYXRhKGlycSwgcGlvKTsKKwlzZXRfaXJxX2RhdGEoaXJxLCAodm9pZCAqKSBncGlvX2lycSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKywgZ3Bpb19pcnErKykgeworCQlzZXRfaXJxX2NoaXBfZGF0YShncGlvX2lycSwgcGlvKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGdwaW9faXJxLCAmZ3Bpb19pcnFjaGlwLAorCQkJCWhhbmRsZV9zaW1wbGVfaXJxKTsKKwl9CisKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihpcnEsIGdwaW9faXJxX2hhbmRsZXIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogc3RhdGljIGludCBfX2luaXQgcGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHBpb19kZXZpY2UgKnBpbyA9IE5VTEw7CisJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaW50IGdwaW9faXJxX2Jhc2UgPSBHUElPX0lSUV9CQVNFICsgcGRldi0+aWQgKiAzMjsKIAogCUJVR19PTihwZGV2LT5pZCA+PSBNQVhfTlJfUElPX0RFVklDRVMpOwogCXBpbyA9ICZwaW9fZGV2W3BkZXYtPmlkXTsKIAlCVUdfT04oIXBpby0+cmVncyk7CiAKLQkvKiBUT0RPOiBJbnRlcnJ1cHRzICovCisJZ3Bpb19pcnFfc2V0dXAocGlvLCBpcnEsIGdwaW9faXJxX2Jhc2UpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGlvKTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdG1lbCBQb3J0IE11bHRpcGxleGVyIGF0IDB4JXAgKGlycSAlZClcbiIsCi0JICAgICAgIHBpby0+bmFtZSwgcGlvLT5yZWdzLCBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhc2UgMHglcCwgaXJxICVkIGNoYWlucyAlZC4uJWRcbiIsCisJICAgICAgIHBpby0+bmFtZSwgcGlvLT5yZWdzLCBpcnEsIGdwaW9faXJxX2Jhc2UsIGdwaW9faXJxX2Jhc2UgKyAzMSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0OCw3ICszNjQsNyBAQAogewogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBpb19kcml2ZXIpOwogfQotc3Vic3lzX2luaXRjYWxsKHBpb19pbml0KTsKK3Bvc3Rjb3JlX2luaXRjYWxsKHBpb19pbml0KTsKIAogdm9pZCBfX2luaXQgYXQzMl9pbml0X3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpAQCAtMTg0LDYgKzQwMCwxMyBAQAogCXBpby0+cGRldiA9IHBkZXY7CiAJcGlvLT5yZWdzID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVncy0+ZW5kIC0gcmVncy0+c3RhcnQgKyAxKTsKIAotCXBpb193cml0ZWwocGlvLCBPRFIsIH4wVUwpOwotCXBpb193cml0ZWwocGlvLCBQRVIsIH4wVUwpOworCS8qCisJICogcmVxdWVzdF9ncGlvKCkgaXMgb25seSB2YWxpZCBmb3IgcGlucyB0aGF0IGhhdmUgYmVlbgorCSAqIGV4cGxpY2l0bHkgY29uZmlndXJlZCBhcyBHUElPIGFuZCBub3QgcHJldmlvdXNseSByZXF1ZXN0ZWQKKwkgKi8KKwlwaW8tPmdwaW9fbWFzayA9IH4wVUw7CisKKwkvKiBzdGFydCB3aXRoIGlycXMgZGlzYWJsZWQgYW5kIGFja2VkICovCisJcGlvX3dyaXRlbChwaW8sIElEUiwgfjBVTCk7CisJKHZvaWQpIHBpb19yZWFkbChwaW8sIElTUik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21tL2NhY2hlLmMgYi9hcmNoL2F2cjMyL21tL2NhY2hlLmMKaW5kZXggNDUwNTE1Yi4uZmIxM2Y3MiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tbS9jYWNoZS5jCisrKyBiL2FyY2gvYXZyMzIvbW0vY2FjaGUuYwpAQCAtMjIsMTggKzIyLDM0IEBACiAKIHZvaWQgaW52YWxpZGF0ZV9kY2FjaGVfcmVnaW9uKHZvaWQgKnN0YXJ0LCBzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHYsIGJlZ2luLCBlbmQsIGxpbmVzejsKKwl1bnNpZ25lZCBsb25nIHYsIGJlZ2luLCBlbmQsIGxpbmVzeiwgbWFzazsKKwlpbnQgZmx1c2ggPSAwOwogCiAJbGluZXN6ID0gYm9vdF9jcHVfZGF0YS5kY2FjaGUubGluZXN6OworCW1hc2sgPSBsaW5lc3ogLSAxOwogCi0JLy9wcmludGsoImludmFsaWRhdGUgZGNhY2hlOiAlcCArICV1XG4iLCBzdGFydCwgc2l6ZSk7CisJLyogd2hlbiBmaXJzdCBhbmQvb3IgbGFzdCBjYWNoZWxpbmVzIGFyZSBzaGFyZWQsIGZsdXNoIHRoZW0KKwkgKiBpbnN0ZWFkIG9mIGludmFsaWRhdGluZyAuLi4gbmV2ZXIgZGlzY2FyZCB2YWxpZCBkYXRhIQorCSAqLworCWJlZ2luID0gKHVuc2lnbmVkIGxvbmcpc3RhcnQ7CisJZW5kID0gYmVnaW4gKyBzaXplIC0gMTsKIAotCS8qIFlvdSBhc2tlZCBmb3IgaXQsIHlvdSBnb3QgaXQgKi8KLQliZWdpbiA9ICh1bnNpZ25lZCBsb25nKXN0YXJ0ICYgfihsaW5lc3ogLSAxKTsKLQllbmQgPSAoKHVuc2lnbmVkIGxvbmcpc3RhcnQgKyBzaXplICsgbGluZXN6IC0gMSkgJiB+KGxpbmVzeiAtIDEpOworCWlmIChiZWdpbiAmIG1hc2spIHsKKwkJZmx1c2hfZGNhY2hlX2xpbmUoc3RhcnQpOworCQliZWdpbiArPSBsaW5lc3o7CisJCWZsdXNoID0gMTsKKwl9CisJaWYgKChlbmQgJiBtYXNrKSAhPSBtYXNrKSB7CisJCWZsdXNoX2RjYWNoZV9saW5lKCh2b2lkICopZW5kKTsKKwkJZW5kIC09IGxpbmVzejsKKwkJZmx1c2ggPSAxOworCX0KIAotCWZvciAodiA9IGJlZ2luOyB2IDwgZW5kOyB2ICs9IGxpbmVzeikKKwkvKiByZW1haW5pbmcgY2FjaGVsaW5lcyBvbmx5IG5lZWQgaW52YWxpZGF0aW9uICovCisJZm9yICh2ID0gYmVnaW47IHYgPD0gZW5kOyB2ICs9IGxpbmVzeikKIAkJaW52YWxpZGF0ZV9kY2FjaGVfbGluZSgodm9pZCAqKXYpOworCWlmIChmbHVzaCkKKwkJZmx1c2hfd3JpdGVfYnVmZmVyKCk7CiB9CiAKIHZvaWQgY2xlYW5fZGNhY2hlX3JlZ2lvbih2b2lkICpzdGFydCwgc2l6ZV90IHNpemUpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2hwZXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCmluZGV4IDQ1YTg2ODUuLjBiMjlkNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCkBAIC0xMiw3ICsxMiw3IEBACiAvKiBGU0VDID0gMTBeLTE1IE5TRUMgPSAxMF4tOSAqLwogI2RlZmluZSBGU0VDX1BFUl9OU0VDCTEwMDAwMDAKIAotc3RhdGljIHZvaWQgKmhwZXRfcHRyOworc3RhdGljIHZvaWQgX19pb21lbSAqaHBldF9wdHI7CiAKIHN0YXRpYyBjeWNsZV90IHJlYWRfaHBldCh2b2lkKQogewpAQCAtNDAsOCArNDAsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIGNhbGN1bGF0ZSB0aGUgaHBldCBhZGRyZXNzOiAqLwotCWhwZXRfYmFzZSA9Ci0JCSh2b2lkIF9faW9tZW0qKWlvcmVtYXBfbm9jYWNoZShocGV0X2FkZHJlc3MsIEhQRVRfTU1BUF9TSVpFKTsKKwlocGV0X2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoaHBldF9hZGRyZXNzLCBIUEVUX01NQVBfU0laRSk7CiAJaHBldF9wdHIgPSBocGV0X2Jhc2UgKyBIUEVUX0NPVU5URVI7CiAKIAkvKiBjYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeTogKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKaW5kZXggNTU5MmZhNi4uYmE4ZDMwMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKQEAgLTEyNiw3ICsxMjYsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgaW9fYXBpY19tb2RpZnkodW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgaW9fYXBpYyAqaW9fYXBpYyA9IGlvX2FwaWNfYmFzZShhcGljKTsKKwl2b2xhdGlsZSBzdHJ1Y3QgaW9fYXBpYyBfX2lvbWVtICppb19hcGljID0gaW9fYXBpY19iYXNlKGFwaWMpOwogCWlmIChzaXNfYXBpY19idWcpCiAJCXdyaXRlbChyZWcsICZpb19hcGljLT5pbmRleCk7CiAJd3JpdGVsKHZhbHVlLCAmaW9fYXBpYy0+ZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3N5c2VudGVyLmMgYi9hcmNoL2kzODYva2VybmVsL3N5c2VudGVyLmMKaW5kZXggNWRhNzQ0Mi4uYmM4ODJhMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zeXNlbnRlci5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzZW50ZXIuYwpAQCAtNzAsMTEgKzcwLDEyIEBACiAgKi8KIGV4dGVybiBjb25zdCBjaGFyIHZzeXNjYWxsX2ludDgwX3N0YXJ0LCB2c3lzY2FsbF9pbnQ4MF9lbmQ7CiBleHRlcm4gY29uc3QgY2hhciB2c3lzY2FsbF9zeXNlbnRlcl9zdGFydCwgdnN5c2NhbGxfc3lzZW50ZXJfZW5kOwotc3RhdGljIHZvaWQgKnN5c2NhbGxfcGFnZTsKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqc3lzY2FsbF9wYWdlc1sxXTsKIAogaW50IF9faW5pdCBzeXNlbnRlcl9zZXR1cCh2b2lkKQogewotCXN5c2NhbGxfcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOworCXZvaWQgKnN5c2NhbGxfcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOworCXN5c2NhbGxfcGFnZXNbMF0gPSB2aXJ0X3RvX3BhZ2Uoc3lzY2FsbF9wYWdlKTsKIAogI2lmZGVmIENPTkZJR19DT01QQVRfVkRTTwogCV9fc2V0X2ZpeG1hcChGSVhfVkRTTywgX19wYShzeXNjYWxsX3BhZ2UpLCBQQUdFX1JFQURPTkxZKTsKQEAgLTk2LDMxICs5NywxMiBAQAogfQogCiAjaWZuZGVmIENPTkZJR19DT01QQVRfVkRTTwotc3RhdGljIHN0cnVjdCBwYWdlICpzeXNjYWxsX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQl1bnNpZ25lZCBsb25nIGFkciwgaW50ICp0eXBlKQotewotCXN0cnVjdCBwYWdlICpwID0gdmlydF90b19wYWdlKGFkciAtIHZtYS0+dm1fc3RhcnQgKyBzeXNjYWxsX3BhZ2UpOwotCWdldF9wYWdlKHApOwotCXJldHVybiBwOwotfQotCi0vKiBQcmV2ZW50IFZNQSBtZXJnaW5nICovCi1zdGF0aWMgdm9pZCBzeXNjYWxsX3ZtYV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLX0KLQotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzeXNjYWxsX3ZtX29wcyA9IHsKLQkuY2xvc2UgPSBzeXNjYWxsX3ZtYV9jbG9zZSwKLQkubm9wYWdlID0gc3lzY2FsbF9ub3BhZ2UsCi19OwotCiAvKiBEZWZpbmVkIGluIHZzeXNjYWxsLXN5c2VudGVyLlMgKi8KIGV4dGVybiB2b2lkIFNZU0VOVEVSX1JFVFVSTjsKIAogLyogU2V0dXAgYSBWTUEgYXQgcHJvZ3JhbSBzdGFydHVwIGZvciB0aGUgdnN5c2NhbGwgcGFnZSAqLwogaW50IGFyY2hfc2V0dXBfYWRkaXRpb25hbF9wYWdlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLCBpbnQgZXhzdGFjaykKIHsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAlpbnQgcmV0OwpAQCAtMTMyLDM4ICsxMTQsMjUgQEAKIAkJZ290byB1cF9mYWlsOwogCX0KIAotCXZtYSA9IGttZW1fY2FjaGVfemFsbG9jKHZtX2FyZWFfY2FjaGVwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZtYSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIHVwX2ZhaWw7Ci0JfQotCi0Jdm1hLT52bV9zdGFydCA9IGFkZHI7Ci0Jdm1hLT52bV9lbmQgPSBhZGRyICsgUEFHRV9TSVpFOwotCS8qIE1BWVdSSVRFIHRvIGFsbG93IGdkYiB0byBDT1cgYW5kIHNldCBicmVha3BvaW50cyAqLwotCXZtYS0+dm1fZmxhZ3MgPSBWTV9SRUFEfFZNX0VYRUN8Vk1fTUFZUkVBRHxWTV9NQVlFWEVDfFZNX01BWVdSSVRFOwogCS8qCisJICogTUFZV1JJVEUgdG8gYWxsb3cgZ2RiIHRvIENPVyBhbmQgc2V0IGJyZWFrcG9pbnRzCisJICoKIAkgKiBNYWtlIHN1cmUgdGhlIHZEU08gZ2V0cyBpbnRvIGV2ZXJ5IGNvcmUgZHVtcC4KIAkgKiBEdW1waW5nIGl0cyBjb250ZW50cyBtYWtlcyBwb3N0LW1vcnRlbSBmdWxseSBpbnRlcnByZXRhYmxlIGxhdGVyCiAJICogd2l0aG91dCBtYXRjaGluZyB1cCB0aGUgc2FtZSBrZXJuZWwgYW5kIGhhcmR3YXJlIGNvbmZpZyB0byBzZWUKIAkgKiB3aGF0IFBDIHZhbHVlcyBtZWFudC4KIAkgKi8KLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0FMV0FZU0RVTVA7Ci0Jdm1hLT52bV9mbGFncyB8PSBtbS0+ZGVmX2ZsYWdzOwotCXZtYS0+dm1fcGFnZV9wcm90ID0gcHJvdGVjdGlvbl9tYXBbdm1hLT52bV9mbGFncyAmIDddOwotCXZtYS0+dm1fb3BzID0gJnN5c2NhbGxfdm1fb3BzOwotCXZtYS0+dm1fbW0gPSBtbTsKLQotCXJldCA9IGluc2VydF92bV9zdHJ1Y3QobW0sIHZtYSk7Ci0JaWYgKHVubGlrZWx5KHJldCkpIHsKLQkJa21lbV9jYWNoZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOworCXJldCA9IGluc3RhbGxfc3BlY2lhbF9tYXBwaW5nKG1tLCBhZGRyLCBQQUdFX1NJWkUsCisJCQkJICAgICAgVk1fUkVBRHxWTV9FWEVDfAorCQkJCSAgICAgIFZNX01BWVJFQUR8Vk1fTUFZV1JJVEV8Vk1fTUFZRVhFQ3wKKwkJCQkgICAgICBWTV9BTFdBWVNEVU1QLAorCQkJCSAgICAgIHN5c2NhbGxfcGFnZXMpOworCWlmIChyZXQpCiAJCWdvdG8gdXBfZmFpbDsKLQl9CiAKIAljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvID0gKHZvaWQgKilhZGRyOwogCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3lzZW50ZXJfcmV0dXJuID0KIAkJCQkgICAgKHZvaWQgKilWRFNPX1NZTSgmU1lTRU5URVJfUkVUVVJOKTsKLQltbS0+dG90YWxfdm0rKzsKIHVwX2ZhaWw6CiAJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9wYWdlYXR0ci5jIGIvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMKaW5kZXggYWQ5MTUyOC4uZTIyM2IxZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMKKysrIGIvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMKQEAgLTIyNCw3ICsyMjQsNyBAQAogCWxpc3RfcmVwbGFjZV9pbml0KCZkZl9saXN0LCAmbCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjcGFfbG9jayk7CiAJaWYgKCFjcHVfaGFzX2NsZmx1c2gpCi0JCWZsdXNoX21hcCgwKTsKKwkJZmx1c2hfbWFwKE5VTEwpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZywgbmV4dCwgJmwsIGxydSkgewogCQlpZiAoY3B1X2hhc19jbGZsdXNoKQogCQkJZmx1c2hfbWFwKHBhZ2VfYWRkcmVzcyhwZykpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9jcmFzaC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9jcmFzaC5jCmluZGV4IDlkOTIwOTcuLjM3YmIxNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvY3Jhc2guYworKysgYi9hcmNoL2lhNjQva2VybmVsL2NyYXNoLmMKQEAgLTUyLDcgKzUyLDcgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZWxmX3Byc3RhdHVzLCBlbGZfcHJzdGF0dXMpOwogCiB2b2lkCi1jcmFzaF9zYXZlX3RoaXNfY3B1KCkKK2NyYXNoX3NhdmVfdGhpc19jcHUodm9pZCkKIHsKIAl2b2lkICpidWY7CiAJdW5zaWduZWQgbG9uZyBjZm0sIHNvZiwgc29sOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMKaW5kZXggZjRjN2Y3Ny4uNTVkZGQ4MCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NtcC5jCkBAIC0yMjEsMTMgKzIyMSwxMyBAQAogCiAjaWZkZWYgQ09ORklHX0tFWEVDCiB2b2lkCi1rZHVtcF9zbXBfc2VuZF9zdG9wKCkKK2tkdW1wX3NtcF9zZW5kX3N0b3Aodm9pZCkKIHsKICAJc2VuZF9JUElfYWxsYnV0c2VsZihJUElfS0RVTVBfQ1BVX1NUT1ApOwogfQogCiB2b2lkCi1rZHVtcF9zbXBfc2VuZF9pbml0KCkKK2tkdW1wX3NtcF9zZW5kX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1LCBzZWxmX2NwdTsKIAlzZWxmX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9kZWMvTWFrZWZpbGUgYi9hcmNoL21pcHMvZGVjL01ha2VmaWxlCmluZGV4IGVkMTgxZmQuLjhiNzkwYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9kZWMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2RlYy9NYWtlZmlsZQpAQCAtNiw2ICs2LDcgQEAKIAkJICAga24wMi1pcnEubyBrbjAyeGEtYmVyci5vIHJlc2V0Lm8gc2V0dXAubyB0aW1lLm8KIAogb2JqLSQoQ09ORklHX1BST01fQ09OU09MRSkJKz0gcHJvbWNvbi5vCitvYmotJChDT05GSUdfVEMpCQkrPSB0Yy5vCiBvYmotJChDT05GSUdfQ1BVX0hBU19XQikJKz0gd2JmbHVzaC5vCiAKIEVYVFJBX0FGTEFHUyA6PSAkKENGTEFHUykKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9kZWMvcHJvbS9pZGVudGlmeS5jIGIvYXJjaC9taXBzL2RlYy9wcm9tL2lkZW50aWZ5LmMKaW5kZXggODFkNWU4Ny4uYzRlM2MxZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2RlYy9wcm9tL2lkZW50aWZ5LmMKKysrIGIvYXJjaC9taXBzL2RlYy9wcm9tL2lkZW50aWZ5LmMKQEAgLTg4LDYgKzg4LDcgQEAKIHsKIAlkZWNfa25fc2xvdF9iYXNlID0gS04wMl9TTE9UX0JBU0U7CiAJZGVjX2tuX3Nsb3Rfc2l6ZSA9IEtOMDJfU0xPVF9TSVpFOworCWRlY190Y19idXMgPSAxOwogCiAJZGVjX3J0Y19iYXNlID0gKHZvaWQgKilDS1NFRzFBRERSKGRlY19rbl9zbG90X2Jhc2UgKyBLTjAyX1JUQyk7CiB9CkBAIC05Niw2ICs5Nyw3IEBACiB7CiAJZGVjX2tuX3Nsb3RfYmFzZSA9IEtOMDJYQV9TTE9UX0JBU0U7CiAJZGVjX2tuX3Nsb3Rfc2l6ZSA9IElPQVNJQ19TTE9UX1NJWkU7CisJZGVjX3RjX2J1cyA9IDE7CiAKIAlpb2FzaWNfYmFzZSA9ICh2b2lkICopQ0tTRUcxQUREUihkZWNfa25fc2xvdF9iYXNlICsgSU9BU0lDX0lPQ1RMKTsKIAlkZWNfcnRjX2Jhc2UgPSAodm9pZCAqKUNLU0VHMUFERFIoZGVjX2tuX3Nsb3RfYmFzZSArIElPQVNJQ19UT1kpOwpAQCAtMTA1LDYgKzEwNyw3IEBACiB7CiAJZGVjX2tuX3Nsb3RfYmFzZSA9IEtOMDNfU0xPVF9CQVNFOwogCWRlY19rbl9zbG90X3NpemUgPSBJT0FTSUNfU0xPVF9TSVpFOworCWRlY190Y19idXMgPSAxOwogCiAJaW9hc2ljX2Jhc2UgPSAodm9pZCAqKUNLU0VHMUFERFIoZGVjX2tuX3Nsb3RfYmFzZSArIElPQVNJQ19JT0NUTCk7CiAJZGVjX3J0Y19iYXNlID0gKHZvaWQgKilDS1NFRzFBRERSKGRlY19rbl9zbG90X2Jhc2UgKyBJT0FTSUNfVE9ZKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9kZWMvc2V0dXAuYyBiL2FyY2gvbWlwcy9kZWMvc2V0dXAuYwppbmRleCAxMDU4ZTJmLi5iOGE1ZTc1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZGVjL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2RlYy9zZXR1cC5jCkBAIC01Myw2ICs1Myw4IEBACiBFWFBPUlRfU1lNQk9MKGRlY19rbl9zbG90X2Jhc2UpOwogRVhQT1JUX1NZTUJPTChkZWNfa25fc2xvdF9zaXplKTsKIAoraW50IGRlY190Y19idXM7CisKIHNwaW5sb2NrX3QgaW9hc2ljX3Nzcl9sb2NrOwogCiB2b2xhdGlsZSB1MzIgKmlvYXNpY19iYXNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy90Yy5jIGIvYXJjaC9taXBzL2RlYy90Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjAyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvZGVjL3RjLmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqCVRVUkJPY2hhbm5lbCBhcmNoaXRlY3R1cmUgY2FsbHMuCisgKgorICoJQ29weXJpZ2h0IChjKSBIYXJhbGQgS29lcmZnZW4sIDE5OTgKKyAqCUNvcHlyaWdodCAoYykgMjAwMSwgMjAwMywgMjAwNSwgMjAwNiAgTWFjaWVqIFcuIFJvenlja2kKKyAqCUNvcHlyaWdodCAoYykgMjAwNSAgSmFtZXMgU2ltbW9ucworICoKKyAqCVRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VCisgKglHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbgorICoJZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL3BhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGFzbS9kZWMvaW50ZXJydXB0cy5oPgorI2luY2x1ZGUgPGFzbS9kZWMvcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9kZWMvc3lzdGVtLmg+CisKKy8qCisgKiBQcm90ZWN0ZWQgcmVhZCBieXRlIGZyb20gVFVSQk9jaGFubmVsIHNsb3Qgc3BhY2UuCisgKi8KK2ludCB0Y19wcmVhZGIodTggKnZhbHAsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gZ2V0X2RiZSgqdmFscCwgKHU4ICopYWRkcik7Cit9CisKKy8qCisgKiBHZXQgVFVSQk9jaGFubmVsIGJ1cyBpbmZvcm1hdGlvbiBhcyBzcGVjaWZpZWQgYnkgdGhlIHNwZWMsIHBsdXMKKyAqIHRoZSBzbG90IHNwYWNlIGJhc2UgYWRkcmVzcyBhbmQgdGhlIG51bWJlciBvZiBzbG90cy4KKyAqLworaW50IF9faW5pdCB0Y19idXNfZ2V0X2luZm8oc3RydWN0IHRjX2J1cyAqdGJ1cykKK3sKKwlpZiAoIWRlY190Y19idXMpCisJCXJldHVybiAtRU5YSU87CisKKwltZW1jcHkoJnRidXMtPmluZm8sIHJleF9nZXR0Y2luZm8oKSwgc2l6ZW9mKHRidXMtPmluZm8pKTsKKwl0YnVzLT5zbG90X2Jhc2UgPSBDUEhZU0FERFIoKGxvbmcpcmV4X3Nsb3RfYWRkcmVzcygwKSk7CisKKwlzd2l0Y2ggKG1pcHNfbWFjaHR5cGUpIHsKKwljYXNlIE1BQ0hfRFM1MDAwXzIwMDoKKwkJdGJ1cy0+bnVtX3Rjc2xvdHMgPSA3OworCQlicmVhazsKKwljYXNlIE1BQ0hfRFM1MDAwXzJYMDoKKwljYXNlIE1BQ0hfRFM1OTAwOgorCQl0YnVzLT5leHRfc2xvdF9iYXNlID0gMHgyMDAwMDAwMDsKKwkJdGJ1cy0+ZXh0X3Nsb3Rfc2l6ZSA9IDB4MjAwMDAwMDA7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgTUFDSF9EUzUwMDBfMVhYOgorCQl0YnVzLT5udW1fdGNzbG90cyA9IDM7CisJCWJyZWFrOworCWNhc2UgTUFDSF9EUzUwMDBfWFg6CisJCXRidXMtPm51bV90Y3Nsb3RzID0gMjsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgdGhlIElSUSBmb3IgdGhlIHNwZWNpZmllZCBzbG90LgorICovCit2b2lkIF9faW5pdCB0Y19kZXZpY2VfZ2V0X2lycShzdHJ1Y3QgdGNfZGV2ICp0ZGV2KQoreworCXN3aXRjaCAodGRldi0+c2xvdCkgeworCWNhc2UgMDoKKwkJdGRldi0+aW50ZXJydXB0ID0gZGVjX2ludGVycnVwdFtERUNfSVJRX1RDMF07CisJCWJyZWFrOworCWNhc2UgMToKKwkJdGRldi0+aW50ZXJydXB0ID0gZGVjX2ludGVycnVwdFtERUNfSVJRX1RDMV07CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdGRldi0+aW50ZXJydXB0ID0gZGVjX2ludGVycnVwdFtERUNfSVJRX1RDMl07CisJCWJyZWFrOworCS8qCisJICogWXVjayEgRFM1MDAwLzIwMCBvbmJvYXJkIGRldmljZXMKKwkgKi8KKwljYXNlIDU6CisJCXRkZXYtPmludGVycnVwdCA9IGRlY19pbnRlcnJ1cHRbREVDX0lSUV9UQzVdOworCQlicmVhazsKKwljYXNlIDY6CisJCXRkZXYtPmludGVycnVwdCA9IGRlY19pbnRlcnJ1cHRbREVDX0lSUV9UQzZdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0ZGV2LT5pbnRlcnJ1cHQgPSAtMTsKKwkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwppbmRleCBhZTBlZGUxLi41MDE0OWVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwpAQCAtNDksOSArNDksMTMgQEAKIC8qIE1heCBzdXBwb3J0ZWQgc2l6ZSBmb3Igc3ltYm9sIG5hbWVzICovCiAjZGVmaW5lIE1BWF9TWU1OQU1FCTY0CiAKKyNkZWZpbmUgVkRTTzMyX01BWFBBR0VTCSgoKDB4MzAwMCArIFBBR0VfTUFTSykgPj4gUEFHRV9TSElGVCkgKyAyKQorI2RlZmluZSBWRFNPNjRfTUFYUEFHRVMJKCgoMHgzMDAwICsgUEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUKSArIDIpCisKIGV4dGVybiBjaGFyIHZkc28zMl9zdGFydCwgdmRzbzMyX2VuZDsKIHN0YXRpYyB2b2lkICp2ZHNvMzJfa2Jhc2UgPSAmdmRzbzMyX3N0YXJ0OwogdW5zaWduZWQgaW50IHZkc28zMl9wYWdlczsKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqdmRzbzMyX3BhZ2VsaXN0W1ZEU08zMl9NQVhQQUdFU107CiB1bnNpZ25lZCBsb25nIHZkc28zMl9zaWd0cmFtcDsKIHVuc2lnbmVkIGxvbmcgdmRzbzMyX3J0X3NpZ3RyYW1wOwogCkBAIC01OSw2ICs2Myw3IEBACiBleHRlcm4gY2hhciB2ZHNvNjRfc3RhcnQsIHZkc282NF9lbmQ7CiBzdGF0aWMgdm9pZCAqdmRzbzY0X2tiYXNlID0gJnZkc282NF9zdGFydDsKIHVuc2lnbmVkIGludCB2ZHNvNjRfcGFnZXM7CitzdGF0aWMgc3RydWN0IHBhZ2UgKnZkc282NF9wYWdlbGlzdFtWRFNPNjRfTUFYUEFHRVNdOwogdW5zaWduZWQgbG9uZyB2ZHNvNjRfcnRfc2lndHJhbXA7CiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKQEAgLTE2NSw1NSArMTcwLDYgQEAKICNlbmRpZiAvKiBERUJVRyAqLwogCiAvKgotICogS2VlcCBhIGR1bW15IHZtYV9jbG9zZSBmb3Igbm93LCBpdCB3aWxsIHByZXZlbnQgVk1BIG1lcmdpbmcuCi0gKi8KLXN0YXRpYyB2b2lkIHZkc29fdm1hX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKLXsKLX0KLQotLyoKLSAqIE91ciBub3BhZ2UoKSBmdW5jdGlvbiwgbWFwcyBpbiB0aGUgYWN0dWFsIHZEU08ga2VybmVsIHBhZ2VzLCB0aGV5IHdpbGwKLSAqIGJlIG1hcHBlZCByZWFkLW9ubHkgYnkgZG9fbm9fcGFnZSgpLCBhbmQgZXZlbnR1YWxseSBDT1cnZWQsIGVpdGhlcgotICogcmlnaHQgYXdheSBmb3IgYW4gaW5pdGlhbCB3cml0ZSBhY2Nlc3MsIG9yIGJ5IGRvX3dwX3BhZ2UoKS4KLSAqLwotc3RhdGljIHN0cnVjdCBwYWdlICogdmRzb192bWFfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50ICp0eXBlKQotewotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gYWRkcmVzcyAtIHZtYS0+dm1fc3RhcnQ7Ci0Jc3RydWN0IHBhZ2UgKnBnOwotI2lmZGVmIENPTkZJR19QUEM2NAotCXZvaWQgKnZiYXNlID0gKHZtYS0+dm1fbW0tPnRhc2tfc2l6ZSA+IFRBU0tfU0laRV9VU0VSMzIpID8KLQkJdmRzbzY0X2tiYXNlIDogdmRzbzMyX2tiYXNlOwotI2Vsc2UKLQl2b2lkICp2YmFzZSA9IHZkc28zMl9rYmFzZTsKLSNlbmRpZgotCi0JREJHKCJ2ZHNvX3ZtYV9ub3BhZ2UoY3VycmVudDogJXMsIGFkZHJlc3M6ICUwMTZseCwgb2ZmOiAlbHgpXG4iLAotCSAgICBjdXJyZW50LT5jb21tLCBhZGRyZXNzLCBvZmZzZXQpOwotCi0JaWYgKGFkZHJlc3MgPCB2bWEtPnZtX3N0YXJ0IHx8IGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkKLQkJcmV0dXJuIE5PUEFHRV9TSUdCVVM7Ci0KLQkvKgotCSAqIExhc3QgcGFnZSBpcyBzeXN0ZW1jZmcuCi0JICovCi0JaWYgKCh2bWEtPnZtX2VuZCAtIGFkZHJlc3MpIDw9IFBBR0VfU0laRSkKLQkJcGcgPSB2aXJ0X3RvX3BhZ2UodmRzb19kYXRhKTsKLQllbHNlCi0JCXBnID0gdmlydF90b19wYWdlKHZiYXNlICsgb2Zmc2V0KTsKLQotCWdldF9wYWdlKHBnKTsKLQlEQkcoIiAtPnBhZ2UgY291bnQ6ICVkXG4iLCBwYWdlX2NvdW50KHBnKSk7Ci0KLQlyZXR1cm4gcGc7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgdmRzb192bW9wcyA9IHsKLQkuY2xvc2UJPSB2ZHNvX3ZtYV9jbG9zZSwKLQkubm9wYWdlCT0gdmRzb192bWFfbm9wYWdlLAotfTsKLQotLyoKICAqIFRoaXMgaXMgY2FsbGVkIGZyb20gYmluZm10X2VsZiwgd2UgY3JlYXRlIHRoZSBzcGVjaWFsIHZtYSBmb3IgdGhlCiAgKiB2RFNPIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgbW0gc3RydWN0IHRyZWUKICAqLwpAQCAtMjIxLDIwICsxNzcsMjMgQEAKIAkJCQlpbnQgZXhlY3V0YWJsZV9zdGFjaykKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCBwYWdlICoqdmRzb19wYWdlbGlzdDsKIAl1bnNpZ25lZCBsb25nIHZkc29fcGFnZXM7CiAJdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7CiAJaW50IHJjOwogCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkgeworCQl2ZHNvX3BhZ2VsaXN0ID0gdmRzbzMyX3BhZ2VsaXN0OwogCQl2ZHNvX3BhZ2VzID0gdmRzbzMyX3BhZ2VzOwogCQl2ZHNvX2Jhc2UgPSBWRFNPMzJfTUJBU0U7CiAJfSBlbHNlIHsKKwkJdmRzb19wYWdlbGlzdCA9IHZkc282NF9wYWdlbGlzdDsKIAkJdmRzb19wYWdlcyA9IHZkc282NF9wYWdlczsKIAkJdmRzb19iYXNlID0gVkRTTzY0X01CQVNFOwogCX0KICNlbHNlCisJdmRzb19wYWdlbGlzdCA9IHZkc28zMl9wYWdlbGlzdDsKIAl2ZHNvX3BhZ2VzID0gdmRzbzMyX3BhZ2VzOwogCXZkc29fYmFzZSA9IFZEU08zMl9NQkFTRTsKICNlbmRpZgpAQCAtMjYyLDE3ICsyMjEsNiBAQAogCQlnb3RvIGZhaWxfbW1hcHNlbTsKIAl9CiAKLQotCS8qIEFsbG9jYXRlIGEgVk1BIHN0cnVjdHVyZSBhbmQgZmlsbCBpdCB1cCAqLwotCXZtYSA9IGttZW1fY2FjaGVfemFsbG9jKHZtX2FyZWFfY2FjaGVwLCBHRlBfS0VSTkVMKTsKLQlpZiAodm1hID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxfbW1hcHNlbTsKLQl9Ci0Jdm1hLT52bV9tbSA9IG1tOwotCXZtYS0+dm1fc3RhcnQgPSB2ZHNvX2Jhc2U7Ci0Jdm1hLT52bV9lbmQgPSB2bWEtPnZtX3N0YXJ0ICsgKHZkc29fcGFnZXMgPDwgUEFHRV9TSElGVCk7Ci0KIAkvKgogCSAqIG91ciB2bWEgZmxhZ3MgZG9uJ3QgaGF2ZSBWTV9XUklURSBzbyBieSBkZWZhdWx0LCB0aGUgcHJvY2VzcyBpc24ndAogCSAqIGFsbG93ZWQgdG8gd3JpdGUgdGhvc2UgcGFnZXMuCkBAIC0yODIsMzIgKzIzMCwyNiBAQAogCSAqIGFuZCB5b3VyIG5pY2UgdXNlcmxhbmQgZ2V0dGltZW9mZGF5IHdpbGwgYmUgdG90YWxseSBkZWFkLgogCSAqIEl0J3MgZmluZSB0byB1c2UgdGhhdCBmb3Igc2V0dGluZyBicmVha3BvaW50cyBpbiB0aGUgdkRTTyBjb2RlCiAJICogcGFnZXMgdGhvdWdoCi0JICovCi0Jdm1hLT52bV9mbGFncyA9IFZNX1JFQUR8Vk1fRVhFQ3xWTV9NQVlSRUFEfFZNX01BWVdSSVRFfFZNX01BWUVYRUM7Ci0JLyoKKwkgKgogCSAqIE1ha2Ugc3VyZSB0aGUgdkRTTyBnZXRzIGludG8gZXZlcnkgY29yZSBkdW1wLgogCSAqIER1bXBpbmcgaXRzIGNvbnRlbnRzIG1ha2VzIHBvc3QtbW9ydGVtIGZ1bGx5IGludGVycHJldGFibGUgbGF0ZXIKIAkgKiB3aXRob3V0IG1hdGNoaW5nIHVwIHRoZSBzYW1lIGtlcm5lbCBhbmQgaGFyZHdhcmUgY29uZmlnIHRvIHNlZQogCSAqIHdoYXQgUEMgdmFsdWVzIG1lYW50LgogCSAqLwotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fQUxXQVlTRFVNUDsKLQl2bWEtPnZtX2ZsYWdzIHw9IG1tLT5kZWZfZmxhZ3M7Ci0Jdm1hLT52bV9wYWdlX3Byb3QgPSBwcm90ZWN0aW9uX21hcFt2bWEtPnZtX2ZsYWdzICYgMHg3XTsKLQl2bWEtPnZtX29wcyA9ICZ2ZHNvX3Ztb3BzOwotCi0JLyogSW5zZXJ0IG5ldyBWTUEgKi8KLQlyYyA9IGluc2VydF92bV9zdHJ1Y3QobW0sIHZtYSk7CisJcmMgPSBpbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwgdmRzb19iYXNlLCB2ZHNvX3BhZ2VzIDw8IFBBR0VfU0hJRlQsCisJCQkJICAgICBWTV9SRUFEfFZNX0VYRUN8CisJCQkJICAgICBWTV9NQVlSRUFEfFZNX01BWVdSSVRFfFZNX01BWUVYRUN8CisJCQkJICAgICBWTV9BTFdBWVNEVU1QLAorCQkJCSAgICAgdmRzb19wYWdlbGlzdCk7CiAJaWYgKHJjKQotCQlnb3RvIGZhaWxfdm1hOworCQlnb3RvIGZhaWxfbW1hcHNlbTsKIAotCS8qIFB1dCB2RFNPIGJhc2UgaW50byBtbSBzdHJ1Y3QgYW5kIGFjY291bnQgZm9yIG1lbW9yeSB1c2FnZSAqLworCS8qIFB1dCB2RFNPIGJhc2UgaW50byBtbSBzdHJ1Y3QgKi8KIAljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UgPSB2ZHNvX2Jhc2U7Ci0JbW0tPnRvdGFsX3ZtICs9ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQ7CisKIAl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAlyZXR1cm4gMDsKIAotIGZhaWxfdm1hOgotCWttZW1fY2FjaGVfZnJlZSh2bV9hcmVhX2NhY2hlcCwgdm1hKTsKICBmYWlsX21tYXBzZW06CiAJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJcmV0dXJuIHJjOwpAQCAtNzc4LDE4ICs3MjAsMjYgQEAKIAl9CiAKIAkvKiBNYWtlIHN1cmUgcGFnZXMgYXJlIGluIHRoZSBjb3JyZWN0IHN0YXRlICovCisJQlVHX09OKHZkc28zMl9wYWdlcyArIDIgPiBWRFNPMzJfTUFYUEFHRVMpOwogCWZvciAoaSA9IDA7IGkgPCB2ZHNvMzJfcGFnZXM7IGkrKykgewogCQlzdHJ1Y3QgcGFnZSAqcGcgPSB2aXJ0X3RvX3BhZ2UodmRzbzMyX2tiYXNlICsgaSpQQUdFX1NJWkUpOwogCQlDbGVhclBhZ2VSZXNlcnZlZChwZyk7CiAJCWdldF9wYWdlKHBnKTsKLQorCQl2ZHNvMzJfcGFnZWxpc3RbaV0gPSBwZzsKIAl9CisJdmRzbzMyX3BhZ2VsaXN0W2krK10gPSB2aXJ0X3RvX3BhZ2UodmRzb19kYXRhKTsKKwl2ZHNvMzJfcGFnZWxpc3RbaV0gPSBOVUxMOworCiAjaWZkZWYgQ09ORklHX1BQQzY0CisJQlVHX09OKHZkc282NF9wYWdlcyArIDIgPiBWRFNPNjRfTUFYUEFHRVMpOwogCWZvciAoaSA9IDA7IGkgPCB2ZHNvNjRfcGFnZXM7IGkrKykgewogCQlzdHJ1Y3QgcGFnZSAqcGcgPSB2aXJ0X3RvX3BhZ2UodmRzbzY0X2tiYXNlICsgaSpQQUdFX1NJWkUpOwogCQlDbGVhclBhZ2VSZXNlcnZlZChwZyk7CiAJCWdldF9wYWdlKHBnKTsKKwkJdmRzbzY0X3BhZ2VsaXN0W2ldID0gcGc7CiAJfQorCXZkc282NF9wYWdlbGlzdFtpKytdID0gdmlydF90b19wYWdlKHZkc29fZGF0YSk7CisJdmRzbzY0X3BhZ2VsaXN0W2ldID0gTlVMTDsKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogCWdldF9wYWdlKHZpcnRfdG9fcGFnZSh2ZHNvX2RhdGEpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKaW5kZXggYjQzNDY2Yi4uNjdkNjE3YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKQEAgLTE0OSw3ICsxNDksOCBAQAogc3RhdGljIHZvaWQgaW52YWxpZGF0ZV90Y2VfY2FjaGUoc3RydWN0IGNiZV9pb21tdSAqaW9tbXUsIHVuc2lnbmVkIGxvbmcgKnB0ZSwKIAkJbG9uZyBuX3B0ZXMpCiB7Ci0JdW5zaWduZWQgbG9uZyAqcmVnLCB2YWw7CisJdW5zaWduZWQgbG9uZyBfX2lvbWVtICpyZWc7CisJdW5zaWduZWQgbG9uZyB2YWw7CiAJbG9uZyBuOwogCiAJcmVnID0gaW9tbXUtPnhsYXRlX3JlZ3MgKyBJT0NfSU9QVF9DYWNoZUludmQ7CkBAIC01OTIsNyArNTkzLDcgQEAKIAkvKiBJbml0IGJhc2UgZmllbGRzICovCiAJaSA9IGNiZV9ucl9pb21tdXMrKzsKIAlpb21tdSA9ICZpb21tdXNbaV07Ci0JaW9tbXUtPnN0YWIgPSAwOworCWlvbW11LT5zdGFiID0gTlVMTDsKIAlpb21tdS0+bmlkID0gbmlkOwogCXNucHJpbnRmKGlvbW11LT5uYW1lLCBzaXplb2YoaW9tbXUtPm5hbWUpLCAiaW9tbXUlZCIsIGkpOwogCUlOSVRfTElTVF9IRUFEKCZpb21tdS0+d2luZG93cyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGxlYi9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbGViL3BjaS5jCmluZGV4IDg2N2Y4M2EuLjk4ZGU4MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbGViL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbGViL3BjaS5jCkBAIC02NSwxMyArNjUsMTMgQEAKIAogc3RhdGljIGlubGluZSB1MTYgY2VsbGViX2Zha2VfY29uZmlnX3JlYWR3KHZvaWQgKmFkZHIpCiB7Ci0JdTE2ICpwID0gYWRkcjsKKwlfX2xlMTYgKnAgPSBhZGRyOwogCXJldHVybiBsZTE2X3RvX2NwdSgqcCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGNlbGxlYl9mYWtlX2NvbmZpZ19yZWFkbCh2b2lkICphZGRyKQogewotCXUzMiAqcCA9IGFkZHI7CisJX19sZTMyICpwID0gYWRkcjsKIAlyZXR1cm4gbGUzMl90b19jcHUoKnApOwogfQogCkBAIC04MywxNiArODMsMTYgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGNlbGxlYl9mYWtlX2NvbmZpZ193cml0ZXcodTMyIHZhbCwgdm9pZCAqYWRkcikKIHsKLQl1MTYgdmFsMTY7Ci0JdTE2ICpwID0gYWRkcjsKKwlfX2xlMTYgdmFsMTY7CisJX19sZTE2ICpwID0gYWRkcjsKIAl2YWwxNiA9IGNwdV90b19sZTE2KHZhbCk7CiAJKnAgPSB2YWwxNjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNlbGxlYl9mYWtlX2NvbmZpZ193cml0ZWwodTMyIHZhbCwgdm9pZCAqYWRkcikKIHsKLQl1MzIgdmFsMzI7Ci0JdTMyICpwID0gYWRkcjsKKwlfX2xlMzIgdmFsMzI7CisJX19sZTMyICpwID0gYWRkcjsKIAl2YWwzMiA9IGNwdV90b19sZTMyKHZhbCk7CiAJKnAgPSB2YWwzMjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbGViL3NjY19lcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGxlYi9zY2NfZXBjaS5jCmluZGV4IDBlZGJjMGMuLmMxMWIzOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbGViL3NjY19lcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsZWIvc2NjX2VwY2kuYwpAQCAtNDcsNyArNDcsNyBAQAogI2lmIDAgLyogdGVzdCBjb2RlIGZvciBlcGNpIGR1bW15IHJlYWQgKi8KIHN0YXRpYyB2b2lkIGNlbGxlYl9lcGNpX2R1bW15X3JlYWQoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQl2b2lkICplcGNpX2Jhc2U7CisJdm9pZCBfX2lvbWVtICplcGNpX2Jhc2U7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIAl1MzIgdmFsOwpAQCAtNTgsNyArNTgsNyBAQAogCWlmICghaG9zZSkKIAkJcmV0dXJuOwogCi0JZXBjaV9iYXNlID0gKHZvaWQgKilob3NlLT5jZmdfYWRkcjsKKwllcGNpX2Jhc2UgPSBob3NlLT5jZmdfYWRkcjsKIAogCXZhbCA9IGluX2JlMzIoZXBjaV9iYXNlICsgU0NDX0VQQ0lfV0FUUlApOwogCWlvc3luYygpOwpAQCAtNzEsMTggKzcxLDE4IEBACiAJCQkJCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKIHsKIAl2b2lkIF9faW9tZW0gKmFkZHI7Ci0JYWRkciA9ICh2b2lkICopaG9zZS0+Y2ZnX2FkZHIgKyBQQ0lfQ09NTUFORDsKKwlhZGRyID0gaG9zZS0+Y2ZnX2FkZHIgKyBQQ0lfQ09NTUFORDsKIAlvdXRfYmUzMihhZGRyLCBpbl9iZTMyKGFkZHIpIHwgKFBDSV9TVEFUVVNfUkVDX01BU1RFUl9BQk9SVCA8PCAxNikpOwogfQogCiBzdGF0aWMgaW50IGNlbGxlYl9lcGNpX2NoZWNrX2Fib3J0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHIpCisJCQkJICAgdm9pZCBfX2lvbWVtICphZGRyKQogewogCXZvaWQgX19pb21lbSAqcmVnLCAqZXBjaV9iYXNlOwogCXUzMiB2YWw7CiAKIAlpb2IoKTsKLQllcGNpX2Jhc2UgPSAodm9pZCAqKWhvc2UtPmNmZ19hZGRyOworCWVwY2lfYmFzZSA9IGhvc2UtPmNmZ19hZGRyOwogCiAJcmVnID0gZXBjaV9iYXNlICsgUENJX0NPTU1BTkQ7CiAJdmFsID0gaW5fYmUzMihyZWcpOwpAQCAtMTA4LDIzICsxMDgsMjMgQEAKIAlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjZWxsZWJfZXBjaV9tYWtlX2NvbmZpZ19hZGRyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmNlbGxlYl9lcGNpX21ha2VfY29uZmlnX2FkZHIoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAogCQkJCQl1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSkKIHsKLQl1bnNpZ25lZCBsb25nIGFkZHI7CisJdm9pZCBfX2lvbWVtICphZGRyOwogCXN0cnVjdCBwY2lfYnVzICpidXMgPSBob3NlLT5idXM7CiAKIAlpZiAoYnVzLT5zZWxmKQotCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+Y2ZnX2RhdGEgKworCQlhZGRyID0gaG9zZS0+Y2ZnX2RhdGEgKwogCQkgICAgICAgKCgoYnVzLT5udW1iZXIgJiAweGZmKSA8PCAxNikKIAkJICAgICAgICB8ICgoZGV2Zm4gJiAweGZmKSA8PCA4KQogCQkgICAgICAgIHwgKHdoZXJlICYgMHhmZikKIAkJICAgICAgICB8IDB4MDEwMDAwMDApOwogCWVsc2UKLQkJYWRkciA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmNmZ19kYXRhICsKKwkJYWRkciA9IGhvc2UtPmNmZ19kYXRhICsKIAkJICAgICAgICgoKGRldmZuICYgMHhmZikgPDwgOCkgfCAod2hlcmUgJiAweGZmKSk7CiAKLQlwcl9kZWJ1ZygiRVBDSTogY29uZmlnX2FkZHIgPSAweCUwMTZseFxuIiwgYWRkcik7CisJcHJfZGVidWcoIkVQQ0k6IGNvbmZpZ19hZGRyID0gMHglcFxuIiwgYWRkcik7CiAKIAlyZXR1cm4gYWRkcjsKIH0KQEAgLTEzMiw3ICsxMzIsNyBAQAogc3RhdGljIGludCBjZWxsZWJfZXBjaV9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLAogCQkJdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKiB2YWwpCiB7Ci0JdW5zaWduZWQgbG9uZyBhZGRyOworCXZvaWQgX19pb21lbSAqYWRkcjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogCkBAIC0xNDgsMTcgKzE0OCwxNyBAQAogCWlmIChidXMtPm51bWJlciA9PSBob3NlLT5maXJzdF9idXNubyAmJiBkZXZmbiA9PSAwKSB7CiAJCS8qIEVQQ0kgY29udHJvbGxlciBzZWxmICovCiAKLQkJYWRkciA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmNmZ19hZGRyICsgd2hlcmU7CisJCWFkZHIgPSBob3NlLT5jZmdfYWRkciArIHdoZXJlOwogCiAJCXN3aXRjaCAoc2l6ZSkgewogCQljYXNlIDE6Ci0JCQkqdmFsID0gaW5fOCgodTggKilhZGRyKTsKKwkJCSp2YWwgPSBpbl84KGFkZHIpOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKLQkJCSp2YWwgPSBpbl9iZTE2KCh1MTYgKilhZGRyKTsKKwkJCSp2YWwgPSBpbl9iZTE2KGFkZHIpOwogCQkJYnJlYWs7CiAJCWNhc2UgNDoKLQkJCSp2YWwgPSBpbl9iZTMyKCh1MzIgKilhZGRyKTsKKwkJCSp2YWwgPSBpbl9iZTMyKGFkZHIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtMTcxLDEzICsxNzEsMTMgQEAKIAogCQlzd2l0Y2ggKHNpemUpIHsKIAkJY2FzZSAxOgotCQkJKnZhbCA9IGluXzgoKHU4ICopYWRkcik7CisJCQkqdmFsID0gaW5fOChhZGRyKTsKIAkJCWJyZWFrOwogCQljYXNlIDI6Ci0JCQkqdmFsID0gaW5fbGUxNigodTE2ICopYWRkcik7CisJCQkqdmFsID0gaW5fbGUxNihhZGRyKTsKIAkJCWJyZWFrOwogCQljYXNlIDQ6Ci0JCQkqdmFsID0gaW5fbGUzMigodTMyICopYWRkcik7CisJCQkqdmFsID0gaW5fbGUzMihhZGRyKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKQEAgLTE4OCwxMyArMTg4LDEzIEBACiAJCSAiYWRkcj0weCVseCwgZGV2Zm49MHgleCwgd2hlcmU9MHgleCwgc2l6ZT0weCV4LCB2YWw9MHgleFxuIiwKIAkJIGFkZHIsIGRldmZuLCB3aGVyZSwgc2l6ZSwgKnZhbCk7CiAKLQlyZXR1cm4gY2VsbGViX2VwY2lfY2hlY2tfYWJvcnQoaG9zZSwgMCk7CisJcmV0dXJuIGNlbGxlYl9lcGNpX2NoZWNrX2Fib3J0KGhvc2UsIE5VTEwpOwogfQogCiBzdGF0aWMgaW50IGNlbGxlYl9lcGNpX3dyaXRlX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLAogCQkJdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsKQogewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIApAQCAtMjEwLDE3ICsyMTAsMTcgQEAKIAlpZiAoYnVzLT5udW1iZXIgPT0gaG9zZS0+Zmlyc3RfYnVzbm8gJiYgZGV2Zm4gPT0gMCkgewogCQkvKiBFUENJIGNvbnRyb2xsZXIgc2VsZiAqLwogCi0JCWFkZHIgPSAodW5zaWduZWQgbG9uZylob3NlLT5jZmdfYWRkciArIHdoZXJlOworCQlhZGRyID0gaG9zZS0+Y2ZnX2FkZHIgKyB3aGVyZTsKIAogCQlzd2l0Y2ggKHNpemUpIHsKIAkJY2FzZSAxOgotCQkJb3V0XzgoKHU4ICopYWRkciwgdmFsKTsKKwkJCW91dF84KGFkZHIsIHZhbCk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJb3V0X2JlMTYoKHUxNiAqKWFkZHIsIHZhbCk7CisJCQlvdXRfYmUxNihhZGRyLCB2YWwpOwogCQkJYnJlYWs7CiAJCWNhc2UgNDoKLQkJCW91dF9iZTMyKCh1MzIgKilhZGRyLCB2YWwpOworCQkJb3V0X2JlMzIoYWRkciwgdmFsKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKQEAgLTIzMywxMyArMjMzLDEzIEBACiAKIAkJc3dpdGNoIChzaXplKSB7CiAJCWNhc2UgMToKLQkJCW91dF84KCh1OCAqKWFkZHIsIHZhbCk7CisJCQlvdXRfOChhZGRyLCB2YWwpOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKLQkJCW91dF9sZTE2KCh1MTYgKilhZGRyLCB2YWwpOworCQkJb3V0X2xlMTYoYWRkciwgdmFsKTsKIAkJCWJyZWFrOwogCQljYXNlIDQ6Ci0JCQlvdXRfbGUzMigodTMyICopYWRkciwgdmFsKTsKKwkJCW91dF9sZTMyKGFkZHIsIHZhbCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CkBAIC0yNjEsNyArMjYxLDcgQEAKIAl2b2lkIF9faW9tZW0gKnJlZywgKmVwY2lfYmFzZTsKIAlpbnQgaHdyZXMgPSAwOwogCi0JZXBjaV9iYXNlID0gKHZvaWQgKilob3NlLT5jZmdfYWRkcjsKKwllcGNpX2Jhc2UgPSBob3NlLT5jZmdfYWRkcjsKIAogCS8qIFBDSSBjb3JlIHJlc2V0KEludGVybmFsIGJ1cyBhbmQgUENJIGNsb2NrKSAqLwogCXJlZyA9IGVwY2lfYmFzZSArIFNDQ19FUENJX0NLQ1RSTDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMKaW5kZXggZTFmNTFkNC4uMTE3YzlhMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMKQEAgLTc1LDcgKzc1LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvb3BzX3Blcl9qaWZmeTsKIAogLyogVG8gYmUgcmVwbGFjZWQgYnkgUlRBUyB3aGVuIGF2YWlsYWJsZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCAqYnJpcV9TUE9SOworc3RhdGljIHVuc2lnbmVkIGludCBfX2lvbWVtICpicmlxX1NQT1I7CiAKICNpZmRlZiBDT05GSUdfU01QCiBleHRlcm4gc3RydWN0IHNtcF9vcHNfdCBjaHJwX3NtcF9vcHM7CkBAIC0yNjcsNyArMjY3LDcgQEAKIAl9IGVsc2UgaWYgKG1hY2hpbmUgJiYgc3RybmNtcChtYWNoaW5lLCAiVG90YWxJbXBhY3QsQlJJUS0xIiwgMTgpID09IDApIHsKIAkJX2NocnBfdHlwZSA9IF9DSFJQX2JyaXE7CiAJCS8qIE1hcCB0aGUgU1BPUiByZWdpc3RlciBvbiBicmlxIGFuZCBjaGFuZ2UgdGhlIHJlc3RhcnQgaG9vayAqLwotCQlicmlxX1NQT1IgPSAodW5zaWduZWQgaW50ICopaW9yZW1hcCgweGZmMDAwMGU4LCA0KTsKKwkJYnJpcV9TUE9SID0gaW9yZW1hcCgweGZmMDAwMGU4LCA0KTsKIAkJcHBjX21kLnJlc3RhcnQgPSBicmlxX3Jlc3RhcnQ7CiAJfSBlbHNlIHsKIAkJLyogTGV0J3MgYXNzdW1lIGl0IGlzIGFuIElCTSBjaHJwIGlmIGFsbCBlbHNlIGZhaWxzICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCmluZGV4IGJiMTcyODMuLjYzMWMzMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCkBAIC0xOTQsNiArMTk0LDcgQEAKIAogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfYWxsb2NfaW9faXJxKTsKIAogaW50IHBzM19mcmVlX2lvX2lycSh1bnNpZ25lZCBpbnQgdmlycSkKIHsKQEAgLTIwOSw2ICsyMTAsNyBAQAogCiAJcmV0dXJuIHJlc3VsdDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19mcmVlX2lvX2lycSk7CiAKIC8qKgogICogcHMzX2FsbG9jX2V2ZW50X2lycSAtIEFsbG9jYXRlIGEgdmlycSBmb3IgdXNlIHdpdGggYSBzeXN0ZW0gZXZlbnQuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMKaW5kZXggYmNlNjEzNi4uYTlmN2U0YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYwpAQCAtNTcsNiArNTcsNyBAQAogCWR1bXBfbW1pb19yZWdpb24ocik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19tbWlvX3JlZ2lvbl9jcmVhdGUpOwogCiBpbnQgcHMzX2ZyZWVfbW1pb19yZWdpb24oc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKIHsKQEAgLTcyLDYgKzczLDcgQEAKIAlyLT5scGFyX2FkZHIgPSAwOwogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfZnJlZV9tbWlvX3JlZ2lvbik7CiAKIHN0YXRpYyBpbnQgcHMzX3N5c3RlbV9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqX2RldiwKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy94bW9uL3NwdS1kaXMuYyBiL2FyY2gvcG93ZXJwYy94bW9uL3NwdS1kaXMuYwppbmRleCBlZTkyOWM2Li5lNWY4OTgzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMveG1vbi9zcHUtZGlzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3htb24vc3B1LWRpcy5jCkBAIC04NSw3ICs4NSw3IEBACiAgIGlmICgoaW5kZXggPSBzcHVfZGlzYXNzZW1ibGVfdGFibGVbb3Bjb2RlICYgMHg3ZmZdKSAhPSAwKQogICAgIHJldHVybiBpbmRleDsKIAotICByZXR1cm4gMDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFByaW50IGEgU3B1IGluc3RydWN0aW9uLiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9kZWZjb25maWcgYi9hcmNoL3MzOTAvZGVmY29uZmlnCmluZGV4IDdjNjIxYjguLjE0MDY0MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9kZWZjb25maWcKKysrIGIvYXJjaC9zMzkwL2RlZmNvbmZpZwpAQCAtMTc5LDYgKzE3OSw4IEBACiAjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfS0VZPXkKK0NPTkZJR19JVUNWPW0KK0NPTkZJR19BRklVQ1Y9bQogQ09ORklHX0lORVQ9eQogQ09ORklHX0lQX01VTFRJQ0FTVD15CiAjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldApAQCAtNTA4LDcgKzUxMCw2IEBACiAjCiBDT05GSUdfTENTPW0KIENPTkZJR19DVEM9bQotQ09ORklHX0lVQ1Y9bQogIyBDT05GSUdfTkVUSVVDViBpcyBub3Qgc2V0CiAjIENPTkZJR19TTVNHSVVDViBpcyBub3Qgc2V0CiAjIENPTkZJR19DTEFXIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3ZzeXNjYWxsL3ZzeXNjYWxsLmMgYi9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC92c3lzY2FsbC5jCmluZGV4IGRlYjQ2OTQuLjdiMGY2NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3ZzeXNjYWxsL3ZzeXNjYWxsLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdnN5c2NhbGwvdnN5c2NhbGwuYwpAQCAtMzcsMTEgKzM3LDEyIEBACiAgKiBvZiB0aGUgRUxGIERTTyBpbWFnZXMgaW5jbHVkZWQgdGhlcmVpbi4KICAqLwogZXh0ZXJuIGNvbnN0IGNoYXIgdnN5c2NhbGxfdHJhcGFfc3RhcnQsIHZzeXNjYWxsX3RyYXBhX2VuZDsKLXN0YXRpYyB2b2lkICpzeXNjYWxsX3BhZ2U7CitzdGF0aWMgc3RydWN0IHBhZ2UgKnN5c2NhbGxfcGFnZXNbMV07CiAKIGludCBfX2luaXQgdnN5c2NhbGxfaW5pdCh2b2lkKQogewotCXN5c2NhbGxfcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOworCXZvaWQgKnN5c2NhbGxfcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOworCXN5c2NhbGxfcGFnZXNbMF0gPSB2aXJ0X3RvX3BhZ2Uoc3lzY2FsbF9wYWdlKTsKIAogCS8qCiAJICogWFhYOiBNYXAgdGhpcyBwYWdlIHRvIGEgZml4bWFwIGVudHJ5IGlmIHdlIGdldCBhcm91bmQKQEAgLTU1LDM3ICs1NiwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKnN5c2NhbGxfdm1hX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgKnR5cGUpCi17Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBhZGRyZXNzIC0gdm1hLT52bV9zdGFydDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQotCWlmIChhZGRyZXNzIDwgdm1hLT52bV9zdGFydCB8fCBhZGRyZXNzID4gdm1hLT52bV9lbmQpCi0JCXJldHVybiBOT1BBR0VfU0lHQlVTOwotCi0JcGFnZSA9IHZpcnRfdG9fcGFnZShzeXNjYWxsX3BhZ2UgKyBvZmZzZXQpOwotCi0JZ2V0X3BhZ2UocGFnZSk7Ci0KLQlyZXR1cm4gcGFnZTsKLX0KLQotLyogUHJldmVudCBWTUEgbWVyZ2luZyAqLwotc3RhdGljIHZvaWQgc3lzY2FsbF92bWFfY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3lzY2FsbF92bV9vcHMgPSB7Ci0JLm5vcGFnZQk9IHN5c2NhbGxfdm1hX25vcGFnZSwKLQkuY2xvc2UJPSBzeXNjYWxsX3ZtYV9jbG9zZSwKLX07Ci0KIC8qIFNldHVwIGEgVk1BIGF0IHByb2dyYW0gc3RhcnR1cCBmb3IgdGhlIHZzeXNjYWxsIHBhZ2UgKi8KIGludCBhcmNoX3NldHVwX2FkZGl0aW9uYWxfcGFnZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwKIAkJCQlpbnQgZXhlY3V0YWJsZV9zdGFjaykKIHsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAlpbnQgcmV0OwpAQCAtOTcsMzAgKzcxLDE2IEBACiAJCWdvdG8gdXBfZmFpbDsKIAl9CiAKLQl2bWEgPSBrbWVtX2NhY2hlX3phbGxvYyh2bV9hcmVhX2NhY2hlcCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2bWEpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlyZXQgPSBpbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwgYWRkciwgUEFHRV9TSVpFLAorCQkJCSAgICAgIFZNX1JFQUQgfCBWTV9FWEVDIHwKKwkJCQkgICAgICBWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlFWEVDIHwKKwkJCQkgICAgICBWTV9BTFdBWVNEVU1QLAorCQkJCSAgICAgIHN5c2NhbGxfcGFnZXMpOworCWlmICh1bmxpa2VseShyZXQpKQogCQlnb3RvIHVwX2ZhaWw7Ci0JfQotCi0Jdm1hLT52bV9zdGFydCA9IGFkZHI7Ci0Jdm1hLT52bV9lbmQgPSBhZGRyICsgUEFHRV9TSVpFOwotCS8qIE1BWVdSSVRFIHRvIGFsbG93IGdkYiB0byBDT1cgYW5kIHNldCBicmVha3BvaW50cyAqLwotCXZtYS0+dm1fZmxhZ3MgPSBWTV9SRUFEfFZNX0VYRUN8Vk1fTUFZUkVBRHxWTV9NQVlFWEVDfFZNX01BWVdSSVRFOwotCXZtYS0+dm1fZmxhZ3MgfD0gbW0tPmRlZl9mbGFnczsKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHByb3RlY3Rpb25fbWFwW3ZtYS0+dm1fZmxhZ3MgJiA3XTsKLQl2bWEtPnZtX29wcyA9ICZzeXNjYWxsX3ZtX29wczsKLQl2bWEtPnZtX21tID0gbW07Ci0KLQlyZXQgPSBpbnNlcnRfdm1fc3RydWN0KG1tLCB2bWEpOwotCWlmICh1bmxpa2VseShyZXQpKSB7Ci0JCWttZW1fY2FjaGVfZnJlZSh2bV9hcmVhX2NhY2hlcCwgdm1hKTsKLQkJZ290byB1cF9mYWlsOwotCX0KIAogCWN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc28gPSAodm9pZCAqKWFkZHI7CiAKLQltbS0+dG90YWxfdm0rKzsKIHVwX2ZhaWw6CiAJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvc3lzY2FsbDMyLmMgYi9hcmNoL3g4Nl82NC9pYTMyL3N5c2NhbGwzMi5jCmluZGV4IDU5ZjFmYTEuLjU2OGZmMGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvc3lzY2FsbDMyLmMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9zeXNjYWxsMzIuYwpAQCAtMTgsNjggKzE4LDM0IEBACiBleHRlcm4gdW5zaWduZWQgY2hhciBzeXNjYWxsMzJfc3lzZW50ZXJbXSwgc3lzY2FsbDMyX3N5c2VudGVyX2VuZFtdOwogZXh0ZXJuIGludCBzeXNjdGxfdnN5c2NhbGwzMjsKIAotY2hhciAqc3lzY2FsbDMyX3BhZ2U7IAorc3RhdGljIHN0cnVjdCBwYWdlICpzeXNjYWxsMzJfcGFnZXNbMV07CiBzdGF0aWMgaW50IHVzZV9zeXNlbnRlciA9IC0xOwogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKgotc3lzY2FsbDMyX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZHIsIGludCAqdHlwZSkKLXsKLQlzdHJ1Y3QgcGFnZSAqcCA9IHZpcnRfdG9fcGFnZShhZHIgLSB2bWEtPnZtX3N0YXJ0ICsgc3lzY2FsbDMyX3BhZ2UpOwotCWdldF9wYWdlKHApOwotCXJldHVybiBwOwotfQotCi0vKiBQcmV2ZW50IFZNQSBtZXJnaW5nICovCi1zdGF0aWMgdm9pZCBzeXNjYWxsMzJfdm1hX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotfQotCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHN5c2NhbGwzMl92bV9vcHMgPSB7Ci0JLmNsb3NlID0gc3lzY2FsbDMyX3ZtYV9jbG9zZSwKLQkubm9wYWdlID0gc3lzY2FsbDMyX25vcGFnZSwKLX07Ci0KIHN0cnVjdCBsaW51eF9iaW5wcm07CiAKIC8qIFNldHVwIGEgVk1BIGF0IHByb2dyYW0gc3RhcnR1cCBmb3IgdGhlIHZzeXNjYWxsIHBhZ2UgKi8KIGludCBzeXNjYWxsMzJfc2V0dXBfcGFnZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgaW50IGV4c3RhY2spCiB7Ci0JaW50IG5wYWdlcyA9IChWU1lTQ0FMTDMyX0VORCAtIFZTWVNDQUxMMzJfQkFTRSkgPj4gUEFHRV9TSElGVDsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCWludCByZXQ7CiAKLQl2bWEgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2FjaGVwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZtYSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1zZXQodm1hLCAwLCBzaXplb2Yoc3RydWN0IHZtX2FyZWFfc3RydWN0KSk7Ci0JLyogQ291bGQgcmFuZG9taXplIGhlcmUgKi8KLQl2bWEtPnZtX3N0YXJ0ID0gVlNZU0NBTEwzMl9CQVNFOwotCXZtYS0+dm1fZW5kID0gVlNZU0NBTEwzMl9FTkQ7Ci0JLyogTUFZV1JJVEUgdG8gYWxsb3cgZ2RiIHRvIENPVyBhbmQgc2V0IGJyZWFrcG9pbnRzICovCi0Jdm1hLT52bV9mbGFncyA9IFZNX1JFQUR8Vk1fRVhFQ3xWTV9NQVlSRUFEfFZNX01BWUVYRUN8Vk1fTUFZV1JJVEU7CisJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAkvKgorCSAqIE1BWVdSSVRFIHRvIGFsbG93IGdkYiB0byBDT1cgYW5kIHNldCBicmVha3BvaW50cworCSAqCiAJICogTWFrZSBzdXJlIHRoZSB2RFNPIGdldHMgaW50byBldmVyeSBjb3JlIGR1bXAuCiAJICogRHVtcGluZyBpdHMgY29udGVudHMgbWFrZXMgcG9zdC1tb3J0ZW0gZnVsbHkgaW50ZXJwcmV0YWJsZSBsYXRlcgogCSAqIHdpdGhvdXQgbWF0Y2hpbmcgdXAgdGhlIHNhbWUga2VybmVsIGFuZCBoYXJkd2FyZSBjb25maWcgdG8gc2VlCiAJICogd2hhdCBQQyB2YWx1ZXMgbWVhbnQuCiAJICovCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9BTFdBWVNEVU1QOwotCXZtYS0+dm1fZmxhZ3MgfD0gbW0tPmRlZl9mbGFnczsKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHByb3RlY3Rpb25fbWFwW3ZtYS0+dm1fZmxhZ3MgJiA3XTsKLQl2bWEtPnZtX29wcyA9ICZzeXNjYWxsMzJfdm1fb3BzOwotCXZtYS0+dm1fbW0gPSBtbTsKLQotCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0JaWYgKChyZXQgPSBpbnNlcnRfdm1fc3RydWN0KG1tLCB2bWEpKSkgewotCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQkJa21lbV9jYWNoZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwotCQlyZXR1cm4gcmV0OwotCX0KLQltbS0+dG90YWxfdm0gKz0gbnBhZ2VzOworCS8qIENvdWxkIHJhbmRvbWl6ZSBoZXJlICovCisJcmV0ID0gaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcobW0sIFZTWVNDQUxMMzJfQkFTRSwgUEFHRV9TSVpFLAorCQkJCSAgICAgIFZNX1JFQUR8Vk1fRVhFQ3wKKwkJCQkgICAgICBWTV9NQVlSRUFEfFZNX01BWVdSSVRFfFZNX01BWUVYRUN8CisJCQkJICAgICAgVk1fQUxXQVlTRFVNUCwKKwkJCQkgICAgICBzeXNjYWxsMzJfcGFnZXMpOwogCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIGNvbnN0IGNoYXIgKmFyY2hfdm1hX25hbWUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCkBAIC05Miw5ICs1OCwxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3N5c2NhbGwzMih2b2lkKQogeyAKLQlzeXNjYWxsMzJfcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOyAKKwljaGFyICpzeXNjYWxsMzJfcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghc3lzY2FsbDMyX3BhZ2UpIAogCQlwYW5pYygiQ2Fubm90IGFsbG9jYXRlIHN5c2NhbGwzMiBwYWdlIik7IAorCXN5c2NhbGwzMl9wYWdlc1swXSA9IHZpcnRfdG9fcGFnZShzeXNjYWxsMzJfcGFnZSk7CiAgCWlmICh1c2Vfc3lzZW50ZXIgPiAwKSB7CiAgCQltZW1jcHkoc3lzY2FsbDMyX3BhZ2UsIHN5c2NhbGwzMl9zeXNlbnRlciwKICAJCSAgICAgICBzeXNjYWxsMzJfc3lzZW50ZXJfZW5kIC0gc3lzY2FsbDMyX3N5c2VudGVyKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2xsX3J3X2Jsay5jIGIvYmxvY2svbGxfcndfYmxrLmMKaW5kZXggZmI2Nzg5Ny4uMzhjMjkzYiAxMDA2NDQKLS0tIGEvYmxvY2svbGxfcndfYmxrLmMKKysrIGIvYmxvY2svbGxfcndfYmxrLmMKQEAgLTEyNjQsNyArMTI2NCw3IEBACiAJYmlvLT5iaV9od19zZWdtZW50cyA9IG5yX2h3X3NlZ3M7CiAJYmlvLT5iaV9mbGFncyB8PSAoMSA8PCBCSU9fU0VHX1ZBTElEKTsKIH0KLQorRVhQT1JUX1NZTUJPTChibGtfcmVjb3VudF9zZWdtZW50cyk7CiAKIHN0YXRpYyBpbnQgYmxrX3BoeXNfY29udGlnX3NlZ21lbnQocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8sCiAJCQkJICAgc3RydWN0IGJpbyAqbnh0KQpkaWZmIC0tZ2l0IGEvY3J5cHRvL0tjb25maWcgYi9jcnlwdG8vS2NvbmZpZwppbmRleCA5MThiNGQ4Li4wODZmY2VjIDEwMDY0NAotLS0gYS9jcnlwdG8vS2NvbmZpZworKysgYi9jcnlwdG8vS2NvbmZpZwpAQCAtMTQ5LDYgKzE0OSwxNSBAQAogCSAgQ0JDOiBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgbW9kZQogCSAgVGhpcyBibG9jayBjaXBoZXIgYWxnb3JpdGhtIGlzIHJlcXVpcmVkIGZvciBJUFNlYy4KIAorY29uZmlnIENSWVBUT19QQ0JDCisJdHJpc3RhdGUgIlBDQkMgc3VwcG9ydCIKKwlzZWxlY3QgQ1JZUFRPX0JMS0NJUEhFUgorCXNlbGVjdCBDUllQVE9fTUFOQUdFUgorCWRlZmF1bHQgbQorCWhlbHAKKwkgIFBDQkM6IFByb3BhZ2F0aW5nIENpcGhlciBCbG9jayBDaGFpbmluZyBtb2RlCisJICBUaGlzIGJsb2NrIGNpcGhlciBhbGdvcml0aG0gaXMgcmVxdWlyZWQgZm9yIFJ4UlBDLgorCiBjb25maWcgQ1JZUFRPX0xSVwogCXRyaXN0YXRlICJMUlcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTApAQCAtMTY4LDYgKzE3NywxMyBAQAogCWhlbHAKIAkgIERFUyBjaXBoZXIgYWxnb3JpdGhtIChGSVBTIDQ2LTIpLCBhbmQgVHJpcGxlIERFUyBFREUgKEZJUFMgNDYtMykuCiAKK2NvbmZpZyBDUllQVE9fRkNSWVBUCisJdHJpc3RhdGUgIkZDcnlwdCBjaXBoZXIgYWxnb3JpdGhtIgorCXNlbGVjdCBDUllQVE9fQUxHQVBJCisJc2VsZWN0IENSWVBUT19CTEtDSVBIRVIKKwloZWxwCisJICBGQ3J5cHQgYWxnb3JpdGhtIHVzZWQgYnkgUnhSUEMuCisKIGNvbmZpZyBDUllQVE9fQkxPV0ZJU0gKIAl0cmlzdGF0ZSAiQmxvd2Zpc2ggY2lwaGVyIGFsZ29yaXRobSIKIAlzZWxlY3QgQ1JZUFRPX0FMR0FQSQpAQCAtNDA5LDYgKzQyNSwyMSBAQAogCSAgU2VlIENhc3RhZ25vbGk5My4gIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBsaWIvbGliY3JjMzJjLgogICAgICAgICAgIE1vZHVsZSB3aWxsIGJlIGNyYzMyYy4KIAorY29uZmlnIENSWVBUT19DQU1FTExJQQorCXRyaXN0YXRlICJDYW1lbGxpYSBjaXBoZXIgYWxnb3JpdGhtcyIKKwlkZXBlbmRzIG9uIENSWVBUTworCXNlbGVjdCBDUllQVE9fQUxHQVBJCisJaGVscAorCSAgQ2FtZWxsaWEgY2lwaGVyIGFsZ29yaXRobXMgbW9kdWxlLgorCisJICBDYW1lbGxpYSBpcyBhIHN5bW1ldHJpYyBrZXkgYmxvY2sgY2lwaGVyIGRldmVsb3BlZCBqb2ludGx5CisJICBhdCBOVFQgYW5kIE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycG9yYXRpb24uCisKKwkgIFRoZSBDYW1lbGxpYSBzcGVjaWZpZXMgdGhyZWUga2V5IHNpemVzOiAxMjgsIDE5MiBhbmQgMjU2IGJpdHMuCisKKwkgIFNlZSBhbHNvOgorCSAgPGh0dHBzOi8vaW5mby5pc2wubnR0LmNvLmpwL2NyeXB0L2VuZy9jYW1lbGxpYS9pbmRleF9zLmh0bWw+CisKIGNvbmZpZyBDUllQVE9fVEVTVAogCXRyaXN0YXRlICJUZXN0aW5nIG1vZHVsZSIKIAlkZXBlbmRzIG9uIG0KZGlmZiAtLWdpdCBhL2NyeXB0by9NYWtlZmlsZSBiL2NyeXB0by9NYWtlZmlsZQppbmRleCA2MGUzZDI0Zi4uMTJmOTNmNSAxMDA2NDQKLS0tIGEvY3J5cHRvL01ha2VmaWxlCisrKyBiL2NyeXB0by9NYWtlZmlsZQpAQCAtMjcsMTMgKzI3LDE2IEBACiBvYmotJChDT05GSUdfQ1JZUFRPX0dGMTI4TVVMKSArPSBnZjEyOG11bC5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0VDQikgKz0gZWNiLm8KIG9iai0kKENPTkZJR19DUllQVE9fQ0JDKSArPSBjYmMubworb2JqLSQoQ09ORklHX0NSWVBUT19QQ0JDKSArPSBwY2JjLm8KIG9iai0kKENPTkZJR19DUllQVE9fTFJXKSArPSBscncubwogb2JqLSQoQ09ORklHX0NSWVBUT19ERVMpICs9IGRlcy5vCitvYmotJChDT05GSUdfQ1JZUFRPX0ZDUllQVCkgKz0gZmNyeXB0Lm8KIG9iai0kKENPTkZJR19DUllQVE9fQkxPV0ZJU0gpICs9IGJsb3dmaXNoLm8KIG9iai0kKENPTkZJR19DUllQVE9fVFdPRklTSCkgKz0gdHdvZmlzaC5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1RXT0ZJU0hfQ09NTU9OKSArPSB0d29maXNoX2NvbW1vbi5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1NFUlBFTlQpICs9IHNlcnBlbnQubwogb2JqLSQoQ09ORklHX0NSWVBUT19BRVMpICs9IGFlcy5vCitvYmotJChDT05GSUdfQ1JZUFRPX0NBTUVMTElBKSArPSBjYW1lbGxpYS5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0NBU1Q1KSArPSBjYXN0NS5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0NBU1Q2KSArPSBjYXN0Ni5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0FSQzQpICs9IGFyYzQubwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FsZ2FwaS5jIGIvY3J5cHRvL2FsZ2FwaS5jCmluZGV4IGM5MTUzMDAuLmY3ZDIxODUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hbGdhcGkuYworKysgYi9jcnlwdG8vYWxnYXBpLmMKQEAgLTM3Nyw3ICszNzcsOCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2Ryb3Bfc3Bhd24pOwogCi1zdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX3NwYXduX3RmbShzdHJ1Y3QgY3J5cHRvX3NwYXduICpzcGF3bikKK3N0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fc3Bhd25fdGZtKHN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduLCB1MzIgdHlwZSwKKwkJCQkgICAgdTMyIG1hc2spCiB7CiAJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKIAlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnMjsKQEAgLTM5NiwxMCArMzk3LDE4IEBACiAJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOwogCX0KIAotCXRmbSA9IF9fY3J5cHRvX2FsbG9jX3RmbShhbGcsIDApOwotCWlmIChJU19FUlIodGZtKSkKLQkJY3J5cHRvX21vZF9wdXQoYWxnKTsKKwl0Zm0gPSBFUlJfUFRSKC1FSU5WQUwpOworCWlmICh1bmxpa2VseSgoYWxnLT5jcmFfZmxhZ3MgXiB0eXBlKSAmIG1hc2spKQorCQlnb3RvIG91dF9wdXRfYWxnOwogCisJdGZtID0gX19jcnlwdG9fYWxsb2NfdGZtKGFsZywgdHlwZSwgbWFzayk7CisJaWYgKElTX0VSUih0Zm0pKQorCQlnb3RvIG91dF9wdXRfYWxnOworCisJcmV0dXJuIHRmbTsKKworb3V0X3B1dF9hbGc6CisJY3J5cHRvX21vZF9wdXQoYWxnKTsKIAlyZXR1cm4gdGZtOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX3NwYXduX3RmbSk7CmRpZmYgLS1naXQgYS9jcnlwdG8vYXBpLmMgYi9jcnlwdG8vYXBpLmMKaW5kZXggOGM0NDY4Ny4uNTVhZjhiYiAxMDA2NDQKLS0tIGEvY3J5cHRvL2FwaS5jCisrKyBiL2NyeXB0by9hcGkuYwpAQCAtMjEyLDMxICsyMTIsMTIgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19hbGdfbW9kX2xvb2t1cCk7CiAKLXN0YXRpYyBpbnQgY3J5cHRvX2luaXRfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQorc3RhdGljIGludCBjcnlwdG9faW5pdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIHR5cGUsIHUzMiBtYXNrKQogewotCXRmbS0+Y3J0X2ZsYWdzID0gZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9NQVNLOwotCWZsYWdzICY9IH5DUllQVE9fVEZNX1JFUV9NQVNLOwotCQotCXN3aXRjaCAoY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pKSB7Ci0JY2FzZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOgotCQlyZXR1cm4gY3J5cHRvX2luaXRfY2lwaGVyX2ZsYWdzKHRmbSwgZmxhZ3MpOwotCQkKLQljYXNlIENSWVBUT19BTEdfVFlQRV9ESUdFU1Q6Ci0JCXJldHVybiBjcnlwdG9faW5pdF9kaWdlc3RfZmxhZ3ModGZtLCBmbGFncyk7Ci0JCQotCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTOgotCQlyZXR1cm4gY3J5cHRvX2luaXRfY29tcHJlc3NfZmxhZ3ModGZtLCBmbGFncyk7Ci0JfQotCQotCXJldHVybiAwOwotfQorCWNvbnN0IHN0cnVjdCBjcnlwdG9fdHlwZSAqdHlwZV9vYmogPSB0Zm0tPl9fY3J0X2FsZy0+Y3JhX3R5cGU7CiAKLXN0YXRpYyBpbnQgY3J5cHRvX2luaXRfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JY29uc3Qgc3RydWN0IGNyeXB0b190eXBlICp0eXBlID0gdGZtLT5fX2NydF9hbGctPmNyYV90eXBlOwotCi0JaWYgKHR5cGUpCi0JCXJldHVybiB0eXBlLT5pbml0KHRmbSk7CisJaWYgKHR5cGVfb2JqKQorCQlyZXR1cm4gdHlwZV9vYmotPmluaXQodGZtLCB0eXBlLCBtYXNrKTsKIAogCXN3aXRjaCAoY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pKSB7CiAJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOgpAQCAtMjg1LDI5ICsyNjYsMjkgQEAKIAl9CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3J5cHRvX2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZywgaW50IGZsYWdzKQorc3RhdGljIHVuc2lnbmVkIGludCBjcnlwdG9fY3R4c2l6ZShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLCB1MzIgdHlwZSwgdTMyIG1hc2spCiB7Ci0JY29uc3Qgc3RydWN0IGNyeXB0b190eXBlICp0eXBlID0gYWxnLT5jcmFfdHlwZTsKKwljb25zdCBzdHJ1Y3QgY3J5cHRvX3R5cGUgKnR5cGVfb2JqID0gYWxnLT5jcmFfdHlwZTsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCiAJbGVuID0gYWxnLT5jcmFfYWxpZ25tYXNrICYgfihjcnlwdG9fdGZtX2N0eF9hbGlnbm1lbnQoKSAtIDEpOwotCWlmICh0eXBlKQotCQlyZXR1cm4gbGVuICsgdHlwZS0+Y3R4c2l6ZShhbGcpOworCWlmICh0eXBlX29iaikKKwkJcmV0dXJuIGxlbiArIHR5cGVfb2JqLT5jdHhzaXplKGFsZywgdHlwZSwgbWFzayk7CiAKIAlzd2l0Y2ggKGFsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0spIHsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAogCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjoKLQkJbGVuICs9IGNyeXB0b19jaXBoZXJfY3R4c2l6ZShhbGcsIGZsYWdzKTsKKwkJbGVuICs9IGNyeXB0b19jaXBoZXJfY3R4c2l6ZShhbGcpOwogCQlicmVhazsKIAkJCiAJY2FzZSBDUllQVE9fQUxHX1RZUEVfRElHRVNUOgotCQlsZW4gKz0gY3J5cHRvX2RpZ2VzdF9jdHhzaXplKGFsZywgZmxhZ3MpOworCQlsZW4gKz0gY3J5cHRvX2RpZ2VzdF9jdHhzaXplKGFsZyk7CiAJCWJyZWFrOwogCQkKIAljYXNlIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzoKLQkJbGVuICs9IGNyeXB0b19jb21wcmVzc19jdHhzaXplKGFsZywgZmxhZ3MpOworCQlsZW4gKz0gY3J5cHRvX2NvbXByZXNzX2N0eHNpemUoYWxnKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0zMjIsMjQgKzMwMywyMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX3Nob290X2FsZyk7CiAKLXN0cnVjdCBjcnlwdG9fdGZtICpfX2NyeXB0b19hbGxvY190Zm0oc3RydWN0IGNyeXB0b19hbGcgKmFsZywgdTMyIGZsYWdzKQorc3RydWN0IGNyeXB0b190Zm0gKl9fY3J5cHRvX2FsbG9jX3RmbShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLCB1MzIgdHlwZSwKKwkJCQkgICAgICB1MzIgbWFzaykKIHsKIAlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgdGZtX3NpemU7CiAJaW50IGVyciA9IC1FTk9NRU07CiAKLQl0Zm1fc2l6ZSA9IHNpemVvZigqdGZtKSArIGNyeXB0b19jdHhzaXplKGFsZywgZmxhZ3MpOworCXRmbV9zaXplID0gc2l6ZW9mKCp0Zm0pICsgY3J5cHRvX2N0eHNpemUoYWxnLCB0eXBlLCBtYXNrKTsKIAl0Zm0gPSBremFsbG9jKHRmbV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAodGZtID09IE5VTEwpCiAJCWdvdG8gb3V0X2VycjsKIAogCXRmbS0+X19jcnRfYWxnID0gYWxnOwogCi0JZXJyID0gY3J5cHRvX2luaXRfZmxhZ3ModGZtLCBmbGFncyk7Ci0JaWYgKGVycikKLQkJZ290byBvdXRfZnJlZV90Zm07Ci0JCQotCWVyciA9IGNyeXB0b19pbml0X29wcyh0Zm0pOworCWVyciA9IGNyeXB0b19pbml0X29wcyh0Zm0sIHR5cGUsIG1hc2spOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2ZyZWVfdGZtOwogCkBAIC0zNjIsMzEgKzM0MCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX2NyeXB0b19hbGxvY190Zm0pOwogCi1zdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IE5VTEw7Ci0JaW50IGVycjsKLQotCWRvIHsKLQkJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKLQotCQlhbGcgPSBjcnlwdG9fYWxnX21vZF9sb29rdXAobmFtZSwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7Ci0JCWVyciA9IFBUUl9FUlIoYWxnKTsKLQkJaWYgKElTX0VSUihhbGcpKQotCQkJY29udGludWU7Ci0KLQkJdGZtID0gX19jcnlwdG9fYWxsb2NfdGZtKGFsZywgZmxhZ3MpOwotCQllcnIgPSAwOwotCQlpZiAoSVNfRVJSKHRmbSkpIHsKLQkJCWNyeXB0b19tb2RfcHV0KGFsZyk7Ci0JCQllcnIgPSBQVFJfRVJSKHRmbSk7Ci0JCQl0Zm0gPSBOVUxMOwotCQl9Ci0JfSB3aGlsZSAoZXJyID09IC1FQUdBSU4gJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKTsKLQotCXJldHVybiB0Zm07Ci19Ci0KIC8qCiAgKgljcnlwdG9fYWxsb2NfYmFzZSAtIExvY2F0ZSBhbGdvcml0aG0gYW5kIGFsbG9jYXRlIHRyYW5zZm9ybQogICoJQGFsZ19uYW1lOiBOYW1lIG9mIGFsZ29yaXRobQpAQCAtNDIwLDcgKzM3Myw3IEBACiAJCQlnb3RvIGVycjsKIAkJfQogCi0JCXRmbSA9IF9fY3J5cHRvX2FsbG9jX3RmbShhbGcsIDApOworCQl0Zm0gPSBfX2NyeXB0b19hbGxvY190Zm0oYWxnLCB0eXBlLCBtYXNrKTsKIAkJaWYgKCFJU19FUlIodGZtKSkKIAkJCXJldHVybiB0Zm07CiAKQEAgLTQ2Niw3ICs0MTksNiBAQAogCWtmcmVlKHRmbSk7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19hbGxvY190Zm0pOwogRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2ZyZWVfdGZtKTsKIAogaW50IGNyeXB0b19oYXNfYWxnKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKZGlmZiAtLWdpdCBhL2NyeXB0by9ibGtjaXBoZXIuYyBiL2NyeXB0by9ibGtjaXBoZXIuYwppbmRleCA2ZTkzMDA0Zi4uYjViZWZlOCAxMDA2NDQKLS0tIGEvY3J5cHRvL2Jsa2NpcGhlci5jCisrKyBiL2NyeXB0by9ibGtjaXBoZXIuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KQEAgLTMxMyw2ICszMTQsOSBAQAogCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0gPSBkZXNjLT50Zm07CiAJdW5zaWduZWQgaW50IGFsaWdubWFzayA9IGNyeXB0b19ibGtjaXBoZXJfYWxpZ25tYXNrKHRmbSk7CiAKKwlpZiAoV0FSTl9PTl9PTkNFKGluX2lycSgpKSkKKwkJcmV0dXJuIC1FREVBRExLOworCiAJd2Fsay0+bmJ5dGVzID0gd2Fsay0+dG90YWw7CiAJaWYgKHVubGlrZWx5KCF3YWxrLT50b3RhbCkpCiAJCXJldHVybiAwOwpAQCAtMzQ1LDcgKzM0OSw4IEBACiAJcmV0dXJuIGNpcGhlci0+c2V0a2V5KHRmbSwga2V5LCBrZXlsZW4pOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGNyeXB0b19ibGtjaXBoZXJfY3R4c2l6ZShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQorc3RhdGljIHVuc2lnbmVkIGludCBjcnlwdG9fYmxrY2lwaGVyX2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZywgdTMyIHR5cGUsCisJCQkJCSAgICAgdTMyIG1hc2spCiB7CiAJc3RydWN0IGJsa2NpcGhlcl9hbGcgKmNpcGhlciA9ICZhbGctPmNyYV9ibGtjaXBoZXI7CiAJdW5zaWduZWQgaW50IGxlbiA9IGFsZy0+Y3JhX2N0eHNpemU7CkBAIC0zNTgsNyArMzYzLDcgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IGNyeXB0b19pbml0X2Jsa2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3N0YXRpYyBpbnQgY3J5cHRvX2luaXRfYmxrY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgdHlwZSwgdTMyIG1hc2spCiB7CiAJc3RydWN0IGJsa2NpcGhlcl90Zm0gKmNydCA9ICZ0Zm0tPmNydF9ibGtjaXBoZXI7CiAJc3RydWN0IGJsa2NpcGhlcl9hbGcgKmFsZyA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2Jsa2NpcGhlcjsKZGlmZiAtLWdpdCBhL2NyeXB0by9jYW1lbGxpYS5jIGIvY3J5cHRvL2NhbWVsbGlhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3N2VjZgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9jYW1lbGxpYS5jCkBAIC0wLDAgKzEsMTgwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNgorICogTlRUIChOaXBwb24gVGVsZWdyYXBoIGFuZCBUZWxlcGhvbmUgQ29ycG9yYXRpb24pLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qCisgKiBBbGdvcml0aG0gU3BlY2lmaWNhdGlvbgorICogIGh0dHA6Ly9pbmZvLmlzbC5udHQuY28uanAvY3J5cHQvZW5nL2NhbWVsbGlhL3NwZWNpZmljYXRpb25zLmh0bWwKKyAqLworCisvKgorICoKKyAqIE5PVEUgLS0tIE5PVEUgLS0tIE5PVEUgLS0tIE5PVEUKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IGFsbCBtZW1vcnkgYWRkcmVzc2VzIHBhc3NlZAorICogYXMgcGFyYW1ldGVycyBhcmUgZm91ci1ieXRlIGFsaWduZWQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworCisjZGVmaW5lIENBTUVMTElBX01JTl9LRVlfU0laRSAgICAgICAgMTYKKyNkZWZpbmUgQ0FNRUxMSUFfTUFYX0tFWV9TSVpFICAgICAgICAzMgorI2RlZmluZSBDQU1FTExJQV9CTE9DS19TSVpFIDE2CisjZGVmaW5lIENBTUVMTElBX1RBQkxFX0JZVEVfTEVOIDI3MgorI2RlZmluZSBDQU1FTExJQV9UQUJMRV9XT1JEX0xFTiAoQ0FNRUxMSUFfVEFCTEVfQllURV9MRU4gLyA0KQorCit0eXBlZGVmIHUzMiBLRVlfVEFCTEVfVFlQRVtDQU1FTExJQV9UQUJMRV9XT1JEX0xFTl07CisKKworLyoga2V5IGNvbnN0YW50cyAqLworCisjZGVmaW5lIENBTUVMTElBX1NJR01BMUwgKDB4QTA5RTY2N0ZMKQorI2RlZmluZSBDQU1FTExJQV9TSUdNQTFSICgweDNCQ0M5MDhCTCkKKyNkZWZpbmUgQ0FNRUxMSUFfU0lHTUEyTCAoMHhCNjdBRTg1OEwpCisjZGVmaW5lIENBTUVMTElBX1NJR01BMlIgKDB4NENBQTczQjJMKQorI2RlZmluZSBDQU1FTExJQV9TSUdNQTNMICgweEM2RUYzNzJGTCkKKyNkZWZpbmUgQ0FNRUxMSUFfU0lHTUEzUiAoMHhFOTRGODJCRUwpCisjZGVmaW5lIENBTUVMTElBX1NJR01BNEwgKDB4NTRGRjUzQTVMKQorI2RlZmluZSBDQU1FTExJQV9TSUdNQTRSICgweEYxRDM2RjFDTCkKKyNkZWZpbmUgQ0FNRUxMSUFfU0lHTUE1TCAoMHgxMEU1MjdGQUwpCisjZGVmaW5lIENBTUVMTElBX1NJR01BNVIgKDB4REU2ODJEMURMKQorI2RlZmluZSBDQU1FTExJQV9TSUdNQTZMICgweEIwNTY4OEMyTCkKKyNkZWZpbmUgQ0FNRUxMSUFfU0lHTUE2UiAoMHhCM0U2QzFGREwpCisKK3N0cnVjdCBjYW1lbGxpYV9jdHggeworCWludCBrZXlfbGVuZ3RoOworCUtFWV9UQUJMRV9UWVBFIGtleV90YWJsZTsKK307CisKKworLyoKKyAqICBtYWNyb3MKKyAqLworCisKKyMgZGVmaW5lIEdFVFUzMihwdCkgKCgodTMyKShwdClbMF0gPDwgMjQpCVwKKwkJICAgICBeICgodTMyKShwdClbMV0gPDwgMTYpCVwKKwkJICAgICBeICgodTMyKShwdClbMl0gPDwgIDgpCVwKKwkJICAgICBeICgodTMyKShwdClbM10pKQorCisjZGVmaW5lIENPUFk0V09SRChkc3QsIHNyYykJCQlcCisgICAgZG8gewkJCQkJXAorCShkc3QpWzBdPShzcmMpWzBdOwkJCVwKKwkoZHN0KVsxXT0oc3JjKVsxXTsJCQlcCisJKGRzdClbMl09KHNyYylbMl07CQkJXAorCShkc3QpWzNdPShzcmMpWzNdOwkJCVwKKyAgICB9d2hpbGUoMCkKKworI2RlZmluZSBTV0FQNFdPUkQod29yZCkJCQkJXAorICAgIGRvIHsJCQkJCVwKKwlDQU1FTExJQV9TV0FQNCgod29yZClbMF0pOwkJXAorCUNBTUVMTElBX1NXQVA0KCh3b3JkKVsxXSk7CQlcCisJQ0FNRUxMSUFfU1dBUDQoKHdvcmQpWzJdKTsJCVwKKwlDQU1FTExJQV9TV0FQNCgod29yZClbM10pOwkJXAorICAgIH13aGlsZSgwKQorCisjZGVmaW5lIFhPUjRXT1JEKGEsIGIpLyogYSA9IGEgXiBiICovCQlcCisgICAgZG8gewkJCQkJXAorCShhKVswXV49KGIpWzBdOwkJCQlcCisJKGEpWzFdXj0oYilbMV07CQkJCVwKKwkoYSlbMl1ePShiKVsyXTsJCQkJXAorCShhKVszXV49KGIpWzNdOwkJCQlcCisgICAgfXdoaWxlKDApCisKKyNkZWZpbmUgWE9SNFdPUkQyKGEsIGIsIGMpLyogYSA9IGIgXiBjICovCVwKKyAgICBkbyB7CQkJCQlcCisJKGEpWzBdPShiKVswXV4oYylbMF07CQkJXAorCShhKVsxXT0oYilbMV1eKGMpWzFdOwkJCVwKKwkoYSlbMl09KGIpWzJdXihjKVsyXTsJCQlcCisJKGEpWzNdPShiKVszXV4oYylbM107CQkJXAorICAgIH13aGlsZSgwKQorCisjZGVmaW5lIENBTUVMTElBX1NVQktFWV9MKElOREVYKSAoc3Via2V5WyhJTkRFWCkqMl0pCisjZGVmaW5lIENBTUVMTElBX1NVQktFWV9SKElOREVYKSAoc3Via2V5WyhJTkRFWCkqMiArIDFdKQorCisvKiByb3RhdGlvbiByaWdodCBzaGlmdCAxYnl0ZSAqLworI2RlZmluZSBDQU1FTExJQV9SUjgoeCkgKCgoeCkgPj4gOCkgKyAoKHgpIDw8IDI0KSkKKy8qIHJvdGF0aW9uIGxlZnQgc2hpZnQgMWJpdCAqLworI2RlZmluZSBDQU1FTExJQV9STDEoeCkgKCgoeCkgPDwgMSkgKyAoKHgpID4+IDMxKSkKKy8qIHJvdGF0aW9uIGxlZnQgc2hpZnQgMWJ5dGUgKi8KKyNkZWZpbmUgQ0FNRUxMSUFfUkw4KHgpICgoKHgpIDw8IDgpICsgKCh4KSA+PiAyNCkpCisKKyNkZWZpbmUgQ0FNRUxMSUFfUk9MRFEobGwsIGxyLCBybCwgcnIsIHcwLCB3MSwgYml0cykJXAorICAgIGRvIHsJCQkJCQlcCisJdzAgPSBsbDsJCQkJCVwKKwlsbCA9IChsbCA8PCBiaXRzKSArIChsciA+PiAoMzIgLSBiaXRzKSk7CVwKKwlsciA9IChsciA8PCBiaXRzKSArIChybCA+PiAoMzIgLSBiaXRzKSk7CVwKKwlybCA9IChybCA8PCBiaXRzKSArIChyciA+PiAoMzIgLSBiaXRzKSk7CVwKKwlyciA9IChyciA8PCBiaXRzKSArICh3MCA+PiAoMzIgLSBiaXRzKSk7CVwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQ0FNRUxMSUFfUk9MRFFvMzIobGwsIGxyLCBybCwgcnIsIHcwLCB3MSwgYml0cykJXAorICAgIGRvIHsJCQkJCQlcCisJdzAgPSBsbDsJCQkJCVwKKwl3MSA9IGxyOwkJCQkJXAorCWxsID0gKGxyIDw8IChiaXRzIC0gMzIpKSArIChybCA+PiAoNjQgLSBiaXRzKSk7CVwKKwlsciA9IChybCA8PCAoYml0cyAtIDMyKSkgKyAocnIgPj4gKDY0IC0gYml0cykpOwlcCisJcmwgPSAocnIgPDwgKGJpdHMgLSAzMikpICsgKHcwID4+ICg2NCAtIGJpdHMpKTsJXAorCXJyID0gKHcwIDw8IChiaXRzIC0gMzIpKSArICh3MSA+PiAoNjQgLSBiaXRzKSk7CVwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQ0FNRUxMSUFfU1AxMTEwKElOREVYKSAoY2FtZWxsaWFfc3AxMTEwWyhJTkRFWCldKQorI2RlZmluZSBDQU1FTExJQV9TUDAyMjIoSU5ERVgpIChjYW1lbGxpYV9zcDAyMjJbKElOREVYKV0pCisjZGVmaW5lIENBTUVMTElBX1NQMzAzMyhJTkRFWCkgKGNhbWVsbGlhX3NwMzAzM1soSU5ERVgpXSkKKyNkZWZpbmUgQ0FNRUxMSUFfU1A0NDA0KElOREVYKSAoY2FtZWxsaWFfc3A0NDA0WyhJTkRFWCldKQorCisjZGVmaW5lIENBTUVMTElBX0YoeGwsIHhyLCBrbCwga3IsIHlsLCB5ciwgaWwsIGlyLCB0MCwgdDEpCVwKKyAgICBkbyB7CQkJCQkJCVwKKwlpbCA9IHhsIF4ga2w7CQkJCQkJXAorCWlyID0geHIgXiBrcjsJCQkJCQlcCisJdDAgPSBpbCA+PiAxNjsJCQkJCQlcCisJdDEgPSBpciA+PiAxNjsJCQkJCQlcCisJeWwgPSBDQU1FTExJQV9TUDExMTAoaXIgJiAweGZmKQkJCQlcCisJICAgIF4gQ0FNRUxMSUFfU1AwMjIyKCh0MSA+PiA4KSAmIDB4ZmYpCQkJXAorCSAgICBeIENBTUVMTElBX1NQMzAzMyh0MSAmIDB4ZmYpCQkJXAorCSAgICBeIENBTUVMTElBX1NQNDQwNCgoaXIgPj4gOCkgJiAweGZmKTsJCVwKKwl5ciA9IENBTUVMTElBX1NQMTExMCgodDAgPj4gOCkgJiAweGZmKQkJCVwKKwkgICAgXiBDQU1FTExJQV9TUDAyMjIodDAgJiAweGZmKQkJCVwKKwkgICAgXiBDQU1FTExJQV9TUDMwMzMoKGlsID4+IDgpICYgMHhmZikJCQlcCisJICAgIF4gQ0FNRUxMSUFfU1A0NDA0KGlsICYgMHhmZik7CQkJXAorCXlsIF49IHlyOwkJCQkJCVwKKwl5ciA9IENBTUVMTElBX1JSOCh5cik7CQkJCQlcCisJeXIgXj0geWw7CQkJCQkJXAorICAgIH0gd2hpbGUoMCkKKworCisvKgorICogZm9yIHNwZWVkIHVwCisgKgorICovCisjZGVmaW5lIENBTUVMTElBX0ZMUyhsbCwgbHIsIHJsLCByciwga2xsLCBrbHIsIGtybCwga3JyLCB0MCwgdDEsIHQyLCB0MykgXAorICAgIGRvIHsJCQkJCQkJCVwKKwl0MCA9IGtsbDsJCQkJCQkJXAorCXQyID0ga3JyOwkJCQkJCQlcCisJdDAgJj0gbGw7CQkJCQkJCVwKKwl0MiB8PSBycjsJCQkJCQkJXAorCXJsIF49IHQyOwkJCQkJCQlcCisJbHIgXj0gQ0FNRUxMSUFfUkwxKHQwKTsJCQkJCQlcCisJdDMgPSBrcmw7CQkJCQkJCVwKKwl0MSA9IGtscjsJCQkJCQkJXAorCXQzICY9IHJsOwkJCQkJCQlcCisJdDEgfD0gbHI7CQkJCQkJCVwKKwlsbCBePSB0MTsJCQkJCQkJXAorCXJyIF49IENBTUVMTElBX1JMMSh0Myk7CQkJCQkJXAorICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBDQU1FTExJQV9ST1VORFNNKHhsLCB4ciwga2wsIGtyLCB5bCwgeXIsIGlsLCBpciwgdDAsIHQxKQlcCisgICAgZG8gewkJCQkJCQkJXAorCWlyID0gIENBTUVMTElBX1NQMTExMCh4ciAmIDB4ZmYpOwkJCQlcCisJaWwgPSAgQ0FNRUxMSUFfU1AxMTEwKCh4bD4+MjQpICYgMHhmZik7CQkJCVwKKwlpciBePSBDQU1FTExJQV9TUDAyMjIoKHhyPj4yNCkgJiAweGZmKTsJCQkJXAorCWlsIF49IENBTUVMTElBX1NQMDIyMigoeGw+PjE2KSAmIDB4ZmYpOwkJCQlcCisJaXIgXj0gQ0FNRUxMSUFfU1AzMDMzKCh4cj4+MTYpICYgMHhmZik7CQkJCVwKKwlpbCBePSBDQU1FTExJQV9TUDMwMzMoKHhsPj44KSAmIDB4ZmYpOwkJCQlcCisJaXIgXj0gQ0FNRUxMSUFfU1A0NDA0KCh4cj4+OCkgJiAweGZmKTsJCQkJXAorCWlsIF49IENBTUVMTElBX1NQNDQwNCh4bCAmIDB4ZmYpOwkJCQlcCisJaWwgXj0ga2w7CQkJCQkJCVwKKwlpciBePSBpbCBeIGtyOwkJCQkJCQlcCisJeWwgXj0gaXI7CQkJCQkJCVwKKwl5ciBePSBDQU1FTExJQV9SUjgoaWwpIF4gaXI7CQkJCQlcCisgICAgfSB3aGlsZSgwKQorCisvKioKKyAqIFN0dWZmIHJlbGF0ZWQgdG8gdGhlIENhbWVsbGlhIGtleSBzY2hlZHVsZQorICovCisjZGVmaW5lIFNVQkwoeCkgc3ViTFsoeCldCisjZGVmaW5lIFNVQlIoeCkgc3ViUlsoeCldCisKKworc3RhdGljIGNvbnN0IHUzMiBjYW1lbGxpYV9zcDExMTBbMjU2XSA9IHsKKwkweDcwNzA3MDAwLDB4ODI4MjgyMDAsMHgyYzJjMmMwMCwweGVjZWNlYzAwLAorCTB4YjNiM2IzMDAsMHgyNzI3MjcwMCwweGMwYzBjMDAwLDB4ZTVlNWU1MDAsCisJMHhlNGU0ZTQwMCwweDg1ODU4NTAwLDB4NTc1NzU3MDAsMHgzNTM1MzUwMCwKKwkweGVhZWFlYTAwLDB4MGMwYzBjMDAsMHhhZWFlYWUwMCwweDQxNDE0MTAwLAorCTB4MjMyMzIzMDAsMHhlZmVmZWYwMCwweDZiNmI2YjAwLDB4OTM5MzkzMDAsCisJMHg0NTQ1NDUwMCwweDE5MTkxOTAwLDB4YTVhNWE1MDAsMHgyMTIxMjEwMCwKKwkweGVkZWRlZDAwLDB4MGUwZTBlMDAsMHg0ZjRmNGYwMCwweDRlNGU0ZTAwLAorCTB4MWQxZDFkMDAsMHg2NTY1NjUwMCwweDkyOTI5MjAwLDB4YmRiZGJkMDAsCisJMHg4Njg2ODYwMCwweGI4YjhiODAwLDB4YWZhZmFmMDAsMHg4ZjhmOGYwMCwKKwkweDdjN2M3YzAwLDB4ZWJlYmViMDAsMHgxZjFmMWYwMCwweGNlY2VjZTAwLAorCTB4M2UzZTNlMDAsMHgzMDMwMzAwMCwweGRjZGNkYzAwLDB4NWY1ZjVmMDAsCisJMHg1ZTVlNWUwMCwweGM1YzVjNTAwLDB4MGIwYjBiMDAsMHgxYTFhMWEwMCwKKwkweGE2YTZhNjAwLDB4ZTFlMWUxMDAsMHgzOTM5MzkwMCwweGNhY2FjYTAwLAorCTB4ZDVkNWQ1MDAsMHg0NzQ3NDcwMCwweDVkNWQ1ZDAwLDB4M2QzZDNkMDAsCisJMHhkOWQ5ZDkwMCwweDAxMDEwMTAwLDB4NWE1YTVhMDAsMHhkNmQ2ZDYwMCwKKwkweDUxNTE1MTAwLDB4NTY1NjU2MDAsMHg2YzZjNmMwMCwweDRkNGQ0ZDAwLAorCTB4OGI4YjhiMDAsMHgwZDBkMGQwMCwweDlhOWE5YTAwLDB4NjY2NjY2MDAsCisJMHhmYmZiZmIwMCwweGNjY2NjYzAwLDB4YjBiMGIwMDAsMHgyZDJkMmQwMCwKKwkweDc0NzQ3NDAwLDB4MTIxMjEyMDAsMHgyYjJiMmIwMCwweDIwMjAyMDAwLAorCTB4ZjBmMGYwMDAsMHhiMWIxYjEwMCwweDg0ODQ4NDAwLDB4OTk5OTk5MDAsCisJMHhkZmRmZGYwMCwweDRjNGM0YzAwLDB4Y2JjYmNiMDAsMHhjMmMyYzIwMCwKKwkweDM0MzQzNDAwLDB4N2U3ZTdlMDAsMHg3Njc2NzYwMCwweDA1MDUwNTAwLAorCTB4NmQ2ZDZkMDAsMHhiN2I3YjcwMCwweGE5YTlhOTAwLDB4MzEzMTMxMDAsCisJMHhkMWQxZDEwMCwweDE3MTcxNzAwLDB4MDQwNDA0MDAsMHhkN2Q3ZDcwMCwKKwkweDE0MTQxNDAwLDB4NTg1ODU4MDAsMHgzYTNhM2EwMCwweDYxNjE2MTAwLAorCTB4ZGVkZWRlMDAsMHgxYjFiMWIwMCwweDExMTExMTAwLDB4MWMxYzFjMDAsCisJMHgzMjMyMzIwMCwweDBmMGYwZjAwLDB4OWM5YzljMDAsMHgxNjE2MTYwMCwKKwkweDUzNTM1MzAwLDB4MTgxODE4MDAsMHhmMmYyZjIwMCwweDIyMjIyMjAwLAorCTB4ZmVmZWZlMDAsMHg0NDQ0NDQwMCwweGNmY2ZjZjAwLDB4YjJiMmIyMDAsCisJMHhjM2MzYzMwMCwweGI1YjViNTAwLDB4N2E3YTdhMDAsMHg5MTkxOTEwMCwKKwkweDI0MjQyNDAwLDB4MDgwODA4MDAsMHhlOGU4ZTgwMCwweGE4YThhODAwLAorCTB4NjA2MDYwMDAsMHhmY2ZjZmMwMCwweDY5Njk2OTAwLDB4NTA1MDUwMDAsCisJMHhhYWFhYWEwMCwweGQwZDBkMDAwLDB4YTBhMGEwMDAsMHg3ZDdkN2QwMCwKKwkweGExYTFhMTAwLDB4ODk4OTg5MDAsMHg2MjYyNjIwMCwweDk3OTc5NzAwLAorCTB4NTQ1NDU0MDAsMHg1YjViNWIwMCwweDFlMWUxZTAwLDB4OTU5NTk1MDAsCisJMHhlMGUwZTAwMCwweGZmZmZmZjAwLDB4NjQ2NDY0MDAsMHhkMmQyZDIwMCwKKwkweDEwMTAxMDAwLDB4YzRjNGM0MDAsMHgwMDAwMDAwMCwweDQ4NDg0ODAwLAorCTB4YTNhM2EzMDAsMHhmN2Y3ZjcwMCwweDc1NzU3NTAwLDB4ZGJkYmRiMDAsCisJMHg4YThhOGEwMCwweDAzMDMwMzAwLDB4ZTZlNmU2MDAsMHhkYWRhZGEwMCwKKwkweDA5MDkwOTAwLDB4M2YzZjNmMDAsMHhkZGRkZGQwMCwweDk0OTQ5NDAwLAorCTB4ODc4Nzg3MDAsMHg1YzVjNWMwMCwweDgzODM4MzAwLDB4MDIwMjAyMDAsCisJMHhjZGNkY2QwMCwweDRhNGE0YTAwLDB4OTA5MDkwMDAsMHgzMzMzMzMwMCwKKwkweDczNzM3MzAwLDB4Njc2NzY3MDAsMHhmNmY2ZjYwMCwweGYzZjNmMzAwLAorCTB4OWQ5ZDlkMDAsMHg3ZjdmN2YwMCwweGJmYmZiZjAwLDB4ZTJlMmUyMDAsCisJMHg1MjUyNTIwMCwweDliOWI5YjAwLDB4ZDhkOGQ4MDAsMHgyNjI2MjYwMCwKKwkweGM4YzhjODAwLDB4MzczNzM3MDAsMHhjNmM2YzYwMCwweDNiM2IzYjAwLAorCTB4ODE4MTgxMDAsMHg5Njk2OTYwMCwweDZmNmY2ZjAwLDB4NGI0YjRiMDAsCisJMHgxMzEzMTMwMCwweGJlYmViZTAwLDB4NjM2MzYzMDAsMHgyZTJlMmUwMCwKKwkweGU5ZTllOTAwLDB4Nzk3OTc5MDAsMHhhN2E3YTcwMCwweDhjOGM4YzAwLAorCTB4OWY5ZjlmMDAsMHg2ZTZlNmUwMCwweGJjYmNiYzAwLDB4OGU4ZThlMDAsCisJMHgyOTI5MjkwMCwweGY1ZjVmNTAwLDB4ZjlmOWY5MDAsMHhiNmI2YjYwMCwKKwkweDJmMmYyZjAwLDB4ZmRmZGZkMDAsMHhiNGI0YjQwMCwweDU5NTk1OTAwLAorCTB4Nzg3ODc4MDAsMHg5ODk4OTgwMCwweDA2MDYwNjAwLDB4NmE2YTZhMDAsCisJMHhlN2U3ZTcwMCwweDQ2NDY0NjAwLDB4NzE3MTcxMDAsMHhiYWJhYmEwMCwKKwkweGQ0ZDRkNDAwLDB4MjUyNTI1MDAsMHhhYmFiYWIwMCwweDQyNDI0MjAwLAorCTB4ODg4ODg4MDAsMHhhMmEyYTIwMCwweDhkOGQ4ZDAwLDB4ZmFmYWZhMDAsCisJMHg3MjcyNzIwMCwweDA3MDcwNzAwLDB4YjliOWI5MDAsMHg1NTU1NTUwMCwKKwkweGY4ZjhmODAwLDB4ZWVlZWVlMDAsMHhhY2FjYWMwMCwweDBhMGEwYTAwLAorCTB4MzYzNjM2MDAsMHg0OTQ5NDkwMCwweDJhMmEyYTAwLDB4Njg2ODY4MDAsCisJMHgzYzNjM2MwMCwweDM4MzgzODAwLDB4ZjFmMWYxMDAsMHhhNGE0YTQwMCwKKwkweDQwNDA0MDAwLDB4MjgyODI4MDAsMHhkM2QzZDMwMCwweDdiN2I3YjAwLAorCTB4YmJiYmJiMDAsMHhjOWM5YzkwMCwweDQzNDM0MzAwLDB4YzFjMWMxMDAsCisJMHgxNTE1MTUwMCwweGUzZTNlMzAwLDB4YWRhZGFkMDAsMHhmNGY0ZjQwMCwKKwkweDc3Nzc3NzAwLDB4YzdjN2M3MDAsMHg4MDgwODAwMCwweDllOWU5ZTAwLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBjYW1lbGxpYV9zcDAyMjJbMjU2XSA9IHsKKwkweDAwZTBlMGUwLDB4MDAwNTA1MDUsMHgwMDU4NTg1OCwweDAwZDlkOWQ5LAorCTB4MDA2NzY3NjcsMHgwMDRlNGU0ZSwweDAwODE4MTgxLDB4MDBjYmNiY2IsCisJMHgwMGM5YzljOSwweDAwMGIwYjBiLDB4MDBhZWFlYWUsMHgwMDZhNmE2YSwKKwkweDAwZDVkNWQ1LDB4MDAxODE4MTgsMHgwMDVkNWQ1ZCwweDAwODI4MjgyLAorCTB4MDA0NjQ2NDYsMHgwMGRmZGZkZiwweDAwZDZkNmQ2LDB4MDAyNzI3MjcsCisJMHgwMDhhOGE4YSwweDAwMzIzMjMyLDB4MDA0YjRiNGIsMHgwMDQyNDI0MiwKKwkweDAwZGJkYmRiLDB4MDAxYzFjMWMsMHgwMDllOWU5ZSwweDAwOWM5YzljLAorCTB4MDAzYTNhM2EsMHgwMGNhY2FjYSwweDAwMjUyNTI1LDB4MDA3YjdiN2IsCisJMHgwMDBkMGQwZCwweDAwNzE3MTcxLDB4MDA1ZjVmNWYsMHgwMDFmMWYxZiwKKwkweDAwZjhmOGY4LDB4MDBkN2Q3ZDcsMHgwMDNlM2UzZSwweDAwOWQ5ZDlkLAorCTB4MDA3YzdjN2MsMHgwMDYwNjA2MCwweDAwYjliOWI5LDB4MDBiZWJlYmUsCisJMHgwMGJjYmNiYywweDAwOGI4YjhiLDB4MDAxNjE2MTYsMHgwMDM0MzQzNCwKKwkweDAwNGQ0ZDRkLDB4MDBjM2MzYzMsMHgwMDcyNzI3MiwweDAwOTU5NTk1LAorCTB4MDBhYmFiYWIsMHgwMDhlOGU4ZSwweDAwYmFiYWJhLDB4MDA3YTdhN2EsCisJMHgwMGIzYjNiMywweDAwMDIwMjAyLDB4MDBiNGI0YjQsMHgwMGFkYWRhZCwKKwkweDAwYTJhMmEyLDB4MDBhY2FjYWMsMHgwMGQ4ZDhkOCwweDAwOWE5YTlhLAorCTB4MDAxNzE3MTcsMHgwMDFhMWExYSwweDAwMzUzNTM1LDB4MDBjY2NjY2MsCisJMHgwMGY3ZjdmNywweDAwOTk5OTk5LDB4MDA2MTYxNjEsMHgwMDVhNWE1YSwKKwkweDAwZThlOGU4LDB4MDAyNDI0MjQsMHgwMDU2NTY1NiwweDAwNDA0MDQwLAorCTB4MDBlMWUxZTEsMHgwMDYzNjM2MywweDAwMDkwOTA5LDB4MDAzMzMzMzMsCisJMHgwMGJmYmZiZiwweDAwOTg5ODk4LDB4MDA5Nzk3OTcsMHgwMDg1ODU4NSwKKwkweDAwNjg2ODY4LDB4MDBmY2ZjZmMsMHgwMGVjZWNlYywweDAwMGEwYTBhLAorCTB4MDBkYWRhZGEsMHgwMDZmNmY2ZiwweDAwNTM1MzUzLDB4MDA2MjYyNjIsCisJMHgwMGEzYTNhMywweDAwMmUyZTJlLDB4MDAwODA4MDgsMHgwMGFmYWZhZiwKKwkweDAwMjgyODI4LDB4MDBiMGIwYjAsMHgwMDc0NzQ3NCwweDAwYzJjMmMyLAorCTB4MDBiZGJkYmQsMHgwMDM2MzYzNiwweDAwMjIyMjIyLDB4MDAzODM4MzgsCisJMHgwMDY0NjQ2NCwweDAwMWUxZTFlLDB4MDAzOTM5MzksMHgwMDJjMmMyYywKKwkweDAwYTZhNmE2LDB4MDAzMDMwMzAsMHgwMGU1ZTVlNSwweDAwNDQ0NDQ0LAorCTB4MDBmZGZkZmQsMHgwMDg4ODg4OCwweDAwOWY5ZjlmLDB4MDA2NTY1NjUsCisJMHgwMDg3ODc4NywweDAwNmI2YjZiLDB4MDBmNGY0ZjQsMHgwMDIzMjMyMywKKwkweDAwNDg0ODQ4LDB4MDAxMDEwMTAsMHgwMGQxZDFkMSwweDAwNTE1MTUxLAorCTB4MDBjMGMwYzAsMHgwMGY5ZjlmOSwweDAwZDJkMmQyLDB4MDBhMGEwYTAsCisJMHgwMDU1NTU1NSwweDAwYTFhMWExLDB4MDA0MTQxNDEsMHgwMGZhZmFmYSwKKwkweDAwNDM0MzQzLDB4MDAxMzEzMTMsMHgwMGM0YzRjNCwweDAwMmYyZjJmLAorCTB4MDBhOGE4YTgsMHgwMGI2YjZiNiwweDAwM2MzYzNjLDB4MDAyYjJiMmIsCisJMHgwMGMxYzFjMSwweDAwZmZmZmZmLDB4MDBjOGM4YzgsMHgwMGE1YTVhNSwKKwkweDAwMjAyMDIwLDB4MDA4OTg5ODksMHgwMDAwMDAwMCwweDAwOTA5MDkwLAorCTB4MDA0NzQ3NDcsMHgwMGVmZWZlZiwweDAwZWFlYWVhLDB4MDBiN2I3YjcsCisJMHgwMDE1MTUxNSwweDAwMDYwNjA2LDB4MDBjZGNkY2QsMHgwMGI1YjViNSwKKwkweDAwMTIxMjEyLDB4MDA3ZTdlN2UsMHgwMGJiYmJiYiwweDAwMjkyOTI5LAorCTB4MDAwZjBmMGYsMHgwMGI4YjhiOCwweDAwMDcwNzA3LDB4MDAwNDA0MDQsCisJMHgwMDliOWI5YiwweDAwOTQ5NDk0LDB4MDAyMTIxMjEsMHgwMDY2NjY2NiwKKwkweDAwZTZlNmU2LDB4MDBjZWNlY2UsMHgwMGVkZWRlZCwweDAwZTdlN2U3LAorCTB4MDAzYjNiM2IsMHgwMGZlZmVmZSwweDAwN2Y3ZjdmLDB4MDBjNWM1YzUsCisJMHgwMGE0YTRhNCwweDAwMzczNzM3LDB4MDBiMWIxYjEsMHgwMDRjNGM0YywKKwkweDAwOTE5MTkxLDB4MDA2ZTZlNmUsMHgwMDhkOGQ4ZCwweDAwNzY3Njc2LAorCTB4MDAwMzAzMDMsMHgwMDJkMmQyZCwweDAwZGVkZWRlLDB4MDA5Njk2OTYsCisJMHgwMDI2MjYyNiwweDAwN2Q3ZDdkLDB4MDBjNmM2YzYsMHgwMDVjNWM1YywKKwkweDAwZDNkM2QzLDB4MDBmMmYyZjIsMHgwMDRmNGY0ZiwweDAwMTkxOTE5LAorCTB4MDAzZjNmM2YsMHgwMGRjZGNkYywweDAwNzk3OTc5LDB4MDAxZDFkMWQsCisJMHgwMDUyNTI1MiwweDAwZWJlYmViLDB4MDBmM2YzZjMsMHgwMDZkNmQ2ZCwKKwkweDAwNWU1ZTVlLDB4MDBmYmZiZmIsMHgwMDY5Njk2OSwweDAwYjJiMmIyLAorCTB4MDBmMGYwZjAsMHgwMDMxMzEzMSwweDAwMGMwYzBjLDB4MDBkNGQ0ZDQsCisJMHgwMGNmY2ZjZiwweDAwOGM4YzhjLDB4MDBlMmUyZTIsMHgwMDc1NzU3NSwKKwkweDAwYTlhOWE5LDB4MDA0YTRhNGEsMHgwMDU3NTc1NywweDAwODQ4NDg0LAorCTB4MDAxMTExMTEsMHgwMDQ1NDU0NSwweDAwMWIxYjFiLDB4MDBmNWY1ZjUsCisJMHgwMGU0ZTRlNCwweDAwMGUwZTBlLDB4MDA3MzczNzMsMHgwMGFhYWFhYSwKKwkweDAwZjFmMWYxLDB4MDBkZGRkZGQsMHgwMDU5NTk1OSwweDAwMTQxNDE0LAorCTB4MDA2YzZjNmMsMHgwMDkyOTI5MiwweDAwNTQ1NDU0LDB4MDBkMGQwZDAsCisJMHgwMDc4Nzg3OCwweDAwNzA3MDcwLDB4MDBlM2UzZTMsMHgwMDQ5NDk0OSwKKwkweDAwODA4MDgwLDB4MDA1MDUwNTAsMHgwMGE3YTdhNywweDAwZjZmNmY2LAorCTB4MDA3Nzc3NzcsMHgwMDkzOTM5MywweDAwODY4Njg2LDB4MDA4MzgzODMsCisJMHgwMDJhMmEyYSwweDAwYzdjN2M3LDB4MDA1YjViNWIsMHgwMGU5ZTllOSwKKwkweDAwZWVlZWVlLDB4MDA4ZjhmOGYsMHgwMDAxMDEwMSwweDAwM2QzZDNkLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBjYW1lbGxpYV9zcDMwMzNbMjU2XSA9IHsKKwkweDM4MDAzODM4LDB4NDEwMDQxNDEsMHgxNjAwMTYxNiwweDc2MDA3Njc2LAorCTB4ZDkwMGQ5ZDksMHg5MzAwOTM5MywweDYwMDA2MDYwLDB4ZjIwMGYyZjIsCisJMHg3MjAwNzI3MiwweGMyMDBjMmMyLDB4YWIwMGFiYWIsMHg5YTAwOWE5YSwKKwkweDc1MDA3NTc1LDB4MDYwMDA2MDYsMHg1NzAwNTc1NywweGEwMDBhMGEwLAorCTB4OTEwMDkxOTEsMHhmNzAwZjdmNywweGI1MDBiNWI1LDB4YzkwMGM5YzksCisJMHhhMjAwYTJhMiwweDhjMDA4YzhjLDB4ZDIwMGQyZDIsMHg5MDAwOTA5MCwKKwkweGY2MDBmNmY2LDB4MDcwMDA3MDcsMHhhNzAwYTdhNywweDI3MDAyNzI3LAorCTB4OGUwMDhlOGUsMHhiMjAwYjJiMiwweDQ5MDA0OTQ5LDB4ZGUwMGRlZGUsCisJMHg0MzAwNDM0MywweDVjMDA1YzVjLDB4ZDcwMGQ3ZDcsMHhjNzAwYzdjNywKKwkweDNlMDAzZTNlLDB4ZjUwMGY1ZjUsMHg4ZjAwOGY4ZiwweDY3MDA2NzY3LAorCTB4MWYwMDFmMWYsMHgxODAwMTgxOCwweDZlMDA2ZTZlLDB4YWYwMGFmYWYsCisJMHgyZjAwMmYyZiwweGUyMDBlMmUyLDB4ODUwMDg1ODUsMHgwZDAwMGQwZCwKKwkweDUzMDA1MzUzLDB4ZjAwMGYwZjAsMHg5YzAwOWM5YywweDY1MDA2NTY1LAorCTB4ZWEwMGVhZWEsMHhhMzAwYTNhMywweGFlMDBhZWFlLDB4OWUwMDllOWUsCisJMHhlYzAwZWNlYywweDgwMDA4MDgwLDB4MmQwMDJkMmQsMHg2YjAwNmI2YiwKKwkweGE4MDBhOGE4LDB4MmIwMDJiMmIsMHgzNjAwMzYzNiwweGE2MDBhNmE2LAorCTB4YzUwMGM1YzUsMHg4NjAwODY4NiwweDRkMDA0ZDRkLDB4MzMwMDMzMzMsCisJMHhmZDAwZmRmZCwweDY2MDA2NjY2LDB4NTgwMDU4NTgsMHg5NjAwOTY5NiwKKwkweDNhMDAzYTNhLDB4MDkwMDA5MDksMHg5NTAwOTU5NSwweDEwMDAxMDEwLAorCTB4NzgwMDc4NzgsMHhkODAwZDhkOCwweDQyMDA0MjQyLDB4Y2MwMGNjY2MsCisJMHhlZjAwZWZlZiwweDI2MDAyNjI2LDB4ZTUwMGU1ZTUsMHg2MTAwNjE2MSwKKwkweDFhMDAxYTFhLDB4M2YwMDNmM2YsMHgzYjAwM2IzYiwweDgyMDA4MjgyLAorCTB4YjYwMGI2YjYsMHhkYjAwZGJkYiwweGQ0MDBkNGQ0LDB4OTgwMDk4OTgsCisJMHhlODAwZThlOCwweDhiMDA4YjhiLDB4MDIwMDAyMDIsMHhlYjAwZWJlYiwKKwkweDBhMDAwYTBhLDB4MmMwMDJjMmMsMHgxZDAwMWQxZCwweGIwMDBiMGIwLAorCTB4NmYwMDZmNmYsMHg4ZDAwOGQ4ZCwweDg4MDA4ODg4LDB4MGUwMDBlMGUsCisJMHgxOTAwMTkxOSwweDg3MDA4Nzg3LDB4NGUwMDRlNGUsMHgwYjAwMGIwYiwKKwkweGE5MDBhOWE5LDB4MGMwMDBjMGMsMHg3OTAwNzk3OSwweDExMDAxMTExLAorCTB4N2YwMDdmN2YsMHgyMjAwMjIyMiwweGU3MDBlN2U3LDB4NTkwMDU5NTksCisJMHhlMTAwZTFlMSwweGRhMDBkYWRhLDB4M2QwMDNkM2QsMHhjODAwYzhjOCwKKwkweDEyMDAxMjEyLDB4MDQwMDA0MDQsMHg3NDAwNzQ3NCwweDU0MDA1NDU0LAorCTB4MzAwMDMwMzAsMHg3ZTAwN2U3ZSwweGI0MDBiNGI0LDB4MjgwMDI4MjgsCisJMHg1NTAwNTU1NSwweDY4MDA2ODY4LDB4NTAwMDUwNTAsMHhiZTAwYmViZSwKKwkweGQwMDBkMGQwLDB4YzQwMGM0YzQsMHgzMTAwMzEzMSwweGNiMDBjYmNiLAorCTB4MmEwMDJhMmEsMHhhZDAwYWRhZCwweDBmMDAwZjBmLDB4Y2EwMGNhY2EsCisJMHg3MDAwNzA3MCwweGZmMDBmZmZmLDB4MzIwMDMyMzIsMHg2OTAwNjk2OSwKKwkweDA4MDAwODA4LDB4NjIwMDYyNjIsMHgwMDAwMDAwMCwweDI0MDAyNDI0LAorCTB4ZDEwMGQxZDEsMHhmYjAwZmJmYiwweGJhMDBiYWJhLDB4ZWQwMGVkZWQsCisJMHg0NTAwNDU0NSwweDgxMDA4MTgxLDB4NzMwMDczNzMsMHg2ZDAwNmQ2ZCwKKwkweDg0MDA4NDg0LDB4OWYwMDlmOWYsMHhlZTAwZWVlZSwweDRhMDA0YTRhLAorCTB4YzMwMGMzYzMsMHgyZTAwMmUyZSwweGMxMDBjMWMxLDB4MDEwMDAxMDEsCisJMHhlNjAwZTZlNiwweDI1MDAyNTI1LDB4NDgwMDQ4NDgsMHg5OTAwOTk5OSwKKwkweGI5MDBiOWI5LDB4YjMwMGIzYjMsMHg3YjAwN2I3YiwweGY5MDBmOWY5LAorCTB4Y2UwMGNlY2UsMHhiZjAwYmZiZiwweGRmMDBkZmRmLDB4NzEwMDcxNzEsCisJMHgyOTAwMjkyOSwweGNkMDBjZGNkLDB4NmMwMDZjNmMsMHgxMzAwMTMxMywKKwkweDY0MDA2NDY0LDB4OWIwMDliOWIsMHg2MzAwNjM2MywweDlkMDA5ZDlkLAorCTB4YzAwMGMwYzAsMHg0YjAwNGI0YiwweGI3MDBiN2I3LDB4YTUwMGE1YTUsCisJMHg4OTAwODk4OSwweDVmMDA1ZjVmLDB4YjEwMGIxYjEsMHgxNzAwMTcxNywKKwkweGY0MDBmNGY0LDB4YmMwMGJjYmMsMHhkMzAwZDNkMywweDQ2MDA0NjQ2LAorCTB4Y2YwMGNmY2YsMHgzNzAwMzczNywweDVlMDA1ZTVlLDB4NDcwMDQ3NDcsCisJMHg5NDAwOTQ5NCwweGZhMDBmYWZhLDB4ZmMwMGZjZmMsMHg1YjAwNWI1YiwKKwkweDk3MDA5Nzk3LDB4ZmUwMGZlZmUsMHg1YTAwNWE1YSwweGFjMDBhY2FjLAorCTB4M2MwMDNjM2MsMHg0YzAwNGM0YywweDAzMDAwMzAzLDB4MzUwMDM1MzUsCisJMHhmMzAwZjNmMywweDIzMDAyMzIzLDB4YjgwMGI4YjgsMHg1ZDAwNWQ1ZCwKKwkweDZhMDA2YTZhLDB4OTIwMDkyOTIsMHhkNTAwZDVkNSwweDIxMDAyMTIxLAorCTB4NDQwMDQ0NDQsMHg1MTAwNTE1MSwweGM2MDBjNmM2LDB4N2QwMDdkN2QsCisJMHgzOTAwMzkzOSwweDgzMDA4MzgzLDB4ZGMwMGRjZGMsMHhhYTAwYWFhYSwKKwkweDdjMDA3YzdjLDB4NzcwMDc3NzcsMHg1NjAwNTY1NiwweDA1MDAwNTA1LAorCTB4MWIwMDFiMWIsMHhhNDAwYTRhNCwweDE1MDAxNTE1LDB4MzQwMDM0MzQsCisJMHgxZTAwMWUxZSwweDFjMDAxYzFjLDB4ZjgwMGY4ZjgsMHg1MjAwNTI1MiwKKwkweDIwMDAyMDIwLDB4MTQwMDE0MTQsMHhlOTAwZTllOSwweGJkMDBiZGJkLAorCTB4ZGQwMGRkZGQsMHhlNDAwZTRlNCwweGExMDBhMWExLDB4ZTAwMGUwZTAsCisJMHg4YTAwOGE4YSwweGYxMDBmMWYxLDB4ZDYwMGQ2ZDYsMHg3YTAwN2E3YSwKKwkweGJiMDBiYmJiLDB4ZTMwMGUzZTMsMHg0MDAwNDA0MCwweDRmMDA0ZjRmLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBjYW1lbGxpYV9zcDQ0MDRbMjU2XSA9IHsKKwkweDcwNzAwMDcwLDB4MmMyYzAwMmMsMHhiM2IzMDBiMywweGMwYzAwMGMwLAorCTB4ZTRlNDAwZTQsMHg1NzU3MDA1NywweGVhZWEwMGVhLDB4YWVhZTAwYWUsCisJMHgyMzIzMDAyMywweDZiNmIwMDZiLDB4NDU0NTAwNDUsMHhhNWE1MDBhNSwKKwkweGVkZWQwMGVkLDB4NGY0ZjAwNGYsMHgxZDFkMDAxZCwweDkyOTIwMDkyLAorCTB4ODY4NjAwODYsMHhhZmFmMDBhZiwweDdjN2MwMDdjLDB4MWYxZjAwMWYsCisJMHgzZTNlMDAzZSwweGRjZGMwMGRjLDB4NWU1ZTAwNWUsMHgwYjBiMDAwYiwKKwkweGE2YTYwMGE2LDB4MzkzOTAwMzksMHhkNWQ1MDBkNSwweDVkNWQwMDVkLAorCTB4ZDlkOTAwZDksMHg1YTVhMDA1YSwweDUxNTEwMDUxLDB4NmM2YzAwNmMsCisJMHg4YjhiMDA4YiwweDlhOWEwMDlhLDB4ZmJmYjAwZmIsMHhiMGIwMDBiMCwKKwkweDc0NzQwMDc0LDB4MmIyYjAwMmIsMHhmMGYwMDBmMCwweDg0ODQwMDg0LAorCTB4ZGZkZjAwZGYsMHhjYmNiMDBjYiwweDM0MzQwMDM0LDB4NzY3NjAwNzYsCisJMHg2ZDZkMDA2ZCwweGE5YTkwMGE5LDB4ZDFkMTAwZDEsMHgwNDA0MDAwNCwKKwkweDE0MTQwMDE0LDB4M2EzYTAwM2EsMHhkZWRlMDBkZSwweDExMTEwMDExLAorCTB4MzIzMjAwMzIsMHg5YzljMDA5YywweDUzNTMwMDUzLDB4ZjJmMjAwZjIsCisJMHhmZWZlMDBmZSwweGNmY2YwMGNmLDB4YzNjMzAwYzMsMHg3YTdhMDA3YSwKKwkweDI0MjQwMDI0LDB4ZThlODAwZTgsMHg2MDYwMDA2MCwweDY5NjkwMDY5LAorCTB4YWFhYTAwYWEsMHhhMGEwMDBhMCwweGExYTEwMGExLDB4NjI2MjAwNjIsCisJMHg1NDU0MDA1NCwweDFlMWUwMDFlLDB4ZTBlMDAwZTAsMHg2NDY0MDA2NCwKKwkweDEwMTAwMDEwLDB4MDAwMDAwMDAsMHhhM2EzMDBhMywweDc1NzUwMDc1LAorCTB4OGE4YTAwOGEsMHhlNmU2MDBlNiwweDA5MDkwMDA5LDB4ZGRkZDAwZGQsCisJMHg4Nzg3MDA4NywweDgzODMwMDgzLDB4Y2RjZDAwY2QsMHg5MDkwMDA5MCwKKwkweDczNzMwMDczLDB4ZjZmNjAwZjYsMHg5ZDlkMDA5ZCwweGJmYmYwMGJmLAorCTB4NTI1MjAwNTIsMHhkOGQ4MDBkOCwweGM4YzgwMGM4LDB4YzZjNjAwYzYsCisJMHg4MTgxMDA4MSwweDZmNmYwMDZmLDB4MTMxMzAwMTMsMHg2MzYzMDA2MywKKwkweGU5ZTkwMGU5LDB4YTdhNzAwYTcsMHg5ZjlmMDA5ZiwweGJjYmMwMGJjLAorCTB4MjkyOTAwMjksMHhmOWY5MDBmOSwweDJmMmYwMDJmLDB4YjRiNDAwYjQsCisJMHg3ODc4MDA3OCwweDA2MDYwMDA2LDB4ZTdlNzAwZTcsMHg3MTcxMDA3MSwKKwkweGQ0ZDQwMGQ0LDB4YWJhYjAwYWIsMHg4ODg4MDA4OCwweDhkOGQwMDhkLAorCTB4NzI3MjAwNzIsMHhiOWI5MDBiOSwweGY4ZjgwMGY4LDB4YWNhYzAwYWMsCisJMHgzNjM2MDAzNiwweDJhMmEwMDJhLDB4M2MzYzAwM2MsMHhmMWYxMDBmMSwKKwkweDQwNDAwMDQwLDB4ZDNkMzAwZDMsMHhiYmJiMDBiYiwweDQzNDMwMDQzLAorCTB4MTUxNTAwMTUsMHhhZGFkMDBhZCwweDc3NzcwMDc3LDB4ODA4MDAwODAsCisJMHg4MjgyMDA4MiwweGVjZWMwMGVjLDB4MjcyNzAwMjcsMHhlNWU1MDBlNSwKKwkweDg1ODUwMDg1LDB4MzUzNTAwMzUsMHgwYzBjMDAwYywweDQxNDEwMDQxLAorCTB4ZWZlZjAwZWYsMHg5MzkzMDA5MywweDE5MTkwMDE5LDB4MjEyMTAwMjEsCisJMHgwZTBlMDAwZSwweDRlNGUwMDRlLDB4NjU2NTAwNjUsMHhiZGJkMDBiZCwKKwkweGI4YjgwMGI4LDB4OGY4ZjAwOGYsMHhlYmViMDBlYiwweGNlY2UwMGNlLAorCTB4MzAzMDAwMzAsMHg1ZjVmMDA1ZiwweGM1YzUwMGM1LDB4MWExYTAwMWEsCisJMHhlMWUxMDBlMSwweGNhY2EwMGNhLDB4NDc0NzAwNDcsMHgzZDNkMDAzZCwKKwkweDAxMDEwMDAxLDB4ZDZkNjAwZDYsMHg1NjU2MDA1NiwweDRkNGQwMDRkLAorCTB4MGQwZDAwMGQsMHg2NjY2MDA2NiwweGNjY2MwMGNjLDB4MmQyZDAwMmQsCisJMHgxMjEyMDAxMiwweDIwMjAwMDIwLDB4YjFiMTAwYjEsMHg5OTk5MDA5OSwKKwkweDRjNGMwMDRjLDB4YzJjMjAwYzIsMHg3ZTdlMDA3ZSwweDA1MDUwMDA1LAorCTB4YjdiNzAwYjcsMHgzMTMxMDAzMSwweDE3MTcwMDE3LDB4ZDdkNzAwZDcsCisJMHg1ODU4MDA1OCwweDYxNjEwMDYxLDB4MWIxYjAwMWIsMHgxYzFjMDAxYywKKwkweDBmMGYwMDBmLDB4MTYxNjAwMTYsMHgxODE4MDAxOCwweDIyMjIwMDIyLAorCTB4NDQ0NDAwNDQsMHhiMmIyMDBiMiwweGI1YjUwMGI1LDB4OTE5MTAwOTEsCisJMHgwODA4MDAwOCwweGE4YTgwMGE4LDB4ZmNmYzAwZmMsMHg1MDUwMDA1MCwKKwkweGQwZDAwMGQwLDB4N2Q3ZDAwN2QsMHg4OTg5MDA4OSwweDk3OTcwMDk3LAorCTB4NWI1YjAwNWIsMHg5NTk1MDA5NSwweGZmZmYwMGZmLDB4ZDJkMjAwZDIsCisJMHhjNGM0MDBjNCwweDQ4NDgwMDQ4LDB4ZjdmNzAwZjcsMHhkYmRiMDBkYiwKKwkweDAzMDMwMDAzLDB4ZGFkYTAwZGEsMHgzZjNmMDAzZiwweDk0OTQwMDk0LAorCTB4NWM1YzAwNWMsMHgwMjAyMDAwMiwweDRhNGEwMDRhLDB4MzMzMzAwMzMsCisJMHg2NzY3MDA2NywweGYzZjMwMGYzLDB4N2Y3ZjAwN2YsMHhlMmUyMDBlMiwKKwkweDliOWIwMDliLDB4MjYyNjAwMjYsMHgzNzM3MDAzNywweDNiM2IwMDNiLAorCTB4OTY5NjAwOTYsMHg0YjRiMDA0YiwweGJlYmUwMGJlLDB4MmUyZTAwMmUsCisJMHg3OTc5MDA3OSwweDhjOGMwMDhjLDB4NmU2ZTAwNmUsMHg4ZThlMDA4ZSwKKwkweGY1ZjUwMGY1LDB4YjZiNjAwYjYsMHhmZGZkMDBmZCwweDU5NTkwMDU5LAorCTB4OTg5ODAwOTgsMHg2YTZhMDA2YSwweDQ2NDYwMDQ2LDB4YmFiYTAwYmEsCisJMHgyNTI1MDAyNSwweDQyNDIwMDQyLDB4YTJhMjAwYTIsMHhmYWZhMDBmYSwKKwkweDA3MDcwMDA3LDB4NTU1NTAwNTUsMHhlZWVlMDBlZSwweDBhMGEwMDBhLAorCTB4NDk0OTAwNDksMHg2ODY4MDA2OCwweDM4MzgwMDM4LDB4YTRhNDAwYTQsCisJMHgyODI4MDAyOCwweDdiN2IwMDdiLDB4YzljOTAwYzksMHhjMWMxMDBjMSwKKwkweGUzZTMwMGUzLDB4ZjRmNDAwZjQsMHhjN2M3MDBjNywweDllOWUwMDllLAorfTsKKworCisKK3N0YXRpYyB2b2lkIGNhbWVsbGlhX3NldHVwMTI4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdTMyICpzdWJrZXkpCit7CisJdTMyIGtsbCwga2xyLCBrcmwsIGtycjsKKwl1MzIgaWwsIGlyLCB0MCwgdDEsIHcwLCB3MTsKKwl1MzIga3c0bCwga3c0ciwgZHcsIHRsLCB0cjsKKwl1MzIgc3ViTFsyNl07CisJdTMyIHN1YlJbMjZdOworCisJLyoqCisJICogIGsgPT0ga2xsIHx8IGtsciB8fCBrcmwgfHwga3JyICh8fCBpcyBjb25jYXRpbmF0aW9uKQorCSAqLworCWtsbCA9IEdFVFUzMihrZXkgICAgICk7CisJa2xyID0gR0VUVTMyKGtleSArICA0KTsKKwlrcmwgPSBHRVRVMzIoa2V5ICsgIDgpOworCWtyciA9IEdFVFUzMihrZXkgKyAxMik7CisJLyoqCisJICogZ2VuZXJhdGUgS0wgZGVwZW5kZW50IHN1YmtleXMKKwkgKi8KKwkvKiBrdzEgKi8KKwlTVUJMKDApID0ga2xsOyBTVUJSKDApID0ga2xyOworCS8qIGt3MiAqLworCVNVQkwoMSkgPSBrcmw7IFNVQlIoMSkgPSBrcnI7CisJLyogcm90YXRpb24gbGVmdCBzaGlmdCAxNWJpdCAqLworCUNBTUVMTElBX1JPTERRKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCAxNSk7CisJLyogazMgKi8KKwlTVUJMKDQpID0ga2xsOyBTVUJSKDQpID0ga2xyOworCS8qIGs0ICovCisJU1VCTCg1KSA9IGtybDsgU1VCUig1KSA9IGtycjsKKwkvKiByb3RhdGlvbiBsZWZ0IHNoaWZ0IDE1KzMwYml0ICovCisJQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDMwKTsKKwkvKiBrNyAqLworCVNVQkwoMTApID0ga2xsOyBTVUJSKDEwKSA9IGtscjsKKwkvKiBrOCAqLworCVNVQkwoMTEpID0ga3JsOyBTVUJSKDExKSA9IGtycjsKKwkvKiByb3RhdGlvbiBsZWZ0IHNoaWZ0IDE1KzMwKzE1Yml0ICovCisJQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE1KTsKKwkvKiBrMTAgKi8KKwlTVUJMKDEzKSA9IGtybDsgU1VCUigxMykgPSBrcnI7CisJLyogcm90YXRpb24gbGVmdCBzaGlmdCAxNSszMCsxNSsxNyBiaXQgKi8KKwlDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTcpOworCS8qIGtsMyAqLworCVNVQkwoMTYpID0ga2xsOyBTVUJSKDE2KSA9IGtscjsKKwkvKiBrbDQgKi8KKwlTVUJMKDE3KSA9IGtybDsgU1VCUigxNykgPSBrcnI7CisJLyogcm90YXRpb24gbGVmdCBzaGlmdCAxNSszMCsxNSsxNysxNyBiaXQgKi8KKwlDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTcpOworCS8qIGsxMyAqLworCVNVQkwoMTgpID0ga2xsOyBTVUJSKDE4KSA9IGtscjsKKwkvKiBrMTQgKi8KKwlTVUJMKDE5KSA9IGtybDsgU1VCUigxOSkgPSBrcnI7CisJLyogcm90YXRpb24gbGVmdCBzaGlmdCAxNSszMCsxNSsxNysxNysxNyBiaXQgKi8KKwlDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTcpOworCS8qIGsxNyAqLworCVNVQkwoMjIpID0ga2xsOyBTVUJSKDIyKSA9IGtscjsKKwkvKiBrMTggKi8KKwlTVUJMKDIzKSA9IGtybDsgU1VCUigyMykgPSBrcnI7CisKKwkvKiBnZW5lcmF0ZSBLQSAqLworCWtsbCA9IFNVQkwoMCk7IGtsciA9IFNVQlIoMCk7CisJa3JsID0gU1VCTCgxKTsga3JyID0gU1VCUigxKTsKKwlDQU1FTExJQV9GKGtsbCwga2xyLAorCQkgICBDQU1FTExJQV9TSUdNQTFMLCBDQU1FTExJQV9TSUdNQTFSLAorCQkgICB3MCwgdzEsIGlsLCBpciwgdDAsIHQxKTsKKwlrcmwgXj0gdzA7IGtyciBePSB3MTsKKwlDQU1FTExJQV9GKGtybCwga3JyLAorCQkgICBDQU1FTExJQV9TSUdNQTJMLCBDQU1FTExJQV9TSUdNQTJSLAorCQkgICBrbGwsIGtsciwgaWwsIGlyLCB0MCwgdDEpOworCS8qIGN1cnJlbnQgc3RhdHVzID09IChrbGwsIGtsciwgdzAsIHcxKSAqLworCUNBTUVMTElBX0Yoa2xsLCBrbHIsCisJCSAgIENBTUVMTElBX1NJR01BM0wsIENBTUVMTElBX1NJR01BM1IsCisJCSAgIGtybCwga3JyLCBpbCwgaXIsIHQwLCB0MSk7CisJa3JsIF49IHcwOyBrcnIgXj0gdzE7CisJQ0FNRUxMSUFfRihrcmwsIGtyciwKKwkJICAgQ0FNRUxMSUFfU0lHTUE0TCwgQ0FNRUxMSUFfU0lHTUE0UiwKKwkJICAgdzAsIHcxLCBpbCwgaXIsIHQwLCB0MSk7CisJa2xsIF49IHcwOyBrbHIgXj0gdzE7CisKKwkvKiBnZW5lcmF0ZSBLQSBkZXBlbmRlbnQgc3Via2V5cyAqLworCS8qIGsxLCBrMiAqLworCVNVQkwoMikgPSBrbGw7IFNVQlIoMikgPSBrbHI7CisJU1VCTCgzKSA9IGtybDsgU1VCUigzKSA9IGtycjsKKwlDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTUpOworCS8qIGs1LGs2ICovCisJU1VCTCg2KSA9IGtsbDsgU1VCUig2KSA9IGtscjsKKwlTVUJMKDcpID0ga3JsOyBTVUJSKDcpID0ga3JyOworCUNBTUVMTElBX1JPTERRKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCAxNSk7CisJLyoga2wxLCBrbDIgKi8KKwlTVUJMKDgpID0ga2xsOyBTVUJSKDgpID0ga2xyOworCVNVQkwoOSkgPSBrcmw7IFNVQlIoOSkgPSBrcnI7CisJQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE1KTsKKwkvKiBrOSAqLworCVNVQkwoMTIpID0ga2xsOyBTVUJSKDEyKSA9IGtscjsKKwlDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTUpOworCS8qIGsxMSwgazEyICovCisJU1VCTCgxNCkgPSBrbGw7IFNVQlIoMTQpID0ga2xyOworCVNVQkwoMTUpID0ga3JsOyBTVUJSKDE1KSA9IGtycjsKKwlDQU1FTExJQV9ST0xEUW8zMihrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMzQpOworCS8qIGsxNSwgazE2ICovCisJU1VCTCgyMCkgPSBrbGw7IFNVQlIoMjApID0ga2xyOworCVNVQkwoMjEpID0ga3JsOyBTVUJSKDIxKSA9IGtycjsKKwlDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTcpOworCS8qIGt3Mywga3c0ICovCisJU1VCTCgyNCkgPSBrbGw7IFNVQlIoMjQpID0ga2xyOworCVNVQkwoMjUpID0ga3JsOyBTVUJSKDI1KSA9IGtycjsKKworCisJLyogYWJzb3JiIGt3MiB0byBvdGhlciBzdWJrZXlzICovCisJLyogcm91bmQgMiAqLworCVNVQkwoMykgXj0gU1VCTCgxKTsgU1VCUigzKSBePSBTVUJSKDEpOworCS8qIHJvdW5kIDQgKi8KKwlTVUJMKDUpIF49IFNVQkwoMSk7IFNVQlIoNSkgXj0gU1VCUigxKTsKKwkvKiByb3VuZCA2ICovCisJU1VCTCg3KSBePSBTVUJMKDEpOyBTVUJSKDcpIF49IFNVQlIoMSk7CisJU1VCTCgxKSBePSBTVUJSKDEpICYgflNVQlIoOSk7CisJZHcgPSBTVUJMKDEpICYgU1VCTCg5KSwKKwkJU1VCUigxKSBePSBDQU1FTExJQV9STDEoZHcpOyAvKiBtb2RpZmllZCBmb3IgRkxpbnYoa2wyKSAqLworCS8qIHJvdW5kIDggKi8KKwlTVUJMKDExKSBePSBTVUJMKDEpOyBTVUJSKDExKSBePSBTVUJSKDEpOworCS8qIHJvdW5kIDEwICovCisJU1VCTCgxMykgXj0gU1VCTCgxKTsgU1VCUigxMykgXj0gU1VCUigxKTsKKwkvKiByb3VuZCAxMiAqLworCVNVQkwoMTUpIF49IFNVQkwoMSk7IFNVQlIoMTUpIF49IFNVQlIoMSk7CisJU1VCTCgxKSBePSBTVUJSKDEpICYgflNVQlIoMTcpOworCWR3ID0gU1VCTCgxKSAmIFNVQkwoMTcpLAorCQlTVUJSKDEpIF49IENBTUVMTElBX1JMMShkdyk7IC8qIG1vZGlmaWVkIGZvciBGTGludihrbDQpICovCisJLyogcm91bmQgMTQgKi8KKwlTVUJMKDE5KSBePSBTVUJMKDEpOyBTVUJSKDE5KSBePSBTVUJSKDEpOworCS8qIHJvdW5kIDE2ICovCisJU1VCTCgyMSkgXj0gU1VCTCgxKTsgU1VCUigyMSkgXj0gU1VCUigxKTsKKwkvKiByb3VuZCAxOCAqLworCVNVQkwoMjMpIF49IFNVQkwoMSk7IFNVQlIoMjMpIF49IFNVQlIoMSk7CisJLyoga3czICovCisJU1VCTCgyNCkgXj0gU1VCTCgxKTsgU1VCUigyNCkgXj0gU1VCUigxKTsKKworCS8qIGFic29yYiBrdzQgdG8gb3RoZXIgc3Via2V5cyAqLworCWt3NGwgPSBTVUJMKDI1KTsga3c0ciA9IFNVQlIoMjUpOworCS8qIHJvdW5kIDE3ICovCisJU1VCTCgyMikgXj0ga3c0bDsgU1VCUigyMikgXj0ga3c0cjsKKwkvKiByb3VuZCAxNSAqLworCVNVQkwoMjApIF49IGt3NGw7IFNVQlIoMjApIF49IGt3NHI7CisJLyogcm91bmQgMTMgKi8KKwlTVUJMKDE4KSBePSBrdzRsOyBTVUJSKDE4KSBePSBrdzRyOworCWt3NGwgXj0ga3c0ciAmIH5TVUJSKDE2KTsKKwlkdyA9IGt3NGwgJiBTVUJMKDE2KSwKKwkJa3c0ciBePSBDQU1FTExJQV9STDEoZHcpOyAvKiBtb2RpZmllZCBmb3IgRkwoa2wzKSAqLworCS8qIHJvdW5kIDExICovCisJU1VCTCgxNCkgXj0ga3c0bDsgU1VCUigxNCkgXj0ga3c0cjsKKwkvKiByb3VuZCA5ICovCisJU1VCTCgxMikgXj0ga3c0bDsgU1VCUigxMikgXj0ga3c0cjsKKwkvKiByb3VuZCA3ICovCisJU1VCTCgxMCkgXj0ga3c0bDsgU1VCUigxMCkgXj0ga3c0cjsKKwlrdzRsIF49IGt3NHIgJiB+U1VCUig4KTsKKwlkdyA9IGt3NGwgJiBTVUJMKDgpLAorCQlrdzRyIF49IENBTUVMTElBX1JMMShkdyk7IC8qIG1vZGlmaWVkIGZvciBGTChrbDEpICovCisJLyogcm91bmQgNSAqLworCVNVQkwoNikgXj0ga3c0bDsgU1VCUig2KSBePSBrdzRyOworCS8qIHJvdW5kIDMgKi8KKwlTVUJMKDQpIF49IGt3NGw7IFNVQlIoNCkgXj0ga3c0cjsKKwkvKiByb3VuZCAxICovCisJU1VCTCgyKSBePSBrdzRsOyBTVUJSKDIpIF49IGt3NHI7CisJLyoga3cxICovCisJU1VCTCgwKSBePSBrdzRsOyBTVUJSKDApIF49IGt3NHI7CisKKworCS8qIGtleSBYT1IgaXMgZW5kIG9mIEYtZnVuY3Rpb24gKi8KKwlDQU1FTExJQV9TVUJLRVlfTCgwKSA9IFNVQkwoMCkgXiBTVUJMKDIpOy8qIGt3MSAqLworCUNBTUVMTElBX1NVQktFWV9SKDApID0gU1VCUigwKSBeIFNVQlIoMik7CisJQ0FNRUxMSUFfU1VCS0VZX0woMikgPSBTVUJMKDMpOyAgICAgICAvKiByb3VuZCAxICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMikgPSBTVUJSKDMpOworCUNBTUVMTElBX1NVQktFWV9MKDMpID0gU1VCTCgyKSBeIFNVQkwoNCk7IC8qIHJvdW5kIDIgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigzKSA9IFNVQlIoMikgXiBTVUJSKDQpOworCUNBTUVMTElBX1NVQktFWV9MKDQpID0gU1VCTCgzKSBeIFNVQkwoNSk7IC8qIHJvdW5kIDMgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig0KSA9IFNVQlIoMykgXiBTVUJSKDUpOworCUNBTUVMTElBX1NVQktFWV9MKDUpID0gU1VCTCg0KSBeIFNVQkwoNik7IC8qIHJvdW5kIDQgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig1KSA9IFNVQlIoNCkgXiBTVUJSKDYpOworCUNBTUVMTElBX1NVQktFWV9MKDYpID0gU1VCTCg1KSBeIFNVQkwoNyk7IC8qIHJvdW5kIDUgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig2KSA9IFNVQlIoNSkgXiBTVUJSKDcpOworCXRsID0gU1VCTCgxMCkgXiAoU1VCUigxMCkgJiB+U1VCUig4KSk7CisJZHcgPSB0bCAmIFNVQkwoOCksICAvKiBGTChrbDEpICovCisJCXRyID0gU1VCUigxMCkgXiBDQU1FTExJQV9STDEoZHcpOworCUNBTUVMTElBX1NVQktFWV9MKDcpID0gU1VCTCg2KSBeIHRsOyAvKiByb3VuZCA2ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoNykgPSBTVUJSKDYpIF4gdHI7CisJQ0FNRUxMSUFfU1VCS0VZX0woOCkgPSBTVUJMKDgpOyAgICAgICAvKiBGTChrbDEpICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoOCkgPSBTVUJSKDgpOworCUNBTUVMTElBX1NVQktFWV9MKDkpID0gU1VCTCg5KTsgICAgICAgLyogRkxpbnYoa2wyKSAqLworCUNBTUVMTElBX1NVQktFWV9SKDkpID0gU1VCUig5KTsKKwl0bCA9IFNVQkwoNykgXiAoU1VCUig3KSAmIH5TVUJSKDkpKTsKKwlkdyA9IHRsICYgU1VCTCg5KSwgIC8qIEZMaW52KGtsMikgKi8KKwkJdHIgPSBTVUJSKDcpIF4gQ0FNRUxMSUFfUkwxKGR3KTsKKwlDQU1FTExJQV9TVUJLRVlfTCgxMCkgPSB0bCBeIFNVQkwoMTEpOyAvKiByb3VuZCA3ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTApID0gdHIgXiBTVUJSKDExKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgxMSkgPSBTVUJMKDEwKSBeIFNVQkwoMTIpOyAvKiByb3VuZCA4ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTEpID0gU1VCUigxMCkgXiBTVUJSKDEyKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgxMikgPSBTVUJMKDExKSBeIFNVQkwoMTMpOyAvKiByb3VuZCA5ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTIpID0gU1VCUigxMSkgXiBTVUJSKDEzKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgxMykgPSBTVUJMKDEyKSBeIFNVQkwoMTQpOyAvKiByb3VuZCAxMCAqLworCUNBTUVMTElBX1NVQktFWV9SKDEzKSA9IFNVQlIoMTIpIF4gU1VCUigxNCk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTQpID0gU1VCTCgxMykgXiBTVUJMKDE1KTsgLyogcm91bmQgMTEgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxNCkgPSBTVUJSKDEzKSBeIFNVQlIoMTUpOworCXRsID0gU1VCTCgxOCkgXiAoU1VCUigxOCkgJiB+U1VCUigxNikpOworCWR3ID0gdGwgJiBTVUJMKDE2KSwgLyogRkwoa2wzKSAqLworCQl0ciA9IFNVQlIoMTgpIF4gQ0FNRUxMSUFfUkwxKGR3KTsKKwlDQU1FTExJQV9TVUJLRVlfTCgxNSkgPSBTVUJMKDE0KSBeIHRsOyAvKiByb3VuZCAxMiAqLworCUNBTUVMTElBX1NVQktFWV9SKDE1KSA9IFNVQlIoMTQpIF4gdHI7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTYpID0gU1VCTCgxNik7ICAgICAvKiBGTChrbDMpICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTYpID0gU1VCUigxNik7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTcpID0gU1VCTCgxNyk7ICAgICAvKiBGTGludihrbDQpICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTcpID0gU1VCUigxNyk7CisJdGwgPSBTVUJMKDE1KSBeIChTVUJSKDE1KSAmIH5TVUJSKDE3KSk7CisJZHcgPSB0bCAmIFNVQkwoMTcpLCAvKiBGTGludihrbDQpICovCisJCXRyID0gU1VCUigxNSkgXiBDQU1FTExJQV9STDEoZHcpOworCUNBTUVMTElBX1NVQktFWV9MKDE4KSA9IHRsIF4gU1VCTCgxOSk7IC8qIHJvdW5kIDEzICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTgpID0gdHIgXiBTVUJSKDE5KTsKKwlDQU1FTExJQV9TVUJLRVlfTCgxOSkgPSBTVUJMKDE4KSBeIFNVQkwoMjApOyAvKiByb3VuZCAxNCAqLworCUNBTUVMTElBX1NVQktFWV9SKDE5KSA9IFNVQlIoMTgpIF4gU1VCUigyMCk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMjApID0gU1VCTCgxOSkgXiBTVUJMKDIxKTsgLyogcm91bmQgMTUgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyMCkgPSBTVUJSKDE5KSBeIFNVQlIoMjEpOworCUNBTUVMTElBX1NVQktFWV9MKDIxKSA9IFNVQkwoMjApIF4gU1VCTCgyMik7IC8qIHJvdW5kIDE2ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjEpID0gU1VCUigyMCkgXiBTVUJSKDIyKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgyMikgPSBTVUJMKDIxKSBeIFNVQkwoMjMpOyAvKiByb3VuZCAxNyAqLworCUNBTUVMTElBX1NVQktFWV9SKDIyKSA9IFNVQlIoMjEpIF4gU1VCUigyMyk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMjMpID0gU1VCTCgyMik7ICAgICAvKiByb3VuZCAxOCAqLworCUNBTUVMTElBX1NVQktFWV9SKDIzKSA9IFNVQlIoMjIpOworCUNBTUVMTElBX1NVQktFWV9MKDI0KSA9IFNVQkwoMjQpIF4gU1VCTCgyMyk7IC8qIGt3MyAqLworCUNBTUVMTElBX1NVQktFWV9SKDI0KSA9IFNVQlIoMjQpIF4gU1VCUigyMyk7CisKKwkvKiBhcHBseSB0aGUgaW52ZXJzZSBvZiB0aGUgbGFzdCBoYWxmIG9mIFAtZnVuY3Rpb24gKi8KKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDIpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMiksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMikgPSBDQU1FTExJQV9TVUJLRVlfTCgyKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgyKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMykgXiBDQU1FTExJQV9TVUJLRVlfUigzKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDIgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigzKSA9IENBTUVMTElBX1NVQktFWV9MKDMpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDMpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCg0KSBeIENBTUVMTElBX1NVQktFWV9SKDQpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMyAqLworCUNBTUVMTElBX1NVQktFWV9SKDQpID0gQ0FNRUxMSUFfU1VCS0VZX0woNCkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woNCkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDUpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoNSksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCA0ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoNSkgPSBDQU1FTExJQV9TVUJLRVlfTCg1KSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCg1KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woNikgXiBDQU1FTExJQV9TVUJLRVlfUig2KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDUgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig2KSA9IENBTUVMTElBX1NVQktFWV9MKDYpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDYpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCg3KSBeIENBTUVMTElBX1NVQktFWV9SKDcpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgNiAqLworCUNBTUVMTElBX1NVQktFWV9SKDcpID0gQ0FNRUxMSUFfU1VCS0VZX0woNykgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woNykgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDEwKSBeIENBTUVMTElBX1NVQktFWV9SKDEwKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDcgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxMCkgPSBDQU1FTExJQV9TVUJLRVlfTCgxMCkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMTApID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgxMSkgXiBDQU1FTExJQV9TVUJLRVlfUigxMSksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCA4ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTEpID0gQ0FNRUxMSUFfU1VCS0VZX0woMTEpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDExKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMTIpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMTIpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgOSAqLworCUNBTUVMTElBX1NVQktFWV9SKDEyKSA9IENBTUVMTElBX1NVQktFWV9MKDEyKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgxMikgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDEzKSBeIENBTUVMTElBX1NVQktFWV9SKDEzKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDEwICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTMpID0gQ0FNRUxMSUFfU1VCS0VZX0woMTMpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDEzKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMTQpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMTQpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMTEgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxNCkgPSBDQU1FTExJQV9TVUJLRVlfTCgxNCkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMTQpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgxNSkgXiBDQU1FTExJQV9TVUJLRVlfUigxNSksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxMiAqLworCUNBTUVMTElBX1NVQktFWV9SKDE1KSA9IENBTUVMTElBX1NVQktFWV9MKDE1KSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgxNSkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDE4KSBeIENBTUVMTElBX1NVQktFWV9SKDE4KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDEzICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTgpID0gQ0FNRUxMSUFfU1VCS0VZX0woMTgpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDE4KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMTkpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMTkpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMTQgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxOSkgPSBDQU1FTExJQV9TVUJLRVlfTCgxOSkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMTkpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgyMCkgXiBDQU1FTExJQV9TVUJLRVlfUigyMCksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxNSAqLworCUNBTUVMTElBX1NVQktFWV9SKDIwKSA9IENBTUVMTElBX1NVQktFWV9MKDIwKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgyMCkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDIxKSBeIENBTUVMTElBX1NVQktFWV9SKDIxKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDE2ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjEpID0gQ0FNRUxMSUFfU1VCS0VZX0woMjEpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDIxKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMjIpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMjIpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMTcgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyMikgPSBDQU1FTExJQV9TVUJLRVlfTCgyMikgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMjIpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgyMykgXiBDQU1FTExJQV9TVUJLRVlfUigyMyksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxOCAqLworCUNBTUVMTElBX1NVQktFWV9SKDIzKSA9IENBTUVMTElBX1NVQktFWV9MKDIzKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgyMykgPSBkdzsKKworCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBjYW1lbGxpYV9zZXR1cDI1Nihjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHUzMiAqc3Via2V5KQoreworCXUzMiBrbGwsa2xyLGtybCxrcnI7ICAgICAgICAgICAvKiBsZWZ0IGhhbGYgb2Yga2V5ICovCisJdTMyIGtybGwsa3JscixrcnJsLGtycnI7ICAgICAgIC8qIHJpZ2h0IGhhbGYgb2Yga2V5ICovCisJdTMyIGlsLCBpciwgdDAsIHQxLCB3MCwgdzE7ICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZXMgKi8KKwl1MzIga3c0bCwga3c0ciwgZHcsIHRsLCB0cjsKKwl1MzIgc3ViTFszNF07CisJdTMyIHN1YlJbMzRdOworCisJLyoqCisJICogIGtleSA9IChrbGwgfHwga2xyIHx8IGtybCB8fCBrcnIgfHwga3JsbCB8fCBrcmxyIHx8IGtycmwgfHwga3JycikKKwkgKiAgKHx8IGlzIGNvbmNhdGluYXRpb24pCisJICovCisKKwlrbGwgID0gR0VUVTMyKGtleSAgICAgKTsKKwlrbHIgID0gR0VUVTMyKGtleSArICA0KTsKKwlrcmwgID0gR0VUVTMyKGtleSArICA4KTsKKwlrcnIgID0gR0VUVTMyKGtleSArIDEyKTsKKwlrcmxsID0gR0VUVTMyKGtleSArIDE2KTsKKwlrcmxyID0gR0VUVTMyKGtleSArIDIwKTsKKwlrcnJsID0gR0VUVTMyKGtleSArIDI0KTsKKwlrcnJyID0gR0VUVTMyKGtleSArIDI4KTsKKworCS8qIGdlbmVyYXRlIEtMIGRlcGVuZGVudCBzdWJrZXlzICovCisJLyoga3cxICovCisJU1VCTCgwKSA9IGtsbDsgU1VCUigwKSA9IGtscjsKKwkvKiBrdzIgKi8KKwlTVUJMKDEpID0ga3JsOyBTVUJSKDEpID0ga3JyOworCUNBTUVMTElBX1JPTERRbzMyKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCA0NSk7CisJLyogazkgKi8KKwlTVUJMKDEyKSA9IGtsbDsgU1VCUigxMikgPSBrbHI7CisJLyogazEwICovCisJU1VCTCgxMykgPSBrcmw7IFNVQlIoMTMpID0ga3JyOworCUNBTUVMTElBX1JPTERRKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCAxNSk7CisJLyoga2wzICovCisJU1VCTCgxNikgPSBrbGw7IFNVQlIoMTYpID0ga2xyOworCS8qIGtsNCAqLworCVNVQkwoMTcpID0ga3JsOyBTVUJSKDE3KSA9IGtycjsKKwlDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTcpOworCS8qIGsxNyAqLworCVNVQkwoMjIpID0ga2xsOyBTVUJSKDIyKSA9IGtscjsKKwkvKiBrMTggKi8KKwlTVUJMKDIzKSA9IGtybDsgU1VCUigyMykgPSBrcnI7CisJQ0FNRUxMSUFfUk9MRFFvMzIoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDM0KTsKKwkvKiBrMjMgKi8KKwlTVUJMKDMwKSA9IGtsbDsgU1VCUigzMCkgPSBrbHI7CisJLyogazI0ICovCisJU1VCTCgzMSkgPSBrcmw7IFNVQlIoMzEpID0ga3JyOworCisJLyogZ2VuZXJhdGUgS1IgZGVwZW5kZW50IHN1YmtleXMgKi8KKwlDQU1FTExJQV9ST0xEUShrcmxsLCBrcmxyLCBrcnJsLCBrcnJyLCB3MCwgdzEsIDE1KTsKKwkvKiBrMyAqLworCVNVQkwoNCkgPSBrcmxsOyBTVUJSKDQpID0ga3JscjsKKwkvKiBrNCAqLworCVNVQkwoNSkgPSBrcnJsOyBTVUJSKDUpID0ga3JycjsKKwlDQU1FTExJQV9ST0xEUShrcmxsLCBrcmxyLCBrcnJsLCBrcnJyLCB3MCwgdzEsIDE1KTsKKwkvKiBrbDEgKi8KKwlTVUJMKDgpID0ga3JsbDsgU1VCUig4KSA9IGtybHI7CisJLyoga2wyICovCisJU1VCTCg5KSA9IGtycmw7IFNVQlIoOSkgPSBrcnJyOworCUNBTUVMTElBX1JPTERRKGtybGwsIGtybHIsIGtycmwsIGtycnIsIHcwLCB3MSwgMzApOworCS8qIGsxMyAqLworCVNVQkwoMTgpID0ga3JsbDsgU1VCUigxOCkgPSBrcmxyOworCS8qIGsxNCAqLworCVNVQkwoMTkpID0ga3JybDsgU1VCUigxOSkgPSBrcnJyOworCUNBTUVMTElBX1JPTERRbzMyKGtybGwsIGtybHIsIGtycmwsIGtycnIsIHcwLCB3MSwgMzQpOworCS8qIGsxOSAqLworCVNVQkwoMjYpID0ga3JsbDsgU1VCUigyNikgPSBrcmxyOworCS8qIGsyMCAqLworCVNVQkwoMjcpID0ga3JybDsgU1VCUigyNykgPSBrcnJyOworCUNBTUVMTElBX1JPTERRbzMyKGtybGwsIGtybHIsIGtycmwsIGtycnIsIHcwLCB3MSwgMzQpOworCisJLyogZ2VuZXJhdGUgS0EgKi8KKwlrbGwgPSBTVUJMKDApIF4ga3JsbDsga2xyID0gU1VCUigwKSBeIGtybHI7CisJa3JsID0gU1VCTCgxKSBeIGtycmw7IGtyciA9IFNVQlIoMSkgXiBrcnJyOworCUNBTUVMTElBX0Yoa2xsLCBrbHIsCisJCSAgIENBTUVMTElBX1NJR01BMUwsIENBTUVMTElBX1NJR01BMVIsCisJCSAgIHcwLCB3MSwgaWwsIGlyLCB0MCwgdDEpOworCWtybCBePSB3MDsga3JyIF49IHcxOworCUNBTUVMTElBX0Yoa3JsLCBrcnIsCisJCSAgIENBTUVMTElBX1NJR01BMkwsIENBTUVMTElBX1NJR01BMlIsCisJCSAgIGtsbCwga2xyLCBpbCwgaXIsIHQwLCB0MSk7CisJa2xsIF49IGtybGw7IGtsciBePSBrcmxyOworCUNBTUVMTElBX0Yoa2xsLCBrbHIsCisJCSAgIENBTUVMTElBX1NJR01BM0wsIENBTUVMTElBX1NJR01BM1IsCisJCSAgIGtybCwga3JyLCBpbCwgaXIsIHQwLCB0MSk7CisJa3JsIF49IHcwIF4ga3JybDsga3JyIF49IHcxIF4ga3JycjsKKwlDQU1FTExJQV9GKGtybCwga3JyLAorCQkgICBDQU1FTExJQV9TSUdNQTRMLCBDQU1FTExJQV9TSUdNQTRSLAorCQkgICB3MCwgdzEsIGlsLCBpciwgdDAsIHQxKTsKKwlrbGwgXj0gdzA7IGtsciBePSB3MTsKKworCS8qIGdlbmVyYXRlIEtCICovCisJa3JsbCBePSBrbGw7IGtybHIgXj0ga2xyOworCWtycmwgXj0ga3JsOyBrcnJyIF49IGtycjsKKwlDQU1FTExJQV9GKGtybGwsIGtybHIsCisJCSAgIENBTUVMTElBX1NJR01BNUwsIENBTUVMTElBX1NJR01BNVIsCisJCSAgIHcwLCB3MSwgaWwsIGlyLCB0MCwgdDEpOworCWtycmwgXj0gdzA7IGtycnIgXj0gdzE7CisJQ0FNRUxMSUFfRihrcnJsLCBrcnJyLAorCQkgICBDQU1FTExJQV9TSUdNQTZMLCBDQU1FTExJQV9TSUdNQTZSLAorCQkgICB3MCwgdzEsIGlsLCBpciwgdDAsIHQxKTsKKwlrcmxsIF49IHcwOyBrcmxyIF49IHcxOworCisJLyogZ2VuZXJhdGUgS0EgZGVwZW5kZW50IHN1YmtleXMgKi8KKwlDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTUpOworCS8qIGs1ICovCisJU1VCTCg2KSA9IGtsbDsgU1VCUig2KSA9IGtscjsKKwkvKiBrNiAqLworCVNVQkwoNykgPSBrcmw7IFNVQlIoNykgPSBrcnI7CisJQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDMwKTsKKwkvKiBrMTEgKi8KKwlTVUJMKDE0KSA9IGtsbDsgU1VCUigxNCkgPSBrbHI7CisJLyogazEyICovCisJU1VCTCgxNSkgPSBrcmw7IFNVQlIoMTUpID0ga3JyOworCS8qIHJvdGF0aW9uIGxlZnQgc2hpZnQgMzJiaXQgKi8KKwkvKiBrbDUgKi8KKwlTVUJMKDI0KSA9IGtscjsgU1VCUigyNCkgPSBrcmw7CisJLyoga2w2ICovCisJU1VCTCgyNSkgPSBrcnI7IFNVQlIoMjUpID0ga2xsOworCS8qIHJvdGF0aW9uIGxlZnQgc2hpZnQgNDkgZnJvbSBrMTEsazEyIC0+IGsyMSxrMjIgKi8KKwlDQU1FTExJQV9ST0xEUW8zMihrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgNDkpOworCS8qIGsyMSAqLworCVNVQkwoMjgpID0ga2xsOyBTVUJSKDI4KSA9IGtscjsKKwkvKiBrMjIgKi8KKwlTVUJMKDI5KSA9IGtybDsgU1VCUigyOSkgPSBrcnI7CisKKwkvKiBnZW5lcmF0ZSBLQiBkZXBlbmRlbnQgc3Via2V5cyAqLworCS8qIGsxICovCisJU1VCTCgyKSA9IGtybGw7IFNVQlIoMikgPSBrcmxyOworCS8qIGsyICovCisJU1VCTCgzKSA9IGtycmw7IFNVQlIoMykgPSBrcnJyOworCUNBTUVMTElBX1JPTERRKGtybGwsIGtybHIsIGtycmwsIGtycnIsIHcwLCB3MSwgMzApOworCS8qIGs3ICovCisJU1VCTCgxMCkgPSBrcmxsOyBTVUJSKDEwKSA9IGtybHI7CisJLyogazggKi8KKwlTVUJMKDExKSA9IGtycmw7IFNVQlIoMTEpID0ga3JycjsKKwlDQU1FTExJQV9ST0xEUShrcmxsLCBrcmxyLCBrcnJsLCBrcnJyLCB3MCwgdzEsIDMwKTsKKwkvKiBrMTUgKi8KKwlTVUJMKDIwKSA9IGtybGw7IFNVQlIoMjApID0ga3JscjsKKwkvKiBrMTYgKi8KKwlTVUJMKDIxKSA9IGtycmw7IFNVQlIoMjEpID0ga3JycjsKKwlDQU1FTExJQV9ST0xEUW8zMihrcmxsLCBrcmxyLCBrcnJsLCBrcnJyLCB3MCwgdzEsIDUxKTsKKwkvKiBrdzMgKi8KKwlTVUJMKDMyKSA9IGtybGw7IFNVQlIoMzIpID0ga3JscjsKKwkvKiBrdzQgKi8KKwlTVUJMKDMzKSA9IGtycmw7IFNVQlIoMzMpID0ga3JycjsKKworCS8qIGFic29yYiBrdzIgdG8gb3RoZXIgc3Via2V5cyAqLworCS8qIHJvdW5kIDIgKi8KKwlTVUJMKDMpIF49IFNVQkwoMSk7IFNVQlIoMykgXj0gU1VCUigxKTsKKwkvKiByb3VuZCA0ICovCisJU1VCTCg1KSBePSBTVUJMKDEpOyBTVUJSKDUpIF49IFNVQlIoMSk7CisJLyogcm91bmQgNiAqLworCVNVQkwoNykgXj0gU1VCTCgxKTsgU1VCUig3KSBePSBTVUJSKDEpOworCVNVQkwoMSkgXj0gU1VCUigxKSAmIH5TVUJSKDkpOworCWR3ID0gU1VCTCgxKSAmIFNVQkwoOSksCisJCVNVQlIoMSkgXj0gQ0FNRUxMSUFfUkwxKGR3KTsgLyogbW9kaWZpZWQgZm9yIEZMaW52KGtsMikgKi8KKwkvKiByb3VuZCA4ICovCisJU1VCTCgxMSkgXj0gU1VCTCgxKTsgU1VCUigxMSkgXj0gU1VCUigxKTsKKwkvKiByb3VuZCAxMCAqLworCVNVQkwoMTMpIF49IFNVQkwoMSk7IFNVQlIoMTMpIF49IFNVQlIoMSk7CisJLyogcm91bmQgMTIgKi8KKwlTVUJMKDE1KSBePSBTVUJMKDEpOyBTVUJSKDE1KSBePSBTVUJSKDEpOworCVNVQkwoMSkgXj0gU1VCUigxKSAmIH5TVUJSKDE3KTsKKwlkdyA9IFNVQkwoMSkgJiBTVUJMKDE3KSwKKwkJU1VCUigxKSBePSBDQU1FTExJQV9STDEoZHcpOyAvKiBtb2RpZmllZCBmb3IgRkxpbnYoa2w0KSAqLworCS8qIHJvdW5kIDE0ICovCisJU1VCTCgxOSkgXj0gU1VCTCgxKTsgU1VCUigxOSkgXj0gU1VCUigxKTsKKwkvKiByb3VuZCAxNiAqLworCVNVQkwoMjEpIF49IFNVQkwoMSk7IFNVQlIoMjEpIF49IFNVQlIoMSk7CisJLyogcm91bmQgMTggKi8KKwlTVUJMKDIzKSBePSBTVUJMKDEpOyBTVUJSKDIzKSBePSBTVUJSKDEpOworCVNVQkwoMSkgXj0gU1VCUigxKSAmIH5TVUJSKDI1KTsKKwlkdyA9IFNVQkwoMSkgJiBTVUJMKDI1KSwKKwkJU1VCUigxKSBePSBDQU1FTExJQV9STDEoZHcpOyAvKiBtb2RpZmllZCBmb3IgRkxpbnYoa2w2KSAqLworCS8qIHJvdW5kIDIwICovCisJU1VCTCgyNykgXj0gU1VCTCgxKTsgU1VCUigyNykgXj0gU1VCUigxKTsKKwkvKiByb3VuZCAyMiAqLworCVNVQkwoMjkpIF49IFNVQkwoMSk7IFNVQlIoMjkpIF49IFNVQlIoMSk7CisJLyogcm91bmQgMjQgKi8KKwlTVUJMKDMxKSBePSBTVUJMKDEpOyBTVUJSKDMxKSBePSBTVUJSKDEpOworCS8qIGt3MyAqLworCVNVQkwoMzIpIF49IFNVQkwoMSk7IFNVQlIoMzIpIF49IFNVQlIoMSk7CisKKworCS8qIGFic29yYiBrdzQgdG8gb3RoZXIgc3Via2V5cyAqLworCWt3NGwgPSBTVUJMKDMzKTsga3c0ciA9IFNVQlIoMzMpOworCS8qIHJvdW5kIDIzICovCisJU1VCTCgzMCkgXj0ga3c0bDsgU1VCUigzMCkgXj0ga3c0cjsKKwkvKiByb3VuZCAyMSAqLworCVNVQkwoMjgpIF49IGt3NGw7IFNVQlIoMjgpIF49IGt3NHI7CisJLyogcm91bmQgMTkgKi8KKwlTVUJMKDI2KSBePSBrdzRsOyBTVUJSKDI2KSBePSBrdzRyOworCWt3NGwgXj0ga3c0ciAmIH5TVUJSKDI0KTsKKwlkdyA9IGt3NGwgJiBTVUJMKDI0KSwKKwkJa3c0ciBePSBDQU1FTExJQV9STDEoZHcpOyAvKiBtb2RpZmllZCBmb3IgRkwoa2w1KSAqLworCS8qIHJvdW5kIDE3ICovCisJU1VCTCgyMikgXj0ga3c0bDsgU1VCUigyMikgXj0ga3c0cjsKKwkvKiByb3VuZCAxNSAqLworCVNVQkwoMjApIF49IGt3NGw7IFNVQlIoMjApIF49IGt3NHI7CisJLyogcm91bmQgMTMgKi8KKwlTVUJMKDE4KSBePSBrdzRsOyBTVUJSKDE4KSBePSBrdzRyOworCWt3NGwgXj0ga3c0ciAmIH5TVUJSKDE2KTsKKwlkdyA9IGt3NGwgJiBTVUJMKDE2KSwKKwkJa3c0ciBePSBDQU1FTExJQV9STDEoZHcpOyAvKiBtb2RpZmllZCBmb3IgRkwoa2wzKSAqLworCS8qIHJvdW5kIDExICovCisJU1VCTCgxNCkgXj0ga3c0bDsgU1VCUigxNCkgXj0ga3c0cjsKKwkvKiByb3VuZCA5ICovCisJU1VCTCgxMikgXj0ga3c0bDsgU1VCUigxMikgXj0ga3c0cjsKKwkvKiByb3VuZCA3ICovCisJU1VCTCgxMCkgXj0ga3c0bDsgU1VCUigxMCkgXj0ga3c0cjsKKwlrdzRsIF49IGt3NHIgJiB+U1VCUig4KTsKKwlkdyA9IGt3NGwgJiBTVUJMKDgpLAorCQlrdzRyIF49IENBTUVMTElBX1JMMShkdyk7IC8qIG1vZGlmaWVkIGZvciBGTChrbDEpICovCisJLyogcm91bmQgNSAqLworCVNVQkwoNikgXj0ga3c0bDsgU1VCUig2KSBePSBrdzRyOworCS8qIHJvdW5kIDMgKi8KKwlTVUJMKDQpIF49IGt3NGw7IFNVQlIoNCkgXj0ga3c0cjsKKwkvKiByb3VuZCAxICovCisJU1VCTCgyKSBePSBrdzRsOyBTVUJSKDIpIF49IGt3NHI7CisJLyoga3cxICovCisJU1VCTCgwKSBePSBrdzRsOyBTVUJSKDApIF49IGt3NHI7CisKKwkvKiBrZXkgWE9SIGlzIGVuZCBvZiBGLWZ1bmN0aW9uICovCisJQ0FNRUxMSUFfU1VCS0VZX0woMCkgPSBTVUJMKDApIF4gU1VCTCgyKTsvKiBrdzEgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigwKSA9IFNVQlIoMCkgXiBTVUJSKDIpOworCUNBTUVMTElBX1NVQktFWV9MKDIpID0gU1VCTCgzKTsgICAgICAgLyogcm91bmQgMSAqLworCUNBTUVMTElBX1NVQktFWV9SKDIpID0gU1VCUigzKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgzKSA9IFNVQkwoMikgXiBTVUJMKDQpOyAvKiByb3VuZCAyICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMykgPSBTVUJSKDIpIF4gU1VCUig0KTsKKwlDQU1FTExJQV9TVUJLRVlfTCg0KSA9IFNVQkwoMykgXiBTVUJMKDUpOyAvKiByb3VuZCAzICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoNCkgPSBTVUJSKDMpIF4gU1VCUig1KTsKKwlDQU1FTExJQV9TVUJLRVlfTCg1KSA9IFNVQkwoNCkgXiBTVUJMKDYpOyAvKiByb3VuZCA0ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoNSkgPSBTVUJSKDQpIF4gU1VCUig2KTsKKwlDQU1FTExJQV9TVUJLRVlfTCg2KSA9IFNVQkwoNSkgXiBTVUJMKDcpOyAvKiByb3VuZCA1ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoNikgPSBTVUJSKDUpIF4gU1VCUig3KTsKKwl0bCA9IFNVQkwoMTApIF4gKFNVQlIoMTApICYgflNVQlIoOCkpOworCWR3ID0gdGwgJiBTVUJMKDgpLCAgLyogRkwoa2wxKSAqLworCQl0ciA9IFNVQlIoMTApIF4gQ0FNRUxMSUFfUkwxKGR3KTsKKwlDQU1FTExJQV9TVUJLRVlfTCg3KSA9IFNVQkwoNikgXiB0bDsgLyogcm91bmQgNiAqLworCUNBTUVMTElBX1NVQktFWV9SKDcpID0gU1VCUig2KSBeIHRyOworCUNBTUVMTElBX1NVQktFWV9MKDgpID0gU1VCTCg4KTsgICAgICAgLyogRkwoa2wxKSAqLworCUNBTUVMTElBX1NVQktFWV9SKDgpID0gU1VCUig4KTsKKwlDQU1FTExJQV9TVUJLRVlfTCg5KSA9IFNVQkwoOSk7ICAgICAgIC8qIEZMaW52KGtsMikgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig5KSA9IFNVQlIoOSk7CisJdGwgPSBTVUJMKDcpIF4gKFNVQlIoNykgJiB+U1VCUig5KSk7CisJZHcgPSB0bCAmIFNVQkwoOSksICAvKiBGTGludihrbDIpICovCisJCXRyID0gU1VCUig3KSBeIENBTUVMTElBX1JMMShkdyk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTApID0gdGwgXiBTVUJMKDExKTsgLyogcm91bmQgNyAqLworCUNBTUVMTElBX1NVQktFWV9SKDEwKSA9IHRyIF4gU1VCUigxMSk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTEpID0gU1VCTCgxMCkgXiBTVUJMKDEyKTsgLyogcm91bmQgOCAqLworCUNBTUVMTElBX1NVQktFWV9SKDExKSA9IFNVQlIoMTApIF4gU1VCUigxMik7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTIpID0gU1VCTCgxMSkgXiBTVUJMKDEzKTsgLyogcm91bmQgOSAqLworCUNBTUVMTElBX1NVQktFWV9SKDEyKSA9IFNVQlIoMTEpIF4gU1VCUigxMyk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTMpID0gU1VCTCgxMikgXiBTVUJMKDE0KTsgLyogcm91bmQgMTAgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxMykgPSBTVUJSKDEyKSBeIFNVQlIoMTQpOworCUNBTUVMTElBX1NVQktFWV9MKDE0KSA9IFNVQkwoMTMpIF4gU1VCTCgxNSk7IC8qIHJvdW5kIDExICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTQpID0gU1VCUigxMykgXiBTVUJSKDE1KTsKKwl0bCA9IFNVQkwoMTgpIF4gKFNVQlIoMTgpICYgflNVQlIoMTYpKTsKKwlkdyA9IHRsICYgU1VCTCgxNiksIC8qIEZMKGtsMykgKi8KKwkJdHIgPSBTVUJSKDE4KSBeIENBTUVMTElBX1JMMShkdyk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTUpID0gU1VCTCgxNCkgXiB0bDsgLyogcm91bmQgMTIgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxNSkgPSBTVUJSKDE0KSBeIHRyOworCUNBTUVMTElBX1NVQktFWV9MKDE2KSA9IFNVQkwoMTYpOyAgICAgLyogRkwoa2wzKSAqLworCUNBTUVMTElBX1NVQktFWV9SKDE2KSA9IFNVQlIoMTYpOworCUNBTUVMTElBX1NVQktFWV9MKDE3KSA9IFNVQkwoMTcpOyAgICAgLyogRkxpbnYoa2w0KSAqLworCUNBTUVMTElBX1NVQktFWV9SKDE3KSA9IFNVQlIoMTcpOworCXRsID0gU1VCTCgxNSkgXiAoU1VCUigxNSkgJiB+U1VCUigxNykpOworCWR3ID0gdGwgJiBTVUJMKDE3KSwgLyogRkxpbnYoa2w0KSAqLworCQl0ciA9IFNVQlIoMTUpIF4gQ0FNRUxMSUFfUkwxKGR3KTsKKwlDQU1FTExJQV9TVUJLRVlfTCgxOCkgPSB0bCBeIFNVQkwoMTkpOyAvKiByb3VuZCAxMyAqLworCUNBTUVMTElBX1NVQktFWV9SKDE4KSA9IHRyIF4gU1VCUigxOSk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTkpID0gU1VCTCgxOCkgXiBTVUJMKDIwKTsgLyogcm91bmQgMTQgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxOSkgPSBTVUJSKDE4KSBeIFNVQlIoMjApOworCUNBTUVMTElBX1NVQktFWV9MKDIwKSA9IFNVQkwoMTkpIF4gU1VCTCgyMSk7IC8qIHJvdW5kIDE1ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjApID0gU1VCUigxOSkgXiBTVUJSKDIxKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgyMSkgPSBTVUJMKDIwKSBeIFNVQkwoMjIpOyAvKiByb3VuZCAxNiAqLworCUNBTUVMTElBX1NVQktFWV9SKDIxKSA9IFNVQlIoMjApIF4gU1VCUigyMik7CisJQ0FNRUxMSUFfU1VCS0VZX0woMjIpID0gU1VCTCgyMSkgXiBTVUJMKDIzKTsgLyogcm91bmQgMTcgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyMikgPSBTVUJSKDIxKSBeIFNVQlIoMjMpOworCXRsID0gU1VCTCgyNikgXiAoU1VCUigyNikKKwkJCSAmIH5TVUJSKDI0KSk7CisJZHcgPSB0bCAmIFNVQkwoMjQpLCAvKiBGTChrbDUpICovCisJCXRyID0gU1VCUigyNikgXiBDQU1FTExJQV9STDEoZHcpOworCUNBTUVMTElBX1NVQktFWV9MKDIzKSA9IFNVQkwoMjIpIF4gdGw7IC8qIHJvdW5kIDE4ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjMpID0gU1VCUigyMikgXiB0cjsKKwlDQU1FTExJQV9TVUJLRVlfTCgyNCkgPSBTVUJMKDI0KTsgICAgIC8qIEZMKGtsNSkgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyNCkgPSBTVUJSKDI0KTsKKwlDQU1FTExJQV9TVUJLRVlfTCgyNSkgPSBTVUJMKDI1KTsgICAgIC8qIEZMaW52KGtsNikgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyNSkgPSBTVUJSKDI1KTsKKwl0bCA9IFNVQkwoMjMpIF4gKFNVQlIoMjMpICYKKwkJCSB+U1VCUigyNSkpOworCWR3ID0gdGwgJiBTVUJMKDI1KSwgLyogRkxpbnYoa2w2KSAqLworCQl0ciA9IFNVQlIoMjMpIF4gQ0FNRUxMSUFfUkwxKGR3KTsKKwlDQU1FTExJQV9TVUJLRVlfTCgyNikgPSB0bCBeIFNVQkwoMjcpOyAvKiByb3VuZCAxOSAqLworCUNBTUVMTElBX1NVQktFWV9SKDI2KSA9IHRyIF4gU1VCUigyNyk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMjcpID0gU1VCTCgyNikgXiBTVUJMKDI4KTsgLyogcm91bmQgMjAgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyNykgPSBTVUJSKDI2KSBeIFNVQlIoMjgpOworCUNBTUVMTElBX1NVQktFWV9MKDI4KSA9IFNVQkwoMjcpIF4gU1VCTCgyOSk7IC8qIHJvdW5kIDIxICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjgpID0gU1VCUigyNykgXiBTVUJSKDI5KTsKKwlDQU1FTExJQV9TVUJLRVlfTCgyOSkgPSBTVUJMKDI4KSBeIFNVQkwoMzApOyAvKiByb3VuZCAyMiAqLworCUNBTUVMTElBX1NVQktFWV9SKDI5KSA9IFNVQlIoMjgpIF4gU1VCUigzMCk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMzApID0gU1VCTCgyOSkgXiBTVUJMKDMxKTsgLyogcm91bmQgMjMgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigzMCkgPSBTVUJSKDI5KSBeIFNVQlIoMzEpOworCUNBTUVMTElBX1NVQktFWV9MKDMxKSA9IFNVQkwoMzApOyAgICAgLyogcm91bmQgMjQgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigzMSkgPSBTVUJSKDMwKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgzMikgPSBTVUJMKDMyKSBeIFNVQkwoMzEpOyAvKiBrdzMgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigzMikgPSBTVUJSKDMyKSBeIFNVQlIoMzEpOworCisJLyogYXBwbHkgdGhlIGludmVyc2Ugb2YgdGhlIGxhc3QgaGFsZiBvZiBQLWZ1bmN0aW9uICovCisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgyKSBeIENBTUVMTElBX1NVQktFWV9SKDIpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMSAqLworCUNBTUVMTElBX1NVQktFWV9SKDIpID0gQ0FNRUxMSUFfU1VCS0VZX0woMikgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMikgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDMpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMyksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAyICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMykgPSBDQU1FTExJQV9TVUJLRVlfTCgzKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgzKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woNCkgXiBDQU1FTExJQV9TVUJLRVlfUig0KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDMgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig0KSA9IENBTUVMTElBX1NVQktFWV9MKDQpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDQpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCg1KSBeIENBTUVMTElBX1NVQktFWV9SKDUpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgNCAqLworCUNBTUVMTElBX1NVQktFWV9SKDUpID0gQ0FNRUxMSUFfU1VCS0VZX0woNSkgXiBkdywKKwlDQU1FTExJQV9TVUJLRVlfTCg1KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woNikgXiBDQU1FTExJQV9TVUJLRVlfUig2KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDUgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig2KSA9IENBTUVMTElBX1NVQktFWV9MKDYpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDYpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCg3KSBeIENBTUVMTElBX1NVQktFWV9SKDcpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgNiAqLworCUNBTUVMTElBX1NVQktFWV9SKDcpID0gQ0FNRUxMSUFfU1VCS0VZX0woNykgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woNykgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDEwKSBeIENBTUVMTElBX1NVQktFWV9SKDEwKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDcgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxMCkgPSBDQU1FTExJQV9TVUJLRVlfTCgxMCkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMTApID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgxMSkgXiBDQU1FTExJQV9TVUJLRVlfUigxMSksCisJICAgIGR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCA4ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTEpID0gQ0FNRUxMSUFfU1VCS0VZX0woMTEpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDExKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMTIpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMTIpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgOSAqLworCUNBTUVMTElBX1NVQktFWV9SKDEyKSA9IENBTUVMTElBX1NVQktFWV9MKDEyKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgxMikgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDEzKSBeIENBTUVMTElBX1NVQktFWV9SKDEzKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDEwICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTMpID0gQ0FNRUxMSUFfU1VCS0VZX0woMTMpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDEzKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMTQpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMTQpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMTEgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxNCkgPSBDQU1FTExJQV9TVUJLRVlfTCgxNCkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMTQpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgxNSkgXiBDQU1FTExJQV9TVUJLRVlfUigxNSksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxMiAqLworCUNBTUVMTElBX1NVQktFWV9SKDE1KSA9IENBTUVMTElBX1NVQktFWV9MKDE1KSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgxNSkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDE4KSBeIENBTUVMTElBX1NVQktFWV9SKDE4KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDEzICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTgpID0gQ0FNRUxMSUFfU1VCS0VZX0woMTgpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDE4KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMTkpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMTkpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMTQgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxOSkgPSBDQU1FTExJQV9TVUJLRVlfTCgxOSkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMTkpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgyMCkgXiBDQU1FTExJQV9TVUJLRVlfUigyMCksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxNSAqLworCUNBTUVMTElBX1NVQktFWV9SKDIwKSA9IENBTUVMTElBX1NVQktFWV9MKDIwKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgyMCkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDIxKSBeIENBTUVMTElBX1NVQktFWV9SKDIxKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDE2ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjEpID0gQ0FNRUxMSUFfU1VCS0VZX0woMjEpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDIxKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMjIpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMjIpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMTcgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyMikgPSBDQU1FTExJQV9TVUJLRVlfTCgyMikgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMjIpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgyMykgXiBDQU1FTExJQV9TVUJLRVlfUigyMyksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxOCAqLworCUNBTUVMTElBX1NVQktFWV9SKDIzKSA9IENBTUVMTElBX1NVQktFWV9MKDIzKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgyMykgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDI2KSBeIENBTUVMTElBX1NVQktFWV9SKDI2KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDE5ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjYpID0gQ0FNRUxMSUFfU1VCS0VZX0woMjYpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDI2KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMjcpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMjcpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMjAgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyNykgPSBDQU1FTExJQV9TVUJLRVlfTCgyNykgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMjcpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgyOCkgXiBDQU1FTExJQV9TVUJLRVlfUigyOCksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAyMSAqLworCUNBTUVMTElBX1NVQktFWV9SKDI4KSA9IENBTUVMTElBX1NVQktFWV9MKDI4KSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgyOCkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDI5KSBeIENBTUVMTElBX1NVQktFWV9SKDI5KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDIyICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjkpID0gQ0FNRUxMSUFfU1VCS0VZX0woMjkpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDI5KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMzApIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMzApLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMjMgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigzMCkgPSBDQU1FTExJQV9TVUJLRVlfTCgzMCkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMzApID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgzMSkgXiBDQU1FTExJQV9TVUJLRVlfUigzMSksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAyNCAqLworCUNBTUVMTElBX1NVQktFWV9SKDMxKSA9IENBTUVMTElBX1NVQktFWV9MKDMxKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgzMSkgPSBkdzsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2FtZWxsaWFfc2V0dXAxOTIoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1MzIgKnN1YmtleSkKK3sKKwl1bnNpZ25lZCBjaGFyIGtrWzMyXTsKKwl1MzIga3JsbCwga3Jsciwga3JybCxrcnJyOworCisJbWVtY3B5KGtrLCBrZXksIDI0KTsKKwltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikma3JsbCwga2V5KzE2LDQpOworCW1lbWNweSgodW5zaWduZWQgY2hhciAqKSZrcmxyLCBrZXkrMjAsNCk7CisJa3JybCA9IH5rcmxsOworCWtycnIgPSB+a3JscjsKKwltZW1jcHkoa2srMjQsICh1bnNpZ25lZCBjaGFyICopJmtycmwsIDQpOworCW1lbWNweShraysyOCwgKHVuc2lnbmVkIGNoYXIgKikma3JyciwgNCk7CisJY2FtZWxsaWFfc2V0dXAyNTYoa2ssIHN1YmtleSk7CisJcmV0dXJuOworfQorCisKKy8qKgorICogU3R1ZmYgcmVsYXRlZCB0byBjYW1lbGxpYSBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKyAqLworc3RhdGljIHZvaWQgY2FtZWxsaWFfZW5jcnlwdDEyOChjb25zdCB1MzIgKnN1YmtleSwgX19iZTMyICppb190ZXh0KQoreworCXUzMiBpbCxpcix0MCx0MTsgICAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFsaWFibGVzICovCisKKwl1MzIgaW9bNF07CisKKwlpb1swXSA9IGJlMzJfdG9fY3B1KGlvX3RleHRbMF0pOworCWlvWzFdID0gYmUzMl90b19jcHUoaW9fdGV4dFsxXSk7CisJaW9bMl0gPSBiZTMyX3RvX2NwdShpb190ZXh0WzJdKTsKKwlpb1szXSA9IGJlMzJfdG9fY3B1KGlvX3RleHRbM10pOworCisJLyogcHJlIHdoaXRlbmluZyBidXQgYWJzb3JiIGt3MiovCisJaW9bMF0gXj0gQ0FNRUxMSUFfU1VCS0VZX0woMCk7CisJaW9bMV0gXj0gQ0FNRUxMSUFfU1VCS0VZX1IoMCk7CisJLyogbWFpbiBpdGVyYXRpb24gKi8KKworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMiksQ0FNRUxMSUFfU1VCS0VZX1IoMiksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMyksQ0FNRUxMSUFfU1VCS0VZX1IoMyksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNCksQ0FNRUxMSUFfU1VCS0VZX1IoNCksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNSksQ0FNRUxMSUFfU1VCS0VZX1IoNSksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNiksQ0FNRUxMSUFfU1VCS0VZX1IoNiksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNyksQ0FNRUxMSUFfU1VCS0VZX1IoNyksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisJQ0FNRUxMSUFfRkxTKGlvWzBdLGlvWzFdLGlvWzJdLGlvWzNdLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDgpLENBTUVMTElBX1NVQktFWV9SKDgpLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDkpLENBTUVMTElBX1NVQktFWV9SKDkpLAorCQkgICAgIHQwLHQxLGlsLGlyKTsKKworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTApLENBTUVMTElBX1NVQktFWV9SKDEwKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxMSksQ0FNRUxMSUFfU1VCS0VZX1IoMTEpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDEyKSxDQU1FTExJQV9TVUJLRVlfUigxMiksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTMpLENBTUVMTElBX1NVQktFWV9SKDEzKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxNCksQ0FNRUxMSUFfU1VCS0VZX1IoMTQpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDE1KSxDQU1FTExJQV9TVUJLRVlfUigxNSksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisJQ0FNRUxMSUFfRkxTKGlvWzBdLGlvWzFdLGlvWzJdLGlvWzNdLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDE2KSxDQU1FTExJQV9TVUJLRVlfUigxNiksCisJCSAgICAgQ0FNRUxMSUFfU1VCS0VZX0woMTcpLENBTUVMTElBX1NVQktFWV9SKDE3KSwKKwkJICAgICB0MCx0MSxpbCxpcik7CisKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDE4KSxDQU1FTExJQV9TVUJLRVlfUigxOCksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTkpLENBTUVMTElBX1NVQktFWV9SKDE5KSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyMCksQ0FNRUxMSUFfU1VCS0VZX1IoMjApLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDIxKSxDQU1FTExJQV9TVUJLRVlfUigyMSksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjIpLENBTUVMTElBX1NVQktFWV9SKDIyKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyMyksQ0FNRUxMSUFfU1VCS0VZX1IoMjMpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworCS8qIHBvc3Qgd2hpdGVuaW5nIGJ1dCBrdzQgKi8KKwlpb1syXSBePSBDQU1FTExJQV9TVUJLRVlfTCgyNCk7CisJaW9bM10gXj0gQ0FNRUxMSUFfU1VCS0VZX1IoMjQpOworCisJdDAgPSBpb1swXTsKKwl0MSA9IGlvWzFdOworCWlvWzBdID0gaW9bMl07CisJaW9bMV0gPSBpb1szXTsKKwlpb1syXSA9IHQwOworCWlvWzNdID0gdDE7CisKKwlpb190ZXh0WzBdID0gY3B1X3RvX2JlMzIoaW9bMF0pOworCWlvX3RleHRbMV0gPSBjcHVfdG9fYmUzMihpb1sxXSk7CisJaW9fdGV4dFsyXSA9IGNwdV90b19iZTMyKGlvWzJdKTsKKwlpb190ZXh0WzNdID0gY3B1X3RvX2JlMzIoaW9bM10pOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjYW1lbGxpYV9kZWNyeXB0MTI4KGNvbnN0IHUzMiAqc3Via2V5LCBfX2JlMzIgKmlvX3RleHQpCit7CisJdTMyIGlsLGlyLHQwLHQxOyAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YWxpYWJsZXMgKi8KKworCXUzMiBpb1s0XTsKKworCWlvWzBdID0gYmUzMl90b19jcHUoaW9fdGV4dFswXSk7CisJaW9bMV0gPSBiZTMyX3RvX2NwdShpb190ZXh0WzFdKTsKKwlpb1syXSA9IGJlMzJfdG9fY3B1KGlvX3RleHRbMl0pOworCWlvWzNdID0gYmUzMl90b19jcHUoaW9fdGV4dFszXSk7CisKKwkvKiBwcmUgd2hpdGVuaW5nIGJ1dCBhYnNvcmIga3cyKi8KKwlpb1swXSBePSBDQU1FTExJQV9TVUJLRVlfTCgyNCk7CisJaW9bMV0gXj0gQ0FNRUxMSUFfU1VCS0VZX1IoMjQpOworCisJLyogbWFpbiBpdGVyYXRpb24gKi8KKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDIzKSxDQU1FTExJQV9TVUJLRVlfUigyMyksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjIpLENBTUVMTElBX1NVQktFWV9SKDIyKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyMSksQ0FNRUxMSUFfU1VCS0VZX1IoMjEpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDIwKSxDQU1FTExJQV9TVUJLRVlfUigyMCksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTkpLENBTUVMTElBX1NVQktFWV9SKDE5KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxOCksQ0FNRUxMSUFfU1VCS0VZX1IoMTgpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworCUNBTUVMTElBX0ZMUyhpb1swXSxpb1sxXSxpb1syXSxpb1szXSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCgxNyksQ0FNRUxMSUFfU1VCS0VZX1IoMTcpLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDE2KSxDQU1FTExJQV9TVUJLRVlfUigxNiksCisJCSAgICAgdDAsdDEsaWwsaXIpOworCisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxNSksQ0FNRUxMSUFfU1VCS0VZX1IoMTUpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDE0KSxDQU1FTExJQV9TVUJLRVlfUigxNCksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTMpLENBTUVMTElBX1NVQktFWV9SKDEzKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxMiksQ0FNRUxMSUFfU1VCS0VZX1IoMTIpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDExKSxDQU1FTExJQV9TVUJLRVlfUigxMSksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTApLENBTUVMTElBX1NVQktFWV9SKDEwKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKwlDQU1FTExJQV9GTFMoaW9bMF0saW9bMV0saW9bMl0saW9bM10sCisJCSAgICAgQ0FNRUxMSUFfU1VCS0VZX0woOSksQ0FNRUxMSUFfU1VCS0VZX1IoOSksCisJCSAgICAgQ0FNRUxMSUFfU1VCS0VZX0woOCksQ0FNRUxMSUFfU1VCS0VZX1IoOCksCisJCSAgICAgdDAsdDEsaWwsaXIpOworCisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCg3KSxDQU1FTExJQV9TVUJLRVlfUig3KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCg2KSxDQU1FTExJQV9TVUJLRVlfUig2KSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCg1KSxDQU1FTExJQV9TVUJLRVlfUig1KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCg0KSxDQU1FTExJQV9TVUJLRVlfUig0KSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgzKSxDQU1FTExJQV9TVUJLRVlfUigzKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyKSxDQU1FTExJQV9TVUJLRVlfUigyKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKwkvKiBwb3N0IHdoaXRlbmluZyBidXQga3c0ICovCisJaW9bMl0gXj0gQ0FNRUxMSUFfU1VCS0VZX0woMCk7CisJaW9bM10gXj0gQ0FNRUxMSUFfU1VCS0VZX1IoMCk7CisKKwl0MCA9IGlvWzBdOworCXQxID0gaW9bMV07CisJaW9bMF0gPSBpb1syXTsKKwlpb1sxXSA9IGlvWzNdOworCWlvWzJdID0gdDA7CisJaW9bM10gPSB0MTsKKworCWlvX3RleHRbMF0gPSBjcHVfdG9fYmUzMihpb1swXSk7CisJaW9fdGV4dFsxXSA9IGNwdV90b19iZTMyKGlvWzFdKTsKKwlpb190ZXh0WzJdID0gY3B1X3RvX2JlMzIoaW9bMl0pOworCWlvX3RleHRbM10gPSBjcHVfdG9fYmUzMihpb1szXSk7CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBzdHVmZiBmb3IgMTkyIGFuZCAyNTZiaXQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGNhbWVsbGlhX2VuY3J5cHQyNTYoY29uc3QgdTMyICpzdWJrZXksIF9fYmUzMiAqaW9fdGV4dCkKK3sKKwl1MzIgaWwsaXIsdDAsdDE7ICAgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFsaWFibGVzICovCisKKwl1MzIgaW9bNF07CisKKwlpb1swXSA9IGJlMzJfdG9fY3B1KGlvX3RleHRbMF0pOworCWlvWzFdID0gYmUzMl90b19jcHUoaW9fdGV4dFsxXSk7CisJaW9bMl0gPSBiZTMyX3RvX2NwdShpb190ZXh0WzJdKTsKKwlpb1szXSA9IGJlMzJfdG9fY3B1KGlvX3RleHRbM10pOworCisJLyogcHJlIHdoaXRlbmluZyBidXQgYWJzb3JiIGt3MiovCisJaW9bMF0gXj0gQ0FNRUxMSUFfU1VCS0VZX0woMCk7CisJaW9bMV0gXj0gQ0FNRUxMSUFfU1VCS0VZX1IoMCk7CisKKwkvKiBtYWluIGl0ZXJhdGlvbiAqLworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMiksQ0FNRUxMSUFfU1VCS0VZX1IoMiksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMyksQ0FNRUxMSUFfU1VCS0VZX1IoMyksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNCksQ0FNRUxMSUFfU1VCS0VZX1IoNCksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNSksQ0FNRUxMSUFfU1VCS0VZX1IoNSksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNiksQ0FNRUxMSUFfU1VCS0VZX1IoNiksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNyksQ0FNRUxMSUFfU1VCS0VZX1IoNyksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisJQ0FNRUxMSUFfRkxTKGlvWzBdLGlvWzFdLGlvWzJdLGlvWzNdLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDgpLENBTUVMTElBX1NVQktFWV9SKDgpLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDkpLENBTUVMTElBX1NVQktFWV9SKDkpLAorCQkgICAgIHQwLHQxLGlsLGlyKTsKKworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTApLENBTUVMTElBX1NVQktFWV9SKDEwKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxMSksQ0FNRUxMSUFfU1VCS0VZX1IoMTEpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDEyKSxDQU1FTExJQV9TVUJLRVlfUigxMiksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTMpLENBTUVMTElBX1NVQktFWV9SKDEzKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxNCksQ0FNRUxMSUFfU1VCS0VZX1IoMTQpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDE1KSxDQU1FTExJQV9TVUJLRVlfUigxNSksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisJQ0FNRUxMSUFfRkxTKGlvWzBdLGlvWzFdLGlvWzJdLGlvWzNdLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDE2KSxDQU1FTExJQV9TVUJLRVlfUigxNiksCisJCSAgICAgQ0FNRUxMSUFfU1VCS0VZX0woMTcpLENBTUVMTElBX1NVQktFWV9SKDE3KSwKKwkJICAgICB0MCx0MSxpbCxpcik7CisKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDE4KSxDQU1FTExJQV9TVUJLRVlfUigxOCksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTkpLENBTUVMTElBX1NVQktFWV9SKDE5KSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyMCksQ0FNRUxMSUFfU1VCS0VZX1IoMjApLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDIxKSxDQU1FTExJQV9TVUJLRVlfUigyMSksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjIpLENBTUVMTElBX1NVQktFWV9SKDIyKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyMyksQ0FNRUxMSUFfU1VCS0VZX1IoMjMpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworCUNBTUVMTElBX0ZMUyhpb1swXSxpb1sxXSxpb1syXSxpb1szXSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCgyNCksQ0FNRUxMSUFfU1VCS0VZX1IoMjQpLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDI1KSxDQU1FTExJQV9TVUJLRVlfUigyNSksCisJCSAgICAgdDAsdDEsaWwsaXIpOworCisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyNiksQ0FNRUxMSUFfU1VCS0VZX1IoMjYpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDI3KSxDQU1FTExJQV9TVUJLRVlfUigyNyksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjgpLENBTUVMTElBX1NVQktFWV9SKDI4KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyOSksQ0FNRUxMSUFfU1VCS0VZX1IoMjkpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDMwKSxDQU1FTExJQV9TVUJLRVlfUigzMCksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMzEpLENBTUVMTElBX1NVQktFWV9SKDMxKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKwkvKiBwb3N0IHdoaXRlbmluZyBidXQga3c0ICovCisJaW9bMl0gXj0gQ0FNRUxMSUFfU1VCS0VZX0woMzIpOworCWlvWzNdIF49IENBTUVMTElBX1NVQktFWV9SKDMyKTsKKworCXQwID0gaW9bMF07CisJdDEgPSBpb1sxXTsKKwlpb1swXSA9IGlvWzJdOworCWlvWzFdID0gaW9bM107CisJaW9bMl0gPSB0MDsKKwlpb1szXSA9IHQxOworCisJaW9fdGV4dFswXSA9IGNwdV90b19iZTMyKGlvWzBdKTsKKwlpb190ZXh0WzFdID0gY3B1X3RvX2JlMzIoaW9bMV0pOworCWlvX3RleHRbMl0gPSBjcHVfdG9fYmUzMihpb1syXSk7CisJaW9fdGV4dFszXSA9IGNwdV90b19iZTMyKGlvWzNdKTsKKworCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBjYW1lbGxpYV9kZWNyeXB0MjU2KGNvbnN0IHUzMiAqc3Via2V5LCBfX2JlMzIgKmlvX3RleHQpCit7CisJdTMyIGlsLGlyLHQwLHQxOyAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhbGlhYmxlcyAqLworCisJdTMyIGlvWzRdOworCisJaW9bMF0gPSBiZTMyX3RvX2NwdShpb190ZXh0WzBdKTsKKwlpb1sxXSA9IGJlMzJfdG9fY3B1KGlvX3RleHRbMV0pOworCWlvWzJdID0gYmUzMl90b19jcHUoaW9fdGV4dFsyXSk7CisJaW9bM10gPSBiZTMyX3RvX2NwdShpb190ZXh0WzNdKTsKKworCS8qIHByZSB3aGl0ZW5pbmcgYnV0IGFic29yYiBrdzIqLworCWlvWzBdIF49IENBTUVMTElBX1NVQktFWV9MKDMyKTsKKwlpb1sxXSBePSBDQU1FTExJQV9TVUJLRVlfUigzMik7CisKKwkvKiBtYWluIGl0ZXJhdGlvbiAqLworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMzEpLENBTUVMTElBX1NVQktFWV9SKDMxKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgzMCksQ0FNRUxMSUFfU1VCS0VZX1IoMzApLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDI5KSxDQU1FTExJQV9TVUJLRVlfUigyOSksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjgpLENBTUVMTElBX1NVQktFWV9SKDI4KSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyNyksQ0FNRUxMSUFfU1VCS0VZX1IoMjcpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDI2KSxDQU1FTExJQV9TVUJLRVlfUigyNiksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisJQ0FNRUxMSUFfRkxTKGlvWzBdLGlvWzFdLGlvWzJdLGlvWzNdLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDI1KSxDQU1FTExJQV9TVUJLRVlfUigyNSksCisJCSAgICAgQ0FNRUxMSUFfU1VCS0VZX0woMjQpLENBTUVMTElBX1NVQktFWV9SKDI0KSwKKwkJICAgICB0MCx0MSxpbCxpcik7CisKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDIzKSxDQU1FTExJQV9TVUJLRVlfUigyMyksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjIpLENBTUVMTElBX1NVQktFWV9SKDIyKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyMSksQ0FNRUxMSUFfU1VCS0VZX1IoMjEpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDIwKSxDQU1FTExJQV9TVUJLRVlfUigyMCksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTkpLENBTUVMTElBX1NVQktFWV9SKDE5KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxOCksQ0FNRUxMSUFfU1VCS0VZX1IoMTgpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworCUNBTUVMTElBX0ZMUyhpb1swXSxpb1sxXSxpb1syXSxpb1szXSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCgxNyksQ0FNRUxMSUFfU1VCS0VZX1IoMTcpLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDE2KSxDQU1FTExJQV9TVUJLRVlfUigxNiksCisJCSAgICAgdDAsdDEsaWwsaXIpOworCisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxNSksQ0FNRUxMSUFfU1VCS0VZX1IoMTUpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDE0KSxDQU1FTExJQV9TVUJLRVlfUigxNCksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTMpLENBTUVMTElBX1NVQktFWV9SKDEzKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxMiksQ0FNRUxMSUFfU1VCS0VZX1IoMTIpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDExKSxDQU1FTExJQV9TVUJLRVlfUigxMSksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTApLENBTUVMTElBX1NVQktFWV9SKDEwKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKwlDQU1FTExJQV9GTFMoaW9bMF0saW9bMV0saW9bMl0saW9bM10sCisJCSAgICAgQ0FNRUxMSUFfU1VCS0VZX0woOSksQ0FNRUxMSUFfU1VCS0VZX1IoOSksCisJCSAgICAgQ0FNRUxMSUFfU1VCS0VZX0woOCksQ0FNRUxMSUFfU1VCS0VZX1IoOCksCisJCSAgICAgdDAsdDEsaWwsaXIpOworCisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCg3KSxDQU1FTExJQV9TVUJLRVlfUig3KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCg2KSxDQU1FTExJQV9TVUJLRVlfUig2KSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCg1KSxDQU1FTExJQV9TVUJLRVlfUig1KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCg0KSxDQU1FTExJQV9TVUJLRVlfUig0KSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgzKSxDQU1FTExJQV9TVUJLRVlfUigzKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyKSxDQU1FTExJQV9TVUJLRVlfUigyKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKwkvKiBwb3N0IHdoaXRlbmluZyBidXQga3c0ICovCisJaW9bMl0gXj0gQ0FNRUxMSUFfU1VCS0VZX0woMCk7CisJaW9bM10gXj0gQ0FNRUxMSUFfU1VCS0VZX1IoMCk7CisKKwl0MCA9IGlvWzBdOworCXQxID0gaW9bMV07CisJaW9bMF0gPSBpb1syXTsKKwlpb1sxXSA9IGlvWzNdOworCWlvWzJdID0gdDA7CisJaW9bM10gPSB0MTsKKworCWlvX3RleHRbMF0gPSBjcHVfdG9fYmUzMihpb1swXSk7CisJaW9fdGV4dFsxXSA9IGNwdV90b19iZTMyKGlvWzFdKTsKKwlpb190ZXh0WzJdID0gY3B1X3RvX2JlMzIoaW9bMl0pOworCWlvX3RleHRbM10gPSBjcHVfdG9fYmUzMihpb1szXSk7CisKKwlyZXR1cm47Cit9CisKKworc3RhdGljIGludAorY2FtZWxsaWFfc2V0X2tleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqaW5fa2V5LAorCQkgdW5zaWduZWQgaW50IGtleV9sZW4pCit7CisJc3RydWN0IGNhbWVsbGlhX2N0eCAqY2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqa2V5ID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilpbl9rZXk7CisJdTMyICpmbGFncyA9ICZ0Zm0tPmNydF9mbGFnczsKKworCWlmIChrZXlfbGVuICE9IDE2ICYmIGtleV9sZW4gIT0gMjQgJiYga2V5X2xlbiAhPSAzMikgeworCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNjdHgtPmtleV9sZW5ndGggPSBrZXlfbGVuOworCisJc3dpdGNoKGtleV9sZW4pIHsKKwljYXNlIDE2OgorCQljYW1lbGxpYV9zZXR1cDEyOChrZXksIGNjdHgtPmtleV90YWJsZSk7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCWNhbWVsbGlhX3NldHVwMTkyKGtleSwgY2N0eC0+a2V5X3RhYmxlKTsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJY2FtZWxsaWFfc2V0dXAyNTYoa2V5LCBjY3R4LT5rZXlfdGFibGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBjYW1lbGxpYV9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKK3sKKwljb25zdCBzdHJ1Y3QgY2FtZWxsaWFfY3R4ICpjY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwljb25zdCBfX2JlMzIgKnNyYyA9IChjb25zdCBfX2JlMzIgKilpbjsKKwlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXQ7CisKKwlfX2JlMzIgdG1wWzRdOworCisJbWVtY3B5KHRtcCwgc3JjLCBDQU1FTExJQV9CTE9DS19TSVpFKTsKKworCXN3aXRjaCAoY2N0eC0+a2V5X2xlbmd0aCkgeworCWNhc2UgMTY6CisJCWNhbWVsbGlhX2VuY3J5cHQxMjgoY2N0eC0+a2V5X3RhYmxlLCB0bXApOworCQlicmVhazsKKwljYXNlIDI0OgorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDMyOgorCQljYW1lbGxpYV9lbmNyeXB0MjU2KGNjdHgtPmtleV90YWJsZSwgdG1wKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbWVtY3B5KGRzdCwgdG1wLCBDQU1FTExJQV9CTE9DS19TSVpFKTsKK30KKworCitzdGF0aWMgdm9pZCBjYW1lbGxpYV9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKK3sKKwljb25zdCBzdHJ1Y3QgY2FtZWxsaWFfY3R4ICpjY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwljb25zdCBfX2JlMzIgKnNyYyA9IChjb25zdCBfX2JlMzIgKilpbjsKKwlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXQ7CisKKwlfX2JlMzIgdG1wWzRdOworCisJbWVtY3B5KHRtcCwgc3JjLCBDQU1FTExJQV9CTE9DS19TSVpFKTsKKworCXN3aXRjaCAoY2N0eC0+a2V5X2xlbmd0aCkgeworCWNhc2UgMTY6CisJCWNhbWVsbGlhX2RlY3J5cHQxMjgoY2N0eC0+a2V5X3RhYmxlLCB0bXApOworCQlicmVhazsKKwljYXNlIDI0OgorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDMyOgorCQljYW1lbGxpYV9kZWNyeXB0MjU2KGNjdHgtPmtleV90YWJsZSwgdG1wKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbWVtY3B5KGRzdCwgdG1wLCBDQU1FTExJQV9CTE9DS19TSVpFKTsKK30KKworCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgY2FtZWxsaWFfYWxnID0geworCS5jcmFfbmFtZQkJPQkiY2FtZWxsaWEiLAorCS5jcmFfZHJpdmVyX25hbWUJPQkiY2FtZWxsaWEtZ2VuZXJpYyIsCisJLmNyYV9wcmlvcml0eQkJPQkxMDAsCisJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9CUNBTUVMTElBX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgY2FtZWxsaWFfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPQkzLAorCS5jcmFfbW9kdWxlCQk9CVRISVNfTU9EVUxFLAorCS5jcmFfbGlzdAkJPQlMSVNUX0hFQURfSU5JVChjYW1lbGxpYV9hbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJCT0JeworCQkuY2lwaGVyID0geworCQkJLmNpYV9taW5fa2V5c2l6ZQk9CUNBTUVMTElBX01JTl9LRVlfU0laRSwKKwkJCS5jaWFfbWF4X2tleXNpemUJPQlDQU1FTExJQV9NQVhfS0VZX1NJWkUsCisJCQkuY2lhX3NldGtleQkJPQljYW1lbGxpYV9zZXRfa2V5LAorCQkJLmNpYV9lbmNyeXB0CQk9CWNhbWVsbGlhX2VuY3J5cHQsCisJCQkuY2lhX2RlY3J5cHQJCT0JY2FtZWxsaWFfZGVjcnlwdAorCQl9CisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgY2FtZWxsaWFfaW5pdCh2b2lkKQoreworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZjYW1lbGxpYV9hbGcpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjYW1lbGxpYV9maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYW1lbGxpYV9hbGcpOworfQorCisKK21vZHVsZV9pbml0KGNhbWVsbGlhX2luaXQpOworbW9kdWxlX2V4aXQoY2FtZWxsaWFfZmluaSk7CisKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDYW1lbGxpYSBDaXBoZXIgQWxnb3JpdGhtIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9jcnlwdG8vY2JjLmMgYi9jcnlwdG8vY2JjLmMKaW5kZXggZjU1NDJiNC4uMTM2ZmVhNyAxMDA2NDQKLS0tIGEvY3J5cHRvL2NiYy5jCisrKyBiL2NyeXB0by9jYmMuYwpAQCAtMjQzLDYgKzI0Myw3IEBACiAJc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCA9ICh2b2lkICopdGZtLT5fX2NydF9hbGc7CiAJc3RydWN0IGNyeXB0b19zcGF3biAqc3Bhd24gPSBjcnlwdG9faW5zdGFuY2VfY3R4KGluc3QpOwogCXN0cnVjdCBjcnlwdG9fY2JjX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqY2lwaGVyOwogCiAJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSkgewogCWNhc2UgODoKQEAgLTI2MCwxMSArMjYxLDExIEBACiAJCQljdHgtPnhvciA9IHhvcl9xdWFkOwogCX0KIAotCXRmbSA9IGNyeXB0b19zcGF3bl90Zm0oc3Bhd24pOwotCWlmIChJU19FUlIodGZtKSkKLQkJcmV0dXJuIFBUUl9FUlIodGZtKTsKKwljaXBoZXIgPSBjcnlwdG9fc3Bhd25fY2lwaGVyKHNwYXduKTsKKwlpZiAoSVNfRVJSKGNpcGhlcikpCisJCXJldHVybiBQVFJfRVJSKGNpcGhlcik7CiAKLQljdHgtPmNoaWxkID0gY3J5cHRvX2NpcGhlcl9jYXN0KHRmbSk7CisJY3R4LT5jaGlsZCA9IGNpcGhlcjsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvY3J5cHRvL2NpcGhlci5jIGIvY3J5cHRvL2NpcGhlci5jCmluZGV4IDllMDM3MDEuLjMzM2FhYjIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9jaXBoZXIuYworKysgYi9jcnlwdG8vY2lwaGVyLmMKQEAgLTEyLDI3NCArMTIsMTMgQEAKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICoKICAqLwotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzY2F0dGVyd2Fsay5oIgotCi1zdHJ1Y3QgY2lwaGVyX2FsZ19jb21wYXQgewotCXVuc2lnbmVkIGludCBjaWFfbWluX2tleXNpemU7Ci0JdW5zaWduZWQgaW50IGNpYV9tYXhfa2V5c2l6ZTsKLQlpbnQgKCpjaWFfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAotCSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4pOwotCXZvaWQgKCpjaWFfZW5jcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Ci0Jdm9pZCAoKmNpYV9kZWNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKLQotCXVuc2lnbmVkIGludCAoKmNpYV9lbmNyeXB0X2VjYikoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAotCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAotCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKLQl1bnNpZ25lZCBpbnQgKCpjaWFfZGVjcnlwdF9lY2IpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKLQkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKLQkJCQkJdW5zaWduZWQgaW50IG5ieXRlcyk7Ci0JdW5zaWduZWQgaW50ICgqY2lhX2VuY3J5cHRfY2JjKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCi0JCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCi0JCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpOwotCXVuc2lnbmVkIGludCAoKmNpYV9kZWNyeXB0X2NiYykoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAotCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAotCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB4b3JfNjQodTggKmEsIGNvbnN0IHU4ICpiKQotewotCSgodTMyICopYSlbMF0gXj0gKCh1MzIgKiliKVswXTsKLQkoKHUzMiAqKWEpWzFdIF49ICgodTMyICopYilbMV07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB4b3JfMTI4KHU4ICphLCBjb25zdCB1OCAqYikKLXsKLQkoKHUzMiAqKWEpWzBdIF49ICgodTMyICopYilbMF07Ci0JKCh1MzIgKilhKVsxXSBePSAoKHUzMiAqKWIpWzFdOwotCSgodTMyICopYSlbMl0gXj0gKCh1MzIgKiliKVsyXTsKLQkoKHUzMiAqKWEpWzNdIF49ICgodTMyICopYilbM107Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3J5cHRfc2xvdyhjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCi0JCQkgICAgICAgc3RydWN0IHNjYXR0ZXJfd2FsayAqaW4sCi0JCQkgICAgICAgc3RydWN0IHNjYXR0ZXJfd2FsayAqb3V0LCB1bnNpZ25lZCBpbnQgYnNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBhbGlnbm1hc2sgPSBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2soZGVzYy0+dGZtKTsKLQl1OCBidWZmZXJbYnNpemUgKiAyICsgYWxpZ25tYXNrXTsKLQl1OCAqc3JjID0gKHU4ICopQUxJR04oKHVuc2lnbmVkIGxvbmcpYnVmZmVyLCBhbGlnbm1hc2sgKyAxKTsKLQl1OCAqZHN0ID0gc3JjICsgYnNpemU7Ci0KLQlzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKHNyYywgaW4sIGJzaXplLCAwKTsKLQlkZXNjLT5wcmZuKGRlc2MsIGRzdCwgc3JjLCBic2l6ZSk7Ci0Jc2NhdHRlcndhbGtfY29weWNodW5rcyhkc3QsIG91dCwgYnNpemUsIDEpOwotCi0JcmV0dXJuIGJzaXplOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdF9mYXN0KGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKLQkJCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcl93YWxrICppbiwKLQkJCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcl93YWxrICpvdXQsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKnRtcCkKLXsKLQl1OCAqc3JjLCAqZHN0OwotCXU4ICpyZWFsX3NyYywgKnJlYWxfZHN0OwotCi0JcmVhbF9zcmMgPSBzY2F0dGVyd2Fsa19tYXAoaW4sIDApOwotCXJlYWxfZHN0ID0gc2NhdHRlcndhbGtfbWFwKG91dCwgMSk7Ci0KLQlzcmMgPSByZWFsX3NyYzsKLQlkc3QgPSBzY2F0dGVyd2Fsa19zYW1lYnVmKGluLCBvdXQpID8gc3JjIDogcmVhbF9kc3Q7Ci0KLQlpZiAodG1wKSB7Ci0JCW1lbWNweSh0bXAsIHNyYywgbmJ5dGVzKTsKLQkJc3JjID0gdG1wOwotCQlkc3QgPSB0bXA7Ci0JfQotCi0JbmJ5dGVzID0gZGVzYy0+cHJmbihkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQotCWlmICh0bXApCi0JCW1lbWNweShyZWFsX2RzdCwgdG1wLCBuYnl0ZXMpOwotCi0Jc2NhdHRlcndhbGtfdW5tYXAocmVhbF9zcmMsIDApOwotCXNjYXR0ZXJ3YWxrX3VubWFwKHJlYWxfZHN0LCAxKTsKLQotCXNjYXR0ZXJ3YWxrX2FkdmFuY2UoaW4sIG5ieXRlcyk7Ci0Jc2NhdHRlcndhbGtfYWR2YW5jZShvdXQsIG5ieXRlcyk7Ci0KLQlyZXR1cm4gbmJ5dGVzOwotfQotCi0vKiAKLSAqIEdlbmVyaWMgZW5jcnlwdC9kZWNyeXB0IHdyYXBwZXIgZm9yIGNpcGhlcnMsIGhhbmRsZXMgb3BlcmF0aW9ucyBhY3Jvc3MKLSAqIG11bHRpcGxlIHBhZ2UgYm91bmRhcmllcyBieSB1c2luZyB0ZW1wb3JhcnkgYmxvY2tzLiAgSW4gdXNlciBjb250ZXh0LAotICogdGhlIGtlcm5lbCBpcyBnaXZlbiBhIGNoYW5jZSB0byBzY2hlZHVsZSB1cyBvbmNlIHBlciBwYWdlLgotICovCi1zdGF0aWMgaW50IGNyeXB0KGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKLQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCSB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXN0cnVjdCBzY2F0dGVyX3dhbGsgd2Fsa19pbiwgd2Fsa19vdXQ7Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGRlc2MtPnRmbTsKLQljb25zdCB1bnNpZ25lZCBpbnQgYnNpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKTsKLQl1bnNpZ25lZCBpbnQgYWxpZ25tYXNrID0gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKHRmbSk7Ci0JdW5zaWduZWQgbG9uZyBidWZmZXIgPSAwOwotCi0JaWYgKCFuYnl0ZXMpCi0JCXJldHVybiAwOwotCi0JaWYgKG5ieXRlcyAlIGJzaXplKSB7Ci0JCXRmbS0+Y3J0X2ZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9CTE9DS19MRU47Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNjYXR0ZXJ3YWxrX3N0YXJ0KCZ3YWxrX2luLCBzcmMpOwotCXNjYXR0ZXJ3YWxrX3N0YXJ0KCZ3YWxrX291dCwgZHN0KTsKLQotCWZvcig7OykgewotCQl1bnNpZ25lZCBpbnQgbiA9IG5ieXRlczsKLQkJdTggKnRtcCA9IE5VTEw7Ci0KLQkJaWYgKCFzY2F0dGVyd2Fsa19hbGlnbmVkKCZ3YWxrX2luLCBhbGlnbm1hc2spIHx8Ci0JCSAgICAhc2NhdHRlcndhbGtfYWxpZ25lZCgmd2Fsa19vdXQsIGFsaWdubWFzaykpIHsKLQkJCWlmICghYnVmZmVyKSB7Ci0JCQkJYnVmZmVyID0gX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMpOwotCQkJCWlmICghYnVmZmVyKQotCQkJCQluID0gMDsKLQkJCX0KLQkJCXRtcCA9ICh1OCAqKWJ1ZmZlcjsKLQkJfQotCi0JCW4gPSBzY2F0dGVyd2Fsa19jbGFtcCgmd2Fsa19pbiwgbik7Ci0JCW4gPSBzY2F0dGVyd2Fsa19jbGFtcCgmd2Fsa19vdXQsIG4pOwotCi0JCWlmIChsaWtlbHkobiA+PSBic2l6ZSkpCi0JCQluID0gY3J5cHRfZmFzdChkZXNjLCAmd2Fsa19pbiwgJndhbGtfb3V0LCBuLCB0bXApOwotCQllbHNlCi0JCQluID0gY3J5cHRfc2xvdyhkZXNjLCAmd2Fsa19pbiwgJndhbGtfb3V0LCBic2l6ZSk7Ci0KLQkJbmJ5dGVzIC09IG47Ci0KLQkJc2NhdHRlcndhbGtfZG9uZSgmd2Fsa19pbiwgMCwgbmJ5dGVzKTsKLQkJc2NhdHRlcndhbGtfZG9uZSgmd2Fsa19vdXQsIDEsIG5ieXRlcyk7Ci0KLQkJaWYgKCFuYnl0ZXMpCi0JCQlicmVhazsKLQotCQljcnlwdG9feWllbGQodGZtLT5jcnRfZmxhZ3MpOwotCX0KLQotCWlmIChidWZmZXIpCi0JCWZyZWVfcGFnZShidWZmZXIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3J5cHRfaXZfdW5hbGlnbmVkKHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKLQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07Ci0JdW5zaWduZWQgbG9uZyBhbGlnbm1hc2sgPSBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2sodGZtKTsKLQl1OCAqaXYgPSBkZXNjLT5pbmZvOwotCi0JaWYgKHVubGlrZWx5KCgodW5zaWduZWQgbG9uZylpdiAmIGFsaWdubWFzaykpKSB7Ci0JCXVuc2lnbmVkIGludCBpdnNpemUgPSB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2c2l6ZTsKLQkJdTggYnVmZmVyW2l2c2l6ZSArIGFsaWdubWFza107Ci0JCXU4ICp0bXAgPSAodTggKilBTElHTigodW5zaWduZWQgbG9uZylidWZmZXIsIGFsaWdubWFzayArIDEpOwotCQlpbnQgZXJyOwotCi0JCWRlc2MtPmluZm8gPSBtZW1jcHkodG1wLCBpdiwgaXZzaXplKTsKLQkJZXJyID0gY3J5cHQoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JCW1lbWNweShpdiwgdG1wLCBpdnNpemUpOwotCi0JCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIGNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNiY19wcm9jZXNzX2VuY3J5cHQoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAotCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAotCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07Ci0Jdm9pZCAoKnhvcikodTggKiwgY29uc3QgdTggKikgPSB0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrOwotCWludCBic2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOwotCi0Jdm9pZCAoKmZuKShzdHJ1Y3QgY3J5cHRvX3RmbSAqLCB1OCAqLCBjb25zdCB1OCAqKSA9IGRlc2MtPmNyZm47Ci0JdTggKml2ID0gZGVzYy0+aW5mbzsKLQl1bnNpZ25lZCBpbnQgZG9uZSA9IDA7Ci0KLQluYnl0ZXMgLT0gYnNpemU7Ci0KLQlkbyB7Ci0JCXhvcihpdiwgc3JjKTsKLQkJZm4odGZtLCBkc3QsIGl2KTsKLQkJbWVtY3B5KGl2LCBkc3QsIGJzaXplKTsKLQotCQlzcmMgKz0gYnNpemU7Ci0JCWRzdCArPSBic2l6ZTsKLQl9IHdoaWxlICgoZG9uZSArPSBic2l6ZSkgPD0gbmJ5dGVzKTsKLQotCXJldHVybiBkb25lOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNiY19wcm9jZXNzX2RlY3J5cHQoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAotCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAotCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07Ci0Jdm9pZCAoKnhvcikodTggKiwgY29uc3QgdTggKikgPSB0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrOwotCWludCBic2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOwotCXVuc2lnbmVkIGxvbmcgYWxpZ25tYXNrID0gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKGRlc2MtPnRmbSk7Ci0KLQl1OCBzdGFja1tzcmMgPT0gZHN0ID8gYnNpemUgKyBhbGlnbm1hc2sgOiAwXTsKLQl1OCAqYnVmID0gKHU4ICopQUxJR04oKHVuc2lnbmVkIGxvbmcpc3RhY2ssIGFsaWdubWFzayArIDEpOwotCXU4ICoqZHN0X3AgPSBzcmMgPT0gZHN0ID8gJmJ1ZiA6ICZkc3Q7Ci0KLQl2b2lkICgqZm4pKHN0cnVjdCBjcnlwdG9fdGZtICosIHU4ICosIGNvbnN0IHU4ICopID0gZGVzYy0+Y3JmbjsKLQl1OCAqaXYgPSBkZXNjLT5pbmZvOwotCXVuc2lnbmVkIGludCBkb25lID0gMDsKLQotCW5ieXRlcyAtPSBic2l6ZTsKLQotCWRvIHsKLQkJdTggKnRtcF9kc3QgPSAqZHN0X3A7Ci0KLQkJZm4odGZtLCB0bXBfZHN0LCBzcmMpOwotCQl4b3IodG1wX2RzdCwgaXYpOwotCQltZW1jcHkoaXYsIHNyYywgYnNpemUpOwotCQlpZiAodG1wX2RzdCAhPSBkc3QpCi0JCQltZW1jcHkoZHN0LCB0bXBfZHN0LCBic2l6ZSk7Ci0KLQkJc3JjICs9IGJzaXplOwotCQlkc3QgKz0gYnNpemU7Ci0JfSB3aGlsZSAoKGRvbmUgKz0gYnNpemUpIDw9IG5ieXRlcyk7Ci0KLQlyZXR1cm4gZG9uZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBlY2JfcHJvY2Vzcyhjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpkc3QsCi0JCQkJY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGVzYy0+dGZtOwotCWludCBic2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOwotCXZvaWQgKCpmbikoc3RydWN0IGNyeXB0b190Zm0gKiwgdTggKiwgY29uc3QgdTggKikgPSBkZXNjLT5jcmZuOwotCXVuc2lnbmVkIGludCBkb25lID0gMDsKLQotCW5ieXRlcyAtPSBic2l6ZTsKLQotCWRvIHsKLQkJZm4odGZtLCBkc3QsIHNyYyk7Ci0KLQkJc3JjICs9IGJzaXplOwotCQlkc3QgKz0gYnNpemU7Ci0JfSB3aGlsZSAoKGRvbmUgKz0gYnNpemUpIDw9IG5ieXRlcyk7Ci0KLQlyZXR1cm4gZG9uZTsKLX0KIAogc3RhdGljIGludCBzZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKIHsKQEAgLTI5MywxMjIgKzMyLDYgQEAKIAkJcmV0dXJuIGNpYS0+Y2lhX3NldGtleSh0Zm0sIGtleSwga2V5bGVuKTsKIH0KIAotc3RhdGljIGludCBlY2JfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXN0cnVjdCBjaXBoZXJfZGVzYyBkZXNjOwotCXN0cnVjdCBjaXBoZXJfYWxnX2NvbXBhdCAqY2lwaGVyID0gKHZvaWQgKikmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7Ci0KLQlkZXNjLnRmbSA9IHRmbTsKLQlkZXNjLmNyZm4gPSBjaXBoZXItPmNpYV9lbmNyeXB0OwotCWRlc2MucHJmbiA9IGNpcGhlci0+Y2lhX2VuY3J5cHRfZWNiID86IGVjYl9wcm9jZXNzOwotCi0JcmV0dXJuIGNyeXB0KCZkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKLX0KLQotc3RhdGljIGludCBlY2JfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXN0cnVjdCBjaXBoZXJfZGVzYyBkZXNjOwotCXN0cnVjdCBjaXBoZXJfYWxnX2NvbXBhdCAqY2lwaGVyID0gKHZvaWQgKikmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7Ci0KLQlkZXNjLnRmbSA9IHRmbTsKLQlkZXNjLmNyZm4gPSBjaXBoZXItPmNpYV9kZWNyeXB0OwotCWRlc2MucHJmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHRfZWNiID86IGVjYl9wcm9jZXNzOwotCi0JcmV0dXJuIGNyeXB0KCZkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKLX0KLQotc3RhdGljIGludCBjYmNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXN0cnVjdCBjaXBoZXJfZGVzYyBkZXNjOwotCXN0cnVjdCBjaXBoZXJfYWxnX2NvbXBhdCAqY2lwaGVyID0gKHZvaWQgKikmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7Ci0KLQlkZXNjLnRmbSA9IHRmbTsKLQlkZXNjLmNyZm4gPSBjaXBoZXItPmNpYV9lbmNyeXB0OwotCWRlc2MucHJmbiA9IGNpcGhlci0+Y2lhX2VuY3J5cHRfY2JjID86IGNiY19wcm9jZXNzX2VuY3J5cHQ7Ci0JZGVzYy5pbmZvID0gdGZtLT5jcnRfY2lwaGVyLmNpdF9pdjsKLQotCXJldHVybiBjcnlwdCgmZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7Ci19Ci0KLXN0YXRpYyBpbnQgY2JjX2VuY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCi17Ci0Jc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7Ci0Jc3RydWN0IGNpcGhlcl9hbGdfY29tcGF0ICpjaXBoZXIgPSAodm9pZCAqKSZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKLQotCWRlc2MudGZtID0gdGZtOwotCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2VuY3J5cHQ7Ci0JZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZW5jcnlwdF9jYmMgPzogY2JjX3Byb2Nlc3NfZW5jcnlwdDsKLQlkZXNjLmluZm8gPSBpdjsKLQotCXJldHVybiBjcnlwdF9pdl91bmFsaWduZWQoJmRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwotfQotCi1zdGF0aWMgaW50IGNiY19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0Jc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7Ci0Jc3RydWN0IGNpcGhlcl9hbGdfY29tcGF0ICpjaXBoZXIgPSAodm9pZCAqKSZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKLQotCWRlc2MudGZtID0gdGZtOwotCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHQ7Ci0JZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZGVjcnlwdF9jYmMgPzogY2JjX3Byb2Nlc3NfZGVjcnlwdDsKLQlkZXNjLmluZm8gPSB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2OwotCi0JcmV0dXJuIGNyeXB0KCZkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKLX0KLQotc3RhdGljIGludCBjYmNfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKLXsKLQlzdHJ1Y3QgY2lwaGVyX2Rlc2MgZGVzYzsKLQlzdHJ1Y3QgY2lwaGVyX2FsZ19jb21wYXQgKmNpcGhlciA9ICh2b2lkICopJnRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyOwotCi0JZGVzYy50Zm0gPSB0Zm07Ci0JZGVzYy5jcmZuID0gY2lwaGVyLT5jaWFfZGVjcnlwdDsKLQlkZXNjLnByZm4gPSBjaXBoZXItPmNpYV9kZWNyeXB0X2NiYyA/OiBjYmNfcHJvY2Vzc19kZWNyeXB0OwotCWRlc2MuaW5mbyA9IGl2OwotCi0JcmV0dXJuIGNyeXB0X2l2X3VuYWxpZ25lZCgmZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7Ci19Ci0KLXN0YXRpYyBpbnQgbm9jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW50IG5vY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLWludCBjcnlwdG9faW5pdF9jaXBoZXJfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQotewotCXUzMiBtb2RlID0gZmxhZ3MgJiBDUllQVE9fVEZNX01PREVfTUFTSzsKLQl0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUgPSBtb2RlID8gbW9kZSA6IENSWVBUT19URk1fTU9ERV9FQ0I7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIGNpcGhlcl9jcnlwdF91bmFsaWduZWQodm9pZCAoKmZuKShzdHJ1Y3QgY3J5cHRvX3RmbSAqLCB1OCAqLAogCQkJCQkgICAgICBjb25zdCB1OCAqKSwKIAkJCQkgICBzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLApAQCAtNDU0LDcgKzc3LDYgQEAKIAogaW50IGNyeXB0b19pbml0X2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgY2lwaGVyX3RmbSAqb3BzID0gJnRmbS0+Y3J0X2NpcGhlcjsKIAlzdHJ1Y3QgY2lwaGVyX2FsZyAqY2lwaGVyID0gJnRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyOwogCkBAIC00NjQsNzAgKzg2LDcgQEAKIAlvcHMtPmNpdF9kZWNyeXB0X29uZSA9IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayh0Zm0pID8KIAkJY2lwaGVyX2RlY3J5cHRfdW5hbGlnbmVkIDogY2lwaGVyLT5jaWFfZGVjcnlwdDsKIAotCXN3aXRjaCAodGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlKSB7Ci0JY2FzZSBDUllQVE9fVEZNX01PREVfRUNCOgotCQlvcHMtPmNpdF9lbmNyeXB0ID0gZWNiX2VuY3J5cHQ7Ci0JCW9wcy0+Y2l0X2RlY3J5cHQgPSBlY2JfZGVjcnlwdDsKLQkJb3BzLT5jaXRfZW5jcnlwdF9pdiA9IG5vY3J5cHRfaXY7Ci0JCW9wcy0+Y2l0X2RlY3J5cHRfaXYgPSBub2NyeXB0X2l2OwotCQlicmVhazsKLQkJCi0JY2FzZSBDUllQVE9fVEZNX01PREVfQ0JDOgotCQlvcHMtPmNpdF9lbmNyeXB0ID0gY2JjX2VuY3J5cHQ7Ci0JCW9wcy0+Y2l0X2RlY3J5cHQgPSBjYmNfZGVjcnlwdDsKLQkJb3BzLT5jaXRfZW5jcnlwdF9pdiA9IGNiY19lbmNyeXB0X2l2OwotCQlvcHMtPmNpdF9kZWNyeXB0X2l2ID0gY2JjX2RlY3J5cHRfaXY7Ci0JCWJyZWFrOwotCQkKLQljYXNlIENSWVBUT19URk1fTU9ERV9DRkI6Ci0JCW9wcy0+Y2l0X2VuY3J5cHQgPSBub2NyeXB0OwotCQlvcHMtPmNpdF9kZWNyeXB0ID0gbm9jcnlwdDsKLQkJb3BzLT5jaXRfZW5jcnlwdF9pdiA9IG5vY3J5cHRfaXY7Ci0JCW9wcy0+Y2l0X2RlY3J5cHRfaXYgPSBub2NyeXB0X2l2OwotCQlicmVhazsKLQkKLQljYXNlIENSWVBUT19URk1fTU9ERV9DVFI6Ci0JCW9wcy0+Y2l0X2VuY3J5cHQgPSBub2NyeXB0OwotCQlvcHMtPmNpdF9kZWNyeXB0ID0gbm9jcnlwdDsKLQkJb3BzLT5jaXRfZW5jcnlwdF9pdiA9IG5vY3J5cHRfaXY7Ci0JCW9wcy0+Y2l0X2RlY3J5cHRfaXYgPSBub2NyeXB0X2l2OwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQkKLQlpZiAob3BzLT5jaXRfbW9kZSA9PSBDUllQVE9fVEZNX01PREVfQ0JDKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYWxpZ247Ci0JCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQkgICAgCQotCSAgICAJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSkgewotCSAgICAJY2FzZSA4OgotCSAgICAJCW9wcy0+Y2l0X3hvcl9ibG9jayA9IHhvcl82NDsKLQkgICAgCQlicmVhazsKLQkgICAgCQkKLQkgICAgCWNhc2UgMTY6Ci0JICAgIAkJb3BzLT5jaXRfeG9yX2Jsb2NrID0geG9yXzEyODsKLQkgICAgCQlicmVhazsKLQkgICAgCQkKLQkgICAgCWRlZmF1bHQ6Ci0JICAgIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGJsb2NrIHNpemUgJXUgbm90IHN1cHBvcnRlZFxuIiwKLQkgICAgCQkgICAgICAgY3J5cHRvX3RmbV9hbGdfbmFtZSh0Zm0pLAotCSAgICAJCSAgICAgICBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7Ci0JICAgIAkJcmV0ID0gLUVJTlZBTDsKLQkgICAgCQlnb3RvIG91dDsKLQkgICAgCX0KLQkgICAgCQotCQlvcHMtPmNpdF9pdnNpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKTsKLQkJYWxpZ24gPSBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2sodGZtKSArIDE7Ci0JCWFkZHIgPSAodW5zaWduZWQgbG9uZyljcnlwdG9fdGZtX2N0eCh0Zm0pOwotCQlhZGRyID0gQUxJR04oYWRkciwgYWxpZ24pOwotCQlhZGRyICs9IEFMSUdOKHRmbS0+X19jcnRfYWxnLT5jcmFfY3R4c2l6ZSwgYWxpZ24pOwotCQlvcHMtPmNpdF9pdiA9ICh2b2lkICopYWRkcjsKLQl9Ci0KLW91dDoJCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBjcnlwdG9fZXhpdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCmRpZmYgLS1naXQgYS9jcnlwdG8vY29tcHJlc3MuYyBiL2NyeXB0by9jb21wcmVzcy5jCmluZGV4IGVjYTE4MmEuLjBhNjU3MDAgMTAwNjQ0Ci0tLSBhL2NyeXB0by9jb21wcmVzcy5jCisrKyBiL2NyeXB0by9jb21wcmVzcy5jCkBAIC0zNCwxMSArMzQsNiBAQAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsZW4pOwogfQogCi1pbnQgY3J5cHRvX2luaXRfY29tcHJlc3NfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQotewotCXJldHVybiBmbGFncyA/IC1FSU5WQUwgOiAwOwotfQotCiBpbnQgY3J5cHRvX2luaXRfY29tcHJlc3Nfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7CiAJc3RydWN0IGNvbXByZXNzX3RmbSAqb3BzID0gJnRmbS0+Y3J0X2NvbXByZXNzOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2RpZ2VzdC5jIGIvY3J5cHRvL2RpZ2VzdC5jCmluZGV4IDhmNDU5MzIuLjFiZjc0MTQgMTAwNjQ0Ci0tLSBhL2NyeXB0by9kaWdlc3QuYworKysgYi9jcnlwdG8vZGlnZXN0LmMKQEAgLTE0LDcgKzE0LDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAKQEAgLTI5LDggKzMxLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1cGRhdGUoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywKLQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQorc3RhdGljIGludCB1cGRhdGUyKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsCisJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7CiAJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGNyeXB0b19oYXNoX3RmbShkZXNjLT50Zm0pOwogCXVuc2lnbmVkIGludCBhbGlnbm1hc2sgPSBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2sodGZtKTsKQEAgLTgxLDYgKzgzLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdXBkYXRlKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsCisJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlpZiAoV0FSTl9PTl9PTkNFKGluX2lycSgpKSkKKwkJcmV0dXJuIC1FREVBRExLOworCXJldHVybiB1cGRhdGUyKGRlc2MsIHNnLCBuYnl0ZXMpOworfQorCiBzdGF0aWMgaW50IGZpbmFsKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpCiB7CiAJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGNyeXB0b19oYXNoX3RmbShkZXNjLT50Zm0pOwpAQCAtMTE4LDE0ICsxMjgsMTIgQEAKIHN0YXRpYyBpbnQgZGlnZXN0KHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsCiAJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKm91dCkKIHsKLQlpbml0KGRlc2MpOwotCXVwZGF0ZShkZXNjLCBzZywgbmJ5dGVzKTsKLQlyZXR1cm4gZmluYWwoZGVzYywgb3V0KTsKLX0KKwlpZiAoV0FSTl9PTl9PTkNFKGluX2lycSgpKSkKKwkJcmV0dXJuIC1FREVBRExLOwogCi1pbnQgY3J5cHRvX2luaXRfZGlnZXN0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKLXsKLQlyZXR1cm4gZmxhZ3MgPyAtRUlOVkFMIDogMDsKKwlpbml0KGRlc2MpOworCXVwZGF0ZTIoZGVzYywgc2csIG5ieXRlcyk7CisJcmV0dXJuIGZpbmFsKGRlc2MsIG91dCk7CiB9CiAKIGludCBjcnlwdG9faW5pdF9kaWdlc3Rfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCmRpZmYgLS1naXQgYS9jcnlwdG8vZWNiLmMgYi9jcnlwdG8vZWNiLmMKaW5kZXggZjIzOWFhOS4uODM5YTBhZSAxMDA2NDQKLS0tIGEvY3J5cHRvL2VjYi5jCisrKyBiL2NyeXB0by9lY2IuYwpAQCAtOTksMTIgKzk5LDEzIEBACiAJc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCA9ICh2b2lkICopdGZtLT5fX2NydF9hbGc7CiAJc3RydWN0IGNyeXB0b19zcGF3biAqc3Bhd24gPSBjcnlwdG9faW5zdGFuY2VfY3R4KGluc3QpOwogCXN0cnVjdCBjcnlwdG9fZWNiX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqY2lwaGVyOwogCi0JdGZtID0gY3J5cHRvX3NwYXduX3RmbShzcGF3bik7Ci0JaWYgKElTX0VSUih0Zm0pKQotCQlyZXR1cm4gUFRSX0VSUih0Zm0pOworCWNpcGhlciA9IGNyeXB0b19zcGF3bl9jaXBoZXIoc3Bhd24pOworCWlmIChJU19FUlIoY2lwaGVyKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2lwaGVyKTsKIAotCWN0eC0+Y2hpbGQgPSBjcnlwdG9fY2lwaGVyX2Nhc3QodGZtKTsKKwljdHgtPmNoaWxkID0gY2lwaGVyOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9jcnlwdG8vZmNyeXB0LmMgYi9jcnlwdG8vZmNyeXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyYmI1MwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9mY3J5cHQuYwpAQCAtMCwwICsxLDQyMyBAQAorLyogRkNyeXB0IGVuY3J5cHRpb24gYWxnb3JpdGhtCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEJhc2VkIG9uIGNvZGU6CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk1IC0gMjAwMCBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KKyAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisKKyNkZWZpbmUgUk9VTkRTIDE2CisKK3N0cnVjdCBmY3J5cHRfY3R4IHsKKwl1MzIgc2NoZWRbUk9VTkRTXTsKK307CisKKy8qIFJvdGF0ZSByaWdodCB0d28gMzIgYml0IG51bWJlcnMgYXMgYSA1NiBiaXQgbnVtYmVyICovCisjZGVmaW5lIHJvcjU2KGhpLCBsbywgbikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwl1MzIgdCA9IGxvICYgKCgxIDw8IG4pIC0gMSk7CQkJCVwKKwlsbyA9IChsbyA+PiBuKSB8ICgoaGkgJiAoKDEgPDwgbikgLSAxKSkgPDwgKDMyIC0gbikpOwlcCisJaGkgPSAoaGkgPj4gbikgfCAodCA8PCAoMjQtbikpOwkJCQlcCit9IHdoaWxlKDApCisKKy8qIFJvdGF0ZSByaWdodCBvbmUgNjQgYml0IG51bWJlciBhcyBhIDU2IGJpdCBudW1iZXIgKi8KKyNkZWZpbmUgcm9yNTZfNjQoaywgbikJCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJayA9IChrID4+IG4pIHwgKChrICYgKCgxIDw8IG4pIC0gMSkpIDw8ICg1NiAtIG4pKTsJXAorfSB3aGlsZSgwKQorCisvKgorICogU2JveGVzIGZvciBGZWlzdGVsIG5ldHdvcmsgZGVyaXZlZCBmcm9tCisgKiAvYWZzL3RyYW5zYXJjLmNvbS9wdWJsaWMvYWZzcHMvYWZzLnJlbDMxYi5leHBvcnQtc3JjL3J4a2FkL3Nib3hlcy5oCisgKi8KKyN1bmRlZiBaCisjZGVmaW5lIFooeCkgX19jb25zdGFudF9iZTMyX3RvX2NwdSh4IDw8IDMpCitzdGF0aWMgY29uc3QgdTMyIHNib3gwWzI1Nl0gPSB7CisJWigweGVhKSwgWigweDdmKSwgWigweGIyKSwgWigweDY0KSwgWigweDlkKSwgWigweGIwKSwgWigweGQ5KSwgWigweDExKSwKKwlaKDB4Y2QpLCBaKDB4ODYpLCBaKDB4ODYpLCBaKDB4OTEpLCBaKDB4MGEpLCBaKDB4YjIpLCBaKDB4OTMpLCBaKDB4MDYpLAorCVooMHgwZSksIFooMHgwNiksIFooMHhkMiksIFooMHg2NSksIFooMHg3MyksIFooMHhjNSksIFooMHgyOCksIFooMHg2MCksCisJWigweGYyKSwgWigweDIwKSwgWigweGI1KSwgWigweDM4KSwgWigweDdlKSwgWigweGRhKSwgWigweDlmKSwgWigweGUzKSwKKwlaKDB4ZDIpLCBaKDB4Y2YpLCBaKDB4YzQpLCBaKDB4M2MpLCBaKDB4NjEpLCBaKDB4ZmYpLCBaKDB4NGEpLCBaKDB4NGEpLAorCVooMHgzNSksIFooMHhhYyksIFooMHhhYSksIFooMHg1ZiksIFooMHgyYiksIFooMHhiYiksIFooMHhiYyksIFooMHg1MyksCisJWigweDRlKSwgWigweDlkKSwgWigweDc4KSwgWigweGEzKSwgWigweGRjKSwgWigweDA5KSwgWigweDMyKSwgWigweDEwKSwKKwlaKDB4YzYpLCBaKDB4NmYpLCBaKDB4NjYpLCBaKDB4ZDYpLCBaKDB4YWIpLCBaKDB4YTkpLCBaKDB4YWYpLCBaKDB4ZmQpLAorCVooMHgzYiksIFooMHg5NSksIFooMHhlOCksIFooMHgzNCksIFooMHg5YSksIFooMHg4MSksIFooMHg3MiksIFooMHg4MCksCisJWigweDljKSwgWigweGYzKSwgWigweGVjKSwgWigweGRhKSwgWigweDlmKSwgWigweDI2KSwgWigweDc2KSwgWigweDE1KSwKKwlaKDB4M2UpLCBaKDB4NTUpLCBaKDB4NGQpLCBaKDB4ZGUpLCBaKDB4ODQpLCBaKDB4ZWUpLCBaKDB4YWQpLCBaKDB4YzcpLAorCVooMHhmMSksIFooMHg2YiksIFooMHgzZCksIFooMHhkMyksIFooMHgwNCksIFooMHg0OSksIFooMHhhYSksIFooMHgyNCksCisJWigweDBiKSwgWigweDhhKSwgWigweDgzKSwgWigweGJhKSwgWigweGZhKSwgWigweDg1KSwgWigweGEwKSwgWigweGE4KSwKKwlaKDB4YjEpLCBaKDB4ZDQpLCBaKDB4MDEpLCBaKDB4ZDgpLCBaKDB4NzApLCBaKDB4NjQpLCBaKDB4ZjApLCBaKDB4NTEpLAorCVooMHhkMiksIFooMHhjMyksIFooMHhhNyksIFooMHg3NSksIFooMHg4YyksIFooMHhhNSksIFooMHg2NCksIFooMHhlZiksCisJWigweDEwKSwgWigweDRlKSwgWigweGI3KSwgWigweGM2KSwgWigweDYxKSwgWigweDAzKSwgWigweGViKSwgWigweDQ0KSwKKwlaKDB4M2QpLCBaKDB4ZTUpLCBaKDB4YjMpLCBaKDB4NWIpLCBaKDB4YWUpLCBaKDB4ZDUpLCBaKDB4YWQpLCBaKDB4MWQpLAorCVooMHhmYSksIFooMHg1YSksIFooMHgxZSksIFooMHgzMyksIFooMHhhYiksIFooMHg5MyksIFooMHhhMiksIFooMHhiNyksCisJWigweGU3KSwgWigweGE4KSwgWigweDQ1KSwgWigweGE0KSwgWigweGNkKSwgWigweDI5KSwgWigweDYzKSwgWigweDQ0KSwKKwlaKDB4YjYpLCBaKDB4NjkpLCBaKDB4N2UpLCBaKDB4MmUpLCBaKDB4NjIpLCBaKDB4MDMpLCBaKDB4YzgpLCBaKDB4ZTApLAorCVooMHgxNyksIFooMHhiYiksIFooMHhjNyksIFooMHhmMyksIFooMHgzZiksIFooMHgzNiksIFooMHhiYSksIFooMHg3MSksCisJWigweDhlKSwgWigweDk3KSwgWigweDY1KSwgWigweDYwKSwgWigweDY5KSwgWigweGI2KSwgWigweGY2KSwgWigweGU2KSwKKwlaKDB4NmUpLCBaKDB4ZTApLCBaKDB4ODEpLCBaKDB4NTkpLCBaKDB4ZTgpLCBaKDB4YWYpLCBaKDB4ZGQpLCBaKDB4OTUpLAorCVooMHgyMiksIFooMHg5OSksIFooMHhmZCksIFooMHg2MyksIFooMHgxOSksIFooMHg3NCksIFooMHg2MSksIFooMHhiMSksCisJWigweGI2KSwgWigweDViKSwgWigweGFlKSwgWigweDU0KSwgWigweGIzKSwgWigweDcwKSwgWigweGZmKSwgWigweGM2KSwKKwlaKDB4M2IpLCBaKDB4M2UpLCBaKDB4YzEpLCBaKDB4ZDcpLCBaKDB4ZTEpLCBaKDB4MGUpLCBaKDB4NzYpLCBaKDB4ZTUpLAorCVooMHgzNiksIFooMHg0ZiksIFooMHg1OSksIFooMHhjNyksIFooMHgwOCksIFooMHg2ZSksIFooMHg4MiksIFooMHhhNiksCisJWigweDkzKSwgWigweGM0KSwgWigweGFhKSwgWigweDI2KSwgWigweDQ5KSwgWigweGUwKSwgWigweDIxKSwgWigweDY0KSwKKwlaKDB4MDcpLCBaKDB4OWYpLCBaKDB4NjQpLCBaKDB4ODEpLCBaKDB4OWMpLCBaKDB4YmYpLCBaKDB4ZjkpLCBaKDB4ZDEpLAorCVooMHg0MyksIFooMHhmOCksIFooMHhiNiksIFooMHhiOSksIFooMHhmMSksIFooMHgyNCksIFooMHg3NSksIFooMHgwMyksCisJWigweGU0KSwgWigweGIwKSwgWigweDk5KSwgWigweDQ2KSwgWigweDNkKSwgWigweGY1KSwgWigweGQxKSwgWigweDM5KSwKKwlaKDB4NzIpLCBaKDB4MTIpLCBaKDB4ZjYpLCBaKDB4YmEpLCBaKDB4MGMpLCBaKDB4MGQpLCBaKDB4NDIpLCBaKDB4MmUpCit9OworCisjdW5kZWYgWgorI2RlZmluZSBaKHgpIF9fY29uc3RhbnRfYmUzMl90b19jcHUoKHggPDwgMjcpIHwgKHggPj4gNSkpCitzdGF0aWMgY29uc3QgdTMyIHNib3gxWzI1Nl0gPSB7CisJWigweDc3KSwgWigweDE0KSwgWigweGE2KSwgWigweGZlKSwgWigweGIyKSwgWigweDVlKSwgWigweDhjKSwgWigweDNlKSwKKwlaKDB4NjcpLCBaKDB4NmMpLCBaKDB4YTEpLCBaKDB4MGQpLCBaKDB4YzIpLCBaKDB4YTIpLCBaKDB4YzEpLCBaKDB4ODUpLAorCVooMHg2YyksIFooMHg3YiksIFooMHg2NyksIFooMHhjNiksIFooMHgyMyksIFooMHhlMyksIFooMHhmMiksIFooMHg4OSksCisJWigweDUwKSwgWigweDljKSwgWigweDAzKSwgWigweGI3KSwgWigweDczKSwgWigweGU2KSwgWigweGUxKSwgWigweDM5KSwKKwlaKDB4MzEpLCBaKDB4MmMpLCBaKDB4MjcpLCBaKDB4OWYpLCBaKDB4YTUpLCBaKDB4NjkpLCBaKDB4NDQpLCBaKDB4ZDYpLAorCVooMHgyMyksIFooMHg4MyksIFooMHg5OCksIFooMHg3ZCksIFooMHgzYyksIFooMHhiNCksIFooMHgyZCksIFooMHg5OSksCisJWigweDFjKSwgWigweDFmKSwgWigweDhjKSwgWigweDIwKSwgWigweDAzKSwgWigweDdjKSwgWigweDVmKSwgWigweGFkKSwKKwlaKDB4ZjQpLCBaKDB4ZmEpLCBaKDB4OTUpLCBaKDB4Y2EpLCBaKDB4NzYpLCBaKDB4NDQpLCBaKDB4Y2QpLCBaKDB4YjYpLAorCVooMHhiOCksIFooMHhhMSksIFooMHhhMSksIFooMHhiZSksIFooMHg5ZSksIFooMHg1NCksIFooMHg4ZiksIFooMHgwYiksCisJWigweDE2KSwgWigweDc0KSwgWigweDMxKSwgWigweDhhKSwgWigweDIzKSwgWigweDE3KSwgWigweDA0KSwgWigweGZhKSwKKwlaKDB4NzkpLCBaKDB4ODQpLCBaKDB4YjEpLCBaKDB4ZjUpLCBaKDB4MTMpLCBaKDB4YWIpLCBaKDB4YjUpLCBaKDB4MmUpLAorCVooMHhhYSksIFooMHgwYyksIFooMHg2MCksIFooMHg2YiksIFooMHg1YiksIFooMHhjNCksIFooMHg0YiksIFooMHhiYyksCisJWigweGUyKSwgWigweGFmKSwgWigweDQ1KSwgWigweDczKSwgWigweGZhKSwgWigweGM5KSwgWigweDQ5KSwgWigweGNkKSwKKwlaKDB4MDApLCBaKDB4OTIpLCBaKDB4N2QpLCBaKDB4OTcpLCBaKDB4N2EpLCBaKDB4MTgpLCBaKDB4NjApLCBaKDB4M2QpLAorCVooMHhjZiksIFooMHg1YiksIFooMHhkZSksIFooMHhjNiksIFooMHhlMiksIFooMHhlNiksIFooMHhiYiksIFooMHg4YiksCisJWigweDA2KSwgWigweGRhKSwgWigweDA4KSwgWigweDE1KSwgWigweDFiKSwgWigweDg4KSwgWigweDZhKSwgWigweDE3KSwKKwlaKDB4ODkpLCBaKDB4ZDApLCBaKDB4YTkpLCBaKDB4YzEpLCBaKDB4YzkpLCBaKDB4NzApLCBaKDB4NmIpLCBaKDB4ZTUpLAorCVooMHg0MyksIFooMHhmNCksIFooMHg2OCksIFooMHhjOCksIFooMHhkMyksIFooMHg4NCksIFooMHgyOCksIFooMHgwYSksCisJWigweDUyKSwgWigweDY2KSwgWigweGEzKSwgWigweGNhKSwgWigweGYyKSwgWigweGUzKSwgWigweDdmKSwgWigweDdhKSwKKwlaKDB4MzEpLCBaKDB4ZjcpLCBaKDB4ODgpLCBaKDB4OTQpLCBaKDB4NWUpLCBaKDB4OWMpLCBaKDB4NjMpLCBaKDB4ZDUpLAorCVooMHgyNCksIFooMHg2NiksIFooMHhmYyksIFooMHhiMyksIFooMHg1NyksIFooMHgyNSksIFooMHhiZSksIFooMHg4OSksCisJWigweDQ0KSwgWigweGM0KSwgWigweGUwKSwgWigweDhmKSwgWigweDIzKSwgWigweDNjKSwgWigweDEyKSwgWigweDUyKSwKKwlaKDB4ZjUpLCBaKDB4MWUpLCBaKDB4ZjQpLCBaKDB4Y2IpLCBaKDB4MTgpLCBaKDB4MzMpLCBaKDB4MWYpLCBaKDB4ZjgpLAorCVooMHg2OSksIFooMHgxMCksIFooMHg5ZCksIFooMHhkMyksIFooMHhmNyksIFooMHgyOCksIFooMHhmOCksIFooMHgzMCksCisJWigweDA1KSwgWigweDVlKSwgWigweDMyKSwgWigweGMwKSwgWigweGQ1KSwgWigweDE5KSwgWigweGJkKSwgWigweDQ1KSwKKwlaKDB4OGIpLCBaKDB4NWIpLCBaKDB4ZmQpLCBaKDB4YmMpLCBaKDB4ZTIpLCBaKDB4NWMpLCBaKDB4YTkpLCBaKDB4OTYpLAorCVooMHhlZiksIFooMHg3MCksIFooMHhjZiksIFooMHhjMiksIFooMHgyYSksIFooMHhiMyksIFooMHg2MSksIFooMHhhZCksCisJWigweDgwKSwgWigweDQ4KSwgWigweDgxKSwgWigweGI3KSwgWigweDFkKSwgWigweDQzKSwgWigweGQ5KSwgWigweGQ3KSwKKwlaKDB4NDUpLCBaKDB4ZjApLCBaKDB4ZDgpLCBaKDB4OGEpLCBaKDB4NTkpLCBaKDB4N2MpLCBaKDB4NTcpLCBaKDB4YzEpLAorCVooMHg3OSksIFooMHhjNyksIFooMHgzNCksIFooMHhkNiksIFooMHg0MyksIFooMHhkZiksIFooMHhlNCksIFooMHg3OCksCisJWigweDE2KSwgWigweDA2KSwgWigweGRhKSwgWigweDkyKSwgWigweDc2KSwgWigweDUxKSwgWigweGUxKSwgWigweGQ0KSwKKwlaKDB4NzApLCBaKDB4MDMpLCBaKDB4ZTApLCBaKDB4MmYpLCBaKDB4OTYpLCBaKDB4OTEpLCBaKDB4ODIpLCBaKDB4ODApCit9OworCisjdW5kZWYgWgorI2RlZmluZSBaKHgpIF9fY29uc3RhbnRfYmUzMl90b19jcHUoeCA8PCAxMSkKK3N0YXRpYyBjb25zdCB1MzIgc2JveDJbMjU2XSA9IHsKKwlaKDB4ZjApLCBaKDB4MzcpLCBaKDB4MjQpLCBaKDB4NTMpLCBaKDB4MmEpLCBaKDB4MDMpLCBaKDB4ODMpLCBaKDB4ODYpLAorCVooMHhkMSksIFooMHhlYyksIFooMHg1MCksIFooMHhmMCksIFooMHg0MiksIFooMHg3OCksIFooMHgyZiksIFooMHg2ZCksCisJWigweGJmKSwgWigweDgwKSwgWigweDg3KSwgWigweDI3KSwgWigweDk1KSwgWigweGUyKSwgWigweGM1KSwgWigweDVkKSwKKwlaKDB4ZjkpLCBaKDB4NmYpLCBaKDB4ZGIpLCBaKDB4YjQpLCBaKDB4NjUpLCBaKDB4NmUpLCBaKDB4ZTcpLCBaKDB4MjQpLAorCVooMHhjOCksIFooMHgxYSksIFooMHhiYiksIFooMHg0OSksIFooMHhiNSksIFooMHgwYSksIFooMHg3ZCksIFooMHhiOSksCisJWigweGU4KSwgWigweGRjKSwgWigweGI3KSwgWigweGQ5KSwgWigweDQ1KSwgWigweDIwKSwgWigweDFiKSwgWigweGNlKSwKKwlaKDB4NTkpLCBaKDB4OWQpLCBaKDB4NmIpLCBaKDB4YmQpLCBaKDB4MGUpLCBaKDB4OGYpLCBaKDB4YTMpLCBaKDB4YTkpLAorCVooMHhiYyksIFooMHg3NCksIFooMHhhNiksIFooMHhmNiksIFooMHg3ZiksIFooMHg1ZiksIFooMHhiMSksIFooMHg2OCksCisJWigweDg0KSwgWigweGJjKSwgWigweGE5KSwgWigweGZkKSwgWigweDU1KSwgWigweDUwKSwgWigweGU5KSwgWigweGI2KSwKKwlaKDB4MTMpLCBaKDB4NWUpLCBaKDB4MDcpLCBaKDB4YjgpLCBaKDB4OTUpLCBaKDB4MDIpLCBaKDB4YzApLCBaKDB4ZDApLAorCVooMHg2YSksIFooMHgxYSksIFooMHg4NSksIFooMHhiZCksIFooMHhiNiksIFooMHhmZCksIFooMHhmZSksIFooMHgxNyksCisJWigweDNmKSwgWigweDA5KSwgWigweGEzKSwgWigweDhkKSwgWigweGZiKSwgWigweGVkKSwgWigweGRhKSwgWigweDFkKSwKKwlaKDB4NmQpLCBaKDB4MWMpLCBaKDB4NmMpLCBaKDB4MDEpLCBaKDB4NWEpLCBaKDB4ZTUpLCBaKDB4NzEpLCBaKDB4M2UpLAorCVooMHg4YiksIFooMHg2YiksIFooMHhiZSksIFooMHgyOSksIFooMHhlYiksIFooMHgxMiksIFooMHgxOSksIFooMHgzNCksCisJWigweGNkKSwgWigweGIzKSwgWigweGJkKSwgWigweDM1KSwgWigweGVhKSwgWigweDRiKSwgWigweGQ1KSwgWigweGFlKSwKKwlaKDB4MmEpLCBaKDB4NzkpLCBaKDB4NWEpLCBaKDB4YTUpLCBaKDB4MzIpLCBaKDB4MTIpLCBaKDB4N2IpLCBaKDB4ZGMpLAorCVooMHgyYyksIFooMHhkMCksIFooMHgyMiksIFooMHg0YiksIFooMHhiMSksIFooMHg4NSksIFooMHg1OSksIFooMHg4MCksCisJWigweGMwKSwgWigweDMwKSwgWigweDlmKSwgWigweDczKSwgWigweGQzKSwgWigweDE0KSwgWigweDQ4KSwgWigweDQwKSwKKwlaKDB4MDcpLCBaKDB4MmQpLCBaKDB4OGYpLCBaKDB4ODApLCBaKDB4MGYpLCBaKDB4Y2UpLCBaKDB4MGIpLCBaKDB4NWUpLAorCVooMHhiNyksIFooMHg1ZSksIFooMHhhYyksIFooMHgyNCksIFooMHg5NCksIFooMHg0YSksIFooMHgxOCksIFooMHgxNSksCisJWigweDA1KSwgWigweGU4KSwgWigweDAyKSwgWigweDc3KSwgWigweGE5KSwgWigweGM3KSwgWigweDQwKSwgWigweDQ1KSwKKwlaKDB4ODkpLCBaKDB4ZDEpLCBaKDB4ZWEpLCBaKDB4ZGUpLCBaKDB4MGMpLCBaKDB4NzkpLCBaKDB4MmEpLCBaKDB4OTkpLAorCVooMHg2YyksIFooMHgzZSksIFooMHg5NSksIFooMHhkZCksIFooMHg4YyksIFooMHg3ZCksIFooMHhhZCksIFooMHg2ZiksCisJWigweGRjKSwgWigweGZmKSwgWigweGZkKSwgWigweDYyKSwgWigweDQ3KSwgWigweGIzKSwgWigweDIxKSwgWigweDhhKSwKKwlaKDB4ZWMpLCBaKDB4OGUpLCBaKDB4MTkpLCBaKDB4MTgpLCBaKDB4YjQpLCBaKDB4NmUpLCBaKDB4M2QpLCBaKDB4ZmQpLAorCVooMHg3NCksIFooMHg1NCksIFooMHgxZSksIFooMHgwNCksIFooMHg4NSksIFooMHhkOCksIFooMHhiYyksIFooMHgxZiksCisJWigweDU2KSwgWigweGU3KSwgWigweDNhKSwgWigweDU2KSwgWigweDY3KSwgWigweGQ2KSwgWigweGM4KSwgWigweGE1KSwKKwlaKDB4ZjMpLCBaKDB4OGUpLCBaKDB4ZGUpLCBaKDB4YWUpLCBaKDB4MzcpLCBaKDB4NDkpLCBaKDB4YjcpLCBaKDB4ZmEpLAorCVooMHhjOCksIFooMHhmNCksIFooMHgxZiksIFooMHhlMCksIFooMHgyYSksIFooMHg5YiksIFooMHgxNSksIFooMHhkMSksCisJWigweDM0KSwgWigweDBlKSwgWigweGI1KSwgWigweGUwKSwgWigweDQ0KSwgWigweDc4KSwgWigweDg0KSwgWigweDU5KSwKKwlaKDB4NTYpLCBaKDB4NjgpLCBaKDB4NzcpLCBaKDB4YTUpLCBaKDB4MTQpLCBaKDB4MDYpLCBaKDB4ZjUpLCBaKDB4MmYpLAorCVooMHg4YyksIFooMHg4YSksIFooMHg3MyksIFooMHg4MCksIFooMHg3NiksIFooMHhiNCksIFooMHgxMCksIFooMHg4NikKK307CisKKyN1bmRlZiBaCisjZGVmaW5lIFooeCkgX19jb25zdGFudF9iZTMyX3RvX2NwdSh4IDw8IDE5KQorc3RhdGljIGNvbnN0IHUzMiBzYm94M1syNTZdID0geworCVooMHhhOSksIFooMHgyYSksIFooMHg0OCksIFooMHg1MSksIFooMHg4NCksIFooMHg3ZSksIFooMHg0OSksIFooMHhlMiksCisJWigweGI1KSwgWigweGI3KSwgWigweDQyKSwgWigweDMzKSwgWigweDdkKSwgWigweDVkKSwgWigweGE2KSwgWigweDEyKSwKKwlaKDB4NDQpLCBaKDB4NDgpLCBaKDB4NmQpLCBaKDB4MjgpLCBaKDB4YWEpLCBaKDB4MjApLCBaKDB4NmQpLCBaKDB4NTcpLAorCVooMHhkNiksIFooMHg2YiksIFooMHg1ZCksIFooMHg3MiksIFooMHhmMCksIFooMHg5MiksIFooMHg1YSksIFooMHgxYiksCisJWigweDUzKSwgWigweDgwKSwgWigweDI0KSwgWigweDcwKSwgWigweDlhKSwgWigweGNjKSwgWigweGE3KSwgWigweDY2KSwKKwlaKDB4YTEpLCBaKDB4MDEpLCBaKDB4YTUpLCBaKDB4NDEpLCBaKDB4OTcpLCBaKDB4NDEpLCBaKDB4MzEpLCBaKDB4ODIpLAorCVooMHhmMSksIFooMHgxNCksIFooMHhjZiksIFooMHg1MyksIFooMHgwZCksIFooMHhhMCksIFooMHgxMCksIFooMHhjYyksCisJWigweDJhKSwgWigweDdkKSwgWigweGQyKSwgWigweGJmKSwgWigweDRiKSwgWigweDFhKSwgWigweGRiKSwgWigweDE2KSwKKwlaKDB4NDcpLCBaKDB4ZjYpLCBaKDB4NTEpLCBaKDB4MzYpLCBaKDB4ZWQpLCBaKDB4ZjMpLCBaKDB4YjkpLCBaKDB4MWEpLAorCVooMHhhNyksIFooMHhkZiksIFooMHgyOSksIFooMHg0MyksIFooMHgwMSksIFooMHg1NCksIFooMHg3MCksIFooMHhhNCksCisJWigweGJmKSwgWigweGQ0KSwgWigweDBiKSwgWigweDUzKSwgWigweDQ0KSwgWigweDYwKSwgWigweDllKSwgWigweDIzKSwKKwlaKDB4YTEpLCBaKDB4MTgpLCBaKDB4NjgpLCBaKDB4NGYpLCBaKDB4ZjApLCBaKDB4MmYpLCBaKDB4ODIpLCBaKDB4YzIpLAorCVooMHgyYSksIFooMHg0MSksIFooMHhiMiksIFooMHg0MiksIFooMHgwYyksIFooMHhlZCksIFooMHgwYyksIFooMHgxZCksCisJWigweDEzKSwgWigweDNhKSwgWigweDNjKSwgWigweDZlKSwgWigweDM1KSwgWigweGRjKSwgWigweDYwKSwgWigweDY1KSwKKwlaKDB4ODUpLCBaKDB4ZTkpLCBaKDB4NjQpLCBaKDB4MDIpLCBaKDB4OWEpLCBaKDB4M2YpLCBaKDB4OWYpLCBaKDB4ODcpLAorCVooMHg5NiksIFooMHhkZiksIFooMHhiZSksIFooMHhmMiksIFooMHhjYiksIFooMHhlNSksIFooMHg2YyksIFooMHhkNCksCisJWigweDVhKSwgWigweDgzKSwgWigweGJmKSwgWigweDkyKSwgWigweDFiKSwgWigweDk0KSwgWigweDAwKSwgWigweDQyKSwKKwlaKDB4Y2YpLCBaKDB4NGIpLCBaKDB4MDApLCBaKDB4NzUpLCBaKDB4YmEpLCBaKDB4OGYpLCBaKDB4NzYpLCBaKDB4NWYpLAorCVooMHg1ZCksIFooMHgzYSksIFooMHg0ZCksIFooMHgwOSksIFooMHgxMiksIFooMHgwOCksIFooMHgzOCksIFooMHg5NSksCisJWigweDE3KSwgWigweGU0KSwgWigweDAxKSwgWigweDFkKSwgWigweDRjKSwgWigweGE5KSwgWigweGNjKSwgWigweDg1KSwKKwlaKDB4ODIpLCBaKDB4NGMpLCBaKDB4OWQpLCBaKDB4MmYpLCBaKDB4M2IpLCBaKDB4NjYpLCBaKDB4YTEpLCBaKDB4MzQpLAorCVooMHgxMCksIFooMHhjZCksIFooMHg1OSksIFooMHg4OSksIFooMHhhNSksIFooMHgzMSksIFooMHhjZiksIFooMHgwNSksCisJWigweGM4KSwgWigweDg0KSwgWigweGZhKSwgWigweGM3KSwgWigweGJhKSwgWigweDRlKSwgWigweDhiKSwgWigweDFhKSwKKwlaKDB4MTkpLCBaKDB4ZjEpLCBaKDB4YTEpLCBaKDB4M2IpLCBaKDB4MTgpLCBaKDB4MTIpLCBaKDB4MTcpLCBaKDB4YjApLAorCVooMHg5OCksIFooMHg4ZCksIFooMHgwYiksIFooMHgyMyksIFooMHhjMyksIFooMHgzYSksIFooMHgyZCksIFooMHgyMCksCisJWigweGRmKSwgWigweDEzKSwgWigweGEwKSwgWigweGE4KSwgWigweDRjKSwgWigweDBkKSwgWigweDZjKSwgWigweDJmKSwKKwlaKDB4NDcpLCBaKDB4MTMpLCBaKDB4MTMpLCBaKDB4NTIpLCBaKDB4MWYpLCBaKDB4MmQpLCBaKDB4ZjUpLCBaKDB4NzkpLAorCVooMHgzZCksIFooMHhhMiksIFooMHg1NCksIFooMHhiZCksIFooMHg2OSksIFooMHhjOCksIFooMHg2YiksIFooMHhmMyksCisJWigweDA1KSwgWigweDI4KSwgWigweGYxKSwgWigweDE2KSwgWigweDQ2KSwgWigweDQwKSwgWigweGIwKSwgWigweDExKSwKKwlaKDB4ZDMpLCBaKDB4YjcpLCBaKDB4OTUpLCBaKDB4NDkpLCBaKDB4Y2YpLCBaKDB4YzMpLCBaKDB4MWQpLCBaKDB4OGYpLAorCVooMHhkOCksIFooMHhlMSksIFooMHg3MyksIFooMHhkYiksIFooMHhhZCksIFooMHhjOCksIFooMHhjOSksIFooMHhhOSksCisJWigweGExKSwgWigweGMyKSwgWigweGM1KSwgWigweGUzKSwgWigweGJhKSwgWigweGZjKSwgWigweDBlKSwgWigweDI1KQorfTsKKworLyoKKyAqIFRoaXMgaXMgYSAxNiByb3VuZCBGZWlzdGVsIG5ldHdvcmsgd2l0aCBwZXJtdXRhdGlvbiBGX0VOQ1JZUFQKKyAqLworI2RlZmluZSBGX0VOQ1JZUFQoUiwgTCwgc2NoZWQpCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwl1bmlvbiBsYzQgeyB1MzIgbDsgdTggY1s0XTsgfSB1OwkJCQlcCisJdS5sID0gc2NoZWQgXiBSOwkJCQkJCVwKKwlMIF49IHNib3gwW3UuY1swXV0gXiBzYm94MVt1LmNbMV1dIF4gc2JveDJbdS5jWzJdXSBeIHNib3gzW3UuY1szXV07IFwKK30gd2hpbGUoMCkKKworLyoKKyAqIGVuY3J5cHRvcgorICovCitzdGF0aWMgdm9pZCBmY3J5cHRfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoreworCWNvbnN0IHN0cnVjdCBmY3J5cHRfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXN0cnVjdCB7CisJCXUzMiBsLCByOworCX0gWDsKKworCW1lbWNweSgmWCwgc3JjLCBzaXplb2YoWCkpOworCisJRl9FTkNSWVBUKFguciwgWC5sLCBjdHgtPnNjaGVkWzB4MF0pOworCUZfRU5DUllQVChYLmwsIFguciwgY3R4LT5zY2hlZFsweDFdKTsKKwlGX0VOQ1JZUFQoWC5yLCBYLmwsIGN0eC0+c2NoZWRbMHgyXSk7CisJRl9FTkNSWVBUKFgubCwgWC5yLCBjdHgtPnNjaGVkWzB4M10pOworCUZfRU5DUllQVChYLnIsIFgubCwgY3R4LT5zY2hlZFsweDRdKTsKKwlGX0VOQ1JZUFQoWC5sLCBYLnIsIGN0eC0+c2NoZWRbMHg1XSk7CisJRl9FTkNSWVBUKFguciwgWC5sLCBjdHgtPnNjaGVkWzB4Nl0pOworCUZfRU5DUllQVChYLmwsIFguciwgY3R4LT5zY2hlZFsweDddKTsKKwlGX0VOQ1JZUFQoWC5yLCBYLmwsIGN0eC0+c2NoZWRbMHg4XSk7CisJRl9FTkNSWVBUKFgubCwgWC5yLCBjdHgtPnNjaGVkWzB4OV0pOworCUZfRU5DUllQVChYLnIsIFgubCwgY3R4LT5zY2hlZFsweGFdKTsKKwlGX0VOQ1JZUFQoWC5sLCBYLnIsIGN0eC0+c2NoZWRbMHhiXSk7CisJRl9FTkNSWVBUKFguciwgWC5sLCBjdHgtPnNjaGVkWzB4Y10pOworCUZfRU5DUllQVChYLmwsIFguciwgY3R4LT5zY2hlZFsweGRdKTsKKwlGX0VOQ1JZUFQoWC5yLCBYLmwsIGN0eC0+c2NoZWRbMHhlXSk7CisJRl9FTkNSWVBUKFgubCwgWC5yLCBjdHgtPnNjaGVkWzB4Zl0pOworCisJbWVtY3B5KGRzdCwgJlgsIHNpemVvZihYKSk7Cit9CisKKy8qCisgKiBkZWNyeXB0b3IKKyAqLworc3RhdGljIHZvaWQgZmNyeXB0X2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3sKKwljb25zdCBzdHJ1Y3QgZmNyeXB0X2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwlzdHJ1Y3QgeworCQl1MzIgbCwgcjsKKwl9IFg7CisKKwltZW1jcHkoJlgsIHNyYywgc2l6ZW9mKFgpKTsKKworCUZfRU5DUllQVChYLmwsIFguciwgY3R4LT5zY2hlZFsweGZdKTsKKwlGX0VOQ1JZUFQoWC5yLCBYLmwsIGN0eC0+c2NoZWRbMHhlXSk7CisJRl9FTkNSWVBUKFgubCwgWC5yLCBjdHgtPnNjaGVkWzB4ZF0pOworCUZfRU5DUllQVChYLnIsIFgubCwgY3R4LT5zY2hlZFsweGNdKTsKKwlGX0VOQ1JZUFQoWC5sLCBYLnIsIGN0eC0+c2NoZWRbMHhiXSk7CisJRl9FTkNSWVBUKFguciwgWC5sLCBjdHgtPnNjaGVkWzB4YV0pOworCUZfRU5DUllQVChYLmwsIFguciwgY3R4LT5zY2hlZFsweDldKTsKKwlGX0VOQ1JZUFQoWC5yLCBYLmwsIGN0eC0+c2NoZWRbMHg4XSk7CisJRl9FTkNSWVBUKFgubCwgWC5yLCBjdHgtPnNjaGVkWzB4N10pOworCUZfRU5DUllQVChYLnIsIFgubCwgY3R4LT5zY2hlZFsweDZdKTsKKwlGX0VOQ1JZUFQoWC5sLCBYLnIsIGN0eC0+c2NoZWRbMHg1XSk7CisJRl9FTkNSWVBUKFguciwgWC5sLCBjdHgtPnNjaGVkWzB4NF0pOworCUZfRU5DUllQVChYLmwsIFguciwgY3R4LT5zY2hlZFsweDNdKTsKKwlGX0VOQ1JZUFQoWC5yLCBYLmwsIGN0eC0+c2NoZWRbMHgyXSk7CisJRl9FTkNSWVBUKFgubCwgWC5yLCBjdHgtPnNjaGVkWzB4MV0pOworCUZfRU5DUllQVChYLnIsIFgubCwgY3R4LT5zY2hlZFsweDBdKTsKKworCW1lbWNweShkc3QsICZYLCBzaXplb2YoWCkpOworfQorCisvKgorICogR2VuZXJhdGUgYSBrZXkgc2NoZWR1bGUgZnJvbSBrZXksIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgaW4gZWFjaCBrZXkgYnl0ZQorICogaXMgcGFyaXR5IGFuZCBzaGFsbCBiZSBpZ25vcmVkLiBUaGlzIGxlYXZlcyA1NiBzaWduaWZpY2FudCBiaXRzIGluIHRoZSBrZXkKKyAqIHRvIHNjYXR0ZXIgb3ZlciB0aGUgMTYga2V5IHNjaGVkdWxlcy4gRm9yIGVhY2ggc2NoZWR1bGUgZXh0cmFjdCB0aGUgbG93CisgKiBvcmRlciAzMiBiaXRzIGFuZCB1c2UgYXMgc2NoZWR1bGUsIHRoZW4gcm90YXRlIHJpZ2h0IGJ5IDExIGJpdHMuCisgKi8KK3N0YXRpYyBpbnQgZmNyeXB0X3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVjdCBmY3J5cHRfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisjaWYgQklUU19QRVJfTE9ORyA9PSA2NCAgLyogdGhlIDY0LWJpdCB2ZXJzaW9uIGNhbiBhbHNvIGJlIHVzZWQgZm9yIDMyLWJpdAorCQkJICAqIGtlcm5lbHMgLSBpdCBzZWVtcyB0byBiZSBmYXN0ZXIgYnV0IHRoZSBjb2RlIGlzCisJCQkgICogbGFyZ2VyICovCisKKwl1NjQgazsJLyogayBob2xkcyBhbGwgNTYgbm9uLXBhcml0eSBiaXRzICovCisKKwkvKiBkaXNjYXJkIHRoZSBwYXJpdHkgYml0cyAqLworCWsgPSAoKmtleSsrKSA+PiAxOworCWsgPDw9IDc7CisJayB8PSAoKmtleSsrKSA+PiAxOworCWsgPDw9IDc7CisJayB8PSAoKmtleSsrKSA+PiAxOworCWsgPDw9IDc7CisJayB8PSAoKmtleSsrKSA+PiAxOworCWsgPDw9IDc7CisJayB8PSAoKmtleSsrKSA+PiAxOworCWsgPDw9IDc7CisJayB8PSAoKmtleSsrKSA+PiAxOworCWsgPDw9IDc7CisJayB8PSAoKmtleSsrKSA+PiAxOworCWsgPDw9IDc7CisJayB8PSAoKmtleSkgPj4gMTsKKworCS8qIFVzZSBsb3dlciAzMiBiaXRzIGZvciBzY2hlZHVsZSwgcm90YXRlIGJ5IDExIGVhY2ggcm91bmQgKDE2IHRpbWVzKSAqLworCWN0eC0+c2NoZWRbMHgwXSA9IGJlMzJfdG9fY3B1KGspOyByb3I1Nl82NChrLCAxMSk7CisJY3R4LT5zY2hlZFsweDFdID0gYmUzMl90b19jcHUoayk7IHJvcjU2XzY0KGssIDExKTsKKwljdHgtPnNjaGVkWzB4Ml0gPSBiZTMyX3RvX2NwdShrKTsgcm9yNTZfNjQoaywgMTEpOworCWN0eC0+c2NoZWRbMHgzXSA9IGJlMzJfdG9fY3B1KGspOyByb3I1Nl82NChrLCAxMSk7CisJY3R4LT5zY2hlZFsweDRdID0gYmUzMl90b19jcHUoayk7IHJvcjU2XzY0KGssIDExKTsKKwljdHgtPnNjaGVkWzB4NV0gPSBiZTMyX3RvX2NwdShrKTsgcm9yNTZfNjQoaywgMTEpOworCWN0eC0+c2NoZWRbMHg2XSA9IGJlMzJfdG9fY3B1KGspOyByb3I1Nl82NChrLCAxMSk7CisJY3R4LT5zY2hlZFsweDddID0gYmUzMl90b19jcHUoayk7IHJvcjU2XzY0KGssIDExKTsKKwljdHgtPnNjaGVkWzB4OF0gPSBiZTMyX3RvX2NwdShrKTsgcm9yNTZfNjQoaywgMTEpOworCWN0eC0+c2NoZWRbMHg5XSA9IGJlMzJfdG9fY3B1KGspOyByb3I1Nl82NChrLCAxMSk7CisJY3R4LT5zY2hlZFsweGFdID0gYmUzMl90b19jcHUoayk7IHJvcjU2XzY0KGssIDExKTsKKwljdHgtPnNjaGVkWzB4Yl0gPSBiZTMyX3RvX2NwdShrKTsgcm9yNTZfNjQoaywgMTEpOworCWN0eC0+c2NoZWRbMHhjXSA9IGJlMzJfdG9fY3B1KGspOyByb3I1Nl82NChrLCAxMSk7CisJY3R4LT5zY2hlZFsweGRdID0gYmUzMl90b19jcHUoayk7IHJvcjU2XzY0KGssIDExKTsKKwljdHgtPnNjaGVkWzB4ZV0gPSBiZTMyX3RvX2NwdShrKTsgcm9yNTZfNjQoaywgMTEpOworCWN0eC0+c2NoZWRbMHhmXSA9IGJlMzJfdG9fY3B1KGspOworCisJcmV0dXJuIDA7CisjZWxzZQorCXUzMiBoaSwgbG87CQkvKiBoaSBpcyB1cHBlciAyNCBiaXRzIGFuZCBsbyBsb3dlciAzMiwgdG90YWwgNTYgKi8KKworCS8qIGRpc2NhcmQgdGhlIHBhcml0eSBiaXRzICovCisJbG8gPSAoKmtleSsrKSA+PiAxOworCWxvIDw8PSA3OworCWxvIHw9ICgqa2V5KyspID4+IDE7CisJbG8gPDw9IDc7CisJbG8gfD0gKCprZXkrKykgPj4gMTsKKwlsbyA8PD0gNzsKKwlsbyB8PSAoKmtleSsrKSA+PiAxOworCWhpID0gbG8gPj4gNDsKKwlsbyAmPSAweGY7CisJbG8gPDw9IDc7CisJbG8gfD0gKCprZXkrKykgPj4gMTsKKwlsbyA8PD0gNzsKKwlsbyB8PSAoKmtleSsrKSA+PiAxOworCWxvIDw8PSA3OworCWxvIHw9ICgqa2V5KyspID4+IDE7CisJbG8gPDw9IDc7CisJbG8gfD0gKCprZXkpID4+IDE7CisKKwkvKiBVc2UgbG93ZXIgMzIgYml0cyBmb3Igc2NoZWR1bGUsIHJvdGF0ZSBieSAxMSBlYWNoIHJvdW5kICgxNiB0aW1lcykgKi8KKwljdHgtPnNjaGVkWzB4MF0gPSBiZTMyX3RvX2NwdShsbyk7IHJvcjU2KGhpLCBsbywgMTEpOworCWN0eC0+c2NoZWRbMHgxXSA9IGJlMzJfdG9fY3B1KGxvKTsgcm9yNTYoaGksIGxvLCAxMSk7CisJY3R4LT5zY2hlZFsweDJdID0gYmUzMl90b19jcHUobG8pOyByb3I1NihoaSwgbG8sIDExKTsKKwljdHgtPnNjaGVkWzB4M10gPSBiZTMyX3RvX2NwdShsbyk7IHJvcjU2KGhpLCBsbywgMTEpOworCWN0eC0+c2NoZWRbMHg0XSA9IGJlMzJfdG9fY3B1KGxvKTsgcm9yNTYoaGksIGxvLCAxMSk7CisJY3R4LT5zY2hlZFsweDVdID0gYmUzMl90b19jcHUobG8pOyByb3I1NihoaSwgbG8sIDExKTsKKwljdHgtPnNjaGVkWzB4Nl0gPSBiZTMyX3RvX2NwdShsbyk7IHJvcjU2KGhpLCBsbywgMTEpOworCWN0eC0+c2NoZWRbMHg3XSA9IGJlMzJfdG9fY3B1KGxvKTsgcm9yNTYoaGksIGxvLCAxMSk7CisJY3R4LT5zY2hlZFsweDhdID0gYmUzMl90b19jcHUobG8pOyByb3I1NihoaSwgbG8sIDExKTsKKwljdHgtPnNjaGVkWzB4OV0gPSBiZTMyX3RvX2NwdShsbyk7IHJvcjU2KGhpLCBsbywgMTEpOworCWN0eC0+c2NoZWRbMHhhXSA9IGJlMzJfdG9fY3B1KGxvKTsgcm9yNTYoaGksIGxvLCAxMSk7CisJY3R4LT5zY2hlZFsweGJdID0gYmUzMl90b19jcHUobG8pOyByb3I1NihoaSwgbG8sIDExKTsKKwljdHgtPnNjaGVkWzB4Y10gPSBiZTMyX3RvX2NwdShsbyk7IHJvcjU2KGhpLCBsbywgMTEpOworCWN0eC0+c2NoZWRbMHhkXSA9IGJlMzJfdG9fY3B1KGxvKTsgcm9yNTYoaGksIGxvLCAxMSk7CisJY3R4LT5zY2hlZFsweGVdID0gYmUzMl90b19jcHUobG8pOyByb3I1NihoaSwgbG8sIDExKTsKKwljdHgtPnNjaGVkWzB4Zl0gPSBiZTMyX3RvX2NwdShsbyk7CisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGZjcnlwdF9hbGcgPSB7CisJLmNyYV9uYW1lCQk9CSJmY3J5cHQiLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQk4LAorCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGZjcnlwdF9jdHgpLAorCS5jcmFfbW9kdWxlCQk9CVRISVNfTU9EVUxFLAorCS5jcmFfYWxpZ25tYXNrCQk9CTMsCisJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGZjcnlwdF9hbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJCT0JeyAuY2lwaGVyID0geworCS5jaWFfbWluX2tleXNpemUJPQk4LAorCS5jaWFfbWF4X2tleXNpemUJPQk4LAorCS5jaWFfc2V0a2V5CQk9CWZjcnlwdF9zZXRrZXksCisJLmNpYV9lbmNyeXB0CQk9CWZjcnlwdF9lbmNyeXB0LAorCS5jaWFfZGVjcnlwdAkJPQlmY3J5cHRfZGVjcnlwdCB9IH0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX2FsZygmZmNyeXB0X2FsZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZmY3J5cHRfYWxnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGQ3J5cHQgQ2lwaGVyIEFsZ29yaXRobSIpOworTU9EVUxFX0FVVEhPUigiRGF2aWQgSG93ZWxscyA8ZGhvd2VsbHNAcmVkaGF0LmNvbT4iKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9oYXNoLmMgYi9jcnlwdG8vaGFzaC5jCmluZGV4IGNkZWMyM2QuLjEyYzQ1MTQgMTAwNjQ0Ci0tLSBhL2NyeXB0by9oYXNoLmMKKysrIGIvY3J5cHRvL2hhc2guYwpAQCAtMTYsMTIgKzE2LDEzIEBACiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi1zdGF0aWMgdW5zaWduZWQgaW50IGNyeXB0b19oYXNoX2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3J5cHRvX2hhc2hfY3R4c2l6ZShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLCB1MzIgdHlwZSwKKwkJCQkJdTMyIG1hc2spCiB7CiAJcmV0dXJuIGFsZy0+Y3JhX2N0eHNpemU7CiB9CiAKLXN0YXRpYyBpbnQgY3J5cHRvX2luaXRfaGFzaF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3N0YXRpYyBpbnQgY3J5cHRvX2luaXRfaGFzaF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIHR5cGUsIHUzMiBtYXNrKQogewogCXN0cnVjdCBoYXNoX3RmbSAqY3J0ID0gJnRmbS0+Y3J0X2hhc2g7CiAJc3RydWN0IGhhc2hfYWxnICphbGcgPSAmdGZtLT5fX2NydF9hbGctPmNyYV9oYXNoOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2htYWMuYyBiL2NyeXB0by9obWFjLmMKaW5kZXggYjUyMWJjZC4uNDQxODdjNSAxMDA2NDQKLS0tIGEvY3J5cHRvL2htYWMuYworKysgYi9jcnlwdG8vaG1hYy5jCkBAIC0xNzIsMTUgKzE3MiwxNiBAQAogCiBzdGF0aWMgaW50IGhtYWNfaW5pdF90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKKwlzdHJ1Y3QgY3J5cHRvX2hhc2ggKmhhc2g7CiAJc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCA9ICh2b2lkICopdGZtLT5fX2NydF9hbGc7CiAJc3RydWN0IGNyeXB0b19zcGF3biAqc3Bhd24gPSBjcnlwdG9faW5zdGFuY2VfY3R4KGluc3QpOwogCXN0cnVjdCBobWFjX2N0eCAqY3R4ID0gaG1hY19jdHgoX19jcnlwdG9faGFzaF9jYXN0KHRmbSkpOwogCi0JdGZtID0gY3J5cHRvX3NwYXduX3RmbShzcGF3bik7Ci0JaWYgKElTX0VSUih0Zm0pKQotCQlyZXR1cm4gUFRSX0VSUih0Zm0pOworCWhhc2ggPSBjcnlwdG9fc3Bhd25faGFzaChzcGF3bik7CisJaWYgKElTX0VSUihoYXNoKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFzaCk7CiAKLQljdHgtPmNoaWxkID0gY3J5cHRvX2hhc2hfY2FzdCh0Zm0pOworCWN0eC0+Y2hpbGQgPSBoYXNoOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9jcnlwdG8vaW50ZXJuYWwuaCBiL2NyeXB0by9pbnRlcm5hbC5oCmluZGV4IDJkYTZhZDQuLjYwYWNhZDkgMTAwNjQ0Ci0tLSBhL2NyeXB0by9pbnRlcm5hbC5oCisrKyBiL2NyeXB0by9pbnRlcm5hbC5oCkBAIC04Myw4ICs4Myw3IEBACiB7IH0KICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fZGlnZXN0X2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZywKLQkJCQkJCSBpbnQgZmxhZ3MpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fZGlnZXN0X2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKIHsKIAl1bnNpZ25lZCBpbnQgbGVuID0gYWxnLT5jcmFfY3R4c2l6ZTsKIApAQCAtOTYsMjMgKzk1LDEyIEBACiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2NpcGhlcl9jdHhzaXplKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsCi0JCQkJCQkgaW50IGZsYWdzKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2NpcGhlcl9jdHhzaXplKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCiB7Ci0JdW5zaWduZWQgaW50IGxlbiA9IGFsZy0+Y3JhX2N0eHNpemU7Ci0JCi0Jc3dpdGNoIChmbGFncyAmIENSWVBUT19URk1fTU9ERV9NQVNLKSB7Ci0JY2FzZSBDUllQVE9fVEZNX01PREVfQ0JDOgotCQlsZW4gPSBBTElHTihsZW4sICh1bnNpZ25lZCBsb25nKWFsZy0+Y3JhX2FsaWdubWFzayArIDEpOwotCQlsZW4gKz0gYWxnLT5jcmFfYmxvY2tzaXplOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gbGVuOworCXJldHVybiBhbGctPmNyYV9jdHhzaXplOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fY29tcHJlc3NfY3R4c2l6ZShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLAotCQkJCQkJICAgaW50IGZsYWdzKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2NvbXByZXNzX2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKIHsKIAlyZXR1cm4gYWxnLT5jcmFfY3R4c2l6ZTsKIH0KQEAgLTEyMSwxMCArMTA5LDYgQEAKIHN0cnVjdCBjcnlwdG9fYWxnICpfX2NyeXB0b19hbGdfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzayk7CiBzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19tb2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzayk7CiAKLWludCBjcnlwdG9faW5pdF9kaWdlc3RfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKLWludCBjcnlwdG9faW5pdF9jaXBoZXJfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKLWludCBjcnlwdG9faW5pdF9jb21wcmVzc19mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOwotCiBpbnQgY3J5cHRvX2luaXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKIGludCBjcnlwdG9faW5pdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwogaW50IGNyeXB0b19pbml0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKQEAgLTEzNiw3ICsxMjAsOCBAQAogdm9pZCBjcnlwdG9fbGFydmFsX2Vycm9yKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzayk7CiAKIHZvaWQgY3J5cHRvX3Nob290X2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKLXN0cnVjdCBjcnlwdG9fdGZtICpfX2NyeXB0b19hbGxvY190Zm0oc3RydWN0IGNyeXB0b19hbGcgKmFsZywgdTMyIGZsYWdzKTsKK3N0cnVjdCBjcnlwdG9fdGZtICpfX2NyeXB0b19hbGxvY190Zm0oc3RydWN0IGNyeXB0b19hbGcgKmFsZywgdTMyIHR5cGUsCisJCQkJICAgICAgdTMyIG1hc2spOwogCiBpbnQgY3J5cHRvX3JlZ2lzdGVyX2luc3RhbmNlKHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgKnRtcGwsCiAJCQkgICAgIHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2xydy5jIGIvY3J5cHRvL2xydy5jCmluZGV4IDU2NjQyNTguLmI0MTA1MDggMTAwNjQ0Ci0tLSBhL2NyeXB0by9scncuYworKysgYi9jcnlwdG8vbHJ3LmMKQEAgLTIwMSwyMSArMjAxLDIyIEBACiAKIHN0YXRpYyBpbnQgaW5pdF90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqY2lwaGVyOwogCXN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QgPSAodm9pZCAqKXRmbS0+X19jcnRfYWxnOwogCXN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduID0gY3J5cHRvX2luc3RhbmNlX2N0eChpbnN0KTsKIAlzdHJ1Y3QgcHJpdiAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAl1MzIgKmZsYWdzID0gJnRmbS0+Y3J0X2ZsYWdzOwogCi0JdGZtID0gY3J5cHRvX3NwYXduX3RmbShzcGF3bik7Ci0JaWYgKElTX0VSUih0Zm0pKQotCQlyZXR1cm4gUFRSX0VSUih0Zm0pOworCWNpcGhlciA9IGNyeXB0b19zcGF3bl9jaXBoZXIoc3Bhd24pOworCWlmIChJU19FUlIoY2lwaGVyKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2lwaGVyKTsKIAotCWlmIChjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSAhPSAxNikgeworCWlmIChjcnlwdG9fY2lwaGVyX2Jsb2Nrc2l6ZShjaXBoZXIpICE9IDE2KSB7CiAJCSpmbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfQkxPQ0tfTEVOOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQljdHgtPmNoaWxkID0gY3J5cHRvX2NpcGhlcl9jYXN0KHRmbSk7CisJY3R4LT5jaGlsZCA9IGNpcGhlcjsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvY3J5cHRvL3BjYmMuYyBiL2NyeXB0by9wY2JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3NGQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9wY2JjLmMKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKiBQQ0JDOiBQcm9wYWdhdGluZyBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgbW9kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogRGVyaXZlZCBmcm9tIGNiYy5jCisgKiAtIENvcHlyaWdodCAoYykgMjAwNiBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNyeXB0by9hbGdhcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKK3N0cnVjdCBjcnlwdG9fcGNiY19jdHggeworCXN0cnVjdCBjcnlwdG9fY2lwaGVyICpjaGlsZDsKKwl2b2lkICgqeG9yKSh1OCAqZHN0LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgYnMpOworfTsKKworc3RhdGljIGludCBjcnlwdG9fcGNiY19zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnBhcmVudCwgY29uc3QgdTggKmtleSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJc3RydWN0IGNyeXB0b19wY2JjX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgocGFyZW50KTsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqY2hpbGQgPSBjdHgtPmNoaWxkOworCWludCBlcnI7CisKKwljcnlwdG9fY2lwaGVyX2NsZWFyX2ZsYWdzKGNoaWxkLCBDUllQVE9fVEZNX1JFUV9NQVNLKTsKKwljcnlwdG9fY2lwaGVyX3NldF9mbGFncyhjaGlsZCwgY3J5cHRvX3RmbV9nZXRfZmxhZ3MocGFyZW50KSAmCisJCQkJQ1JZUFRPX1RGTV9SRVFfTUFTSyk7CisJZXJyID0gY3J5cHRvX2NpcGhlcl9zZXRrZXkoY2hpbGQsIGtleSwga2V5bGVuKTsKKwljcnlwdG9fdGZtX3NldF9mbGFncyhwYXJlbnQsIGNyeXB0b19jaXBoZXJfZ2V0X2ZsYWdzKGNoaWxkKSAmCisJCQkgICAgIENSWVBUT19URk1fUkVTX01BU0spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX3BjYmNfZW5jcnlwdF9zZWdtZW50KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkgICAgICAgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrLAorCQkJCSAgICAgICBzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLAorCQkJCSAgICAgICB2b2lkICgqeG9yKSh1OCAqLCBjb25zdCB1OCAqLAorCQkJCQkJICAgdW5zaWduZWQgaW50KSkKK3sKKwl2b2lkICgqZm4pKHN0cnVjdCBjcnlwdG9fdGZtICosIHU4ICosIGNvbnN0IHU4ICopID0KKwkJY3J5cHRvX2NpcGhlcl9hbGcodGZtKS0+Y2lhX2VuY3J5cHQ7CisJaW50IGJzaXplID0gY3J5cHRvX2NpcGhlcl9ibG9ja3NpemUodGZtKTsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gd2Fsay0+bmJ5dGVzOworCXU4ICpzcmMgPSB3YWxrLT5zcmMudmlydC5hZGRyOworCXU4ICpkc3QgPSB3YWxrLT5kc3QudmlydC5hZGRyOworCXU4ICppdiA9IHdhbGstPml2OworCisJZG8geworCQl4b3IoaXYsIHNyYywgYnNpemUpOworCQlmbihjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pLCBkc3QsIGl2KTsKKwkJbWVtY3B5KGl2LCBkc3QsIGJzaXplKTsKKwkJeG9yKGl2LCBzcmMsIGJzaXplKTsKKworCQlzcmMgKz0gYnNpemU7CisJCWRzdCArPSBic2l6ZTsKKwl9IHdoaWxlICgobmJ5dGVzIC09IGJzaXplKSA+PSBic2l6ZSk7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgaW50IGNyeXB0b19wY2JjX2VuY3J5cHRfaW5wbGFjZShzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJICAgICAgIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaywKKwkJCQkgICAgICAgc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwKKwkJCQkgICAgICAgdm9pZCAoKnhvcikodTggKiwgY29uc3QgdTggKiwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCkpCit7CisJdm9pZCAoKmZuKShzdHJ1Y3QgY3J5cHRvX3RmbSAqLCB1OCAqLCBjb25zdCB1OCAqKSA9CisJCWNyeXB0b19jaXBoZXJfYWxnKHRmbSktPmNpYV9lbmNyeXB0OworCWludCBic2l6ZSA9IGNyeXB0b19jaXBoZXJfYmxvY2tzaXplKHRmbSk7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKwl1OCAqc3JjID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKKwl1OCAqaXYgPSB3YWxrLT5pdjsKKwl1OCB0bXBidWZbYnNpemVdOworCisJZG8geworCQltZW1jcHkodG1wYnVmLCBzcmMsIGJzaXplKTsKKwkJeG9yKGl2LCB0bXBidWYsIGJzaXplKTsKKwkJZm4oY3J5cHRvX2NpcGhlcl90Zm0odGZtKSwgc3JjLCBpdik7CisJCW1lbWNweShpdiwgc3JjLCBic2l6ZSk7CisJCXhvcihpdiwgdG1wYnVmLCBic2l6ZSk7CisKKwkJc3JjICs9IGJzaXplOworCX0gd2hpbGUgKChuYnl0ZXMgLT0gYnNpemUpID49IGJzaXplKTsKKworCW1lbWNweSh3YWxrLT5pdiwgaXYsIGJzaXplKTsKKworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX3BjYmNfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSA9IGRlc2MtPnRmbTsKKwlzdHJ1Y3QgY3J5cHRvX3BjYmNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eCh0Zm0pOworCXN0cnVjdCBjcnlwdG9fY2lwaGVyICpjaGlsZCA9IGN0eC0+Y2hpbGQ7CisJdm9pZCAoKnhvcikodTggKiwgY29uc3QgdTggKiwgdW5zaWduZWQgaW50IGJzKSA9IGN0eC0+eG9yOworCWludCBlcnI7CisKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCWlmICh3YWxrLnNyYy52aXJ0LmFkZHIgPT0gd2Fsay5kc3QudmlydC5hZGRyKQorCQkJbmJ5dGVzID0gY3J5cHRvX3BjYmNfZW5jcnlwdF9pbnBsYWNlKGRlc2MsICZ3YWxrLCBjaGlsZCwKKwkJCQkJCQkgICAgIHhvcik7CisJCWVsc2UKKwkJCW5ieXRlcyA9IGNyeXB0b19wY2JjX2VuY3J5cHRfc2VnbWVudChkZXNjLCAmd2FsaywgY2hpbGQsCisJCQkJCQkJICAgICB4b3IpOworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCBuYnl0ZXMpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX3BjYmNfZGVjcnlwdF9zZWdtZW50KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkgICAgICAgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrLAorCQkJCSAgICAgICBzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLAorCQkJCSAgICAgICB2b2lkICgqeG9yKSh1OCAqLCBjb25zdCB1OCAqLAorCQkJCQkJICAgdW5zaWduZWQgaW50KSkKK3sKKwl2b2lkICgqZm4pKHN0cnVjdCBjcnlwdG9fdGZtICosIHU4ICosIGNvbnN0IHU4ICopID0KKwkJY3J5cHRvX2NpcGhlcl9hbGcodGZtKS0+Y2lhX2RlY3J5cHQ7CisJaW50IGJzaXplID0gY3J5cHRvX2NpcGhlcl9ibG9ja3NpemUodGZtKTsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gd2Fsay0+bmJ5dGVzOworCXU4ICpzcmMgPSB3YWxrLT5zcmMudmlydC5hZGRyOworCXU4ICpkc3QgPSB3YWxrLT5kc3QudmlydC5hZGRyOworCXU4ICppdiA9IHdhbGstPml2OworCisJZG8geworCQlmbihjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pLCBkc3QsIHNyYyk7CisJCXhvcihkc3QsIGl2LCBic2l6ZSk7CisJCW1lbWNweShpdiwgc3JjLCBic2l6ZSk7CisJCXhvcihpdiwgZHN0LCBic2l6ZSk7CisKKwkJc3JjICs9IGJzaXplOworCQlkc3QgKz0gYnNpemU7CisJfSB3aGlsZSAoKG5ieXRlcyAtPSBic2l6ZSkgPj0gYnNpemUpOworCisJbWVtY3B5KHdhbGstPml2LCBpdiwgYnNpemUpOworCisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIGludCBjcnlwdG9fcGNiY19kZWNyeXB0X2lucGxhY2Uoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAorCQkJCSAgICAgICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGssCisJCQkJICAgICAgIHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0sCisJCQkJICAgICAgIHZvaWQgKCp4b3IpKHU4ICosIGNvbnN0IHU4ICosCisJCQkJCQkgICB1bnNpZ25lZCBpbnQpKQoreworCXZvaWQgKCpmbikoc3RydWN0IGNyeXB0b190Zm0gKiwgdTggKiwgY29uc3QgdTggKikgPQorCQljcnlwdG9fY2lwaGVyX2FsZyh0Zm0pLT5jaWFfZGVjcnlwdDsKKwlpbnQgYnNpemUgPSBjcnlwdG9fY2lwaGVyX2Jsb2Nrc2l6ZSh0Zm0pOworCXVuc2lnbmVkIGludCBuYnl0ZXMgPSB3YWxrLT5uYnl0ZXM7CisJdTggKnNyYyA9IHdhbGstPnNyYy52aXJ0LmFkZHI7CisJdTggKml2ID0gd2Fsay0+aXY7CisJdTggdG1wYnVmW2JzaXplXTsKKworCWRvIHsKKwkJbWVtY3B5KHRtcGJ1Ziwgc3JjLCBic2l6ZSk7CisJCWZuKGNyeXB0b19jaXBoZXJfdGZtKHRmbSksIHNyYywgc3JjKTsKKwkJeG9yKHNyYywgaXYsIGJzaXplKTsKKwkJbWVtY3B5KGl2LCB0bXBidWYsIGJzaXplKTsKKwkJeG9yKGl2LCBzcmMsIGJzaXplKTsKKworCQlzcmMgKz0gYnNpemU7CisJfSB3aGlsZSAoKG5ieXRlcyAtPSBic2l6ZSkgPj0gYnNpemUpOworCisJbWVtY3B5KHdhbGstPml2LCBpdiwgYnNpemUpOworCisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIGludCBjcnlwdG9fcGNiY19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtID0gZGVzYy0+dGZtOworCXN0cnVjdCBjcnlwdG9fcGNiY19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KHRmbSk7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKmNoaWxkID0gY3R4LT5jaGlsZDsKKwl2b2lkICgqeG9yKSh1OCAqLCBjb25zdCB1OCAqLCB1bnNpZ25lZCBpbnQgYnMpID0gY3R4LT54b3I7CisJaW50IGVycjsKKworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCWVyciA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgJndhbGspOworCisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLm5ieXRlcykpIHsKKwkJaWYgKHdhbGsuc3JjLnZpcnQuYWRkciA9PSB3YWxrLmRzdC52aXJ0LmFkZHIpCisJCQluYnl0ZXMgPSBjcnlwdG9fcGNiY19kZWNyeXB0X2lucGxhY2UoZGVzYywgJndhbGssIGNoaWxkLAorCQkJCQkJCSAgICAgeG9yKTsKKwkJZWxzZQorCQkJbmJ5dGVzID0gY3J5cHRvX3BjYmNfZGVjcnlwdF9zZWdtZW50KGRlc2MsICZ3YWxrLCBjaGlsZCwKKwkJCQkJCQkgICAgIHhvcik7CisJCWVyciA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgJndhbGssIG5ieXRlcyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgeG9yX2J5dGUodTggKmEsIGNvbnN0IHU4ICpiLCB1bnNpZ25lZCBpbnQgYnMpCit7CisJZG8geworCQkqYSsrIF49ICpiKys7CisJfSB3aGlsZSAoLS1icyk7Cit9CisKK3N0YXRpYyB2b2lkIHhvcl9xdWFkKHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBicykKK3sKKwl1MzIgKmEgPSAodTMyICopZHN0OworCXUzMiAqYiA9ICh1MzIgKilzcmM7CisKKwlkbyB7CisJCSphKysgXj0gKmIrKzsKKwl9IHdoaWxlICgoYnMgLT0gNCkpOworfQorCitzdGF0aWMgdm9pZCB4b3JfNjQodTggKmEsIGNvbnN0IHU4ICpiLCB1bnNpZ25lZCBpbnQgYnMpCit7CisJKCh1MzIgKilhKVswXSBePSAoKHUzMiAqKWIpWzBdOworCSgodTMyICopYSlbMV0gXj0gKCh1MzIgKiliKVsxXTsKK30KKworc3RhdGljIHZvaWQgeG9yXzEyOCh1OCAqYSwgY29uc3QgdTggKmIsIHVuc2lnbmVkIGludCBicykKK3sKKwkoKHUzMiAqKWEpWzBdIF49ICgodTMyICopYilbMF07CisJKCh1MzIgKilhKVsxXSBePSAoKHUzMiAqKWIpWzFdOworCSgodTMyICopYSlbMl0gXj0gKCh1MzIgKiliKVsyXTsKKwkoKHUzMiAqKWEpWzNdIF49ICgodTMyICopYilbM107Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX3BjYmNfaW5pdF90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0ID0gKHZvaWQgKil0Zm0tPl9fY3J0X2FsZzsKKwlzdHJ1Y3QgY3J5cHRvX3NwYXduICpzcGF3biA9IGNyeXB0b19pbnN0YW5jZV9jdHgoaW5zdCk7CisJc3RydWN0IGNyeXB0b19wY2JjX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqY2lwaGVyOworCisJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSkgeworCWNhc2UgODoKKwkJY3R4LT54b3IgPSB4b3JfNjQ7CisJCWJyZWFrOworCisJY2FzZSAxNjoKKwkJY3R4LT54b3IgPSB4b3JfMTI4OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmIChjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSAlIDQpCisJCQljdHgtPnhvciA9IHhvcl9ieXRlOworCQllbHNlCisJCQljdHgtPnhvciA9IHhvcl9xdWFkOworCX0KKworCWNpcGhlciA9IGNyeXB0b19zcGF3bl9jaXBoZXIoc3Bhd24pOworCWlmIChJU19FUlIoY2lwaGVyKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2lwaGVyKTsKKworCWN0eC0+Y2hpbGQgPSBjaXBoZXI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNyeXB0b19wY2JjX2V4aXRfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNyeXB0b19wY2JjX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwljcnlwdG9fZnJlZV9jaXBoZXIoY3R4LT5jaGlsZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICpjcnlwdG9fcGNiY19hbGxvYyh2b2lkICpwYXJhbSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0OworCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7CisKKwlhbGcgPSBjcnlwdG9fZ2V0X2F0dHJfYWxnKHBhcmFtLCBsZW4sIENSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisJCQkJICBDUllQVE9fQUxHX1RZUEVfTUFTSyB8IENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIoYWxnKSkKKwkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhbGcpKTsKKworCWluc3QgPSBjcnlwdG9fYWxsb2NfaW5zdGFuY2UoInBjYmMiLCBhbGcpOworCWlmIChJU19FUlIoaW5zdCkpCisJCWdvdG8gb3V0X3B1dF9hbGc7CisKKwlpbnN0LT5hbGcuY3JhX2ZsYWdzID0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUjsKKwlpbnN0LT5hbGcuY3JhX3ByaW9yaXR5ID0gYWxnLT5jcmFfcHJpb3JpdHk7CisJaW5zdC0+YWxnLmNyYV9ibG9ja3NpemUgPSBhbGctPmNyYV9ibG9ja3NpemU7CisJaW5zdC0+YWxnLmNyYV9hbGlnbm1hc2sgPSBhbGctPmNyYV9hbGlnbm1hc2s7CisJaW5zdC0+YWxnLmNyYV90eXBlID0gJmNyeXB0b19ibGtjaXBoZXJfdHlwZTsKKworCWlmICghKGFsZy0+Y3JhX2Jsb2Nrc2l6ZSAlIDQpKQorCQlpbnN0LT5hbGcuY3JhX2FsaWdubWFzayB8PSAzOworCWluc3QtPmFsZy5jcmFfYmxrY2lwaGVyLml2c2l6ZSA9IGFsZy0+Y3JhX2Jsb2Nrc2l6ZTsKKwlpbnN0LT5hbGcuY3JhX2Jsa2NpcGhlci5taW5fa2V5c2l6ZSA9IGFsZy0+Y3JhX2NpcGhlci5jaWFfbWluX2tleXNpemU7CisJaW5zdC0+YWxnLmNyYV9ibGtjaXBoZXIubWF4X2tleXNpemUgPSBhbGctPmNyYV9jaXBoZXIuY2lhX21heF9rZXlzaXplOworCisJaW5zdC0+YWxnLmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCBjcnlwdG9fcGNiY19jdHgpOworCisJaW5zdC0+YWxnLmNyYV9pbml0ID0gY3J5cHRvX3BjYmNfaW5pdF90Zm07CisJaW5zdC0+YWxnLmNyYV9leGl0ID0gY3J5cHRvX3BjYmNfZXhpdF90Zm07CisKKwlpbnN0LT5hbGcuY3JhX2Jsa2NpcGhlci5zZXRrZXkgPSBjcnlwdG9fcGNiY19zZXRrZXk7CisJaW5zdC0+YWxnLmNyYV9ibGtjaXBoZXIuZW5jcnlwdCA9IGNyeXB0b19wY2JjX2VuY3J5cHQ7CisJaW5zdC0+YWxnLmNyYV9ibGtjaXBoZXIuZGVjcnlwdCA9IGNyeXB0b19wY2JjX2RlY3J5cHQ7CisKK291dF9wdXRfYWxnOgorCWNyeXB0b19tb2RfcHV0KGFsZyk7CisJcmV0dXJuIGluc3Q7Cit9CisKK3N0YXRpYyB2b2lkIGNyeXB0b19wY2JjX2ZyZWUoc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCkKK3sKKwljcnlwdG9fZHJvcF9zcGF3bihjcnlwdG9faW5zdGFuY2VfY3R4KGluc3QpKTsKKwlrZnJlZShpbnN0KTsKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgY3J5cHRvX3BjYmNfdG1wbCA9IHsKKwkubmFtZSA9ICJwY2JjIiwKKwkuYWxsb2MgPSBjcnlwdG9fcGNiY19hbGxvYywKKwkuZnJlZSA9IGNyeXB0b19wY2JjX2ZyZWUsCisJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3J5cHRvX3BjYmNfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX3RlbXBsYXRlKCZjcnlwdG9fcGNiY190bXBsKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNyeXB0b19wY2JjX21vZHVsZV9leGl0KHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfdGVtcGxhdGUoJmNyeXB0b19wY2JjX3RtcGwpOworfQorCittb2R1bGVfaW5pdChjcnlwdG9fcGNiY19tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChjcnlwdG9fcGNiY19tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENCQyBibG9jayBjaXBoZXIgYWxnb3JpdGhtIik7CmRpZmYgLS1naXQgYS9jcnlwdG8vdGNyeXB0LmMgYi9jcnlwdG8vdGNyeXB0LmMKaW5kZXggZDY3MWU4OTQuLmY1ZTlkYTMgMTAwNjQ0Ci0tLSBhL2NyeXB0by90Y3J5cHQuYworKysgYi9jcnlwdG8vdGNyeXB0LmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICoKKyAqIDIwMDYtMTItMDcgQWRkZWQgU0hBMzg0IEhNQUMgYW5kIFNIQTUxMiBITUFDIHRlc3RzCiAgKiAyMDA0LTA4LTA5IEFkZGVkIGNpcGhlciBzcGVlZCB0ZXN0cyAoUmV5ayBGbG9ldGVyIDxyZXlrQHZhbnRyb25peC5uZXQ+KQogICogMjAwMy0wOS0xNCBSZXdyaXR0ZW4gYnkgS2FydGlrZXkgTWFoZW5kcmEgQmhhdHQKICAqCkBAIC03MSw3ICs3Miw4IEBACiAJImRlcyIsICJtZDUiLCAiZGVzM19lZGUiLCAicm90MTMiLCAic2hhMSIsICJzaGEyNTYiLCAiYmxvd2Zpc2giLAogCSJ0d29maXNoIiwgInNlcnBlbnQiLCAic2hhMzg0IiwgInNoYTUxMiIsICJtZDQiLCAiYWVzIiwgImNhc3Q2IiwKIAkiYXJjNCIsICJtaWNoYWVsX21pYyIsICJkZWZsYXRlIiwgImNyYzMyYyIsICJ0ZWEiLCAieHRlYSIsCi0JImtoYXphZCIsICJ3cDUxMiIsICJ3cDM4NCIsICJ3cDI1NiIsICJ0bmVwcmVzIiwgInhldGEiLCBOVUxMCisJImtoYXphZCIsICJ3cDUxMiIsICJ3cDM4NCIsICJ3cDI1NiIsICJ0bmVwcmVzIiwgInhldGEiLCAgImZjcnlwdCIsCisJImNhbWVsbGlhIiwgTlVMTAogfTsKIAogc3RhdGljIHZvaWQgaGV4ZHVtcCh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBsZW4pCkBAIC03NjUsNyArNzY3LDcgQEAKIAltZW1jcHkodHZtZW0sIGRlZmxhdGVfY29tcF90dl90ZW1wbGF0ZSwgdHNpemUpOwogCXR2ID0gKHZvaWQgKil0dm1lbTsKIAotCXRmbSA9IGNyeXB0b19hbGxvY190Zm0oImRlZmxhdGUiLCAwKTsKKwl0Zm0gPSBjcnlwdG9fYWxsb2NfY29tcCgiZGVmbGF0ZSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOwogCWlmICh0Zm0gPT0gTlVMTCkgewogCQlwcmludGsoImZhaWxlZCB0byBsb2FkIHRyYW5zZm9ybSBmb3IgZGVmbGF0ZVxuIik7CiAJCXJldHVybjsKQEAgLTk2NCw2ICs5NjYsMjYgQEAKIAkJdGVzdF9jaXBoZXIoImVjYih4ZXRhKSIsIERFQ1JZUFQsIHhldGFfZGVjX3R2X3RlbXBsYXRlLAogCQkJICAgIFhFVEFfREVDX1RFU1RfVkVDVE9SUyk7CiAKKwkJLy9GQ3J5cHQKKwkJdGVzdF9jaXBoZXIoInBjYmMoZmNyeXB0KSIsIEVOQ1JZUFQsIGZjcnlwdF9wY2JjX2VuY190dl90ZW1wbGF0ZSwKKwkJCSAgICBGQ1JZUFRfRU5DX1RFU1RfVkVDVE9SUyk7CisJCXRlc3RfY2lwaGVyKCJwY2JjKGZjcnlwdCkiLCBERUNSWVBULCBmY3J5cHRfcGNiY19kZWNfdHZfdGVtcGxhdGUsCisJCQkgICAgRkNSWVBUX0RFQ19URVNUX1ZFQ1RPUlMpOworCisJCS8vQ0FNRUxMSUEKKwkJdGVzdF9jaXBoZXIoImVjYihjYW1lbGxpYSkiLCBFTkNSWVBULAorCQkJICAgIGNhbWVsbGlhX2VuY190dl90ZW1wbGF0ZSwKKwkJCSAgICBDQU1FTExJQV9FTkNfVEVTVF9WRUNUT1JTKTsKKwkJdGVzdF9jaXBoZXIoImVjYihjYW1lbGxpYSkiLCBERUNSWVBULAorCQkJICAgIGNhbWVsbGlhX2RlY190dl90ZW1wbGF0ZSwKKwkJCSAgICBDQU1FTExJQV9ERUNfVEVTVF9WRUNUT1JTKTsKKwkJdGVzdF9jaXBoZXIoImNiYyhjYW1lbGxpYSkiLCBFTkNSWVBULAorCQkJICAgIGNhbWVsbGlhX2NiY19lbmNfdHZfdGVtcGxhdGUsCisJCQkgICAgQ0FNRUxMSUFfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2NpcGhlcigiY2JjKGNhbWVsbGlhKSIsIERFQ1JZUFQsCisJCQkgICAgY2FtZWxsaWFfY2JjX2RlY190dl90ZW1wbGF0ZSwKKwkJCSAgICBDQU1FTExJQV9DQkNfREVDX1RFU1RfVkVDVE9SUyk7CisKIAkJdGVzdF9oYXNoKCJzaGEzODQiLCBzaGEzODRfdHZfdGVtcGxhdGUsIFNIQTM4NF9URVNUX1ZFQ1RPUlMpOwogCQl0ZXN0X2hhc2goInNoYTUxMiIsIHNoYTUxMl90dl90ZW1wbGF0ZSwgU0hBNTEyX1RFU1RfVkVDVE9SUyk7CiAJCXRlc3RfaGFzaCgid3A1MTIiLCB3cDUxMl90dl90ZW1wbGF0ZSwgV1A1MTJfVEVTVF9WRUNUT1JTKTsKQEAgLTk4MCw2ICsxMDAyLDEwIEBACiAJCQkgIEhNQUNfU0hBMV9URVNUX1ZFQ1RPUlMpOwogCQl0ZXN0X2hhc2goImhtYWMoc2hhMjU2KSIsIGhtYWNfc2hhMjU2X3R2X3RlbXBsYXRlLAogCQkJICBITUFDX1NIQTI1Nl9URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2hhc2goImhtYWMoc2hhMzg0KSIsIGhtYWNfc2hhMzg0X3R2X3RlbXBsYXRlLAorCQkJICBITUFDX1NIQTM4NF9URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2hhc2goImhtYWMoc2hhNTEyKSIsIGhtYWNfc2hhNTEyX3R2X3RlbXBsYXRlLAorCQkJICBITUFDX1NIQTUxMl9URVNUX1ZFQ1RPUlMpOwogCiAJCXRlc3RfaGFzaCgieGNiYyhhZXMpIiwgYWVzX3hjYmMxMjhfdHZfdGVtcGxhdGUsCiAJCQkgIFhDQkNfQUVTX1RFU1RfVkVDVE9SUyk7CkBAIC0xMTc3LDYgKzEyMDMsMjggQEAKIAkJCSAgICBYRVRBX0RFQ19URVNUX1ZFQ1RPUlMpOwogCQlicmVhazsKIAorCWNhc2UgMzE6CisJCXRlc3RfY2lwaGVyKCJwY2JjKGZjcnlwdCkiLCBFTkNSWVBULCBmY3J5cHRfcGNiY19lbmNfdHZfdGVtcGxhdGUsCisJCQkgICAgRkNSWVBUX0VOQ19URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2NpcGhlcigicGNiYyhmY3J5cHQpIiwgREVDUllQVCwgZmNyeXB0X3BjYmNfZGVjX3R2X3RlbXBsYXRlLAorCQkJICAgIEZDUllQVF9ERUNfVEVTVF9WRUNUT1JTKTsKKwkJYnJlYWs7CisKKwljYXNlIDMyOgorCQl0ZXN0X2NpcGhlcigiZWNiKGNhbWVsbGlhKSIsIEVOQ1JZUFQsCisJCQkgICAgY2FtZWxsaWFfZW5jX3R2X3RlbXBsYXRlLAorCQkJICAgIENBTUVMTElBX0VOQ19URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2NpcGhlcigiZWNiKGNhbWVsbGlhKSIsIERFQ1JZUFQsCisJCQkgICAgY2FtZWxsaWFfZGVjX3R2X3RlbXBsYXRlLAorCQkJICAgIENBTUVMTElBX0RFQ19URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2NpcGhlcigiY2JjKGNhbWVsbGlhKSIsIEVOQ1JZUFQsCisJCQkgICAgY2FtZWxsaWFfY2JjX2VuY190dl90ZW1wbGF0ZSwKKwkJCSAgICBDQU1FTExJQV9DQkNfRU5DX1RFU1RfVkVDVE9SUyk7CisJCXRlc3RfY2lwaGVyKCJjYmMoY2FtZWxsaWEpIiwgREVDUllQVCwKKwkJCSAgICBjYW1lbGxpYV9jYmNfZGVjX3R2X3RlbXBsYXRlLAorCQkJICAgIENBTUVMTElBX0NCQ19ERUNfVEVTVF9WRUNUT1JTKTsKKwkJYnJlYWs7CisKIAljYXNlIDEwMDoKIAkJdGVzdF9oYXNoKCJobWFjKG1kNSkiLCBobWFjX21kNV90dl90ZW1wbGF0ZSwKIAkJCSAgSE1BQ19NRDVfVEVTVF9WRUNUT1JTKTsKQEAgLTExOTIsNiArMTI0MCwxNiBAQAogCQkJICBITUFDX1NIQTI1Nl9URVNUX1ZFQ1RPUlMpOwogCQlicmVhazsKIAorCWNhc2UgMTAzOgorCQl0ZXN0X2hhc2goImhtYWMoc2hhMzg0KSIsIGhtYWNfc2hhMzg0X3R2X3RlbXBsYXRlLAorCQkJICBITUFDX1NIQTM4NF9URVNUX1ZFQ1RPUlMpOworCQlicmVhazsKKworCWNhc2UgMTA0OgorCQl0ZXN0X2hhc2goImhtYWMoc2hhNTEyKSIsIGhtYWNfc2hhNTEyX3R2X3RlbXBsYXRlLAorCQkJICBITUFDX1NIQTUxMl9URVNUX1ZFQ1RPUlMpOworCQlicmVhazsKKwogCiAJY2FzZSAyMDA6CiAJCXRlc3RfY2lwaGVyX3NwZWVkKCJlY2IoYWVzKSIsIEVOQ1JZUFQsIHNlYywgTlVMTCwgMCwKQEAgLTEyNjAsNiArMTMxOCwxNyBAQAogCQkJCSAgZGVzX3NwZWVkX3RlbXBsYXRlKTsKIAkJYnJlYWs7CiAKKwljYXNlIDIwNToKKwkJdGVzdF9jaXBoZXJfc3BlZWQoImVjYihjYW1lbGxpYSkiLCBFTkNSWVBULCBzZWMsIE5VTEwsIDAsCisJCQkJY2FtZWxsaWFfc3BlZWRfdGVtcGxhdGUpOworCQl0ZXN0X2NpcGhlcl9zcGVlZCgiZWNiKGNhbWVsbGlhKSIsIERFQ1JZUFQsIHNlYywgTlVMTCwgMCwKKwkJCQljYW1lbGxpYV9zcGVlZF90ZW1wbGF0ZSk7CisJCXRlc3RfY2lwaGVyX3NwZWVkKCJjYmMoY2FtZWxsaWEpIiwgRU5DUllQVCwgc2VjLCBOVUxMLCAwLAorCQkJCWNhbWVsbGlhX3NwZWVkX3RlbXBsYXRlKTsKKwkJdGVzdF9jaXBoZXJfc3BlZWQoImNiYyhjYW1lbGxpYSkiLCBERUNSWVBULCBzZWMsIE5VTEwsIDAsCisJCQkJY2FtZWxsaWFfc3BlZWRfdGVtcGxhdGUpOworCQlicmVhazsKKwogCWNhc2UgMzAwOgogCQkvKiBmYWxsIHRocm91Z2ggKi8KIApkaWZmIC0tZ2l0IGEvY3J5cHRvL3RjcnlwdC5oIGIvY3J5cHRvL3RjcnlwdC5oCmluZGV4IDQ4YTgxMzYuLjg4NzUyN2IgMTAwNjQ0Ci0tLSBhL2NyeXB0by90Y3J5cHQuaAorKysgYi9jcnlwdG8vdGNyeXB0LmgKQEAgLTEyLDYgKzEyLDcgQEAKICAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICoKKyAqIDIwMDYtMTItMDcgQWRkZWQgU0hBMzg0IEhNQUMgYW5kIFNIQTUxMiBITUFDIHRlc3RzCiAgKiAyMDA0LTA4LTA5IENpcGhlciBzcGVlZCB0ZXN0cyBieSBSZXlrIEZsb2V0ZXIgPHJleWtAdmFudHJvbml4Lm5ldD4KICAqIDIwMDMtMDktMTQgQ2hhbmdlcyBieSBLYXJ0aWtleSBNYWhlbmRyYSBCaGF0dAogICoKQEAgLTI3LDcgKzI4LDcgQEAKIAogc3RydWN0IGhhc2hfdGVzdHZlYyB7CiAJLyogb25seSB1c2VkIHdpdGgga2V5ZWQgaGFzaCBhbGdvcml0aG1zICovCi0JY2hhciBrZXlbMTI4XSBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oNCkpKTsKKwljaGFyIGtleVsxMzJdIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXyg0KSkpOwogCWNoYXIgcGxhaW50ZXh0WzI0MF07CiAJY2hhciBkaWdlc3RbTUFYX0RJR0VTVF9TSVpFXTsKIAl1bnNpZ25lZCBjaGFyIHRhcFtNQVhfVEFQXTsKQEAgLTEwMDIsNiArMTAwMywyNDggQEAKIH07CiAKIC8qCisgKiBTSEEzODQgSE1BQyB0ZXN0IHZlY3RvcnMgZnJvbSBSRkM0MjMxCisgKi8KKworI2RlZmluZSBITUFDX1NIQTM4NF9URVNUX1ZFQ1RPUlMJNAorCitzdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBobWFjX3NoYTM4NF90dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9IHsgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwKKwkJCSAgICAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLAorCQkJICAgIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIgfSwgLy8gKDIwIGJ5dGVzKQorCQkua3NpemUJPSAyMCwKKwkJLnBsYWludGV4dCA9IHsgMHg0OCwgMHg2OSwgMHgyMCwgMHg1NCwgMHg2OCwgMHg2NSwgMHg3MiwgMHg2NSB9LCAvLyAoIkhpIFRoZXJlIikKKwkJLnBzaXplCT0gOCwKKwkJLmRpZ2VzdAk9IHsgMHhhZiwgMHhkMCwgMHgzOSwgMHg0NCwgMHhkOCwgMHg0OCwgMHg5NSwgMHg2MiwKKwkJCSAgICAweDZiLCAweDA4LCAweDI1LCAweGY0LCAweGFiLCAweDQ2LCAweDkwLCAweDdmLAorCQkJICAgIDB4MTUsIDB4ZjksIDB4ZGEsIDB4ZGIsIDB4ZTQsIDB4MTAsIDB4MWUsIDB4YzYsCisJCQkgICAgMHg4MiwgMHhhYSwgMHgwMywgMHg0YywgMHg3YywgMHhlYiwgMHhjNSwgMHg5YywKKwkJCSAgICAweGZhLCAweGVhLCAweDllLCAweGE5LCAweDA3LCAweDZlLCAweGRlLCAweDdmLAorCQkJICAgIDB4NGEsIDB4ZjEsIDB4NTIsIDB4ZTgsIDB4YjIsIDB4ZmEsIDB4OWMsIDB4YjYgfSwKKwl9LCB7CisJCS5rZXkJPSB7IDB4NGEsIDB4NjUsIDB4NjYsIDB4NjUgfSwgLy8gKCJKZWZlIikKKwkJLmtzaXplCT0gNCwKKwkJLnBsYWludGV4dCA9IHsgMHg3NywgMHg2OCwgMHg2MSwgMHg3NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHgyMCwKKwkJCSAgICAgICAweDc5LCAweDYxLCAweDIwLCAweDc3LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAvLyAoIndoYXQgZG8geWEgd2FudCAiKQorCQkJICAgICAgIDB4NjYsIDB4NmYsIDB4NzIsIDB4MjAsIDB4NmUsIDB4NmYsIDB4NzQsIDB4NjgsCisJCQkgICAgICAgMHg2OSwgMHg2ZSwgMHg2NywgMHgzZiB9LCAvLyAoImZvciBub3RoaW5nPyIpCisJCS5wc2l6ZQk9IDI4LAorCQkuZGlnZXN0CT0geyAweGFmLCAweDQ1LCAweGQyLCAweGUzLCAweDc2LCAweDQ4LCAweDQwLCAweDMxLAorCQkJICAgIDB4NjEsIDB4N2YsIDB4NzgsIDB4ZDIsIDB4YjUsIDB4OGEsIDB4NmIsIDB4MWIsCisJCQkgICAgMHg5YywgMHg3ZSwgMHhmNCwgMHg2NCwgMHhmNSwgMHhhMCwgMHgxYiwgMHg0NywKKwkJCSAgICAweGU0LCAweDJlLCAweGMzLCAweDczLCAweDYzLCAweDIyLCAweDQ0LCAweDVlLAorCQkJICAgIDB4OGUsIDB4MjIsIDB4NDAsIDB4Y2EsIDB4NWUsIDB4NjksIDB4ZTIsIDB4YzcsCisJCQkgICAgMHg4YiwgMHgzMiwgMHgzOSwgMHhlYywgMHhmYSwgMHhiMiwgMHgxNiwgMHg0OSB9LAorCQkubnAJPSA0LAorCQkudGFwCT0geyA3LCA3LCA3LCA3IH0KKwl9LCB7CisJCS5rZXkJPSB7IDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSB9LCAvLyAoMTMxIGJ5dGVzKQorCQkua3NpemUJPSAxMzEsCisJCS5wbGFpbnRleHQgPSB7IDB4NTQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4MjAsIDB4NTUsIDB4NzMsIDB4NjksCisJCQkgICAgICAgMHg2ZSwgMHg2NywgMHgyMCwgMHg0YywgMHg2MSwgMHg3MiwgMHg2NywgMHg2NSwgLy8gKCJUZXN0IFVzaW5nIExhcmdlIikKKwkJCSAgICAgICAweDcyLCAweDIwLCAweDU0LCAweDY4LCAweDYxLCAweDZlLCAweDIwLCAweDQyLAorCQkJICAgICAgIDB4NmMsIDB4NmYsIDB4NjMsIDB4NmIsIDB4MmQsIDB4NTMsIDB4NjksIDB4N2EsIC8vICgiciBUaGFuIEJsb2NrLVNpeiIpCisJCQkgICAgICAgMHg2NSwgMHgyMCwgMHg0YiwgMHg2NSwgMHg3OSwgMHgyMCwgMHgyZCwgMHgyMCwKKwkJCSAgICAgICAweDQ4LCAweDYxLCAweDczLCAweDY4LCAweDIwLCAweDRiLCAweDY1LCAweDc5LCAvLyAoImUgS2V5IC0gSGFzaCBLZXkiKQorCQkJICAgICAgIDB4MjAsIDB4NDYsIDB4NjksIDB4NzIsIDB4NzMsIDB4NzQgfSwgLy8gKCIgRmlyc3QiKQorCQkucHNpemUJPSA1NCwKKwkJLmRpZ2VzdAk9IHsgMHg0ZSwgMHhjZSwgMHgwOCwgMHg0NCwgMHg4NSwgMHg4MSwgMHgzZSwgMHg5MCwKKwkJCSAgICAweDg4LCAweGQyLCAweGM2LCAweDNhLCAweDA0LCAweDFiLCAweGM1LCAweGI0LAorCQkJICAgIDB4NGYsIDB4OWUsIDB4ZjEsIDB4MDEsIDB4MmEsIDB4MmIsIDB4NTgsIDB4OGYsCisJCQkgICAgMHgzYywgMHhkMSwgMHgxZiwgMHgwNSwgMHgwMywgMHgzYSwgMHhjNCwgMHhjNiwKKwkJCSAgICAweDBjLCAweDJlLCAweGY2LCAweGFiLCAweDQwLCAweDMwLCAweGZlLCAweDgyLAorCQkJICAgIDB4OTYsIDB4MjQsIDB4OGQsIDB4ZjEsIDB4NjMsIDB4ZjQsIDB4NDksIDB4NTIgfSwKKwl9LCB7CisJCS5rZXkJPSB7IDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSB9LCAvLyAoMTMxIGJ5dGVzKQorCQkua3NpemUJPSAxMzEsCisJCS5wbGFpbnRleHQgPSB7IDB4NTQsIDB4NjgsIDB4NjksIDB4NzMsIDB4MjAsIDB4NjksIDB4NzMsIDB4MjAsCisJCQkgICAgICAgMHg2MSwgMHgyMCwgMHg3NCwgMHg2NSwgMHg3MywgMHg3NCwgMHgyMCwgMHg3NSwgLy8gKCJUaGlzIGlzIGEgdGVzdCB1IikKKwkJCSAgICAgICAweDczLCAweDY5LCAweDZlLCAweDY3LCAweDIwLCAweDYxLCAweDIwLCAweDZjLAorCQkJICAgICAgIDB4NjEsIDB4NzIsIDB4NjcsIDB4NjUsIDB4NzIsIDB4MjAsIDB4NzQsIDB4NjgsIC8vICgic2luZyBhIGxhcmdlciB0aCIpCisJCQkgICAgICAgMHg2MSwgMHg2ZSwgMHgyMCwgMHg2MiwgMHg2YywgMHg2ZiwgMHg2MywgMHg2YiwKKwkJCSAgICAgICAweDJkLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDIwLCAweDZiLCAweDY1LCAvLyAoImFuIGJsb2NrLXNpemUga2UiKQorCQkJICAgICAgIDB4NzksIDB4MjAsIDB4NjEsIDB4NmUsIDB4NjQsIDB4MjAsIDB4NjEsIDB4MjAsCisJCQkgICAgICAgMHg2YywgMHg2MSwgMHg3MiwgMHg2NywgMHg2NSwgMHg3MiwgMHgyMCwgMHg3NCwgLy8gKCJ5IGFuZCBhIGxhcmdlciB0IikKKwkJCSAgICAgICAweDY4LCAweDYxLCAweDZlLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLAorCQkJICAgICAgIDB4NmIsIDB4MmQsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjAsIDB4NjQsIC8vICgiaGFuIGJsb2NrLXNpemUgZCIpCisJCQkgICAgICAgMHg2MSwgMHg3NCwgMHg2MSwgMHgyZSwgMHgyMCwgMHg1NCwgMHg2OCwgMHg2NSwKKwkJCSAgICAgICAweDIwLCAweDZiLCAweDY1LCAweDc5LCAweDIwLCAweDZlLCAweDY1LCAweDY1LCAvLyAoImF0YS4gVGhlIGtleSBuZWUiKQorCQkJICAgICAgIDB4NjQsIDB4NzMsIDB4MjAsIDB4NzQsIDB4NmYsIDB4MjAsIDB4NjIsIDB4NjUsCisJCQkgICAgICAgMHgyMCwgMHg2OCwgMHg2MSwgMHg3MywgMHg2OCwgMHg2NSwgMHg2NCwgMHgyMCwgLy8gKCJkcyB0byBiZSBoYXNoZWQgIikKKwkJCSAgICAgICAweDYyLCAweDY1LCAweDY2LCAweDZmLCAweDcyLCAweDY1LCAweDIwLCAweDYyLAorCQkJICAgICAgIDB4NjUsIDB4NjksIDB4NmUsIDB4NjcsIDB4MjAsIDB4NzUsIDB4NzMsIDB4NjUsIC8vICgiYmVmb3JlIGJlaW5nIHVzZSIpCisJCQkgICAgICAgMHg2NCwgMHgyMCwgMHg2MiwgMHg3OSwgMHgyMCwgMHg3NCwgMHg2OCwgMHg2NSwKKwkJCSAgICAgICAweDIwLCAweDQ4LCAweDRkLCAweDQxLCAweDQzLCAweDIwLCAweDYxLCAweDZjLCAvLyAoImQgYnkgdGhlIEhNQUMgYWwiKQorCQkJICAgICAgIDB4NjcsIDB4NmYsIDB4NzIsIDB4NjksIDB4NzQsIDB4NjgsIDB4NmQsIDB4MmUgfSwgLy8gKCJnb3JpdGhtLiIpCisJCS5wc2l6ZQk9IDE1MiwKKwkJLmRpZ2VzdAk9IHsgMHg2NiwgMHgxNywgMHgxNywgMHg4ZSwgMHg5NCwgMHgxZiwgMHgwMiwgMHgwZCwKKwkJCSAgICAweDM1LCAweDFlLCAweDJmLCAweDI1LCAweDRlLCAweDhmLCAweGQzLCAweDJjLAorCQkJICAgIDB4NjAsIDB4MjQsIDB4MjAsIDB4ZmUsIDB4YjAsIDB4YjgsIDB4ZmIsIDB4OWEsCisJCQkgICAgMHhkYywgMHhjZSwgMHhiYiwgMHg4MiwgMHg0NiwgMHgxZSwgMHg5OSwgMHhjNSwKKwkJCSAgICAweGE2LCAweDc4LCAweGNjLCAweDMxLCAweGU3LCAweDk5LCAweDE3LCAweDZkLAorCQkJICAgIDB4MzgsIDB4NjAsIDB4ZTYsIDB4MTEsIDB4MGMsIDB4NDYsIDB4NTIsIDB4M2UgfSwKKwl9LAorfTsKKworLyoKKyAqIFNIQTUxMiBITUFDIHRlc3QgdmVjdG9ycyBmcm9tIFJGQzQyMzEKKyAqLworCisjZGVmaW5lIEhNQUNfU0hBNTEyX1RFU1RfVkVDVE9SUwk0CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIGhtYWNfc2hhNTEyX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5CT0geyAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLAorCQkJICAgIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsCisJCQkgICAgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiB9LCAvLyAoMjAgYnl0ZXMpCisJCS5rc2l6ZQk9IDIwLAorCQkucGxhaW50ZXh0ID0geyAweDQ4LCAweDY5LCAweDIwLCAweDU0LCAweDY4LCAweDY1LCAweDcyLCAweDY1IH0sIC8vICgiSGkgVGhlcmUiKQorCQkucHNpemUJPSA4LAorCQkuZGlnZXN0CT0geyAweDg3LCAweGFhLCAweDdjLCAweGRlLCAweGE1LCAweGVmLCAweDYxLCAweDlkLAorCQkJICAgIDB4NGYsIDB4ZjAsIDB4YjQsIDB4MjQsIDB4MWEsIDB4MWQsIDB4NmMsIDB4YjAsCisJCQkgICAgMHgyMywgMHg3OSwgMHhmNCwgMHhlMiwgMHhjZSwgMHg0ZSwgMHhjMiwgMHg3OCwKKwkJCSAgICAweDdhLCAweGQwLCAweGIzLCAweDA1LCAweDQ1LCAweGUxLCAweDdjLCAweGRlLAorCQkJICAgIDB4ZGEsIDB4YTgsIDB4MzMsIDB4YjcsIDB4ZDYsIDB4YjgsIDB4YTcsIDB4MDIsCisJCQkgICAgMHgwMywgMHg4YiwgMHgyNywgMHg0ZSwgMHhhZSwgMHhhMywgMHhmNCwgMHhlNCwKKwkJCSAgICAweGJlLCAweDlkLCAweDkxLCAweDRlLCAweGViLCAweDYxLCAweGYxLCAweDcwLAorCQkJICAgIDB4MmUsIDB4NjksIDB4NmMsIDB4MjAsIDB4M2EsIDB4MTIsIDB4NjgsIDB4NTQgfSwKKwl9LCB7CisJCS5rZXkJPSB7IDB4NGEsIDB4NjUsIDB4NjYsIDB4NjUgfSwgLy8gKCJKZWZlIikKKwkJLmtzaXplCT0gNCwKKwkJLnBsYWludGV4dCA9IHsgMHg3NywgMHg2OCwgMHg2MSwgMHg3NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHgyMCwKKwkJCSAgICAgICAweDc5LCAweDYxLCAweDIwLCAweDc3LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAvLyAoIndoYXQgZG8geWEgd2FudCAiKQorCQkJICAgICAgIDB4NjYsIDB4NmYsIDB4NzIsIDB4MjAsIDB4NmUsIDB4NmYsIDB4NzQsIDB4NjgsCisJCQkgICAgICAgMHg2OSwgMHg2ZSwgMHg2NywgMHgzZiB9LCAvLyAoImZvciBub3RoaW5nPyIpCisJCS5wc2l6ZQk9IDI4LAorCQkuZGlnZXN0CT0geyAweDE2LCAweDRiLCAweDdhLCAweDdiLCAweGZjLCAweGY4LCAweDE5LCAweGUyLAorCQkJICAgIDB4ZTMsIDB4OTUsIDB4ZmIsIDB4ZTcsIDB4M2IsIDB4NTYsIDB4ZTAsIDB4YTMsCisJCQkgICAgMHg4NywgMHhiZCwgMHg2NCwgMHgyMiwgMHgyZSwgMHg4MywgMHgxZiwgMHhkNiwKKwkJCSAgICAweDEwLCAweDI3LCAweDBjLCAweGQ3LCAweGVhLCAweDI1LCAweDA1LCAweDU0LAorCQkJICAgIDB4OTcsIDB4NTgsIDB4YmYsIDB4NzUsIDB4YzAsIDB4NWEsIDB4OTksIDB4NGEsCisJCQkgICAgMHg2ZCwgMHgwMywgMHg0ZiwgMHg2NSwgMHhmOCwgMHhmMCwgMHhlNiwgMHhmZCwKKwkJCSAgICAweGNhLCAweGVhLCAweGIxLCAweGEzLCAweDRkLCAweDRhLCAweDZiLCAweDRiLAorCQkJICAgIDB4NjMsIDB4NmUsIDB4MDcsIDB4MGEsIDB4MzgsIDB4YmMsIDB4ZTcsIDB4MzcgfSwKKwkJLm5wCT0gNCwKKwkJLnRhcAk9IHsgNywgNywgNywgNyB9CisJfSwgeworCQkua2V5CT0geyAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEgfSwgLy8gKDEzMSBieXRlcykKKwkJLmtzaXplCT0gMTMxLAorCQkucGxhaW50ZXh0ID0geyAweDU0LCAweDY1LCAweDczLCAweDc0LCAweDIwLCAweDU1LCAweDczLCAweDY5LAorCQkJICAgICAgIDB4NmUsIDB4NjcsIDB4MjAsIDB4NGMsIDB4NjEsIDB4NzIsIDB4NjcsIDB4NjUsIC8vICgiVGVzdCBVc2luZyBMYXJnZSIpCisJCQkgICAgICAgMHg3MiwgMHgyMCwgMHg1NCwgMHg2OCwgMHg2MSwgMHg2ZSwgMHgyMCwgMHg0MiwKKwkJCSAgICAgICAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJkLCAweDUzLCAweDY5LCAweDdhLCAvLyAoInIgVGhhbiBCbG9jay1TaXoiKQorCQkJICAgICAgIDB4NjUsIDB4MjAsIDB4NGIsIDB4NjUsIDB4NzksIDB4MjAsIDB4MmQsIDB4MjAsCisJCQkgICAgICAgMHg0OCwgMHg2MSwgMHg3MywgMHg2OCwgMHgyMCwgMHg0YiwgMHg2NSwgMHg3OSwgLy8gKCJlIEtleSAtIEhhc2ggS2V5IikKKwkJCSAgICAgICAweDIwLCAweDQ2LCAweDY5LCAweDcyLCAweDczLCAweDc0IH0sIC8vICgiIEZpcnN0IikKKwkJLnBzaXplCT0gNTQsCisJCS5kaWdlc3QJPSB7IDB4ODAsIDB4YjIsIDB4NDIsIDB4NjMsIDB4YzcsIDB4YzEsIDB4YTMsIDB4ZWIsCisJCQkgICAgMHhiNywgMHgxNCwgMHg5MywgMHhjMSwgMHhkZCwgMHg3YiwgMHhlOCwgMHhiNCwKKwkJCSAgICAweDliLCAweDQ2LCAweGQxLCAweGY0LCAweDFiLCAweDRhLCAweGVlLCAweGMxLAorCQkJICAgIDB4MTIsIDB4MWIsIDB4MDEsIDB4MzcsIDB4ODMsIDB4ZjgsIDB4ZjMsIDB4NTIsCisJCQkgICAgMHg2YiwgMHg1NiwgMHhkMCwgMHgzNywgMHhlMCwgMHg1ZiwgMHgyNSwgMHg5OCwKKwkJCSAgICAweGJkLCAweDBmLCAweGQyLCAweDIxLCAweDVkLCAweDZhLCAweDFlLCAweDUyLAorCQkJICAgIDB4OTUsIDB4ZTYsIDB4NGYsIDB4NzMsIDB4ZjYsIDB4M2YsIDB4MGEsIDB4ZWMsCisJCQkgICAgMHg4YiwgMHg5MSwgMHg1YSwgMHg5OCwgMHg1ZCwgMHg3OCwgMHg2NSwgMHg5OCB9LAorCX0sIHsKKwkJLmtleQk9IHsgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhIH0sIC8vICgxMzEgYnl0ZXMpCisJCS5rc2l6ZQk9IDEzMSwKKwkJLnBsYWludGV4dCA9IHsgMHg1NCwgMHg2OCwgMHg2OSwgMHg3MywgMHgyMCwgMHg2OSwgMHg3MywgMHgyMCwKKwkJCSAgICAgICAweDYxLCAweDIwLCAweDc0LCAweDY1LCAweDczLCAweDc0LCAweDIwLCAweDc1LCAvLyAoIlRoaXMgaXMgYSB0ZXN0IHUiKQorCQkJICAgICAgIDB4NzMsIDB4NjksIDB4NmUsIDB4NjcsIDB4MjAsIDB4NjEsIDB4MjAsIDB4NmMsCisJCQkgICAgICAgMHg2MSwgMHg3MiwgMHg2NywgMHg2NSwgMHg3MiwgMHgyMCwgMHg3NCwgMHg2OCwgLy8gKCJzaW5nIGEgbGFyZ2VyIHRoIikKKwkJCSAgICAgICAweDYxLCAweDZlLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLAorCQkJICAgICAgIDB4MmQsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjAsIDB4NmIsIDB4NjUsIC8vICgiYW4gYmxvY2stc2l6ZSBrZSIpCisJCQkgICAgICAgMHg3OSwgMHgyMCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHgyMCwgMHg2MSwgMHgyMCwKKwkJCSAgICAgICAweDZjLCAweDYxLCAweDcyLCAweDY3LCAweDY1LCAweDcyLCAweDIwLCAweDc0LCAvLyAoInkgYW5kIGEgbGFyZ2VyIHQiKQorCQkJICAgICAgIDB4NjgsIDB4NjEsIDB4NmUsIDB4MjAsIDB4NjIsIDB4NmMsIDB4NmYsIDB4NjMsCisJCQkgICAgICAgMHg2YiwgMHgyZCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyMCwgMHg2NCwgLy8gKCJoYW4gYmxvY2stc2l6ZSBkIikKKwkJCSAgICAgICAweDYxLCAweDc0LCAweDYxLCAweDJlLCAweDIwLCAweDU0LCAweDY4LCAweDY1LAorCQkJICAgICAgIDB4MjAsIDB4NmIsIDB4NjUsIDB4NzksIDB4MjAsIDB4NmUsIDB4NjUsIDB4NjUsIC8vICgiYXRhLiBUaGUga2V5IG5lZSIpCisJCQkgICAgICAgMHg2NCwgMHg3MywgMHgyMCwgMHg3NCwgMHg2ZiwgMHgyMCwgMHg2MiwgMHg2NSwKKwkJCSAgICAgICAweDIwLCAweDY4LCAweDYxLCAweDczLCAweDY4LCAweDY1LCAweDY0LCAweDIwLCAvLyAoImRzIHRvIGJlIGhhc2hlZCAiKQorCQkJICAgICAgIDB4NjIsIDB4NjUsIDB4NjYsIDB4NmYsIDB4NzIsIDB4NjUsIDB4MjAsIDB4NjIsCisJCQkgICAgICAgMHg2NSwgMHg2OSwgMHg2ZSwgMHg2NywgMHgyMCwgMHg3NSwgMHg3MywgMHg2NSwgLy8gKCJiZWZvcmUgYmVpbmcgdXNlIikKKwkJCSAgICAgICAweDY0LCAweDIwLCAweDYyLCAweDc5LCAweDIwLCAweDc0LCAweDY4LCAweDY1LAorCQkJICAgICAgIDB4MjAsIDB4NDgsIDB4NGQsIDB4NDEsIDB4NDMsIDB4MjAsIDB4NjEsIDB4NmMsIC8vICgiZCBieSB0aGUgSE1BQyBhbCIpCisJCQkgICAgICAgMHg2NywgMHg2ZiwgMHg3MiwgMHg2OSwgMHg3NCwgMHg2OCwgMHg2ZCwgMHgyZSB9LCAvLyAoImdvcml0aG0uIikKKwkJLnBzaXplCT0gMTUyLAorCQkuZGlnZXN0CT0geyAweGUzLCAweDdiLCAweDZhLCAweDc3LCAweDVkLCAweGM4LCAweDdkLCAweGJhLAorCQkJICAgIDB4YTQsIDB4ZGYsIDB4YTksIDB4ZjksIDB4NmUsIDB4NWUsIDB4M2YsIDB4ZmQsCisJCQkgICAgMHhkZSwgMHhiZCwgMHg3MSwgMHhmOCwgMHg4NiwgMHg3MiwgMHg4OSwgMHg4NiwKKwkJCSAgICAweDVkLCAweGY1LCAweGEzLCAweDJkLCAweDIwLCAweGNkLCAweGM5LCAweDQ0LAorCQkJICAgIDB4YjYsIDB4MDIsIDB4MmMsIDB4YWMsIDB4M2MsIDB4NDksIDB4ODIsIDB4YjEsCisJCQkgICAgMHgwZCwgMHg1ZSwgMHhlYiwgMHg1NSwgMHhjMywgMHhlNCwgMHhkZSwgMHgxNSwKKwkJCSAgICAweDEzLCAweDQ2LCAweDc2LCAweGZiLCAweDZkLCAweGUwLCAweDQ0LCAweDYwLAorCQkJICAgIDB4NjUsIDB4YzksIDB4NzQsIDB4NDAsIDB4ZmEsIDB4OGMsIDB4NmEsIDB4NTggfSwKKwl9LAorfTsKKworLyoKICAqIERFUyB0ZXN0IHZlY3RvcnMuCiAgKi8KICNkZWZpbmUgREVTX0VOQ19URVNUX1ZFQ1RPUlMJCTEwCkBAIC0zMzE2LDYgKzM1NTksMjc4IEBACiAJfQogfTsKIAorLyogCisgKiBGQ3J5cHQgdGVzdCB2ZWN0b3JzIAorICovCisjZGVmaW5lIEZDUllQVF9FTkNfVEVTVF9WRUNUT1JTCUFSUkFZX1NJWkUoZmNyeXB0X3BjYmNfZW5jX3R2X3RlbXBsYXRlKQorI2RlZmluZSBGQ1JZUFRfREVDX1RFU1RfVkVDVE9SUwlBUlJBWV9TSVpFKGZjcnlwdF9wY2JjX2RlY190dl90ZW1wbGF0ZSkKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBmY3J5cHRfcGNiY19lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIGh0dHA6Ly93d3cub3BlbmFmcy5vcmcvcGlwZXJtYWlsL29wZW5hZnMtZGV2ZWwvMjAwMC1EZWNlbWJlci8wMDUzMjAuaHRtbCAqLworCQkua2V5CT0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisJCS5rbGVuCT0gOCwKKwkJLml2CT0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisJCS5pbnB1dAk9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSB7IDB4MEUsIDB4MDksIDB4MDAsIDB4QzcsIDB4M0UsIDB4RjcsIDB4RUQsIDB4NDEgfSwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9IHsgMHgxMSwgMHg0NCwgMHg3NywgMHhBQSwgMHhERCwgMHgwMCwgMHgzMywgMHg2NiB9LAorCQkua2xlbgk9IDgsCisJCS5pdgk9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorCQkuaW5wdXQJPSB7IDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REUsIDB4RjAgfSwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0geyAweEQ4LCAweEVELCAweDc4LCAweDc0LCAweDc3LCAweEVDLCAweDA2LCAweDgwIH0sCisJCS5ybGVuCT0gOCwKKwl9LCB7IC8qIEZyb20gQXJsYSAqLworCQkua2V5CT0geyAweGYwLCAweGUxLCAweGQyLCAweGMzLCAweGI0LCAweGE1LCAweDk2LCAweDg3IH0sCisJCS5rbGVuCT0gOCwKKwkJLml2CT0geyAweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwIH0sCisJCS5pbnB1dAk9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9ncy5cMFwwIiwKKwkJLmlsZW4JPSA0OCwKKwkJLnJlc3VsdAk9IHsgMHgwMCwgMHhmMCwgMHhlLCAgMHgxMSwgMHg3NSwgMHhlNiwgMHgyMywgMHg4MiwKKwkJCSAgICAweGVlLCAweGFjLCAweDk4LCAweDYyLCAweDQ0LCAweDUxLCAweGU0LCAweDg0LAorCQkJICAgIDB4YzMsIDB4NTksIDB4ZDgsIDB4YWEsIDB4NjQsIDB4NjAsIDB4YWUsIDB4ZjcsCisJCQkgICAgMHhkMiwgMHhkOSwgMHgxMywgMHg3OSwgMHg3MiwgMHhhMywgMHg0NSwgMHgwMywKKwkJCSAgICAweDIzLCAweGI1LCAweDYyLCAweGQ3LCAweDBjLCAweGY1LCAweDI3LCAweGQxLAorCQkJICAgIDB4ZjgsIDB4OTEsIDB4M2MsIDB4YWMsIDB4NDQsIDB4MjIsIDB4OTIsIDB4ZWYgfSwKKwkJLnJsZW4JPSA0OCwKKwl9LCB7CisJCS5rZXkJPSB7IDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfSwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSB7IDB4ZjAsIDB4ZTEsIDB4ZDIsIDB4YzMsIDB4YjQsIDB4YTUsIDB4OTYsIDB4ODcgfSwKKwkJLmlucHV0CT0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2dzLlwwXDAiLAorCQkuaWxlbgk9IDQ4LAorCQkucmVzdWx0CT0geyAweGNhLCAweDkwLCAweGY1LCAweDlkLCAweGNiLCAweGQ0LCAweGQyLCAweDNjLAorCQkJICAgIDB4MDEsIDB4ODgsIDB4N2YsIDB4M2UsIDB4MzEsIDB4NmUsIDB4NjIsIDB4OWQsCisJCQkgICAgMHhkOCwgMHhlMCwgMHg1NywgMHhhMywgMHgwNiwgMHgzYSwgMHg0MiwgMHg1OCwKKwkJCSAgICAweDJhLCAweDI4LCAweGZlLCAweDcyLCAweDUyLCAweDJmLCAweGRkLCAweGUwLAorCQkJICAgIDB4MTksIDB4ODksIDB4MDksIDB4MWMsIDB4MmEsIDB4OGUsIDB4OGMsIDB4OTQsCisJCQkgICAgMHhmYywgMHhjNywgMHg2OCwgMHhlNCwgMHg4OCwgMHhhYSwgMHhkZSwgMHgwZiB9LAorCQkucmxlbgk9IDQ4LAorCX0sIHsgLyogc3BsaXQtcGFnZSB2ZXJzaW9uICovCisJCS5rZXkJPSB7IDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfSwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSB7IDB4ZjAsIDB4ZTEsIDB4ZDIsIDB4YzMsIDB4YjQsIDB4YTUsIDB4OTYsIDB4ODcgfSwKKwkJLmlucHV0CT0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2dzLlwwXDAiLAorCQkuaWxlbgk9IDQ4LAorCQkucmVzdWx0CT0geyAweGNhLCAweDkwLCAweGY1LCAweDlkLCAweGNiLCAweGQ0LCAweGQyLCAweDNjLAorCQkJICAgIDB4MDEsIDB4ODgsIDB4N2YsIDB4M2UsIDB4MzEsIDB4NmUsIDB4NjIsIDB4OWQsCisJCQkgICAgMHhkOCwgMHhlMCwgMHg1NywgMHhhMywgMHgwNiwgMHgzYSwgMHg0MiwgMHg1OCwKKwkJCSAgICAweDJhLCAweDI4LCAweGZlLCAweDcyLCAweDUyLCAweDJmLCAweGRkLCAweGUwLAorCQkJICAgIDB4MTksIDB4ODksIDB4MDksIDB4MWMsIDB4MmEsIDB4OGUsIDB4OGMsIDB4OTQsCisJCQkgICAgMHhmYywgMHhjNywgMHg2OCwgMHhlNCwgMHg4OCwgMHhhYSwgMHhkZSwgMHgwZiB9LAorCQkucmxlbgk9IDQ4LAorCQkubnAJPSAyLAorCQkudGFwCT0geyAyMCwgMjggfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGZjcnlwdF9wY2JjX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogaHR0cDovL3d3dy5vcGVuYWZzLm9yZy9waXBlcm1haWwvb3BlbmFmcy1kZXZlbC8yMDAwLURlY2VtYmVyLzAwNTMyMC5odG1sICovCisJCS5rZXkJPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKwkJLmlucHV0CT0geyAweDBFLCAweDA5LCAweDAwLCAweEM3LCAweDNFLCAweEY3LCAweEVELCAweDQxIH0sCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0geyAweDExLCAweDQ0LCAweDc3LCAweEFBLCAweERELCAweDAwLCAweDMzLCAweDY2IH0sCisJCS5rbGVuCT0gOCwKKwkJLml2CT0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisJCS5pbnB1dAk9IHsgMHhEOCwgMHhFRCwgMHg3OCwgMHg3NCwgMHg3NywgMHhFQywgMHgwNiwgMHg4MCB9LAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSB7IDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REUsIDB4RjAgfSwKKwkJLnJsZW4JPSA4LAorCX0sIHsgLyogRnJvbSBBcmxhICovCisJCS5rZXkJPSB7IDB4ZjAsIDB4ZTEsIDB4ZDIsIDB4YzMsIDB4YjQsIDB4YTUsIDB4OTYsIDB4ODcgfSwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSB7IDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfSwKKwkJLmlucHV0CT0geyAweDAwLCAweGYwLCAweGUsICAweDExLCAweDc1LCAweGU2LCAweDIzLCAweDgyLAorCQkJICAgIDB4ZWUsIDB4YWMsIDB4OTgsIDB4NjIsIDB4NDQsIDB4NTEsIDB4ZTQsIDB4ODQsCisJCQkgICAgMHhjMywgMHg1OSwgMHhkOCwgMHhhYSwgMHg2NCwgMHg2MCwgMHhhZSwgMHhmNywKKwkJCSAgICAweGQyLCAweGQ5LCAweDEzLCAweDc5LCAweDcyLCAweGEzLCAweDQ1LCAweDAzLAorCQkJICAgIDB4MjMsIDB4YjUsIDB4NjIsIDB4ZDcsIDB4MGMsIDB4ZjUsIDB4MjcsIDB4ZDEsCisJCQkgICAgMHhmOCwgMHg5MSwgMHgzYywgMHhhYywgMHg0NCwgMHgyMiwgMHg5MiwgMHhlZiB9LAorCQkuaWxlbgk9IDQ4LAorCQkucmVzdWx0CT0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2dzLlwwXDAiLAorCQkucmxlbgk9IDQ4LAorCX0sIHsKKwkJLmtleQk9IHsgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkua2xlbgk9IDgsCisJCS5pdgk9IHsgMHhmMCwgMHhlMSwgMHhkMiwgMHhjMywgMHhiNCwgMHhhNSwgMHg5NiwgMHg4NyB9LAorCQkuaW5wdXQJPSB7IDB4Y2EsIDB4OTAsIDB4ZjUsIDB4OWQsIDB4Y2IsIDB4ZDQsIDB4ZDIsIDB4M2MsCisJCQkgICAgMHgwMSwgMHg4OCwgMHg3ZiwgMHgzZSwgMHgzMSwgMHg2ZSwgMHg2MiwgMHg5ZCwKKwkJCSAgICAweGQ4LCAweGUwLCAweDU3LCAweGEzLCAweDA2LCAweDNhLCAweDQyLCAweDU4LAorCQkJICAgIDB4MmEsIDB4MjgsIDB4ZmUsIDB4NzIsIDB4NTIsIDB4MmYsIDB4ZGQsIDB4ZTAsCisJCQkgICAgMHgxOSwgMHg4OSwgMHgwOSwgMHgxYywgMHgyYSwgMHg4ZSwgMHg4YywgMHg5NCwKKwkJCSAgICAweGZjLCAweGM3LCAweDY4LCAweGU0LCAweDg4LCAweGFhLCAweGRlLCAweDBmIH0sCisJCS5pbGVuCT0gNDgsCisJCS5yZXN1bHQJPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ3MuXDBcMCIsCisJCS5ybGVuCT0gNDgsCisJfSwgeyAvKiBzcGxpdC1wYWdlIHZlcnNpb24gKi8KKwkJLmtleQk9IHsgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkua2xlbgk9IDgsCisJCS5pdgk9IHsgMHhmMCwgMHhlMSwgMHhkMiwgMHhjMywgMHhiNCwgMHhhNSwgMHg5NiwgMHg4NyB9LAorCQkuaW5wdXQJPSB7IDB4Y2EsIDB4OTAsIDB4ZjUsIDB4OWQsIDB4Y2IsIDB4ZDQsIDB4ZDIsIDB4M2MsCisJCQkgICAgMHgwMSwgMHg4OCwgMHg3ZiwgMHgzZSwgMHgzMSwgMHg2ZSwgMHg2MiwgMHg5ZCwKKwkJCSAgICAweGQ4LCAweGUwLCAweDU3LCAweGEzLCAweDA2LCAweDNhLCAweDQyLCAweDU4LAorCQkJICAgIDB4MmEsIDB4MjgsIDB4ZmUsIDB4NzIsIDB4NTIsIDB4MmYsIDB4ZGQsIDB4ZTAsCisJCQkgICAgMHgxOSwgMHg4OSwgMHgwOSwgMHgxYywgMHgyYSwgMHg4ZSwgMHg4YywgMHg5NCwKKwkJCSAgICAweGZjLCAweGM3LCAweDY4LCAweGU0LCAweDg4LCAweGFhLCAweGRlLCAweDBmIH0sCisJCS5pbGVuCT0gNDgsCisJCS5yZXN1bHQJPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ3MuXDBcMCIsCisJCS5ybGVuCT0gNDgsCisJCS5ucAk9IDIsCisJCS50YXAJPSB7IDIwLCAyOCB9LAorCX0KK307CisKKy8qCisgKiBDQU1FTExJQSB0ZXN0IHZlY3RvcnMuCisgKi8KKyNkZWZpbmUgQ0FNRUxMSUFfRU5DX1RFU1RfVkVDVE9SUyAzCisjZGVmaW5lIENBTUVMTElBX0RFQ19URVNUX1ZFQ1RPUlMgMworI2RlZmluZSBDQU1FTExJQV9DQkNfRU5DX1RFU1RfVkVDVE9SUyAyCisjZGVmaW5lIENBTUVMTElBX0NCQ19ERUNfVEVTVF9WRUNUT1JTIDIKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBjYW1lbGxpYV9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0geyAweDY3LCAweDY3LCAweDMxLCAweDM4LCAweDU0LCAweDk2LCAweDY5LCAweDczLAorCQkJICAgIDB4MDgsIDB4NTcsIDB4MDYsIDB4NTYsIDB4NDgsIDB4ZWEsIDB4YmUsIDB4NDMgfSwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCwKKwkJCSAgICAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3IH0sCisJCS5rbGVuCT0gMjQsCisJCS5pbnB1dAk9IHsgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwKKwkJCSAgICAweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwIH0sCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSB7IDB4YjQsIDB4OTksIDB4MzQsIDB4MDEsIDB4YjMsIDB4ZTksIDB4OTYsIDB4ZjgsCisJCQkgICAgMHg0ZSwgMHhlNSwgMHhjZSwgMHhlNywgMHhkNywgMHg5YiwgMHgwOSwgMHhiOSB9LAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9IHsgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwKKwkJCSAgICAweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwLAorCQkJICAgIDB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsCisJCQkgICAgMHg4OCwgMHg5OSwgMHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZiB9LAorCQkua2xlbgk9IDMyLAorCQkuaW5wdXQJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0geyAweDlhLCAweGNjLCAweDIzLCAweDdkLCAweGZmLCAweDE2LCAweGQ3LCAweDZjLAorCQkJICAgIDB4MjAsIDB4ZWYsIDB4N2MsIDB4OTEsIDB4OWUsIDB4M2EsIDB4NzUsIDB4MDkgfSwKKwkJLnJsZW4JPSAxNiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBjYW1lbGxpYV9kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSB7IDB4NjcsIDB4NjcsIDB4MzEsIDB4MzgsIDB4NTQsIDB4OTYsIDB4NjksIDB4NzMsCisJCQkgICAgMHgwOCwgMHg1NywgMHgwNiwgMHg1NiwgMHg0OCwgMHhlYSwgMHhiZSwgMHg0MyB9LAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0geyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLAorCQkJICAgIDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfSwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCwKKwkJCSAgICAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3IH0sCisJCS5rbGVuCT0gMjQsCisJCS5pbnB1dAk9IHsgMHhiNCwgMHg5OSwgMHgzNCwgMHgwMSwgMHhiMywgMHhlOSwgMHg5NiwgMHhmOCwKKwkJCSAgICAweDRlLCAweGU1LCAweGNlLCAweGU3LCAweGQ3LCAweDliLCAweDA5LCAweGI5IH0sCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9IHsgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwKKwkJCSAgICAweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwLAorCQkJICAgIDB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsCisJCQkgICAgMHg4OCwgMHg5OSwgMHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZiB9LAorCQkua2xlbgk9IDMyLAorCQkuaW5wdXQJPSB7IDB4OWEsIDB4Y2MsIDB4MjMsIDB4N2QsIDB4ZmYsIDB4MTYsIDB4ZDcsIDB4NmMsCisJCQkgICAgMHgyMCwgMHhlZiwgMHg3YywgMHg5MSwgMHg5ZSwgMHgzYSwgMHg3NSwgMHgwOSB9LAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0geyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLAorCQkJICAgIDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfSwKKwkJLnJsZW4JPSAxNiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBjYW1lbGxpYV9jYmNfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5ICAgID0geyAweDA2LCAweGE5LCAweDIxLCAweDQwLCAweDM2LCAweGI4LCAweGExLCAweDViLAorCQkJICAgIDB4NTEsIDB4MmUsIDB4MDMsIDB4ZDUsIDB4MzQsIDB4MTIsIDB4MDAsIDB4MDYgfSwKKwkJLmtsZW4gICA9IDE2LAorCQkuaXYJPSB7IDB4M2QsIDB4YWYsIDB4YmEsIDB4NDIsIDB4OWQsIDB4OWUsIDB4YjQsIDB4MzAsCisJCQkgICAgMHhiNCwgMHgyMiwgMHhkYSwgMHg4MCwgMHgyYywgMHg5ZiwgMHhhYywgMHg0MSB9LAorCQkuaW5wdXQJPSB7ICJTaW5nbGUgYmxvY2sgbXNnIiB9LAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSB7IDB4ZWEsIDB4MzIsIDB4MTIsIDB4NzYsIDB4M2IsIDB4NTAsIDB4MTAsIDB4ZTcsCisJCQkgICAgMHgxOCwgMHhmNiwgMHhmZCwgMHg1ZCwgMHhmNiwgMHg4ZiwgMHgxMywgMHg1MSB9LAorCQkucmxlbiAgID0gMTYsCisJfSwgeworCQkua2V5ICAgID0geyAweGMyLCAweDg2LCAweDY5LCAweDZkLCAweDg4LCAweDdjLCAweDlhLCAweGEwLAorCQkJICAgIDB4NjEsIDB4MWIsIDB4YmIsIDB4M2UsIDB4MjAsIDB4MjUsIDB4YTQsIDB4NWEgfSwKKwkJLmtsZW4gICA9IDE2LAorCQkuaXYgICAgID0geyAweDU2LCAweDJlLCAweDE3LCAweDk5LCAweDZkLCAweDA5LCAweDNkLCAweDI4LAorCQkJICAgIDB4ZGQsIDB4YjMsIDB4YmEsIDB4NjksIDB4NWEsIDB4MmUsIDB4NmYsIDB4NTggfSwKKwkJLmlucHV0ICA9IHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkJCSAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAorCQkJICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsCisJCQkgICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiB9LAorCQkuaWxlbiAgID0gMzIsCisJCS5yZXN1bHQgPSB7IDB4YTUsIDB4ZGYsIDB4NmUsIDB4NTAsIDB4ZGEsIDB4NzAsIDB4NmMsIDB4MDEsCisJCQkgICAgMHg0YSwgMHhhYiwgMHhmMywgMHhmMiwgMHhkNiwgMHhmYywgMHg2YywgMHhmZCwKKwkJCSAgICAweDE5LCAweGI0LCAweDNlLCAweDU3LCAweDFjLCAweDAyLCAweDVlLCAweGEwLAorCQkJICAgIDB4MTUsIDB4NzgsIDB4ZTAsIDB4NWUsIDB4ZjIsIDB4Y2IsIDB4ODcsIDB4MTYgfSwKKwkJLnJsZW4gICA9IDMyLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGNhbWVsbGlhX2NiY19kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkgICAgPSB7IDB4MDYsIDB4YTksIDB4MjEsIDB4NDAsIDB4MzYsIDB4YjgsIDB4YTEsIDB4NWIsCisJCQkgICAgMHg1MSwgMHgyZSwgMHgwMywgMHhkNSwgMHgzNCwgMHgxMiwgMHgwMCwgMHgwNiB9LAorCQkua2xlbiAgID0gMTYsCisJCS5pdgk9IHsgMHgzZCwgMHhhZiwgMHhiYSwgMHg0MiwgMHg5ZCwgMHg5ZSwgMHhiNCwgMHgzMCwKKwkJCSAgICAweGI0LCAweDIyLCAweGRhLCAweDgwLCAweDJjLCAweDlmLCAweGFjLCAweDQxIH0sCisJCS5pbnB1dAk9IHsgMHhlYSwgMHgzMiwgMHgxMiwgMHg3NiwgMHgzYiwgMHg1MCwgMHgxMCwgMHhlNywKKwkJCSAgICAweDE4LCAweGY2LCAweGZkLCAweDVkLCAweGY2LCAweDhmLCAweDEzLCAweDUxIH0sCisJCS5pbGVuICAgPSAxNiwKKwkJLnJlc3VsdCA9IHsgIlNpbmdsZSBibG9jayBtc2ciIH0sCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7CisJCS5rZXkgICAgPSB7IDB4YzIsIDB4ODYsIDB4NjksIDB4NmQsIDB4ODgsIDB4N2MsIDB4OWEsIDB4YTAsCisJCQkgICAgMHg2MSwgMHgxYiwgMHhiYiwgMHgzZSwgMHgyMCwgMHgyNSwgMHhhNCwgMHg1YSB9LAorCQkua2xlbiAgID0gMTYsCisJCS5pdiAgICAgPSB7IDB4NTYsIDB4MmUsIDB4MTcsIDB4OTksIDB4NmQsIDB4MDksIDB4M2QsIDB4MjgsCisJCQkgICAgMHhkZCwgMHhiMywgMHhiYSwgMHg2OSwgMHg1YSwgMHgyZSwgMHg2ZiwgMHg1OCB9LAorCQkuaW5wdXQgPSB7IDB4YTUsIDB4ZGYsIDB4NmUsIDB4NTAsIDB4ZGEsIDB4NzAsIDB4NmMsIDB4MDEsCisJCQkgICAgMHg0YSwgMHhhYiwgMHhmMywgMHhmMiwgMHhkNiwgMHhmYywgMHg2YywgMHhmZCwKKwkJCSAgICAweDE5LCAweGI0LCAweDNlLCAweDU3LCAweDFjLCAweDAyLCAweDVlLCAweGEwLAorCQkJICAgIDB4MTUsIDB4NzgsIDB4ZTAsIDB4NWUsIDB4ZjIsIDB4Y2IsIDB4ODcsIDB4MTYgfSwKKwkJLmlsZW4gICA9IDMyLAorCQkucmVzdWx0ID0geyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorCQkJICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsCisJCQkgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKKwkJCSAgICAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmIH0sCisJCS5ybGVuICAgPSAzMiwKKwl9LAorfTsKKwogLyoKICAqIENvbXByZXNzaW9uIHN0dWZmLgogICovCkBAIC0zNzY5LDQgKzQyODQsMjUgQEAKIAl7ICAuYmxlbiA9IDAsCS5wbGVuID0gMCwgfQogfTsKIAorc3RhdGljIHN0cnVjdCBjaXBoZXJfc3BlZWQgY2FtZWxsaWFfc3BlZWRfdGVtcGxhdGVbXSA9IHsKKyAgICAgIHsgLmtsZW4gPSAxNiwgLmJsZW4gPSAxNiwgfSwKKyAgICAgIHsgLmtsZW4gPSAxNiwgLmJsZW4gPSA2NCwgfSwKKyAgICAgIHsgLmtsZW4gPSAxNiwgLmJsZW4gPSAyNTYsIH0sCisgICAgICB7IC5rbGVuID0gMTYsIC5ibGVuID0gMTAyNCwgfSwKKyAgICAgIHsgLmtsZW4gPSAxNiwgLmJsZW4gPSA4MTkyLCB9LAorICAgICAgeyAua2xlbiA9IDI0LCAuYmxlbiA9IDE2LCB9LAorICAgICAgeyAua2xlbiA9IDI0LCAuYmxlbiA9IDY0LCB9LAorICAgICAgeyAua2xlbiA9IDI0LCAuYmxlbiA9IDI1NiwgfSwKKyAgICAgIHsgLmtsZW4gPSAyNCwgLmJsZW4gPSAxMDI0LCB9LAorICAgICAgeyAua2xlbiA9IDI0LCAuYmxlbiA9IDgxOTIsIH0sCisgICAgICB7IC5rbGVuID0gMzIsIC5ibGVuID0gMTYsIH0sCisgICAgICB7IC5rbGVuID0gMzIsIC5ibGVuID0gNjQsIH0sCisgICAgICB7IC5rbGVuID0gMzIsIC5ibGVuID0gMjU2LCB9LAorICAgICAgeyAua2xlbiA9IDMyLCAuYmxlbiA9IDEwMjQsIH0sCisgICAgICB7IC5rbGVuID0gMzIsIC5ibGVuID0gODE5MiwgfSwKKworICAgICAgLyogRW5kIG1hcmtlciAqLworICAgICAgeyAgLmtsZW4gPSAwLCAuYmxlbiA9IDAsIH0KK307CisKICNlbmRpZgkvKiBfQ1JZUFRPX1RDUllQVF9IICovCmRpZmYgLS1naXQgYS9jcnlwdG8veGNiYy5jIGIvY3J5cHRvL3hjYmMuYwppbmRleCA5MzQ3ZWI2Li41M2U4Y2NiIDEwMDY0NAotLS0gYS9jcnlwdG8veGNiYy5jCisrKyBiL2NyeXB0by94Y2JjLmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgpAQCAtNDcsNyArNDgsNyBAQAogICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiBzdHJ1Y3QgY3J5cHRvX3hjYmNfY3R4IHsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqY2hpbGQ7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKmNoaWxkOwogCXU4ICpvZGRzOwogCXU4ICpwcmV2OwogCXU4ICprZXk7CkBAIC03NSw4ICs3Niw3IEBACiAJaWYgKChlcnIgPSBjcnlwdG9fY2lwaGVyX3NldGtleShjdHgtPmNoaWxkLCBjdHgtPmtleSwgY3R4LT5rZXlsZW4pKSkKIAkgICAgcmV0dXJuIGVycjsKIAotCWN0eC0+Y2hpbGQtPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdChjdHgtPmNoaWxkLCBrZXkxLAotCQkJY3R4LT5jb25zdHMpOworCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoY3R4LT5jaGlsZCwga2V5MSwgY3R4LT5jb25zdHMpOwogCiAJcmV0dXJuIGNyeXB0b19jaXBoZXJfc2V0a2V5KGN0eC0+Y2hpbGQsIGtleTEsIGJzKTsKIH0KQEAgLTg2LDcgKzg2LDcgQEAKIHsKIAlzdHJ1Y3QgY3J5cHRvX3hjYmNfY3R4ICpjdHggPSBjcnlwdG9faGFzaF9jdHhfYWxpZ25lZChwYXJlbnQpOwogCi0JaWYgKGtleWxlbiAhPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3R4LT5jaGlsZCkpCisJaWYgKGtleWxlbiAhPSBjcnlwdG9fY2lwaGVyX2Jsb2Nrc2l6ZShjdHgtPmNoaWxkKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljdHgtPmtleWxlbiA9IGtleWxlbjsKQEAgLTEwOCwxMyArMTA4LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY3J5cHRvX3hjYmNfZGlnZXN0X3VwZGF0ZShzdHJ1Y3QgaGFzaF9kZXNjICpwZGVzYywKLQkJCQkgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQorc3RhdGljIGludCBjcnlwdG9feGNiY19kaWdlc3RfdXBkYXRlMihzdHJ1Y3QgaGFzaF9kZXNjICpwZGVzYywKKwkJCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7CiAJc3RydWN0IGNyeXB0b19oYXNoICpwYXJlbnQgPSBwZGVzYy0+dGZtOwogCXN0cnVjdCBjcnlwdG9feGNiY19jdHggKmN0eCA9IGNyeXB0b19oYXNoX2N0eF9hbGlnbmVkKHBhcmVudCk7Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGN0eC0+Y2hpbGQ7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSA9IGN0eC0+Y2hpbGQ7CiAJaW50IGJzID0gY3J5cHRvX2hhc2hfYmxvY2tzaXplKHBhcmVudCk7CiAJdW5zaWduZWQgaW50IGkgPSAwOwogCkBAIC0xNDIsNyArMTQyLDcgQEAKIAkJCQkJb2Zmc2V0ICs9IGxlbjsKIAogCQkJCWNyeXB0b19rdW5tYXAocCwgMCk7Ci0JCQkJY3J5cHRvX3lpZWxkKHRmbS0+Y3J0X2ZsYWdzKTsKKwkJCQljcnlwdG9feWllbGQocGRlc2MtPmZsYWdzKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIApAQCAtMTUyLDcgKzE1Miw3IEBACiAJCQlwICs9IGJzIC0gY3R4LT5sZW47CiAKIAkJCWN0eC0+eG9yKGN0eC0+cHJldiwgY3R4LT5vZGRzLCBicyk7Ci0JCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCh0Zm0sIGN0eC0+cHJldiwgY3R4LT5wcmV2KTsKKwkJCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUodGZtLCBjdHgtPnByZXYsIGN0eC0+cHJldik7CiAKIAkJCS8qIGNsZWFyaW5nIHRoZSBsZW5ndGggKi8KIAkJCWN0eC0+bGVuID0gMDsKQEAgLTE2MCw3ICsxNjAsOCBAQAogCQkJLyogZW5jcnlwdGluZyB0aGUgcmVzdCBvZiBkYXRhICovCiAJCQl3aGlsZSAobGVuID4gYnMpIHsKIAkJCQljdHgtPnhvcihjdHgtPnByZXYsIHAsIGJzKTsKLQkJCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCh0Zm0sIGN0eC0+cHJldiwgY3R4LT5wcmV2KTsKKwkJCQljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKHRmbSwgY3R4LT5wcmV2LAorCQkJCQkJCSAgY3R4LT5wcmV2KTsKIAkJCQlwICs9IGJzOwogCQkJCWxlbiAtPSBiczsKIAkJCX0KQEAgLTE3MSw3ICsxNzIsNyBAQAogCQkJCWN0eC0+bGVuID0gbGVuOwogCQkJfQogCQkJY3J5cHRvX2t1bm1hcChwLCAwKTsKLQkJCWNyeXB0b195aWVsZCh0Zm0tPmNydF9mbGFncyk7CisJCQljcnlwdG9feWllbGQocGRlc2MtPmZsYWdzKTsKIAkJCXNsZW4gLT0gbWluKHNsZW4sICgodW5zaWduZWQgaW50KShQQUdFX1NJWkUpKSAtIG9mZnNldCk7CiAJCQlvZmZzZXQgPSAwOwogCQkJcGcrKzsKQEAgLTE4MywxMSArMTg0LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY3J5cHRvX3hjYmNfZGlnZXN0X3VwZGF0ZShzdHJ1Y3QgaGFzaF9kZXNjICpwZGVzYywKKwkJCQkgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCWlmIChXQVJOX09OX09OQ0UoaW5faXJxKCkpKQorCQlyZXR1cm4gLUVERUFETEs7CisJcmV0dXJuIGNyeXB0b194Y2JjX2RpZ2VzdF91cGRhdGUyKHBkZXNjLCBzZywgbmJ5dGVzKTsKK30KKwogc3RhdGljIGludCBjcnlwdG9feGNiY19kaWdlc3RfZmluYWwoc3RydWN0IGhhc2hfZGVzYyAqcGRlc2MsIHU4ICpvdXQpCiB7CiAJc3RydWN0IGNyeXB0b19oYXNoICpwYXJlbnQgPSBwZGVzYy0+dGZtOwogCXN0cnVjdCBjcnlwdG9feGNiY19jdHggKmN0eCA9IGNyeXB0b19oYXNoX2N0eF9hbGlnbmVkKHBhcmVudCk7Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGN0eC0+Y2hpbGQ7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSA9IGN0eC0+Y2hpbGQ7CiAJaW50IGJzID0gY3J5cHRvX2hhc2hfYmxvY2tzaXplKHBhcmVudCk7CiAJaW50IGVyciA9IDA7CiAKQEAgLTE5NywxMyArMjA3LDE0IEBACiAJCWlmICgoZXJyID0gY3J5cHRvX2NpcGhlcl9zZXRrZXkodGZtLCBjdHgtPmtleSwgY3R4LT5rZXlsZW4pKSAhPSAwKQogCQkJcmV0dXJuIGVycjsKIAotCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCh0Zm0sIGtleTIsIChjb25zdCB1OCopKGN0eC0+Y29uc3RzK2JzKSk7CisJCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUodGZtLCBrZXkyLAorCQkJCQkgICh1OCAqKShjdHgtPmNvbnN0cyArIGJzKSk7CiAKIAkJY3R4LT54b3IoY3R4LT5wcmV2LCBjdHgtPm9kZHMsIGJzKTsKIAkJY3R4LT54b3IoY3R4LT5wcmV2LCBrZXkyLCBicyk7CiAJCV9jcnlwdG9feGNiY19kaWdlc3Rfc2V0a2V5KHBhcmVudCwgY3R4KTsKIAotCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCh0Zm0sIG91dCwgY3R4LT5wcmV2KTsKKwkJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZSh0Zm0sIG91dCwgY3R4LT5wcmV2KTsKIAl9IGVsc2UgewogCQl1OCBrZXkzW2JzXTsKIAkJdW5zaWduZWQgaW50IHJsZW47CkBAIC0yMTgsMTQgKzIyOSwxNSBAQAogCQlpZiAoKGVyciA9IGNyeXB0b19jaXBoZXJfc2V0a2V5KHRmbSwgY3R4LT5rZXksIGN0eC0+a2V5bGVuKSkgIT0gMCkKIAkJCXJldHVybiBlcnI7CiAKLQkJdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQodGZtLCBrZXkzLCAoY29uc3QgdTgqKShjdHgtPmNvbnN0cyticyoyKSk7CisJCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUodGZtLCBrZXkzLAorCQkJCQkgICh1OCAqKShjdHgtPmNvbnN0cyArIGJzICogMikpOwogCiAJCWN0eC0+eG9yKGN0eC0+cHJldiwgY3R4LT5vZGRzLCBicyk7CiAJCWN0eC0+eG9yKGN0eC0+cHJldiwga2V5MywgYnMpOwogCiAJCV9jcnlwdG9feGNiY19kaWdlc3Rfc2V0a2V5KHBhcmVudCwgY3R4KTsKIAotCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCh0Zm0sIG91dCwgY3R4LT5wcmV2KTsKKwkJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZSh0Zm0sIG91dCwgY3R4LT5wcmV2KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIzNCwyMSArMjQ2LDI1IEBACiBzdGF0aWMgaW50IGNyeXB0b194Y2JjX2RpZ2VzdChzdHJ1Y3QgaGFzaF9kZXNjICpwZGVzYywKIAkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqb3V0KQogeworCWlmIChXQVJOX09OX09OQ0UoaW5faXJxKCkpKQorCQlyZXR1cm4gLUVERUFETEs7CisKIAljcnlwdG9feGNiY19kaWdlc3RfaW5pdChwZGVzYyk7Ci0JY3J5cHRvX3hjYmNfZGlnZXN0X3VwZGF0ZShwZGVzYywgc2csIG5ieXRlcyk7CisJY3J5cHRvX3hjYmNfZGlnZXN0X3VwZGF0ZTIocGRlc2MsIHNnLCBuYnl0ZXMpOwogCXJldHVybiBjcnlwdG9feGNiY19kaWdlc3RfZmluYWwocGRlc2MsIG91dCk7CiB9CiAKIHN0YXRpYyBpbnQgeGNiY19pbml0X3RmbShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogeworCXN0cnVjdCBjcnlwdG9fY2lwaGVyICpjaXBoZXI7CiAJc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCA9ICh2b2lkICopdGZtLT5fX2NydF9hbGc7CiAJc3RydWN0IGNyeXB0b19zcGF3biAqc3Bhd24gPSBjcnlwdG9faW5zdGFuY2VfY3R4KGluc3QpOwogCXN0cnVjdCBjcnlwdG9feGNiY19jdHggKmN0eCA9IGNyeXB0b19oYXNoX2N0eF9hbGlnbmVkKF9fY3J5cHRvX2hhc2hfY2FzdCh0Zm0pKTsKIAlpbnQgYnMgPSBjcnlwdG9faGFzaF9ibG9ja3NpemUoX19jcnlwdG9faGFzaF9jYXN0KHRmbSkpOwogCi0JdGZtID0gY3J5cHRvX3NwYXduX3RmbShzcGF3bik7Ci0JaWYgKElTX0VSUih0Zm0pKQotCQlyZXR1cm4gUFRSX0VSUih0Zm0pOworCWNpcGhlciA9IGNyeXB0b19zcGF3bl9jaXBoZXIoc3Bhd24pOworCWlmIChJU19FUlIoY2lwaGVyKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2lwaGVyKTsKIAogCXN3aXRjaChicykgewogCWNhc2UgMTY6CkBAIC0yNTgsNyArMjc0LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY3R4LT5jaGlsZCA9IGNyeXB0b19jaXBoZXJfY2FzdCh0Zm0pOworCWN0eC0+Y2hpbGQgPSBjaXBoZXI7CiAJY3R4LT5vZGRzID0gKHU4KikoY3R4KzEpOwogCWN0eC0+cHJldiA9IGN0eC0+b2RkcyArIGJzOwogCWN0eC0+a2V5ID0gY3R4LT5wcmV2ICsgYnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9NYWtlZmlsZQppbmRleCAwZGQ5NmQxLi5mMjhkY2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTMwLDcgKzMwLDcgQEAKIG9iai15CQkJCSs9IGJhc2UvIGJsb2NrLyBtaXNjLyBtZmQvIG5ldC8gbWVkaWEvCiBvYmotJChDT05GSUdfTlVCVVMpCQkrPSBudWJ1cy8KIG9iai0kKENPTkZJR19BVE0pCQkrPSBhdG0vCi1vYmotJChDT05GSUdfUFBDX1BNQUMpCQkrPSBtYWNpbnRvc2gvCitvYmoteQkJCQkrPSBtYWNpbnRvc2gvCiBvYmotJChDT05GSUdfSURFKQkJKz0gaWRlLwogb2JqLSQoQ09ORklHX0ZDNCkJCSs9IGZjNC8KIG9iai0kKENPTkZJR19TQ1NJKQkJKz0gc2NzaS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9iYXkuYyBiL2RyaXZlcnMvYWNwaS9iYXkuYwppbmRleCA2NjdmYTFkLi45MTA4MmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYmF5LmMKKysrIGIvZHJpdmVycy9hY3BpL2JheS5jCkBAIC0yOTYsNyArMjk2LDcgQEAKIAkvKgogCSAqIEluaXRpYWxpemUgYmF5IGRldmljZSBzdHJ1Y3R1cmUKIAkgKi8KLQluZXdfYmF5ID0ga3phbGxvYyhHRlBfQVRPTUlDLCBzaXplb2YoKm5ld19iYXkpKTsKKwluZXdfYmF5ID0ga3phbGxvYyhzaXplb2YoKm5ld19iYXkpLCBHRlBfQVRPTUlDKTsKIAlJTklUX0xJU1RfSEVBRCgmbmV3X2JheS0+bGlzdCk7CiAJbmV3X2JheS0+aGFuZGxlID0gaGFuZGxlOwogCW5ld19iYXktPm5hbWUgPSAoY2hhciAqKW5idWZmZXIucG9pbnRlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2kuYyBiL2RyaXZlcnMvYXRhL2FoY2kuYwppbmRleCA0ODYxNmM2Li5lMjc5NmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9haGNpLmMKKysrIGIvZHJpdmVycy9hdGEvYWhjaS5jCkBAIC0xMTczLDcgKzExNzMsNyBAQAogCQkgKiBkYW5nZXJvdXMsIHdlIG5lZWQgdG8ga25vdyBtb3JlIGFib3V0IHRoZW0uICBQcmludAogCQkgKiBtb3JlIG9mIGl0LgogCQkgKi8KLQkJY29uc3QgdTMyICpmID0gcHAtPnJ4X2ZpcyArIFJYX0ZJU19TREI7CisJCWNvbnN0IF9fbGUzMiAqZiA9IHBwLT5yeF9maXMgKyBSWF9GSVNfU0RCOwogCiAJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9JTkZPLCAiU3B1cmlvdXMgU0RCIEZJUyBkdXJpbmcgTkNRICIKIAkJCQkiaXNzdWU9MHgleCBTQWN0PTB4JXggRklTPSUwOHg6JTA4eCVzXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zdncuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc3Z3LmMKaW5kZXggNDZkOGE5NC4uNWY0ZTgyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zdncuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3N2dy5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIHsKIAlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCiAJCXJldHVybiAweGZmZmZmZmZmVTsKLQlyZXR1cm4gcmVhZGwoKHZvaWQgKikgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7CisJcmV0dXJuIHJlYWRsKCh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7CiB9CiAKIApAQCAtMTI1LDcgKzEyNSw3IEBACiB7CiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQogCQlyZXR1cm47Ci0Jd3JpdGVsKHZhbCwgKHZvaWQgKikgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7CisJd3JpdGVsKHZhbCwgKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKIH0KIAogCkBAIC0yNjIsNyArMjYyLDcgQEAKIAogc3RhdGljIHU4IGsyX3N0YXRfY2hlY2tfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0gICAgICAgCXJldHVybiByZWFkbCgodm9pZCAqKSBhcC0+aW9hZGRyLnN0YXR1c19hZGRyKTsKKyAgICAgICAJcmV0dXJuIHJlYWRsKCh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5zdGF0dXNfYWRkcik7CiB9CiAKICNpZmRlZiBDT05GSUdfUFBDX09GCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbWFjaHp3ZC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL21hY2h6d2QuYwppbmRleCAyNzY1NzdkLi40ZDczMGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbWFjaHp3ZC5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9tYWNoendkLmMKQEAgLTMyNSw3ICszMjUsNyBAQAogCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwogCiAJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgotCQkJemZfcGluZygwKTsKKwkJCXpmX3BpbmcoTlVMTCk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vZ2VvZGUtYWVzLmMgYi9kcml2ZXJzL2NyeXB0by9nZW9kZS1hZXMuYwppbmRleCA0M2E2ODM5Li4zMWVhNDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9nZW9kZS1hZXMuYworKysgYi9kcml2ZXJzL2NyeXB0by9nZW9kZS1hZXMuYwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiBzdGF0aWMgaW50IF9faW5pdAogZ2VvZGVfYWVzX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZnZW9kZV9hZXNfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZ2VvZGVfYWVzX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hbXMvYW1zLWlucHV0LmMgYi9kcml2ZXJzL2h3bW9uL2Ftcy9hbXMtaW5wdXQuYwppbmRleCBmMTI2YWE0Li4xODIxMDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Ftcy9hbXMtaW5wdXQuYworKysgYi9kcml2ZXJzL2h3bW9uL2Ftcy9hbXMtaW5wdXQuYwpAQCAtMTUzLDcgKzE1Myw3IEBACiB9CiAKIC8qIENhbGwgd2l0aCBhbXNfaW5mby5sb2NrIGhlbGQhICovCi12b2lkIGFtc19pbnB1dF9leGl0KCkKK3ZvaWQgYW1zX2lucHV0X2V4aXQodm9pZCkKIHsKIAlhbXNfaW5wdXRfZGlzYWJsZSgpOwogCWRldmljZV9yZW1vdmVfZmlsZSgmYW1zX2luZm8ub2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9qb3lzdGljayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl9pbml0aWF0b3IuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCmluZGV4IDBhN2QxYWIuLjg5ZTM3MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCkBAIC01NjcsNyArNTY3LDcgQEAKIAlvcGNvZGUgPSBoZHItPm9wY29kZSAmIElTQ1NJX09QQ09ERV9NQVNLOwogCiAJaWYgKG9wY29kZSA9PSBJU0NTSV9PUF9TQ1NJX0NNRF9SU1ApIHsKLQkgICAgICAgIGl0dCA9IGhkci0+aXR0ICYgSVNDU0lfSVRUX01BU0s7IC8qIG1hc2sgb3V0IGNpZCBhbmQgYWdlIGJpdHMgKi8KKwkgICAgICAgIGl0dCA9IGdldF9pdHQoaGRyLT5pdHQpOyAvKiBtYXNrIG91dCBjaWQgYW5kIGFnZSBiaXRzICovCiAJCWlmICghKGl0dCA8IHNlc3Npb24tPmNtZHNfbWF4KSkKIAkJCWlzZXJfZXJyKCJpdHQgY2FuJ3QgYmUgbWF0Y2hlZCB0byB0YXNrISEhIgogCQkJCSAiY29ubiAlcCBvcGNvZGUgJWQgY21kc19tYXggJWQgaXR0ICVkXG4iLApAQCAtNjI1LDcgKzYyNSw3IEBACiAJCS8qIHRoaXMgYXJpdGhtZXRpYyBpcyBsZWdhbCBieSBsaWJpc2NzaSBkZF9kYXRhIGFsbG9jYXRpb24gKi8KIAkJbXRhc2sgPSAodm9pZCAqKSAoKGxvbmcpKHZvaWQgKil0eF9kZXNjIC0KIAkJCQkgIHNpemVvZihzdHJ1Y3QgaXNjc2lfbWdtdF90YXNrKSk7Ci0JCWlmIChtdGFzay0+aGRyLT5pdHQgPT0gY3B1X3RvX2JlMzIoSVNDU0lfUkVTRVJWRURfVEFHKSkgeworCQlpZiAobXRhc2stPmhkci0+aXR0ID09IFJFU0VSVkVEX0lUVCkgewogCQkJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjb25uLT5zZXNzaW9uOwogCiAJCQlzcGluX2xvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYwppbmRleCA0MzU4YTBhLi5jN2RiNDAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAogCiBzdHJ1Y3QgdWNiMTQwMCB7Ci0JYWM5N190CQkJKmFjOTc7CisJc3RydWN0IHNuZF9hYzk3CQkqYWM5NzsKIAlzdHJ1Y3QgaW5wdXRfZGV2CSp0c19pZGV2OwogCiAJaW50CQkJaXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9rdm0va3ZtX21haW4uYyBiL2RyaXZlcnMva3ZtL2t2bV9tYWluLmMKaW5kZXggYjEwOTcyZS4uMDk5ZjBhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9rdm0va3ZtX21haW4uYworKysgYi9kcml2ZXJzL2t2bS9rdm1fbWFpbi5jCkBAIC02Miw3ICs2Miw3IEBACiAJeyAiaGFsdF9leGl0cyIsICZrdm1fc3RhdC5oYWx0X2V4aXRzIH0sCiAJeyAicmVxdWVzdF9pcnEiLCAma3ZtX3N0YXQucmVxdWVzdF9pcnFfZXhpdHMgfSwKIAl7ICJpcnFfZXhpdHMiLCAma3ZtX3N0YXQuaXJxX2V4aXRzIH0sCi0JeyAwLCAwIH0KKwl7IE5VTEwsIE5VTEwgfQogfTsKIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGlyOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAJbXV0ZXhfbG9jaygmdmNwdS0+bXV0ZXgpOwogCWlmICh1bmxpa2VseSghdmNwdS0+dm1jcykpIHsKIAkJbXV0ZXhfdW5sb2NrKCZ2Y3B1LT5tdXRleCk7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gTlVMTDsKIAl9CiAJcmV0dXJuIGt2bV9hcmNoX29wcy0+dmNwdV9sb2FkKHZjcHUpOwogfQpAQCAtMjU3LDkgKzI1Nyw5IEBACiAJaWYgKCFkb250IHx8IGZyZWUtPmRpcnR5X2JpdG1hcCAhPSBkb250LT5kaXJ0eV9iaXRtYXApCiAJCXZmcmVlKGZyZWUtPmRpcnR5X2JpdG1hcCk7CiAKLQlmcmVlLT5waHlzX21lbSA9IDA7CisJZnJlZS0+cGh5c19tZW0gPSBOVUxMOwogCWZyZWUtPm5wYWdlcyA9IDA7Ci0JZnJlZS0+ZGlydHlfYml0bWFwID0gMDsKKwlmcmVlLT5kaXJ0eV9iaXRtYXAgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBrdm1fZnJlZV9waHlzbWVtKHN0cnVjdCBrdm0gKmt2bSkKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGt2bS0+bm1lbXNsb3RzOyArK2kpCi0JCWt2bV9mcmVlX3BoeXNtZW1fc2xvdCgma3ZtLT5tZW1zbG90c1tpXSwgMCk7CisJCWt2bV9mcmVlX3BoeXNtZW1fc2xvdCgma3ZtLT5tZW1zbG90c1tpXSwgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGt2bV9mcmVlX3ZjcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtNjQwLDExICs2NDAsMTEgQEAKIAogCS8qIERlYWxsb2NhdGUgaWYgc2xvdCBpcyBiZWluZyByZW1vdmVkICovCiAJaWYgKCFucGFnZXMpCi0JCW5ldy5waHlzX21lbSA9IDA7CisJCW5ldy5waHlzX21lbSA9IE5VTEw7CiAKIAkvKiBGcmVlIHBhZ2UgZGlydHkgYml0bWFwIGlmIHVubmVlZGVkICovCiAJaWYgKCEobmV3LmZsYWdzICYgS1ZNX01FTV9MT0dfRElSVFlfUEFHRVMpKQotCQluZXcuZGlydHlfYml0bWFwID0gMDsKKwkJbmV3LmRpcnR5X2JpdG1hcCA9IE5VTEw7CiAKIAlyID0gLUVOT01FTTsKIApAQCAtNzk5LDE0ICs3OTksMTQgQEAKIAkJICAgICYmIGdmbiA8IG1lbXNsb3QtPmJhc2VfZ2ZuICsgbWVtc2xvdC0+bnBhZ2VzKQogCQkJcmV0dXJuIG1lbXNsb3Q7CiAJfQotCXJldHVybiAwOworCXJldHVybiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2ZuX3RvX21lbXNsb3QpOwogCiB2b2lkIG1hcmtfcGFnZV9kaXJ0eShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKIHsKIAlpbnQgaTsKLQlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90ID0gMDsKKwlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIHJlbF9nZm47CiAKIAlmb3IgKGkgPSAwOyBpIDwga3ZtLT5ubWVtc2xvdHM7ICsraSkgewpAQCAtMTc3OCw2ICsxNzc4LDcgQEAKIAkJCSAgdW5zaWduZWQgaW50IGlvY3RsLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3Qga3ZtICprdm0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IHIgPSAtRUlOVkFMOwogCiAJc3dpdGNoIChpb2N0bCkgewpAQCAtMTc5NCwxMiArMTc5NSwxMiBAQAogCQlzdHJ1Y3Qga3ZtX3J1biBrdm1fcnVuOwogCiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmt2bV9ydW4sICh2b2lkICopYXJnLCBzaXplb2Yga3ZtX3J1bikpCisJCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3J1biwgYXJncCwgc2l6ZW9mIGt2bV9ydW4pKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fZGV2X2lvY3RsX3J1bihrdm0sICZrdm1fcnVuKTsKIAkJaWYgKHIgPCAwICYmICByICE9IC1FSU5UUikKIAkJCWdvdG8gb3V0OwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAma3ZtX3J1biwgc2l6ZW9mIGt2bV9ydW4pKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmt2bV9ydW4sIHNpemVvZiBrdm1fcnVuKSkgewogCQkJciA9IC1FRkFVTFQ7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTgwOSwxMyArMTgxMCwxMyBAQAogCQlzdHJ1Y3Qga3ZtX3JlZ3Mga3ZtX3JlZ3M7CiAKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3JlZ3MsICh2b2lkICopYXJnLCBzaXplb2Yga3ZtX3JlZ3MpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmt2bV9yZWdzLCBhcmdwLCBzaXplb2Yga3ZtX3JlZ3MpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fZGV2X2lvY3RsX2dldF9yZWdzKGt2bSwgJmt2bV9yZWdzKTsKIAkJaWYgKHIpCiAJCQlnb3RvIG91dDsKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZrdm1fcmVncywgc2l6ZW9mIGt2bV9yZWdzKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAma3ZtX3JlZ3MsIHNpemVvZiBrdm1fcmVncykpCiAJCQlnb3RvIG91dDsKIAkJciA9IDA7CiAJCWJyZWFrOwpAQCAtMTgyNCw3ICsxODI1LDcgQEAKIAkJc3RydWN0IGt2bV9yZWdzIGt2bV9yZWdzOwogCiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmt2bV9yZWdzLCAodm9pZCAqKWFyZywgc2l6ZW9mIGt2bV9yZWdzKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZrdm1fcmVncywgYXJncCwgc2l6ZW9mIGt2bV9yZWdzKSkKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX2Rldl9pb2N0bF9zZXRfcmVncyhrdm0sICZrdm1fcmVncyk7CiAJCWlmIChyKQpAQCAtMTgzNiwxMyArMTgzNywxMyBAQAogCQlzdHJ1Y3Qga3ZtX3NyZWdzIGt2bV9zcmVnczsKIAogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZrdm1fc3JlZ3MsICh2b2lkICopYXJnLCBzaXplb2Yga3ZtX3NyZWdzKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZrdm1fc3JlZ3MsIGFyZ3AsIHNpemVvZiBrdm1fc3JlZ3MpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fZGV2X2lvY3RsX2dldF9zcmVncyhrdm0sICZrdm1fc3JlZ3MpOwogCQlpZiAocikKIAkJCWdvdG8gb3V0OwogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmt2bV9zcmVncywgc2l6ZW9mIGt2bV9zcmVncykpCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmt2bV9zcmVncywgc2l6ZW9mIGt2bV9zcmVncykpCiAJCQlnb3RvIG91dDsKIAkJciA9IDA7CiAJCWJyZWFrOwpAQCAtMTg1MSw3ICsxODUyLDcgQEAKIAkJc3RydWN0IGt2bV9zcmVncyBrdm1fc3JlZ3M7CiAKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3NyZWdzLCAodm9pZCAqKWFyZywgc2l6ZW9mIGt2bV9zcmVncykpCisJCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3NyZWdzLCBhcmdwLCBzaXplb2Yga3ZtX3NyZWdzKSkKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX2Rldl9pb2N0bF9zZXRfc3JlZ3Moa3ZtLCAma3ZtX3NyZWdzKTsKIAkJaWYgKHIpCkBAIC0xODYzLDEzICsxODY0LDEzIEBACiAJCXN0cnVjdCBrdm1fdHJhbnNsYXRpb24gdHI7CiAKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdHIsICh2b2lkICopYXJnLCBzaXplb2YgdHIpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJnRyLCBhcmdwLCBzaXplb2YgdHIpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fZGV2X2lvY3RsX3RyYW5zbGF0ZShrdm0sICZ0cik7CiAJCWlmIChyKQogCQkJZ290byBvdXQ7CiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmdHIsIHNpemVvZiB0cikpCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnRyLCBzaXplb2YgdHIpKQogCQkJZ290byBvdXQ7CiAJCXIgPSAwOwogCQlicmVhazsKQEAgLTE4NzgsNyArMTg3OSw3IEBACiAJCXN0cnVjdCBrdm1faW50ZXJydXB0IGlycTsKIAogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpcnEsICh2b2lkICopYXJnLCBzaXplb2YgaXJxKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpcnEsIGFyZ3AsIHNpemVvZiBpcnEpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fZGV2X2lvY3RsX2ludGVycnVwdChrdm0sICZpcnEpOwogCQlpZiAocikKQEAgLTE4OTAsNyArMTg5MSw3IEBACiAJCXN0cnVjdCBrdm1fZGVidWdfZ3Vlc3QgZGJnOwogCiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmRiZywgKHZvaWQgKilhcmcsIHNpemVvZiBkYmcpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmRiZywgYXJncCwgc2l6ZW9mIGRiZykpCiAJCQlnb3RvIG91dDsKIAkJciA9IGt2bV9kZXZfaW9jdGxfZGVidWdfZ3Vlc3Qoa3ZtLCAmZGJnKTsKIAkJaWYgKHIpCkBAIC0xOTAyLDcgKzE5MDMsNyBAQAogCQlzdHJ1Y3Qga3ZtX21lbW9yeV9yZWdpb24ga3ZtX21lbTsKIAogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZrdm1fbWVtLCAodm9pZCAqKWFyZywgc2l6ZW9mIGt2bV9tZW0pKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmt2bV9tZW0sIGFyZ3AsIHNpemVvZiBrdm1fbWVtKSkKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX2Rldl9pb2N0bF9zZXRfbWVtb3J5X3JlZ2lvbihrdm0sICZrdm1fbWVtKTsKIAkJaWYgKHIpCkBAIC0xOTEzLDcgKzE5MTQsNyBAQAogCQlzdHJ1Y3Qga3ZtX2RpcnR5X2xvZyBsb2c7CiAKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmbG9nLCAodm9pZCAqKWFyZywgc2l6ZW9mIGxvZykpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbG9nLCBhcmdwLCBzaXplb2YgbG9nKSkKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX2Rldl9pb2N0bF9nZXRfZGlydHlfbG9nKGt2bSwgJmxvZyk7CiAJCWlmIChyKQpAQCAtMTkyMSwxMyArMTkyMiwxMyBAQAogCQlicmVhazsKIAl9CiAJY2FzZSBLVk1fR0VUX01TUlM6Ci0JCXIgPSBtc3JfaW8oa3ZtLCAodm9pZCBfX3VzZXIgKilhcmcsIGdldF9tc3IsIDEpOworCQlyID0gbXNyX2lvKGt2bSwgYXJncCwgZ2V0X21zciwgMSk7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX1NFVF9NU1JTOgotCQlyID0gbXNyX2lvKGt2bSwgKHZvaWQgX191c2VyICopYXJnLCBkb19zZXRfbXNyLCAwKTsKKwkJciA9IG1zcl9pbyhrdm0sIGFyZ3AsIGRvX3NldF9tc3IsIDApOwogCQlicmVhazsKIAljYXNlIEtWTV9HRVRfTVNSX0lOREVYX0xJU1Q6IHsKLQkJc3RydWN0IGt2bV9tc3JfbGlzdCBfX3VzZXIgKnVzZXJfbXNyX2xpc3QgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJCXN0cnVjdCBrdm1fbXNyX2xpc3QgX191c2VyICp1c2VyX21zcl9saXN0ID0gYXJncDsKIAkJc3RydWN0IGt2bV9tc3JfbGlzdCBtc3JfbGlzdDsKIAkJdW5zaWduZWQgbjsKIApAQCAtMjAxNCw3ICsyMDE1LDcgQEAKIAkJICogaW4gdm14IHJvb3QgbW9kZS4KIAkJICovCiAJCXByaW50ayhLRVJOX0lORk8gImt2bTogZXhpdGluZyBoYXJkd2FyZSB2aXJ0dWFsaXphdGlvblxuIik7Ci0JCW9uX2VhY2hfY3B1KGt2bV9hcmNoX29wcy0+aGFyZHdhcmVfZGlzYWJsZSwgMCwgMCwgMSk7CisJCW9uX2VhY2hfY3B1KGt2bV9hcmNoX29wcy0+aGFyZHdhcmVfZGlzYWJsZSwgTlVMTCwgMCwgMSk7CiAJfQogCXJldHVybiBOT1RJRllfT0s7CiB9CkBAIC0yMDI4LDcgKzIwMjksNyBAQAogewogCXN0cnVjdCBrdm1fc3RhdHNfZGVidWdmc19pdGVtICpwOwogCi0JZGVidWdmc19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImt2bSIsIDApOworCWRlYnVnZnNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJrdm0iLCBOVUxMKTsKIAlmb3IgKHAgPSBkZWJ1Z2ZzX2VudHJpZXM7IHAtPm5hbWU7ICsrcCkKIAkJcC0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfdTMyKHAtPm5hbWUsIDA0NDQsIGRlYnVnZnNfZGlyLAogCQkJCQkgICAgICAgcC0+ZGF0YSk7CkBAIC0yMDY5LDcgKzIwNzAsNyBAQAogCWlmIChyIDwgMCkKIAkgICAgcmV0dXJuIHI7CiAKLQlvbl9lYWNoX2NwdShrdm1fYXJjaF9vcHMtPmhhcmR3YXJlX2VuYWJsZSwgMCwgMCwgMSk7CisJb25fZWFjaF9jcHUoa3ZtX2FyY2hfb3BzLT5oYXJkd2FyZV9lbmFibGUsIE5VTEwsIDAsIDEpOwogCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigma3ZtX3JlYm9vdF9ub3RpZmllcik7CiAKIAlrdm1fY2hhcmRldl9vcHMub3duZXIgPSBtb2R1bGU7CkBAIC0yMDg0LDcgKzIwODUsNyBAQAogCiBvdXRfZnJlZToKIAl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigma3ZtX3JlYm9vdF9ub3RpZmllcik7Ci0Jb25fZWFjaF9jcHUoa3ZtX2FyY2hfb3BzLT5oYXJkd2FyZV9kaXNhYmxlLCAwLCAwLCAxKTsKKwlvbl9lYWNoX2NwdShrdm1fYXJjaF9vcHMtPmhhcmR3YXJlX2Rpc2FibGUsIE5VTEwsIDAsIDEpOwogCWt2bV9hcmNoX29wcy0+aGFyZHdhcmVfdW5zZXR1cCgpOwogCXJldHVybiByOwogfQpAQCAtMjA5NCw3ICsyMDk1LDcgQEAKIAltaXNjX2RlcmVnaXN0ZXIoJmt2bV9kZXYpOwogCiAJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmt2bV9yZWJvb3Rfbm90aWZpZXIpOwotCW9uX2VhY2hfY3B1KGt2bV9hcmNoX29wcy0+aGFyZHdhcmVfZGlzYWJsZSwgMCwgMCwgMSk7CisJb25fZWFjaF9jcHUoa3ZtX2FyY2hfb3BzLT5oYXJkd2FyZV9kaXNhYmxlLCBOVUxMLCAwLCAxKTsKIAlrdm1fYXJjaF9vcHMtPmhhcmR3YXJlX3Vuc2V0dXAoKTsKIAlrdm1fYXJjaF9vcHMgPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9rdm0vbW11LmMgYi9kcml2ZXJzL2t2bS9tbXUuYwppbmRleCAyMmM0MjZjLi5iZTc5Mzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2t2bS9tbXUuYworKysgYi9kcml2ZXJzL2t2bS9tbXUuYwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJZm9yIChqID0gUk1BUF9FWFQgLSAxOyAhZGVzYy0+c2hhZG93X3B0ZXNbal0gJiYgaiA+IGk7IC0taikKIAkJOwogCWRlc2MtPnNoYWRvd19wdGVzW2ldID0gZGVzYy0+c2hhZG93X3B0ZXNbal07Ci0JZGVzYy0+c2hhZG93X3B0ZXNbal0gPSAwOworCWRlc2MtPnNoYWRvd19wdGVzW2pdID0gTlVMTDsKIAlpZiAoaiAhPSAwKQogCQlyZXR1cm47CiAJaWYgKCFwcmV2X2Rlc2MgJiYgIWRlc2MtPm1vcmUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2t2bS9zdm0uYyBiL2RyaXZlcnMva3ZtL3N2bS5jCmluZGV4IGM3OWRmNzkuLjg1ZjYxZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMva3ZtL3N2bS5jCisrKyBiL2RyaXZlcnMva3ZtL3N2bS5jCkBAIC0yNzQsNyArMjc0LDcgQEAKIAkJd3Jtc3JsKE1TUl9WTV9IU0FWRV9QQSwgMCk7CiAJCXJkbXNybChNU1JfRUZFUiwgZWZlcik7CiAJCXdybXNybChNU1JfRUZFUiwgZWZlciAmIH5NU1JfRUZFUl9TVk1FX01BU0spOwotCQlwZXJfY3B1KHN2bV9kYXRhLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IDA7CisJCXBlcl9jcHUoc3ZtX2RhdGEsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpID0gTlVMTDsKIAkJX19mcmVlX3BhZ2Uoc3ZtX2RhdGEtPnNhdmVfYXJlYSk7CiAJCWtmcmVlKHN2bV9kYXRhKTsKIAl9CkBAIC02NDIsNyArNjQyLDcgQEAKIAljYXNlIFZDUFVfU1JFR19MRFRSOiByZXR1cm4gJnNhdmUtPmxkdHI7CiAJfQogCUJVRygpOwotCXJldHVybiAwOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdTY0IHN2bV9nZXRfc2VnbWVudF9iYXNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHNlZykKQEAgLTkzNCw3ICs5MzQsNyBAQAogCQlyZXR1cm4gMDsKIAogCSphZGRyX292ZXJyaWRlID0gMDsKLQkqc2VnID0gMDsKKwkqc2VnID0gTlVMTDsKIAlmb3IgKGkgPSAwOyBpIDwgaW5zX2xlbmd0aDsgaSsrKQogCQlzd2l0Y2ggKGluc3RbaV0pIHsKIAkJY2FzZSAweGYwOgpAQCAtMTA4Nyw3ICsxMDg3LDcgQEAKIAogc3RhdGljIGludCBlbXVsYXRlX29uX2ludGVyY2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQogewotCWlmIChlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIDAsIDAsIDApICE9IEVNVUxBVEVfRE9ORSkKKwlpZiAoZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCBOVUxMLCAwLCAwKSAhPSBFTVVMQVRFX0RPTkUpCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMva3ZtL3ZteC5jIGIvZHJpdmVycy9rdm0vdm14LmMKaW5kZXggNTRjMzVjMC4uMjdlMDVhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9rdm0vdm14LmMKKysrIGIvZHJpdmVycy9rdm0vdm14LmMKQEAgLTk4LDcgKzk4LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgdmNwdS0+bm1zcnM7ICsraSkKIAkJaWYgKHZjcHUtPmd1ZXN0X21zcnNbaV0uaW5kZXggPT0gbXNyKQogCQkJcmV0dXJuICZ2Y3B1LT5ndWVzdF9tc3JzW2ldOwotCXJldHVybiAwOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCB2bWNzX2NsZWFyKHN0cnVjdCB2bWNzICp2bWNzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZyBiL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcKaW5kZXggYTllNzQ3Yy4uMWE4NjM4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZworKysgYi9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogCiBtZW51ICJNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBQUEMgfHwgTUFDCisJZGVwZW5kcyBvbiBQUEMgfHwgTUFDIHx8IFg4NgogCiBjb25maWcgQURCCiAJYm9vbCAiQXBwbGUgRGVza3RvcCBCdXMgKEFEQikgc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3JhY2stbWV0ZXIuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3JhY2stbWV0ZXIuYwppbmRleCA1ZWQ0MWZlLi5mODNmYWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9yYWNrLW1ldGVyLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvcmFjay1tZXRlci5jCkBAIC0xNzEsMTEgKzE3MSwxMSBAQAogCS8qIE1ha2Ugc3VyZSBkYmRtYSBpcyByZXNldCAqLwogCURCRE1BX0RPX1JFU0VUKHJtLT5kbWFfcmVncyk7CiAKLQlwcl9kZWJ1ZygicmFja21ldGVyOiBtYXJrIG9mZnNldD0weCVseFxuIiwKKwlwcl9kZWJ1ZygicmFja21ldGVyOiBtYXJrIG9mZnNldD0weCV6eFxuIiwKIAkJIG9mZnNldG9mKHN0cnVjdCByYWNrbWV0ZXJfZG1hLCBtYXJrKSk7Ci0JcHJfZGVidWcoInJhY2ttZXRlcjogYnVmMSBvZmZzZXQ9MHglbHhcbiIsCisJcHJfZGVidWcoInJhY2ttZXRlcjogYnVmMSBvZmZzZXQ9MHglenhcbiIsCiAJCSBvZmZzZXRvZihzdHJ1Y3QgcmFja21ldGVyX2RtYSwgYnVmMSkpOwotCXByX2RlYnVnKCJyYWNrbWV0ZXI6IGJ1ZjIgb2Zmc2V0PTB4JWx4XG4iLAorCXByX2RlYnVnKCJyYWNrbWV0ZXI6IGJ1ZjIgb2Zmc2V0PTB4JXp4XG4iLAogCQkgb2Zmc2V0b2Yoc3RydWN0IHJhY2ttZXRlcl9kbWEsIGJ1ZjIpKTsKIAogCS8qIFByZXBhcmUgNCBkYmRtYSBjb21tYW5kcyBmb3IgdGhlIDIgYnVmZmVycyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggMTExMDgxNi4uMDU5NzA0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC0xMTYwLDYgKzExNjAsMjIgQEAKIAkJCXJldHVybiAwOwogCQl9CiAKKwkJaWYgKHVubGlrZWx5KCgqYm1jICYgQ09VTlRFUl9NQVgpID09IENPVU5URVJfTUFYKSkgeworCQkJREVGSU5FX1dBSVQoX193YWl0KTsKKwkJCS8qIG5vdGUgdGhhdCBpdCBpcyBzYWZlIHRvIGRvIHRoZSBwcmVwYXJlX3RvX3dhaXQKKwkJCSAqIGFmdGVyIHRoZSB0ZXN0IGFzIGxvbmcgYXMgd2UgZG8gaXQgYmVmb3JlIGRyb3BwaW5nCisJCQkgKiB0aGUgc3BpbmxvY2suCisJCQkgKi8KKwkJCXByZXBhcmVfdG9fd2FpdCgmYml0bWFwLT5vdmVyZmxvd193YWl0LCAmX193YWl0LAorCQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzcGluX3VubG9ja19pcnEoJmJpdG1hcC0+bG9jayk7CisJCQliaXRtYXAtPm1kZGV2LT5xdWV1ZQorCQkJCS0+dW5wbHVnX2ZuKGJpdG1hcC0+bWRkZXYtPnF1ZXVlKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlmaW5pc2hfd2FpdCgmYml0bWFwLT5vdmVyZmxvd193YWl0LCAmX193YWl0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJc3dpdGNoKCpibWMpIHsKIAkJY2FzZSAwOgogCQkJYml0bWFwX2ZpbGVfc2V0X2JpdChiaXRtYXAsIG9mZnNldCk7CkBAIC0xMTY5LDcgKzExODUsNyBAQAogCQljYXNlIDE6CiAJCQkqYm1jID0gMjsKIAkJfQotCQlCVUdfT04oKCpibWMgJiBDT1VOVEVSX01BWCkgPT0gQ09VTlRFUl9NQVgpOworCiAJCSgqYm1jKSsrOwogCiAJCXNwaW5fdW5sb2NrX2lycSgmYml0bWFwLT5sb2NrKTsKQEAgLTEyMDcsNiArMTIyMyw5IEBACiAJCWlmICghc3VjY2VzcyAmJiAhICgqYm1jICYgTkVFREVEX01BU0spKQogCQkJKmJtYyB8PSBORUVERURfTUFTSzsKIAorCQlpZiAoKCpibWMgJiBDT1VOVEVSX01BWCkgPT0gQ09VTlRFUl9NQVgpCisJCQl3YWtlX3VwKCZiaXRtYXAtPm92ZXJmbG93X3dhaXQpOworCiAJCSgqYm1jKS0tOwogCQlpZiAoKmJtYyA8PSAyKSB7CiAJCQlzZXRfcGFnZV9hdHRyKGJpdG1hcCwKQEAgLTE0MzEsNiArMTQ1MCw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmJpdG1hcC0+bG9jayk7CiAJYXRvbWljX3NldCgmYml0bWFwLT5wZW5kaW5nX3dyaXRlcywgMCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYml0bWFwLT53cml0ZV93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZiaXRtYXAtPm92ZXJmbG93X3dhaXQpOwogCiAJYml0bWFwLT5tZGRldiA9IG1kZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmMgYi9kcml2ZXJzL21kL3JhaWQ1LmMKaW5kZXggNDY3YzE2OS4uMTFjM2Q3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuYwpAQCAtMjYyMCw3ICsyNjIwLDcgQEAKIAl9CiAJYmkgPSBjb25mLT5yZXRyeV9yZWFkX2FsaWduZWRfbGlzdDsKIAlpZihiaSkgewotCQljb25mLT5yZXRyeV9yZWFkX2FsaWduZWQgPSBiaS0+YmlfbmV4dDsKKwkJY29uZi0+cmV0cnlfcmVhZF9hbGlnbmVkX2xpc3QgPSBiaS0+YmlfbmV4dDsKIAkJYmktPmJpX25leHQgPSBOVUxMOwogCQliaS0+YmlfcGh5c19zZWdtZW50cyA9IDE7IC8qIGJpYXNlZCBjb3VudCBvZiBhY3RpdmUgc3RyaXBlcyAqLwogCQliaS0+YmlfaHdfc2VnbWVudHMgPSAwOyAvKiBjb3VudCBvZiBwcm9jZXNzZWQgc3RyaXBlcyAqLwpAQCAtMjY2OSw2ICsyNjY5LDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYmlvX2ZpdHNfcmRldihzdHJ1Y3QgYmlvICpiaSkKK3sKKwlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBiZGV2X2dldF9xdWV1ZShiaS0+YmlfYmRldik7CisKKwlpZiAoKGJpLT5iaV9zaXplPj45KSA+IHEtPm1heF9zZWN0b3JzKQorCQlyZXR1cm4gMDsKKwlibGtfcmVjb3VudF9zZWdtZW50cyhxLCBiaSk7CisJaWYgKGJpLT5iaV9waHlzX3NlZ21lbnRzID4gcS0+bWF4X3BoeXNfc2VnbWVudHMgfHwKKwkgICAgYmktPmJpX2h3X3NlZ21lbnRzID4gcS0+bWF4X2h3X3NlZ21lbnRzKQorCQlyZXR1cm4gMDsKKworCWlmIChxLT5tZXJnZV9idmVjX2ZuKQorCQkvKiBpdCdzIHRvbyBoYXJkIHRvIGFwcGx5IHRoZSBtZXJnZV9idmVjX2ZuIGF0IHRoaXMgc3RhZ2UsCisJCSAqIGp1c3QganVzdCBnaXZlIHVwCisJCSAqLworCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisKIHN0YXRpYyBpbnQgY2h1bmtfYWxpZ25lZF9yZWFkKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqIHJhaWRfYmlvKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtMjcxNSw2ICsyNzM2LDEzIEBACiAJCWFsaWduX2JpLT5iaV9mbGFncyAmPSB+KDEgPDwgQklPX1NFR19WQUxJRCk7CiAJCWFsaWduX2JpLT5iaV9zZWN0b3IgKz0gcmRldi0+ZGF0YV9vZmZzZXQ7CiAKKwkJaWYgKCFiaW9fZml0c19yZGV2KGFsaWduX2JpKSkgeworCQkJLyogdG9vIGJpZyBpbiBzb21lIHdheSAqLworCQkJYmlvX3B1dChhbGlnbl9iaSk7CisJCQlyZGV2X2RlY19wZW5kaW5nKHJkZXYsIG1kZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisKIAkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwogCQl3YWl0X2V2ZW50X2xvY2tfaXJxKGNvbmYtPndhaXRfZm9yX3N0cmlwZSwKIAkJCQkgICAgY29uZi0+cXVpZXNjZSA9PSAwLApAQCAtMzEwNyw3ICszMTM1LDkgQEAKIAlsYXN0X3NlY3RvciA9IHJhaWRfYmlvLT5iaV9zZWN0b3IgKyAocmFpZF9iaW8tPmJpX3NpemU+PjkpOwogCiAJZm9yICg7IGxvZ2ljYWxfc2VjdG9yIDwgbGFzdF9zZWN0b3I7Ci0JICAgICBsb2dpY2FsX3NlY3RvciArPSBTVFJJUEVfU0VDVE9SUywgc2NudCsrKSB7CisJICAgICBsb2dpY2FsX3NlY3RvciArPSBTVFJJUEVfU0VDVE9SUywKKwkJICAgICBzZWN0b3IgKz0gU1RSSVBFX1NFQ1RPUlMsCisJCSAgICAgc2NudCsrKSB7CiAKIAkJaWYgKHNjbnQgPCByYWlkX2Jpby0+YmlfaHdfc2VnbWVudHMpCiAJCQkvKiBhbHJlYWR5IGRvbmUgdGhpcyBzdHJpcGUgKi8KQEAgLTMxMjMsNyArMzE1MywxMyBAQAogCQl9CiAKIAkJc2V0X2JpdChSNV9SZWFkRXJyb3IsICZzaC0+ZGV2W2RkX2lkeF0uZmxhZ3MpOwotCQlhZGRfc3RyaXBlX2JpbyhzaCwgcmFpZF9iaW8sIGRkX2lkeCwgMCk7CisJCWlmICghYWRkX3N0cmlwZV9iaW8oc2gsIHJhaWRfYmlvLCBkZF9pZHgsIDApKSB7CisJCQlyZWxlYXNlX3N0cmlwZShzaCk7CisJCQlyYWlkX2Jpby0+YmlfaHdfc2VnbWVudHMgPSBzY250OworCQkJY29uZi0+cmV0cnlfcmVhZF9hbGlnbmVkID0gcmFpZF9iaW87CisJCQlyZXR1cm4gaGFuZGxlZDsKKwkJfQorCiAJCWhhbmRsZV9zdHJpcGUoc2gsIE5VTEwpOwogCQlyZWxlYXNlX3N0cmlwZShzaCk7CiAJCWhhbmRsZWQrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYwppbmRleCBmNTFlMDJmZS4uMGU5NDhhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXIta2V5bWFwcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYwpAQCAtNjk4LDcgKzY5OCw2IEBACiAJWyAweDI5IF0gPSBLRVlfVEVYVCwKIAlbIDB4MmEgXSA9IEtFWV9NRURJQSwKIAlbIDB4MTggXSA9IEtFWV9FUEcsCi0JWyAweDI3IF0gPSBLRVlfUkVDT1JELAogfTsKIAogRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfcGlubmFjbGVfZ3JleSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCmluZGV4IDcyNDMzMzcuLmJkZDYzMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCkBAIC0xMDcyLDcgKzEwNzIsNyBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IHVzYnZpc2lvbl92NGwyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IHVzYnZpc2lvbl92NGwyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCmluZGV4IDg5YmJhMjcuLmJlZGFlNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCkBAIC00Miw3ICs0Miw3IEBACiAKIGNvbmZpZyBUSUZNX0NPUkUKIAl0cmlzdGF0ZSAiVEkgRmxhc2ggTWVkaWEgaW50ZXJmYWNlIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBQQ0kKIAloZWxwCiAJICBJZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyhSKSBGbGFzaCBNZWRpYSBhZGFwdGVycwogCSAgeW91IHNob3VsZCBzZWxlY3QgdGhpcyBvcHRpb24gYW5kIHRoZW4gYWxzbyBjaG9vc2UgYW4gYXBwcm9wcmlhdGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9sa2R0bS5jIGIvZHJpdmVycy9taXNjL2xrZHRtLmMKaW5kZXggZGI5ZDdkZi4uNTUyYjc5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2xrZHRtLmMKKysrIGIvZHJpdmVycy9taXNjL2xrZHRtLmMKQEAgLTEwOCw4ICsxMDgsOCBAQAogc3RhdGljIGludCBsa2R0bV9wYXJzZV9jb21tYW5kbGluZSh2b2lkKTsKIHN0YXRpYyB2b2lkIGxrZHRtX2hhbmRsZXIodm9pZCk7CiAKLXN0YXRpYyBjaGFyKiBjcG9pbnRfbmFtZSA9IElOVkFMSUQ7Ci1zdGF0aWMgY2hhciogY3BvaW50X3R5cGUgPSBOT05FOworc3RhdGljIGNoYXIqIGNwb2ludF9uYW1lOworc3RhdGljIGNoYXIqIGNwb2ludF90eXBlOwogc3RhdGljIGludCBjcG9pbnRfY291bnQgPSBERUZBVUxUX0NPVU5UOwogc3RhdGljIGludCByZWN1cl9jb3VudCA9IFJFQ19OVU1fREVGQVVMVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvS2NvbmZpZyBiL2RyaXZlcnMvbW1jL0tjb25maWcKaW5kZXggNDIyNDY4Ni4uMTJhZjljNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvS2NvbmZpZworKysgYi9kcml2ZXJzL21tYy9LY29uZmlnCkBAIC0xMTEsNyArMTExLDcgQEAKIAogY29uZmlnIE1NQ19USUZNX1NECiAJdHJpc3RhdGUgIlRJIEZsYXNoIE1lZGlhIE1NQy9TRCBJbnRlcmZhY2Ugc3VwcG9ydCAgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBNTUMgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBNTUMgJiYgRVhQRVJJTUVOVEFMICYmIFBDSQogCXNlbGVjdCBUSUZNX0NPUkUKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gYWNjZXNzIE1NQy9TRCBjYXJkcyB3aXRoCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwMy5jIGIvZHJpdmVycy9uZXQvM2M1MDMuYwppbmRleCA3ZTM0YzRmLi5iYzdlOTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwMy5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTAzLmMKQEAgLTYwMCw4ICs2MDAsNyBAQAogCSAgICBjb3VudCAtPSBzZW1pX2NvdW50OwogCSAgICBtZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsIGJhc2UgKyBlaV9zdGF0dXMucHJpdiwgY291bnQpOwogCX0gZWxzZSB7Ci0JCS8qIFBhY2tldCBpcyBpbiBvbmUgY2h1bmsgLS0gd2UgY2FuIGNvcHkgKyBja3N1bS4gKi8KLQkJZXRoX2lvX2NvcHlfYW5kX3N1bShza2IsIGJhc2UgKyByaW5nX29mZnNldCwgY291bnQsIDApOworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgYmFzZSArIHJpbmdfb2Zmc2V0LCBjb3VudCk7CiAJfQogCXJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCBhZDkyYjZhLi4zOGY0MWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTIzMzUsNiArMjMzNSwxNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcWxhM3h4eC4KIAorY29uZmlnIEFUTDEKKwl0cmlzdGF0ZSAiQXR0YW5zaWMgTDEgR2lnYWJpdCBFdGhlcm5ldCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IENSQzMyCisJc2VsZWN0IE1JSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBBdHRhbnNpYyBMMSBnaWdhYml0IGV0aGVybmV0IGFkYXB0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhdGwxLgorCiBlbmRtZW51CiAKICMKQEAgLTI1MzQsNyArMjU0NSw3IEBACiAKIGNvbmZpZyBGRERJCiAJYm9vbCAiRkRESSBkcml2ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChQQ0kgfHwgRUlTQSkKKwlkZXBlbmRzIG9uIChQQ0kgfHwgRUlTQSB8fCBUQykKIAloZWxwCiAJICBGaWJlciBEaXN0cmlidXRlZCBEYXRhIEludGVyZmFjZSBpcyBhIGhpZ2ggc3BlZWQgbG9jYWwgYXJlYSBuZXR3b3JrCiAJICBkZXNpZ247IGVzc2VudGlhbGx5IGEgcmVwbGFjZW1lbnQgZm9yIGhpZ2ggc3BlZWQgRXRoZXJuZXQuIEZEREkgY2FuCkBAIC0yNTQ0LDExICsyNTU1LDMxIEBACiAJICB3aWxsIHNheSBOLgogCiBjb25maWcgREVGWFgKLQl0cmlzdGF0ZSAiRGlnaXRhbCBERUZFQSBhbmQgREVGUEEgYWRhcHRlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gRkRESSAmJiAoUENJIHx8IEVJU0EpCi0JaGVscAotCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgRElHSVRBTCBzZXJpZXMgb2YgRUlTQSAoREVGRUEpIGFuZCBQQ0kKLQkgIChERUZQQSkgY29udHJvbGxlcnMgd2hpY2ggY2FuIGNvbm5lY3QgeW91IHRvIGEgbG9jYWwgRkRESSBuZXR3b3JrLgorCXRyaXN0YXRlICJEaWdpdGFsIERFRlRBL0RFRkVBL0RFRlBBIGFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZEREkgJiYgKFBDSSB8fCBFSVNBIHx8IFRDKQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgdGhlIERJR0lUQUwgc2VyaWVzIG9mIFRVUkJPY2hhbm5lbCAoREVGVEEpLAorCSAgRUlTQSAoREVGRUEpIGFuZCBQQ0kgKERFRlBBKSBjb250cm9sbGVycyB3aGljaCBjYW4gY29ubmVjdCB5b3UKKwkgIHRvIGEgbG9jYWwgRkRESSBuZXR3b3JrLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBkZWZ4eC4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBERUZYWF9NTUlPCisJYm9vbAorCXByb21wdCAiVXNlIE1NSU8gaW5zdGVhZCBvZiBQSU8iIGlmIFBDSSB8fCBFSVNBCisJZGVwZW5kcyBvbiBERUZYWAorCWRlZmF1bHQgbiBpZiBQQ0kgfHwgRUlTQQorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaW5zdHJ1Y3RzIHRoZSBkcml2ZXIgdG8gdXNlIEVJU0Egb3IgUENJIG1lbW9yeS1tYXBwZWQgSS9PCisJICAoTU1JTykgYXMgYXBwcm9wcmlhdGUgaW5zdGVhZCBvZiBwcm9ncmFtbWVkIEkvTyBwb3J0cyAoUElPKS4KKwkgIEVuYWJsaW5nIHRoaXMgZ2l2ZXMgYW4gaW1wcm92ZW1lbnQgaW4gcHJvY2Vzc2luZyB0aW1lIGluIHBhcnRzCisJICBvZiB0aGUgZHJpdmVyLCBidXQgaXQgbWF5IGNhdXNlIHByb2JsZW1zIHdpdGggRUlTQSAoREVGRUEpCisJICBhZGFwdGVycy4gIFRVUkJPY2hhbm5lbCBkb2VzIG5vdCBoYXZlIHRoZSBjb25jZXB0IG9mIEkvTyBwb3J0cywKKwkgIHNvIE1NSU8gaXMgYWx3YXlzIHVzZWQgZm9yIHRoZXNlIChERUZUQSkgYWRhcHRlcnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBTS0ZQCiAJdHJpc3RhdGUgIlN5c0tvbm5lY3QgRkRESSBQQ0kgc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKaW5kZXggMDg3OGUzZC4uMzNhZjgzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKQEAgLTksNiArOSw3IEBACiBvYmotJChDT05GSUdfQ0hFTFNJT19UMykgKz0gY3hnYjMvCiBvYmotJChDT05GSUdfRUhFQSkgKz0gZWhlYS8KIG9iai0kKENPTkZJR19CT05ESU5HKSArPSBib25kaW5nLworb2JqLSQoQ09ORklHX0FUTDEpICs9IGF0bDEvCiBvYmotJChDT05GSUdfR0lBTkZBUikgKz0gZ2lhbmZhcl9kcml2ZXIubwogCiBnaWFuZmFyX2RyaXZlci1vYmpzIDo9IGdpYW5mYXIubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hYzMyMDAuYyBiL2RyaXZlcnMvbmV0L2FjMzIwMC5jCmluZGV4IGMwMWY4N2YuLjY0NGM0MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FjMzIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2FjMzIwMC5jCkBAIC0zMjcsOCArMzI3LDcgQEAKIAkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LAogCQkJCWVpX3N0YXR1cy5tZW0gKyBUWF9QQUdFUyoyNTYsIGNvdW50KTsKIAl9IGVsc2UgewotCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rIC0tIHdlIGNhbiBjb3B5ICsgY2tzdW0uICovCi0JCWV0aF9pb19jb3B5X2FuZF9zdW0oc2tiLCBzdGFydCwgY291bnQsIDApOworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgc3RhcnQsIGNvdW50KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDEvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9hdGwxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YjcwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hdGwxL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0FUTDEpCSs9IGF0bDEubworYXRsMS15CQkJKz0gYXRsMV9tYWluLm8gYXRsMV9ody5vIGF0bDFfZXRodG9vbC5vIGF0bDFfcGFyYW0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRsMS9hdGwxLmggYi9kcml2ZXJzL25ldC9hdGwxL2F0bDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWM2MDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxLmgKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMDYgQXR0YW5zaWMgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAwNiBDaHJpcyBTbm9vayA8Y3Nub29rQHJlZGhhdC5jb20+CisgKiBDb3B5cmlnaHQoYykgMjAwNiBKYXkgQ2xpYnVybiA8amNsaWJ1cm5AZ21haWwuY29tPgorICoKKyAqIERlcml2ZWQgZnJvbSBJbnRlbCBlMTAwMCBkcml2ZXIKKyAqIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BVEwxX0hfCisjZGVmaW5lIF9BVEwxX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKworI2luY2x1ZGUgImF0bDFfaHcuaCIKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyBuZWVkZWQgYnkgbXVsdGlwbGUgZmlsZXMgKi8KK3MzMiBhdGwxX3VwKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBhdGwxX2Rvd24oc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcik7CitpbnQgYXRsMV9yZXNldChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKTsKK3MzMiBhdGwxX3NldHVwX3JpbmdfcmVzb3VyY2VzKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBhdGwxX2ZyZWVfcmluZ19yZXNvdXJjZXMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcik7CisKK2V4dGVybiBjaGFyIGF0bDFfZHJpdmVyX25hbWVbXTsKK2V4dGVybiBjaGFyIGF0bDFfZHJpdmVyX3ZlcnNpb25bXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgYXRsMV9ldGh0b29sX29wczsKKworc3RydWN0IGF0bDFfYWRhcHRlcjsKKworI2RlZmluZSBBVEwxX01BWF9JTlRSCQkzCisKKyNkZWZpbmUgQVRMMV9ERUZBVUxUX1RQRAkyNTYKKyNkZWZpbmUgQVRMMV9NQVhfVFBECQkxMDI0CisjZGVmaW5lIEFUTDFfTUlOX1RQRAkJNjQKKyNkZWZpbmUgQVRMMV9ERUZBVUxUX1JGRAk1MTIKKyNkZWZpbmUgQVRMMV9NSU5fUkZECQkxMjgKKyNkZWZpbmUgQVRMMV9NQVhfUkZECQkyMDQ4CisKKyNkZWZpbmUgQVRMMV9HRVRfREVTQyhSLCBpLCB0eXBlKQkoJigoKHR5cGUgKikoKFIpLT5kZXNjKSlbaV0pKQorI2RlZmluZSBBVEwxX1JGRF9ERVNDKFIsIGkpCUFUTDFfR0VUX0RFU0MoUiwgaSwgc3RydWN0IHJ4X2ZyZWVfZGVzYykKKyNkZWZpbmUgQVRMMV9UUERfREVTQyhSLCBpKQlBVEwxX0dFVF9ERVNDKFIsIGksIHN0cnVjdCB0eF9wYWNrZXRfZGVzYykKKyNkZWZpbmUgQVRMMV9SUkRfREVTQyhSLCBpKQlBVEwxX0dFVF9ERVNDKFIsIGksIHN0cnVjdCByeF9yZXR1cm5fZGVzYykKKworLyoKKyAqIFNvbWUgd29ya2Fyb3VuZHMgcmVxdWlyZSBtaWxsaXNlY29uZCBkZWxheXMgYW5kIGFyZSBydW4gZHVyaW5nIGludGVycnVwdAorICogY29udGV4dC4gIE1vc3Qgbm90YWJseSwgd2hlbiBlc3RhYmxpc2hpbmcgbGluaywgdGhlIHBoeSBtYXkgbmVlZCB0d2Vha2luZworICogYnV0IGNhbm5vdCBwcm9jZXNzIHBoeSByZWdpc3RlciByZWFkcy93cml0ZXMgZmFzdGVyIHRoYW4gbWlsbGlzZWNvbmQKKyAqIGludGVydmFscy4uLmFuZCB3ZSBlc3RhYmxpc2ggbGluayBkdWUgdG8gYSAibGluayBzdGF0dXMgY2hhbmdlIiBpbnRlcnJ1cHQuCisgKi8KKworLyoKKyAqIHdyYXBwZXIgYXJvdW5kIGEgcG9pbnRlciB0byBhIHNvY2tldCBidWZmZXIsCisgKiBzbyBhIERNQSBoYW5kbGUgY2FuIGJlIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBidWZmZXIKKyAqLworc3RydWN0IGF0bDFfYnVmZmVyIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUxNiBsZW5ndGg7CisJdTE2IGFsbG9jZWQ7CisJZG1hX2FkZHJfdCBkbWE7Cit9OworCisjZGVmaW5lIE1BWF9UWF9CVUZfTEVOCQkweDMwMDAJLyogMTJLQiAqLworCitzdHJ1Y3QgYXRsMV90cGRfcmluZyB7CisJdm9pZCAqZGVzYzsJCS8qIHBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3IgcmluZyBtZW1vcnkgKi8KKwlkbWFfYWRkcl90IGRtYTsJCS8qIHBoeXNpY2FsIGFkcmVzcyBvZiB0aGUgZGVzY3JpcHRvciByaW5nICovCisJdTE2IHNpemU7CQkvKiBsZW5ndGggb2YgZGVzY3JpcHRvciByaW5nIGluIGJ5dGVzICovCisJdTE2IGNvdW50OwkJLyogbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIHRoZSByaW5nICovCisJdTE2IGh3X2lkeDsJCS8qIGhhcmR3YXJlIGluZGV4ICovCisJYXRvbWljX3QgbmV4dF90b19jbGVhbjsKKwlhdG9taWNfdCBuZXh0X3RvX3VzZTsKKwlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOworfTsKKworc3RydWN0IGF0bDFfcmZkX3JpbmcgeworCXZvaWQgKmRlc2M7CisJZG1hX2FkZHJfdCBkbWE7CisJdTE2IHNpemU7CisJdTE2IGNvdW50OworCWF0b21pY190IG5leHRfdG9fdXNlOworCXUxNiBuZXh0X3RvX2NsZWFuOworCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87Cit9OworCitzdHJ1Y3QgYXRsMV9ycmRfcmluZyB7CisJdm9pZCAqZGVzYzsKKwlkbWFfYWRkcl90IGRtYTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1MTYgY291bnQ7CisJdTE2IG5leHRfdG9fdXNlOworCWF0b21pY190IG5leHRfdG9fY2xlYW47Cit9OworCitzdHJ1Y3QgYXRsMV9yaW5nX2hlYWRlciB7CisJdm9pZCAqZGVzYzsJCS8qIHBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3IgcmluZyBtZW1vcnkgKi8KKwlkbWFfYWRkcl90IGRtYTsJCS8qIHBoeXNpY2FsIGFkcmVzcyBvZiB0aGUgZGVzY3JpcHRvciByaW5nICovCisJdW5zaWduZWQgaW50IHNpemU7CS8qIGxlbmd0aCBvZiBkZXNjcmlwdG9yIHJpbmcgaW4gYnl0ZXMgKi8KK307CisKK3N0cnVjdCBhdGwxX2NtYiB7CisJc3RydWN0IGNvYWxzX21zZ19ibG9jayAqY21iOworCWRtYV9hZGRyX3QgZG1hOworfTsKKworc3RydWN0IGF0bDFfc21iIHsKKwlzdHJ1Y3Qgc3RhdHNfbXNnX2Jsb2NrICpzbWI7CisJZG1hX2FkZHJfdCBkbWE7Cit9OworCisvKiBTdGF0aXN0aWNzIGNvdW50ZXJzICovCitzdHJ1Y3QgYXRsMV9zZnRfc3RhdHMgeworCXU2NCByeF9wYWNrZXRzOworCXU2NCB0eF9wYWNrZXRzOworCXU2NCByeF9ieXRlczsKKwl1NjQgdHhfYnl0ZXM7CisJdTY0IG11bHRpY2FzdDsKKwl1NjQgY29sbGlzaW9uczsKKwl1NjQgcnhfZXJyb3JzOworCXU2NCByeF9sZW5ndGhfZXJyb3JzOworCXU2NCByeF9jcmNfZXJyb3JzOworCXU2NCByeF9mcmFtZV9lcnJvcnM7CisJdTY0IHJ4X2ZpZm9fZXJyb3JzOworCXU2NCByeF9taXNzZWRfZXJyb3JzOworCXU2NCB0eF9lcnJvcnM7CisJdTY0IHR4X2ZpZm9fZXJyb3JzOworCXU2NCB0eF9hYm9ydGVkX2Vycm9yczsKKwl1NjQgdHhfd2luZG93X2Vycm9yczsKKwl1NjQgdHhfY2Fycmllcl9lcnJvcnM7CisKKwl1NjQgdHhfcGF1c2U7CQkvKiBudW0gUGF1c2UgcGFja2V0IHRyYW5zbWl0dGVkLiAqLworCXU2NCBleGNlY29sOwkJLyogbnVtIHR4IHBhY2tldHMgYWJvcnRlZCBkdWUgdG8gZXhjZXNzaXZlIGNvbGxpc2lvbnMuICovCisJdTY0IGRlZmZlcjsJCS8qIG51bSBkZWZlcnJlZCB0eCBwYWNrZXRzICovCisJdTY0IHNjYzsJCS8qIG51bSBwYWNrZXRzIHN1YnNlcXVlbnRseSB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHkgdy8gc2luZ2xlIHByaW9yIGNvbGxpc2lvbi4gKi8KKwl1NjQgbWNjOwkJLyogbnVtIHBhY2tldHMgc3Vic2VxdWVudGx5IHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSB3LyBtdWx0aXBsZSBwcmlvciBjb2xsaXNpb25zLiAqLworCXU2NCBsYXRlY29sOwkJLyogbnVtIHR4IHBhY2tldHMgIHcvIGxhdGUgY29sbGlzaW9ucy4gKi8KKwl1NjQgdHhfdW5kZXJ1bjsJCS8qIG51bSB0eCBwYWNrZXRzIGFib3J0ZWQgZHVlIHRvIHRyYW5zbWl0IEZJRk8gdW5kZXJydW4sIG9yIFRSRCBGSUZPIHVuZGVycnVuICovCisJdTY0IHR4X3RydW5jOwkJLyogbnVtIHR4IHBhY2tldHMgdHJ1bmNhdGVkIGR1ZSB0byBzaXplIGV4Y2VlZGluZyBNVFUsIHJlZ2FyZGxlc3Mgd2hldGhlciB0cnVuY2F0ZWQgYnkgU2VsZW5lIG9yIG5vdC4gKFRoZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IHJlZmxlY3QgdGhlIG1lYW5pbmcgaW4gdGhpcyBjYXNlLikgKi8KKwl1NjQgcnhfcGF1c2U7CQkvKiBudW0gUGF1c2UgcGFja2V0cyByZWNlaXZlZC4gKi8KKwl1NjQgcnhfcnJkX292OworCXU2NCByeF90cnVuYzsKK307CisKKy8qIGJvYXJkIHNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgQVRMMV9SRUdTX0xFTgk4CisKKy8qIFN0cnVjdHVyZSBjb250YWluaW5nIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBzaGFyZWQgY29kZSAqLworc3RydWN0IGF0bDFfaHcgeworCXU4IF9faW9tZW0gKmh3X2FkZHI7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYmFjazsKKwllbnVtIGF0bDFfZG1hX29yZGVyIGRtYV9vcmQ7CisJZW51bSBhdGwxX2RtYV9yY2IgcmNiX3ZhbHVlOworCWVudW0gYXRsMV9kbWFfcmVxX2Jsb2NrIGRtYXJfYmxvY2s7CisJZW51bSBhdGwxX2RtYV9yZXFfYmxvY2sgZG1hd19ibG9jazsKKwl1OCBwcmVhbWJsZV9sZW47CisJdTggbWF4X3JldHJ5OwkJLyogUmV0cmFuc21pc3Npb24gbWF4aW11bSwgYWZ0ZXIgd2hpY2ggdGhlIHBhY2tldCB3aWxsIGJlIGRpc2NhcmRlZCAqLworCXU4IGphbV9pcGc7CQkvKiBJUEcgdG8gc3RhcnQgSkFNIGZvciBjb2xsaXNpb24gYmFzZWQgZmxvdyBjb250cm9sIGluIGhhbGYtZHVwbGV4IG1vZGUuIEluIHVuaXRzIG9mIDgtYml0IHRpbWUgKi8KKwl1OCBpcGd0OwkJLyogRGVzaXJlZCBiYWNrIHRvIGJhY2sgaW50ZXItcGFja2V0IGdhcC4gVGhlIGRlZmF1bHQgaXMgOTYtYml0IHRpbWUgKi8KKwl1OCBtaW5faWZnOwkJLyogTWluaW11bSBudW1iZXIgb2YgSUZHIHRvIGVuZm9yY2UgaW4gYmV0d2VlbiBSWCBmcmFtZXMuIEZyYW1lIGdhcCBiZWxvdyBzdWNoIElGUCBpcyBkcm9wcGVkICovCisJdTggaXBncjE7CQkvKiA2NGJpdCBDYXJyaWVyLVNlbnNlIHdpbmRvdyAqLworCXU4IGlwZ3IyOwkJLyogOTYtYml0IElQRyB3aW5kb3cgKi8KKwl1OCB0cGRfYnVyc3Q7CQkvKiBOdW1iZXIgb2YgVFBEIHRvIHByZWZldGNoIGluIGNhY2hlLWFsaWduZWQgYnVyc3QuIEVhY2ggVFBEIGlzIDE2IGJ5dGVzIGxvbmcgKi8KKwl1OCByZmRfYnVyc3Q7CQkvKiBOdW1iZXIgb2YgUkZEIHRvIHByZWZldGNoIGluIGNhY2hlLWFsaWduZWQgYnVyc3QuIEVhY2ggUkZEIGlzIDEyIGJ5dGVzIGxvbmcgKi8KKwl1OCByZmRfZmV0Y2hfZ2FwOworCXU4IHJyZF9idXJzdDsJCS8qIFRocmVzaG9sZCBudW1iZXIgb2YgUlJEcyB0aGF0IGNhbiBiZSByZXRpcmVkIGluIGEgYnVyc3QuIEVhY2ggUlJEIGlzIDE2IGJ5dGVzIGxvbmcgKi8KKwl1OCB0cGRfZmV0Y2hfdGg7CisJdTggdHBkX2ZldGNoX2dhcDsKKwl1MTYgdHhfanVtYm9fdGFza190aDsKKwl1MTYgdHhmX2J1cnN0OwkJLyogTnVtYmVyIG9mIGRhdGEgYnl0ZXMgdG8gcmVhZCBpbiBhIGNhY2hlLWFsaWduZWQgYnVyc3QuIEVhY2ggU1JBTSBlbnRyeSBpcworCQkJCSAgIDggYnl0ZXMgbG9uZyAqLworCXUxNiByeF9qdW1ib190aDsJLyogSnVtYm8gcGFja2V0IHNpemUgZm9yIG5vbi1WTEFOIHBhY2tldC4gVkxBTiBwYWNrZXRzIHNob3VsZCBhZGQgNCBieXRlcyAqLworCXUxNiByeF9qdW1ib19sa2FoOworCXUxNiBycmRfcmV0X3RpbWVyOwkvKiBSUkQgcmV0aXJlbWVudCB0aW1lci4gRGVjcmVtZW50IGJ5IDEgYWZ0ZXIgZXZlcnkgNTEybnMgcGFzc2VzLiAqLworCXUxNiBsY29sOwkJLyogQ29sbGlzaW9uIFdpbmRvdyAqLworCisJdTE2IGNtYl90cGQ7CisJdTE2IGNtYl9ycmQ7CisJdTE2IGNtYl9yeF90aW1lcjsKKwl1MTYgY21iX3R4X3RpbWVyOworCXUzMiBzbWJfdGltZXI7CisJdTE2IG1lZGlhX3R5cGU7CisJdTE2IGF1dG9uZWdfYWR2ZXJ0aXNlZDsKKwl1MTYgcGNpX2NtZF93b3JkOworCisJdTE2IG1paV9hdXRvbmVnX2Fkdl9yZWc7CisJdTE2IG1paV8xMDAwdF9jdHJsX3JlZzsKKworCXUzMiBtZW1fcmFuZzsKKwl1MzIgdHhjdzsKKwl1MzIgbWF4X2ZyYW1lX3NpemU7CisJdTMyIG1pbl9mcmFtZV9zaXplOworCXUzMiBtY19maWx0ZXJfdHlwZTsKKwl1MzIgbnVtX21jX2FkZHJzOworCXUzMiBjb2xsaXNpb25fZGVsdGE7CisJdTMyIHR4X3BhY2tldF9kZWx0YTsKKwl1MTYgcGh5X3NwZF9kZWZhdWx0OworCisJdTE2IGRldl9yZXY7CisJdTggcmV2aXNpb25faWQ7CisKKwkvKiBzcGkgZmxhc2ggKi8KKwl1OCBmbGFzaF92ZW5kb3I7CisKKwl1OCBkbWFfZmFpcm5lc3M7CisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOworCXU4IHBlcm1fbWFjX2FkZHJbRVRIX0FMRU5dOworCisJLyogYm9vbCBwaHlfcHJlYW1ibGVfc3VwOyAqLworCWJvb2wgcGh5X2NvbmZpZ3VyZWQ7Cit9OworCitzdHJ1Y3QgYXRsMV9hZGFwdGVyIHsKKwkvKiBPUyBkZWZpbmVkIHN0cnVjdHMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKKwlzdHJ1Y3QgYXRsMV9zZnRfc3RhdHMgc29mdF9zdGF0czsKKworCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycDsKKwl1MzIgcnhfYnVmZmVyX2xlbjsKKwl1MzIgd29sOworCXUxNiBsaW5rX3NwZWVkOworCXUxNiBsaW5rX2R1cGxleDsKKwlzcGlubG9ja190IGxvY2s7CisJYXRvbWljX3QgaXJxX3NlbTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfdGltZW91dF90YXNrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBsaW5rX2NoZ190YXNrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBwY2llX2RtYV90b19yc3RfdGFzazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZ190aW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBwaHlfY29uZmlnX3RpbWVyOworCWJvb2wgcGh5X3RpbWVyX3BlbmRpbmc7CisKKwlib29sIG1hY19kaXNhYmxlZDsKKworCS8qIEFsbCBkZXNjcmlwdG9yIHJpbmdzJyBtZW1vcnkgKi8KKwlzdHJ1Y3QgYXRsMV9yaW5nX2hlYWRlciByaW5nX2hlYWRlcjsKKworCS8qIFRYICovCisJc3RydWN0IGF0bDFfdHBkX3JpbmcgdHBkX3Jpbmc7CisJc3BpbmxvY2tfdCBtYl9sb2NrOworCisJLyogUlggKi8KKwlzdHJ1Y3QgYXRsMV9yZmRfcmluZyByZmRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9ycmRfcmluZyBycmRfcmluZzsKKwl1NjQgaHdfY3N1bV9lcnI7CisJdTY0IGh3X2NzdW1fZ29vZDsKKworCXUzMiBnb3JjbDsKKwl1NjQgZ29yY2xfb2xkOworCisJLyogSW50ZXJydXB0IE1vZGVyYXRvciB0aW1lciAoIDJ1cyByZXNvbHV0aW9uKSAqLworCXUxNiBpbXQ7CisJLyogSW50ZXJydXB0IENsZWFyIHRpbWVyICgydXMgcmVzb2x1dGlvbikgKi8KKwl1MTYgaWN0OworCisJLyogTUlJIGludGVyZmFjZSBpbmZvICovCisJc3RydWN0IG1paV9pZl9pbmZvIG1paTsKKworCS8qIHN0cnVjdHMgZGVmaW5lZCBpbiBhdGwxX2h3LmggKi8KKwl1MzIgYmRfbnVtYmVyOwkJLyogYm9hcmQgbnVtYmVyICovCisJYm9vbCBwY2lfdXNpbmdfNjQ7CisJc3RydWN0IGF0bDFfaHcgaHc7CisJc3RydWN0IGF0bDFfc21iIHNtYjsKKwlzdHJ1Y3QgYXRsMV9jbWIgY21iOworCisJdTMyIHBjaV9zdGF0ZVsxNl07Cit9OworCisjZW5kaWYJLyogX0FUTDFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9hdGwxL2F0bDFfZXRodG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMWMyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hdGwxL2F0bDFfZXRodG9vbC5jCkBAIC0wLDAgKzEsNTA4IEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDA2IEF0dGFuc2ljIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMDYgQ2hyaXMgU25vb2sgPGNzbm9va0ByZWRoYXQuY29tPgorICogQ29weXJpZ2h0KGMpIDIwMDYgSmF5IENsaWJ1cm4gPGpjbGlidXJuQGdtYWlsLmNvbT4KKyAqCisgKiBEZXJpdmVkIGZyb20gSW50ZWwgZTEwMDAgZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJhdGwxLmgiCisKK3N0cnVjdCBhdGwxX3N0YXRzIHsKKwljaGFyIHN0YXRfc3RyaW5nW0VUSF9HU1RSSU5HX0xFTl07CisJaW50IHNpemVvZl9zdGF0OworCWludCBzdGF0X29mZnNldDsKK307CisKKyNkZWZpbmUgQVRMMV9TVEFUKG0pIHNpemVvZigoKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKikwKS0+bSksIFwKKwlvZmZzZXRvZihzdHJ1Y3QgYXRsMV9hZGFwdGVyLCBtKQorCitzdGF0aWMgc3RydWN0IGF0bDFfc3RhdHMgYXRsMV9nc3RyaW5nc19zdGF0c1tdID0geworCXsicnhfcGFja2V0cyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnJ4X3BhY2tldHMpfSwKKwl7InR4X3BhY2tldHMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy50eF9wYWNrZXRzKX0sCisJeyJyeF9ieXRlcyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnJ4X2J5dGVzKX0sCisJeyJ0eF9ieXRlcyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnR4X2J5dGVzKX0sCisJeyJyeF9lcnJvcnMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5yeF9lcnJvcnMpfSwKKwl7InR4X2Vycm9ycyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnR4X2Vycm9ycyl9LAorCXsicnhfZHJvcHBlZCIsIEFUTDFfU1RBVChuZXRfc3RhdHMucnhfZHJvcHBlZCl9LAorCXsidHhfZHJvcHBlZCIsIEFUTDFfU1RBVChuZXRfc3RhdHMudHhfZHJvcHBlZCl9LAorCXsibXVsdGljYXN0IiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMubXVsdGljYXN0KX0sCisJeyJjb2xsaXNpb25zIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMuY29sbGlzaW9ucyl9LAorCXsicnhfbGVuZ3RoX2Vycm9ycyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMpfSwKKwl7InJ4X292ZXJfZXJyb3JzIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyl9LAorCXsicnhfY3JjX2Vycm9ycyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnJ4X2NyY19lcnJvcnMpfSwKKwl7InJ4X2ZyYW1lX2Vycm9ycyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyl9LAorCXsicnhfZmlmb19lcnJvcnMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5yeF9maWZvX2Vycm9ycyl9LAorCXsicnhfbWlzc2VkX2Vycm9ycyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMpfSwKKwl7InR4X2Fib3J0ZWRfZXJyb3JzIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMpfSwKKwl7InR4X2NhcnJpZXJfZXJyb3JzIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMpfSwKKwl7InR4X2ZpZm9fZXJyb3JzIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMudHhfZmlmb19lcnJvcnMpfSwKKwl7InR4X3dpbmRvd19lcnJvcnMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy50eF93aW5kb3dfZXJyb3JzKX0sCisJeyJ0eF9hYm9ydF9leGNlX2NvbGwiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5leGNlY29sKX0sCisJeyJ0eF9hYm9ydF9sYXRlX2NvbGwiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5sYXRlY29sKX0sCisJeyJ0eF9kZWZlcnJlZF9vayIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLmRlZmZlcil9LAorCXsidHhfc2luZ2xlX2NvbGxfb2siLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5zY2MpfSwKKwl7InR4X211bHRpX2NvbGxfb2siLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5tY2MpfSwKKwl7InR4X3VuZGVydW4iLCBBVEwxX1NUQVQoc29mdF9zdGF0cy50eF91bmRlcnVuKX0sCisJeyJ0eF90cnVuYyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnR4X3RydW5jKX0sCisJeyJ0eF9wYXVzZSIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnR4X3BhdXNlKX0sCisJeyJyeF9wYXVzZSIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnJ4X3BhdXNlKX0sCisJeyJyeF9ycmRfb3YiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5yeF9ycmRfb3YpfSwKKwl7InJ4X3RydW5jIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMucnhfdHJ1bmMpfQorfTsKKworc3RhdGljIHZvaWQgYXRsMV9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICpkYXRhKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBpOworCWNoYXIgKnA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdGwxX2dzdHJpbmdzX3N0YXRzKTsgaSsrKSB7CisJCXAgPSAoY2hhciAqKWFkYXB0ZXIrYXRsMV9nc3RyaW5nc19zdGF0c1tpXS5zdGF0X29mZnNldDsKKwkJZGF0YVtpXSA9IChhdGwxX2dzdHJpbmdzX3N0YXRzW2ldLnNpemVvZl9zdGF0ID09CisJCQlzaXplb2YodTY0KSkgPyAqKHU2NCAqKXAgOiAqKHUzMiAqKXA7CisJfQorCit9CisKK3N0YXRpYyBpbnQgYXRsMV9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gQVJSQVlfU0laRShhdGwxX2dzdHJpbmdzX3N0YXRzKTsKK30KKworc3RhdGljIGludCBhdGwxX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwllY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8CisJCQkgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCSAgIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCSAgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCSAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkgICBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9UUCk7CisJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEX1RQOworCWlmIChody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFX0FVVE9fU0VOU09SIHx8CisJICAgIGh3LT5tZWRpYV90eXBlID09IE1FRElBX1RZUEVfMTAwME1fRlVMTCkgeworCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CisJCWlmIChody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFX0FVVE9fU0VOU09SKSB7CisJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CisJCQllY21kLT5hZHZlcnRpc2luZyB8PQorCQkJICAgIChBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CisJCQkgICAgIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJCSAgICAgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCSAgICAgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCSAgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCk7CisJCX0KKwkJZWxzZQorCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gKEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOworCX0KKwllY21kLT5wb3J0ID0gUE9SVF9UUDsKKwllY21kLT5waHlfYWRkcmVzcyA9IDA7CisJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2soYWRhcHRlci0+bmV0ZGV2KSkgeworCQl1MTYgbGlua19zcGVlZCwgbGlua19kdXBsZXg7CisJCWF0bDFfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsICZsaW5rX3NwZWVkLCAmbGlua19kdXBsZXgpOworCQllY21kLT5zcGVlZCA9IGxpbmtfc3BlZWQ7CisJCWlmIChsaW5rX2R1cGxleCA9PSBGVUxMX0RVUExFWCkKKwkJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQllbHNlCisJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwl9IGVsc2UgeworCQllY21kLT5zcGVlZCA9IC0xOworCQllY21kLT5kdXBsZXggPSAtMTsKKwl9CisJaWYgKGh3LT5tZWRpYV90eXBlID09IE1FRElBX1RZUEVfQVVUT19TRU5TT1IgfHwKKwkgICAgaHctPm1lZGlhX3R5cGUgPT0gTUVESUFfVFlQRV8xMDAwTV9GVUxMKQorCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJZWxzZQorCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRsMV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUxNiBwaHlfZGF0YTsKKwlpbnQgcmV0X3ZhbCA9IDA7CisJdTE2IG9sZF9tZWRpYV90eXBlID0gaHctPm1lZGlhX3R5cGU7CisKKwlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXRodG9vbCBzaHV0dGluZyBkb3duIGFkYXB0ZXJcbiIsCisJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwkJYXRsMV9kb3duKGFkYXB0ZXIpOworCX0KKworCWlmIChlY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKQorCQlody0+bWVkaWFfdHlwZSA9IE1FRElBX1RZUEVfQVVUT19TRU5TT1I7CisJZWxzZSB7CisJCWlmIChlY21kLT5zcGVlZCA9PSBTUEVFRF8xMDAwKSB7CisJCQlpZiAoZWNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiJXM6IGNhbid0IGZvcmNlIHRvIDEwMDBNIGhhbGYgZHVwbGV4XG4iLAorCQkJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwkJCQlyZXRfdmFsID0gLUVJTlZBTDsKKwkJCQlnb3RvIGV4aXRfc3NldDsKKwkJCX0KKwkJCWh3LT5tZWRpYV90eXBlID0gTUVESUFfVFlQRV8xMDAwTV9GVUxMOworCQl9IGVsc2UgaWYgKGVjbWQtPnNwZWVkID09IFNQRUVEXzEwMCkgeworCQkJaWYgKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgeworCQkJCWh3LT5tZWRpYV90eXBlID0gTUVESUFfVFlQRV8xMDBNX0ZVTEw7CisJCQl9IGVsc2UKKwkJCQlody0+bWVkaWFfdHlwZSA9IE1FRElBX1RZUEVfMTAwTV9IQUxGOworCQl9IGVsc2UgeworCQkJaWYgKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCQlody0+bWVkaWFfdHlwZSA9IE1FRElBX1RZUEVfMTBNX0ZVTEw7CisJCQllbHNlCisJCQkJaHctPm1lZGlhX3R5cGUgPSBNRURJQV9UWVBFXzEwTV9IQUxGOworCQl9CisJfQorCXN3aXRjaCAoaHctPm1lZGlhX3R5cGUpIHsKKwljYXNlIE1FRElBX1RZUEVfQVVUT19TRU5TT1I6CisJCWVjbWQtPmFkdmVydGlzaW5nID0KKwkJICAgIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwKKwkJICAgIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJICAgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CisJCSAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAorCQkgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCSAgICBBRFZFUlRJU0VEX0F1dG9uZWcgfCBBRFZFUlRJU0VEX1RQOworCQlicmVhazsKKwljYXNlIE1FRElBX1RZUEVfMTAwME1fRlVMTDoKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgPQorCQkgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCSAgICBBRFZFUlRJU0VEX0F1dG9uZWcgfCBBRFZFUlRJU0VEX1RQOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllY21kLT5hZHZlcnRpc2luZyA9IDA7CisJCWJyZWFrOworCX0KKwlpZiAoYXRsMV9waHlfc2V0dXBfYXV0b25lZ19hZHYoaHcpKSB7CisJCXJldF92YWwgPSAtRUlOVkFMOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiJXM6IGludmFsaWQgZXRodG9vbCBzcGVlZC9kdXBsZXggc2V0dGluZ1xuIiwKKwkJCWF0bDFfZHJpdmVyX25hbWUpOworCQlnb3RvIGV4aXRfc3NldDsKKwl9CisJaWYgKGh3LT5tZWRpYV90eXBlID09IE1FRElBX1RZUEVfQVVUT19TRU5TT1IgfHwKKwkgICAgaHctPm1lZGlhX3R5cGUgPT0gTUVESUFfVFlQRV8xMDAwTV9GVUxMKQorCQlwaHlfZGF0YSA9IE1JSV9DUl9SRVNFVCB8IE1JSV9DUl9BVVRPX05FR19FTjsKKwllbHNlIHsKKwkJc3dpdGNoIChody0+bWVkaWFfdHlwZSkgeworCQljYXNlIE1FRElBX1RZUEVfMTAwTV9GVUxMOgorCQkJcGh5X2RhdGEgPQorCQkJICAgIE1JSV9DUl9GVUxMX0RVUExFWCB8IE1JSV9DUl9TUEVFRF8xMDAgfAorCQkJICAgIE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQljYXNlIE1FRElBX1RZUEVfMTAwTV9IQUxGOgorCQkJcGh5X2RhdGEgPSBNSUlfQ1JfU1BFRURfMTAwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCWNhc2UgTUVESUFfVFlQRV8xME1fRlVMTDoKKwkJCXBoeV9kYXRhID0KKwkJCSAgICBNSUlfQ1JfRlVMTF9EVVBMRVggfCBNSUlfQ1JfU1BFRURfMTAgfCBNSUlfQ1JfUkVTRVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogTUVESUFfVFlQRV8xME1fSEFMRjogKi8KKwkJCXBoeV9kYXRhID0gTUlJX0NSX1NQRUVEXzEwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCX0KKwl9CisJYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQk1DUiwgcGh5X2RhdGEpOworZXhpdF9zc2V0OgorCWlmIChyZXRfdmFsKQorCQlody0+bWVkaWFfdHlwZSA9IG9sZF9tZWRpYV90eXBlOworCisJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV0aHRvb2wgc3RhcnRpbmcgYWRhcHRlclxuIiwKKwkJCWF0bDFfZHJpdmVyX25hbWUpOworCQlhdGwxX3VwKGFkYXB0ZXIpOworCX0gZWxzZSBpZiAoIXJldF92YWwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBldGh0b29sIHJlc2V0dGluZyBhZGFwdGVyXG4iLAorCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisJCWF0bDFfcmVzZXQoYWRhcHRlcik7CisJfQorCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgdm9pZCBhdGwxX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCBhdGwxX2RyaXZlcl9uYW1lLCBzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSk7CisJc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBhdGwxX2RyaXZlcl92ZXJzaW9uLAorCQlzaXplb2YoZHJ2aW5mby0+dmVyc2lvbikpOworCXN0cm5jcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIk4vQSIsIHNpemVvZihkcnZpbmZvLT5md192ZXJzaW9uKSk7CisJc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksCisJCXNpemVvZihkcnZpbmZvLT5idXNfaW5mbykpOworCWRydmluZm8tPmVlZHVtcF9sZW4gPSBBVEwxX0VFRFVNUF9MRU47Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9VQ0FTVCB8IFdBS0VfTUNBU1QgfCBXQUtFX0JDQVNUIHwgV0FLRV9NQUdJQzsKKwl3b2wtPndvbG9wdHMgPSAwOworCWlmIChhZGFwdGVyLT53b2wgJiBBVEwxX1dVRkNfRVgpCisJCXdvbC0+d29sb3B0cyB8PSBXQUtFX1VDQVNUOworCWlmIChhZGFwdGVyLT53b2wgJiBBVEwxX1dVRkNfTUMpCisJCXdvbC0+d29sb3B0cyB8PSBXQUtFX01DQVNUOworCWlmIChhZGFwdGVyLT53b2wgJiBBVEwxX1dVRkNfQkMpCisJCXdvbC0+d29sb3B0cyB8PSBXQUtFX0JDQVNUOworCWlmIChhZGFwdGVyLT53b2wgJiBBVEwxX1dVRkNfTUFHKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgYXRsMV9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQlzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAod29sLT53b2xvcHRzICYgKFdBS0VfUEhZIHwgV0FLRV9BUlAgfCBXQUtFX01BR0lDU0VDVVJFKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWFkYXB0ZXItPndvbCA9IDA7CisJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfVUNBU1QpCisJCWFkYXB0ZXItPndvbCB8PSBBVEwxX1dVRkNfRVg7CisJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfTUNBU1QpCisJCWFkYXB0ZXItPndvbCB8PSBBVEwxX1dVRkNfTUM7CisJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfQkNBU1QpCisJCWFkYXB0ZXItPndvbCB8PSBBVEwxX1dVRkNfQkM7CisJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfTUFHSUMpCisJCWFkYXB0ZXItPndvbCB8PSBBVEwxX1dVRkNfTUFHOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdGwxX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnR4ZHIgPSAmYWRhcHRlci0+dHBkX3Jpbmc7CisJc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJ4ZHIgPSAmYWRhcHRlci0+cmZkX3Jpbmc7CisKKwlyaW5nLT5yeF9tYXhfcGVuZGluZyA9IEFUTDFfTUFYX1JGRDsKKwlyaW5nLT50eF9tYXhfcGVuZGluZyA9IEFUTDFfTUFYX1RQRDsKKwlyaW5nLT5yeF9taW5pX21heF9wZW5kaW5nID0gMDsKKwlyaW5nLT5yeF9qdW1ib19tYXhfcGVuZGluZyA9IDA7CisJcmluZy0+cnhfcGVuZGluZyA9IHJ4ZHItPmNvdW50OworCXJpbmctPnR4X3BlbmRpbmcgPSB0eGRyLT5jb3VudDsKKwlyaW5nLT5yeF9taW5pX3BlbmRpbmcgPSAwOworCXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPSAwOworfQorCitzdGF0aWMgaW50IGF0bDFfc2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkciA9ICZhZGFwdGVyLT50cGRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9ycmRfcmluZyAqcnJkciA9ICZhZGFwdGVyLT5ycmRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkciA9ICZhZGFwdGVyLT5yZmRfcmluZzsKKworCXN0cnVjdCBhdGwxX3RwZF9yaW5nIHRwZF9vbGQsIHRwZF9uZXc7CisJc3RydWN0IGF0bDFfcmZkX3JpbmcgcmZkX29sZCwgcmZkX25ldzsKKwlzdHJ1Y3QgYXRsMV9ycmRfcmluZyBycmRfb2xkLCBycmRfbmV3OworCXN0cnVjdCBhdGwxX3JpbmdfaGVhZGVyIHJoZHJfb2xkLCByaGRyX25ldzsKKwlpbnQgZXJyOworCisJdHBkX29sZCA9IGFkYXB0ZXItPnRwZF9yaW5nOworCXJmZF9vbGQgPSBhZGFwdGVyLT5yZmRfcmluZzsKKwlycmRfb2xkID0gYWRhcHRlci0+cnJkX3Jpbmc7CisJcmhkcl9vbGQgPSBhZGFwdGVyLT5yaW5nX2hlYWRlcjsKKworCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpCisJCWF0bDFfZG93bihhZGFwdGVyKTsKKworCXJmZHItPmNvdW50ID0gKHUxNikgbWF4KHJpbmctPnJ4X3BlbmRpbmcsICh1MzIpIEFUTDFfTUlOX1JGRCk7CisJcmZkci0+Y291bnQgPSByZmRyLT5jb3VudCA+IEFUTDFfTUFYX1JGRCA/IEFUTDFfTUFYX1JGRCA6CisJCQlyZmRyLT5jb3VudDsKKwlyZmRyLT5jb3VudCA9IChyZmRyLT5jb3VudCArIDMpICYgfjM7CisJcnJkci0+Y291bnQgPSByZmRyLT5jb3VudDsKKworCXRwZHItPmNvdW50ID0gKHUxNikgbWF4KHJpbmctPnR4X3BlbmRpbmcsICh1MzIpIEFUTDFfTUlOX1RQRCk7CisJdHBkci0+Y291bnQgPSB0cGRyLT5jb3VudCA+IEFUTDFfTUFYX1RQRCA/IEFUTDFfTUFYX1RQRCA6CisJCQl0cGRyLT5jb3VudDsKKwl0cGRyLT5jb3VudCA9ICh0cGRyLT5jb3VudCArIDMpICYgfjM7CisKKwlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CisJCS8qIHRyeSB0byBnZXQgbmV3IHJlc291cmNlcyBiZWZvcmUgZGVsZXRpbmcgb2xkICovCisJCWVyciA9IGF0bDFfc2V0dXBfcmluZ19yZXNvdXJjZXMoYWRhcHRlcik7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9zZXR1cF9yaW5nOworCisJCS8qCisJCSAqIHNhdmUgdGhlIG5ldywgcmVzdG9yZSB0aGUgb2xkIGluIG9yZGVyIHRvIGZyZWUgaXQsCisJCSAqIHRoZW4gcmVzdG9yZSB0aGUgbmV3IGJhY2sgYWdhaW4KKwkJICovCisKKwkJcmZkX25ldyA9IGFkYXB0ZXItPnJmZF9yaW5nOworCQlycmRfbmV3ID0gYWRhcHRlci0+cnJkX3Jpbmc7CisJCXRwZF9uZXcgPSBhZGFwdGVyLT50cGRfcmluZzsKKwkJcmhkcl9uZXcgPSBhZGFwdGVyLT5yaW5nX2hlYWRlcjsKKwkJYWRhcHRlci0+cmZkX3JpbmcgPSByZmRfb2xkOworCQlhZGFwdGVyLT5ycmRfcmluZyA9IHJyZF9vbGQ7CisJCWFkYXB0ZXItPnRwZF9yaW5nID0gdHBkX29sZDsKKwkJYWRhcHRlci0+cmluZ19oZWFkZXIgPSByaGRyX29sZDsKKwkJYXRsMV9mcmVlX3JpbmdfcmVzb3VyY2VzKGFkYXB0ZXIpOworCQlhZGFwdGVyLT5yZmRfcmluZyA9IHJmZF9uZXc7CisJCWFkYXB0ZXItPnJyZF9yaW5nID0gcnJkX25ldzsKKwkJYWRhcHRlci0+dHBkX3JpbmcgPSB0cGRfbmV3OworCQlhZGFwdGVyLT5yaW5nX2hlYWRlciA9IHJoZHJfbmV3OworCisJCWVyciA9IGF0bDFfdXAoYWRhcHRlcik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKKworZXJyX3NldHVwX3Jpbmc6CisJYWRhcHRlci0+cmZkX3JpbmcgPSByZmRfb2xkOworCWFkYXB0ZXItPnJyZF9yaW5nID0gcnJkX29sZDsKKwlhZGFwdGVyLT50cGRfcmluZyA9IHRwZF9vbGQ7CisJYWRhcHRlci0+cmluZ19oZWFkZXIgPSByaGRyX29sZDsKKwlhdGwxX3VwKGFkYXB0ZXIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKworCWlmIChody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFX0FVVE9fU0VOU09SIHx8CisJICAgIGh3LT5tZWRpYV90eXBlID09IE1FRElBX1RZUEVfMTAwME1fRlVMTCkgeworCQllcGF1c2UtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwl9IGVsc2UgeworCQllcGF1c2UtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJfQorCWVwYXVzZS0+cnhfcGF1c2UgPSAxOworCWVwYXVzZS0+dHhfcGF1c2UgPSAxOworfQorCitzdGF0aWMgaW50IGF0bDFfc2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKworCWlmIChody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFX0FVVE9fU0VOU09SIHx8CisJICAgIGh3LT5tZWRpYV90eXBlID09IE1FRElBX1RZUEVfMTAwME1fRlVMTCkgeworCQllcGF1c2UtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwl9IGVsc2UgeworCQllcGF1c2UtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJfQorCisJZXBhdXNlLT5yeF9wYXVzZSA9IDE7CisJZXBhdXNlLT50eF9wYXVzZSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBhdGwxX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHN0cmluZ3NldCwKKwkJCQl1OCAqZGF0YSkKK3sKKwl1OCAqcCA9IGRhdGE7CisJaW50IGk7CisKKwlzd2l0Y2ggKHN0cmluZ3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdGwxX2dzdHJpbmdzX3N0YXRzKTsgaSsrKSB7CisJCQltZW1jcHkocCwgYXRsMV9nc3RyaW5nc19zdGF0c1tpXS5zdGF0X3N0cmluZywKKwkJCQlFVEhfR1NUUklOR19MRU4pOworCQkJcCArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGF0bDFfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJdTE2IHBoeV9kYXRhOworCQlhdGwxX2Rvd24oYWRhcHRlcik7CisKKwkJaWYgKGh3LT5tZWRpYV90eXBlID09IE1FRElBX1RZUEVfQVVUT19TRU5TT1IgfHwKKwkJCWh3LT5tZWRpYV90eXBlID09IE1FRElBX1RZUEVfMTAwME1fRlVMTCkgeworCQkJcGh5X2RhdGEgPSBNSUlfQ1JfUkVTRVQgfCBNSUlfQ1JfQVVUT19ORUdfRU47CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKGh3LT5tZWRpYV90eXBlKSB7CisJCQljYXNlIE1FRElBX1RZUEVfMTAwTV9GVUxMOgorCQkJCXBoeV9kYXRhID0gTUlJX0NSX0ZVTExfRFVQTEVYIHwKKwkJCQkJTUlJX0NSX1NQRUVEXzEwMCB8IE1JSV9DUl9SRVNFVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgTUVESUFfVFlQRV8xMDBNX0hBTEY6CisJCQkJcGh5X2RhdGEgPSBNSUlfQ1JfU1BFRURfMTAwIHwgTUlJX0NSX1JFU0VUOworCQkJCWJyZWFrOworCQkJY2FzZSBNRURJQV9UWVBFXzEwTV9GVUxMOgorCQkJCXBoeV9kYXRhID0gTUlJX0NSX0ZVTExfRFVQTEVYIHwKKwkJCQkJTUlJX0NSX1NQRUVEXzEwIHwgTUlJX0NSX1JFU0VUOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDogIC8qIE1FRElBX1RZUEVfMTBNX0hBTEYgKi8KKwkJCQlwaHlfZGF0YSA9IE1JSV9DUl9TUEVFRF8xMCB8IE1JSV9DUl9SRVNFVDsKKwkJCX0KKwkJfQorCQlhdGwxX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9CTUNSLCBwaHlfZGF0YSk7CisJCWF0bDFfdXAoYWRhcHRlcik7CisJfQorCXJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgYXRsMV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCQk9IGF0bDFfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gYXRsMV9zZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCQk9IGF0bDFfZ2V0X2RydmluZm8sCisJLmdldF93b2wJCT0gYXRsMV9nZXRfd29sLAorCS5zZXRfd29sCQk9IGF0bDFfc2V0X3dvbCwKKwkuZ2V0X3JpbmdwYXJhbQkJPSBhdGwxX2dldF9yaW5ncGFyYW0sCisJLnNldF9yaW5ncGFyYW0JCT0gYXRsMV9zZXRfcmluZ3BhcmFtLAorCS5nZXRfcGF1c2VwYXJhbQkJPSBhdGwxX2dldF9wYXVzZXBhcmFtLAorCS5zZXRfcGF1c2VwYXJhbSAJPSBhdGwxX3NldF9wYXVzZXBhcmFtLAorCS5nZXRfcnhfY3N1bQkJPSBhdGwxX2dldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX3NldF90eF9od19jc3VtLAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfc2cJCQk9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5zZXRfc2cJCQk9IGV0aHRvb2xfb3Bfc2V0X3NnLAorCS5nZXRfc3RyaW5ncwkJPSBhdGwxX2dldF9zdHJpbmdzLAorCS5ud2F5X3Jlc2V0CQk9IGF0bDFfbndheV9yZXNldCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBhdGwxX2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfc3RhdHNfY291bnQJPSBhdGwxX2dldF9zdGF0c19jb3VudCwKKwkuZ2V0X3RzbwkJPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28JCT0gZXRodG9vbF9vcF9zZXRfdHNvLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9ody5jIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX2h3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiMmQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9ody5jCkBAIC0wLDAgKzEsNzE4IEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDA2IEF0dGFuc2ljIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMDYgQ2hyaXMgU25vb2sgPGNzbm9va0ByZWRoYXQuY29tPgorICogQ29weXJpZ2h0KGMpIDIwMDYgSmF5IENsaWJ1cm4gPGpjbGlidXJuQGdtYWlsLmNvbT4KKyAqIAorICogRGVyaXZlZCBmcm9tIEludGVsIGUxMDAwIGRyaXZlcgorICogQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlICJhdGwxLmgiCisKKy8qCisgKiBSZXNldCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHM7IG1hc2sgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzLgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIHJldHVybiA6IEFUTDFfU1VDQ0VTUyAgb3IgIGlkbGUgc3RhdHVzIChpZiBlcnJvcikKKyAqLworczMyIGF0bDFfcmVzZXRfaHcoc3RydWN0IGF0bDFfaHcgKmh3KQoreworCXUzMiBpY3I7CisJaW50IGk7CisKKwkvKiAKKwkgKiBDbGVhciBJbnRlcnJ1cHQgbWFzayB0byBzdG9wIGJvYXJkIGZyb20gZ2VuZXJhdGluZworCSAqIGludGVycnVwdHMgJiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHQgZXZlbnRzIAorCSAqLworCS8qCisJICogaW93cml0ZTMyKDAsIGh3LT5od19hZGRyICsgUkVHX0lNUik7CisJICogaW93cml0ZTMyKDB4ZmZmZmZmZmYsIGh3LT5od19hZGRyICsgUkVHX0lTUik7CisJICovCisKKwkvKgorCSAqIElzc3VlIFNvZnQgUmVzZXQgdG8gdGhlIE1BQy4gIFRoaXMgd2lsbCByZXNldCB0aGUgY2hpcCdzCisJICogdHJhbnNtaXQsIHJlY2VpdmUsIERNQS4gIEl0IHdpbGwgbm90IGVmZmVjdAorCSAqIHRoZSBjdXJyZW50IFBDSSBjb25maWd1cmF0aW9uLiAgVGhlIGdsb2JhbCByZXNldCBiaXQgaXMgc2VsZi0KKwkgKiBjbGVhcmluZywgYW5kIHNob3VsZCBjbGVhciB3aXRoaW4gYSBtaWNyb3NlY29uZC4KKwkgKi8KKwlpb3dyaXRlMzIoTUFTVEVSX0NUUkxfU09GVF9SU1QsIGh3LT5od19hZGRyICsgUkVHX01BU1RFUl9DVFJMKTsKKwlpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19NQVNURVJfQ1RSTCk7CisKKwlpb3dyaXRlMTYoMSwgaHctPmh3X2FkZHIgKyBSRUdfR1BIWV9FTkFCTEUpOworCWlvcmVhZDE2KGh3LT5od19hZGRyICsgUkVHX0dQSFlfRU5BQkxFKTsKKworCW1zbGVlcCgxKTsJCS8qIGRlbGF5IGFib3V0IDFtcyAqLworCisJLyogV2FpdCBhdCBsZWFzdCAxMG1zIGZvciBBbGwgbW9kdWxlIHRvIGJlIElkbGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlpY3IgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19JRExFX1NUQVRVUyk7CisJCWlmICghaWNyKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsJLyogZGVsYXkgMSBtcyAqLworCQljcHVfcmVsYXgoKTsJLyogRklYTUU6IGlzIHRoaXMgc3RpbGwgdGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzPyAqLworCX0KKworCWlmIChpY3IpIHsKKwkJcHJpbnRrIChLRVJOX0RFQlVHICJpY3IgPSAleFxuIiwgaWNyKTsgCisJCXJldHVybiBpY3I7CisJfQorCisJcmV0dXJuIEFUTDFfU1VDQ0VTUzsKK30KKworLyogZnVuY3Rpb24gYWJvdXQgRUVQUk9NCisgKgorICogY2hlY2tfZWVwcm9tX2V4aXN0CisgKiByZXR1cm4gMCBpZiBlZXByb20gZXhpc3QKKyAqLworc3RhdGljIGludCBhdGwxX2NoZWNrX2VlcHJvbV9leGlzdChzdHJ1Y3QgYXRsMV9odyAqaHcpCit7CisJdTMyIHZhbHVlOworCXZhbHVlID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfU1BJX0ZMQVNIX0NUUkwpOworCWlmICh2YWx1ZSAmIFNQSV9GTEFTSF9DVFJMX0VOX1ZQRCkgeworCQl2YWx1ZSAmPSB+U1BJX0ZMQVNIX0NUUkxfRU5fVlBEOworCQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1NQSV9GTEFTSF9DVFJMKTsKKwl9CisKKwl2YWx1ZSA9IGlvcmVhZDE2KGh3LT5od19hZGRyICsgUkVHX1BDSUVfQ0FQX0xJU1QpOworCXJldHVybiAoKHZhbHVlICYgMHhGRjAwKSA9PSAweDZDMDApID8gMCA6IDE7Cit9CisKK3N0YXRpYyBib29sIGF0bDFfcmVhZF9lZXByb20oc3RydWN0IGF0bDFfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MzIgKnBfdmFsdWUpCit7CisJaW50IGk7CisJdTMyIGNvbnRyb2w7CisKKwlpZiAob2Zmc2V0ICYgMykKKwkJcmV0dXJuIGZhbHNlOwkvKiBhZGRyZXNzIGRvIG5vdCBhbGlnbiAqLworCisJaW93cml0ZTMyKDAsIGh3LT5od19hZGRyICsgUkVHX1ZQRF9EQVRBKTsKKwljb250cm9sID0gKG9mZnNldCAmIFZQRF9DQVBfVlBEX0FERFJfTUFTSykgPDwgVlBEX0NBUF9WUERfQUREUl9TSElGVDsKKwlpb3dyaXRlMzIoY29udHJvbCwgaHctPmh3X2FkZHIgKyBSRUdfVlBEX0NBUCk7CisJaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfVlBEX0NBUCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQltc2xlZXAoMik7CisJCWNvbnRyb2wgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19WUERfQ0FQKTsKKwkJaWYgKGNvbnRyb2wgJiBWUERfQ0FQX1ZQRF9GTEFHKQorCQkJYnJlYWs7CisJfQorCWlmIChjb250cm9sICYgVlBEX0NBUF9WUERfRkxBRykgeworCQkqcF92YWx1ZSA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX1ZQRF9EQVRBKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsJCS8qIHRpbWVvdXQgKi8KK30KKworLyoKKyAqIFJlYWRzIHRoZSB2YWx1ZSBmcm9tIGEgUEhZIHJlZ2lzdGVyCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogcmVnX2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBQSFkgcmVnaXN0ZXIgdG8gcmVhZAorICovCitzMzIgYXRsMV9yZWFkX3BoeV9yZWcoc3RydWN0IGF0bDFfaHcgKmh3LCB1MTYgcmVnX2FkZHIsIHUxNiAqcGh5X2RhdGEpCit7CisJdTMyIHZhbDsKKwlpbnQgaTsKKworCXZhbCA9ICgodTMyKSAocmVnX2FkZHIgJiBNRElPX1JFR19BRERSX01BU0spKSA8PCBNRElPX1JFR19BRERSX1NISUZUIHwKKwkgICAgCU1ESU9fU1RBUlQgfCBNRElPX1NVUF9QUkVBTUJMRSB8IE1ESU9fUlcgfCBNRElPX0NMS18yNV80IDw8CisgCQlNRElPX0NMS19TRUxfU0hJRlQ7CisJaW93cml0ZTMyKHZhbCwgaHctPmh3X2FkZHIgKyBSRUdfTURJT19DVFJMKTsKKwlpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19NRElPX0NUUkwpOworCisJZm9yIChpID0gMDsgaSA8IE1ESU9fV0FJVF9USU1FUzsgaSsrKSB7CisJCXVkZWxheSgyKTsKKwkJdmFsID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfTURJT19DVFJMKTsKKwkJaWYgKCEodmFsICYgKE1ESU9fU1RBUlQgfCBNRElPX0JVU1kpKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoISh2YWwgJiAoTURJT19TVEFSVCB8IE1ESU9fQlVTWSkpKSB7CisJCSpwaHlfZGF0YSA9ICh1MTYpIHZhbDsKKwkJcmV0dXJuIEFUTDFfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIEFUTDFfRVJSX1BIWTsKK30KKworI2RlZmluZSBDVVNUT01fU1BJX0NTX1NFVFVQCTIKKyNkZWZpbmUgQ1VTVE9NX1NQSV9DTEtfSEkJMgorI2RlZmluZSBDVVNUT01fU1BJX0NMS19MTwkyCisjZGVmaW5lIENVU1RPTV9TUElfQ1NfSE9MRAkyCisjZGVmaW5lIENVU1RPTV9TUElfQ1NfSEkJMworCitzdGF0aWMgYm9vbCBhdGwxX3NwaV9yZWFkKHN0cnVjdCBhdGwxX2h3ICpodywgdTMyIGFkZHIsIHUzMiAqYnVmKQoreworCWludCBpOworCXUzMiB2YWx1ZTsKKworCWlvd3JpdGUzMigwLCBody0+aHdfYWRkciArIFJFR19TUElfREFUQSk7CisJaW93cml0ZTMyKGFkZHIsIGh3LT5od19hZGRyICsgUkVHX1NQSV9BRERSKTsKKworCXZhbHVlID0gU1BJX0ZMQVNIX0NUUkxfV0FJVF9SRUFEWSB8CisJICAgIChDVVNUT01fU1BJX0NTX1NFVFVQICYgU1BJX0ZMQVNIX0NUUkxfQ1NfU0VUVVBfTUFTSykgPDwKKwkgICAgU1BJX0ZMQVNIX0NUUkxfQ1NfU0VUVVBfU0hJRlQgfCAoQ1VTVE9NX1NQSV9DTEtfSEkgJgorCQkJCQkgICAgIFNQSV9GTEFTSF9DVFJMX0NMS19ISV9NQVNLKSA8PAorCSAgICBTUElfRkxBU0hfQ1RSTF9DTEtfSElfU0hJRlQgfCAoQ1VTVE9NX1NQSV9DTEtfTE8gJgorCQkJCQkgICBTUElfRkxBU0hfQ1RSTF9DTEtfTE9fTUFTSykgPDwKKwkgICAgU1BJX0ZMQVNIX0NUUkxfQ0xLX0xPX1NISUZUIHwgKENVU1RPTV9TUElfQ1NfSE9MRCAmCisJCQkJCSAgIFNQSV9GTEFTSF9DVFJMX0NTX0hPTERfTUFTSykgPDwKKwkgICAgU1BJX0ZMQVNIX0NUUkxfQ1NfSE9MRF9TSElGVCB8IChDVVNUT01fU1BJX0NTX0hJICYKKwkJCQkJICAgIFNQSV9GTEFTSF9DVFJMX0NTX0hJX01BU0spIDw8CisJICAgIFNQSV9GTEFTSF9DVFJMX0NTX0hJX1NISUZUIHwgKDEgJiBTUElfRkxBU0hfQ1RSTF9JTlNfTUFTSykgPDwKKwkgICAgU1BJX0ZMQVNIX0NUUkxfSU5TX1NISUZUOworCisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19TUElfRkxBU0hfQ1RSTCk7CisKKwl2YWx1ZSB8PSBTUElfRkxBU0hfQ1RSTF9TVEFSVDsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1NQSV9GTEFTSF9DVFJMKTsKKwlpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19TUElfRkxBU0hfQ1RSTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQltc2xlZXAoMSk7CS8qIDFtcyAqLworCQl2YWx1ZSA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX1NQSV9GTEFTSF9DVFJMKTsKKwkJaWYgKCEodmFsdWUgJiBTUElfRkxBU0hfQ1RSTF9TVEFSVCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAodmFsdWUgJiBTUElfRkxBU0hfQ1RSTF9TVEFSVCkKKwkJcmV0dXJuIGZhbHNlOworCisJKmJ1ZiA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX1NQSV9EQVRBKTsKKworCXJldHVybiB0cnVlOworfQorCisvKgorICogZ2V0X3Blcm1hbmVudF9hZGRyZXNzCisgKiByZXR1cm4gMCBpZiBnZXQgdmFsaWQgbWFjIGFkZHJlc3MsIAorICovCitzdGF0aWMgaW50IGF0bDFfZ2V0X3Blcm1hbmVudF9hZGRyZXNzKHN0cnVjdCBhdGwxX2h3ICpodykKK3sKKwl1MzIgYWRkclsyXTsKKwl1MzIgaSwgY29udHJvbDsKKwl1MTYgcmVnOworCXU4IGV0aF9hZGRyW0VUSF9BTEVOXTsKKwlib29sIGtleV92YWxpZDsKKworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGh3LT5wZXJtX21hY19hZGRyKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBpbml0ICovCisJYWRkclswXSA9IGFkZHJbMV0gPSAwOworCisJaWYgKCFhdGwxX2NoZWNrX2VlcHJvbV9leGlzdChodykpIHsJLyogZWVwcm9tIGV4aXN0ICovCisJCXJlZyA9IDA7CisJCWtleV92YWxpZCA9IGZhbHNlOworCQkvKiBSZWFkIG91dCBhbGwgRUVQUk9NIGNvbnRlbnQgKi8KKwkJaSA9IDA7CisJCXdoaWxlICgxKSB7CisJCQlpZiAoYXRsMV9yZWFkX2VlcHJvbShodywgaSArIDB4MTAwLCAmY29udHJvbCkpIHsKKwkJCQlpZiAoa2V5X3ZhbGlkKSB7CisJCQkJCWlmIChyZWcgPT0gUkVHX01BQ19TVEFfQUREUikKKwkJCQkJCWFkZHJbMF0gPSBjb250cm9sOworCQkJCQllbHNlIGlmIChyZWcgPT0gKFJFR19NQUNfU1RBX0FERFIgKyA0KSkKKwkJCQkJCWFkZHJbMV0gPSBjb250cm9sOworCQkJCQlrZXlfdmFsaWQgPSBmYWxzZTsKKwkJCQl9IGVsc2UgaWYgKChjb250cm9sICYgMHhmZikgPT0gMHg1QSkgeworCQkJCQlrZXlfdmFsaWQgPSB0cnVlOworCQkJCQlyZWcgPSAodTE2KSAoY29udHJvbCA+PiAxNik7CisJCQkJfSBlbHNlCisJCQkJCWJyZWFrOwkvKiBhc3N1bWUgZGF0YSBlbmQgd2hpbGUgZW5jb3VudCBhbiBpbnZhbGlkIEtFWVdPUkQgKi8KKwkJCX0gZWxzZQorCQkJCWJyZWFrOwkvKiByZWFkIGVycm9yICovCisJCQlpICs9IDQ7CisJCX0KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgMiBsaW5lcyBhcmUgdGhlIEF0dGFuc2ljIG9yaWdpbmFscy4gIFNhdmluZyBmb3IgcG9zdGVyaXR5LgorICoJCSoodTMyICopICYgZXRoX2FkZHJbMl0gPSBMT05HU1dBUChhZGRyWzBdKTsKKyAqCQkqKHUxNiAqKSAmIGV0aF9hZGRyWzBdID0gU0hPUlRTV0FQKCoodTE2ICopICYgYWRkclsxXSk7CisgKi8KKwkJKih1MzIgKikgJiBldGhfYWRkclsyXSA9IHN3YWIzMihhZGRyWzBdKTsKKwkJKih1MTYgKikgJiBldGhfYWRkclswXSA9IHN3YWIxNigqKHUxNiAqKSAmIGFkZHJbMV0pOworCisJCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGV0aF9hZGRyKSkgeworCQkJbWVtY3B5KGh3LT5wZXJtX21hY19hZGRyLCBldGhfYWRkciwgRVRIX0FMRU4pOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJLyogc2VlIGlmIFNQSSBGTEFHUyBleGlzdCA/ICovCisJYWRkclswXSA9IGFkZHJbMV0gPSAwOworCXJlZyA9IDA7CisJa2V5X3ZhbGlkID0gZmFsc2U7CisJaSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaWYgKGF0bDFfc3BpX3JlYWQoaHcsIGkgKyAweDFmMDAwLCAmY29udHJvbCkpIHsKKwkJCWlmIChrZXlfdmFsaWQpIHsKKwkJCQlpZiAocmVnID09IFJFR19NQUNfU1RBX0FERFIpCisJCQkJCWFkZHJbMF0gPSBjb250cm9sOworCQkJCWVsc2UgaWYgKHJlZyA9PSAoUkVHX01BQ19TVEFfQUREUiArIDQpKQorCQkJCQlhZGRyWzFdID0gY29udHJvbDsKKwkJCQlrZXlfdmFsaWQgPSBmYWxzZTsKKwkJCX0gZWxzZSBpZiAoKGNvbnRyb2wgJiAweGZmKSA9PSAweDVBKSB7CisJCQkJa2V5X3ZhbGlkID0gdHJ1ZTsKKwkJCQlyZWcgPSAodTE2KSAoY29udHJvbCA+PiAxNik7CisJCQl9IGVsc2UKKwkJCQlicmVhazsJLyogZGF0YSBlbmQgKi8KKwkJfSBlbHNlCisJCQlicmVhazsJLyogcmVhZCBlcnJvciAqLworCQlpICs9IDQ7CisJfQorCisvKgorICogVGhlIGZvbGxvd2luZyAyIGxpbmVzIGFyZSB0aGUgQXR0YW5zaWMgb3JpZ2luYWxzLiAgU2F2aW5nIGZvciBwb3N0ZXJpdHkuCisgKgkqKHUzMiAqKSAmIGV0aF9hZGRyWzJdID0gTE9OR1NXQVAoYWRkclswXSk7CisgKgkqKHUxNiAqKSAmIGV0aF9hZGRyWzBdID0gU0hPUlRTV0FQKCoodTE2ICopICYgYWRkclsxXSk7CisgKi8KKwkqKHUzMiAqKSAmIGV0aF9hZGRyWzJdID0gc3dhYjMyKGFkZHJbMF0pOworCSoodTE2ICopICYgZXRoX2FkZHJbMF0gPSBzd2FiMTYoKih1MTYgKikgJiBhZGRyWzFdKTsKKwlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihldGhfYWRkcikpIHsKKwkJbWVtY3B5KGh3LT5wZXJtX21hY19hZGRyLCBldGhfYWRkciwgRVRIX0FMRU4pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZWFkcyB0aGUgYWRhcHRlcidzIE1BQyBhZGRyZXNzIGZyb20gdGhlIEVFUFJPTSAKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKi8KK3MzMiBhdGwxX3JlYWRfbWFjX2FkZHIoc3RydWN0IGF0bDFfaHcgKmh3KQoreworCXUxNiBpOworCisJaWYgKGF0bDFfZ2V0X3Blcm1hbmVudF9hZGRyZXNzKGh3KSkKKwkJcmFuZG9tX2V0aGVyX2FkZHIoaHctPnBlcm1fbWFjX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCWh3LT5tYWNfYWRkcltpXSA9IGh3LT5wZXJtX21hY19hZGRyW2ldOworCXJldHVybiBBVEwxX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBIYXNoZXMgYW4gYWRkcmVzcyB0byBkZXRlcm1pbmUgaXRzIGxvY2F0aW9uIGluIHRoZSBtdWx0aWNhc3QgdGFibGUKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBtY19hZGRyIC0gdGhlIG11bHRpY2FzdCBhZGRyZXNzIHRvIGhhc2gKKyAqCisgKiBhdGwxX2hhc2hfbWNfYWRkcgorICogIHB1cnBvc2UKKyAqICAgICAgc2V0IGhhc2ggdmFsdWUgZm9yIGEgbXVsdGljYXN0IGFkZHJlc3MKKyAqICAgICAgaGFzaCBjYWxjdSBwcm9jZXNzaW5nIDoKKyAqICAgICAgICAgIDEuIGNhbGN1IDMyYml0IENSQyBmb3IgbXVsdGljYXN0IGFkZHJlc3MKKyAqICAgICAgICAgIDIuIHJldmVyc2UgY3JjIHdpdGggTVNCIHRvIExTQgorICovCit1MzIgYXRsMV9oYXNoX21jX2FkZHIoc3RydWN0IGF0bDFfaHcgKmh3LCB1OCAqbWNfYWRkcikKK3sKKwl1MzIgY3JjMzIsIHZhbHVlID0gMDsKKwlpbnQgaTsKKworCWNyYzMyID0gZXRoZXJfY3JjX2xlKDYsIG1jX2FkZHIpOworCWNyYzMyID0gfmNyYzMyOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQl2YWx1ZSB8PSAoKChjcmMzMiA+PiBpKSAmIDEpIDw8ICgzMSAtIGkpKTsKKworCXJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIFNldHMgdGhlIGJpdCBpbiB0aGUgbXVsdGljYXN0IHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhhc2ggdmFsdWUuCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogaGFzaF92YWx1ZSAtIE11bHRpY2FzdCBhZGRyZXNzIGhhc2ggdmFsdWUKKyAqLwordm9pZCBhdGwxX2hhc2hfc2V0KHN0cnVjdCBhdGwxX2h3ICpodywgdTMyIGhhc2hfdmFsdWUpCit7CisJdTMyIGhhc2hfYml0LCBoYXNoX3JlZzsKKwl1MzIgbXRhOworCisJLyoKKwkgKiBUaGUgSEFTSCBUYWJsZSAgaXMgYSByZWdpc3RlciBhcnJheSBvZiAyIDMyLWJpdCByZWdpc3RlcnMuCisJICogSXQgaXMgdHJlYXRlZCBsaWtlIGFuIGFycmF5IG9mIDY0IGJpdHMuICBXZSB3YW50IHRvIHNldAorCSAqIGJpdCBCaXRBcnJheVtoYXNoX3ZhbHVlXS4gU28gd2UgZmlndXJlIG91dCB3aGF0IHJlZ2lzdGVyCisJICogdGhlIGJpdCBpcyBpbiwgcmVhZCBpdCwgT1IgaW4gdGhlIG5ldyBiaXQsIHRoZW4gd3JpdGUKKwkgKiBiYWNrIHRoZSBuZXcgdmFsdWUuICBUaGUgcmVnaXN0ZXIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKKwkgKiB1cHBlciA3IGJpdHMgb2YgdGhlIGhhc2ggdmFsdWUgYW5kIHRoZSBiaXQgd2l0aGluIHRoYXQKKwkgKiByZWdpc3RlciBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbG93ZXIgNSBiaXRzIG9mIHRoZSB2YWx1ZS4KKwkgKi8KKwloYXNoX3JlZyA9IChoYXNoX3ZhbHVlID4+IDMxKSAmIDB4MTsKKwloYXNoX2JpdCA9IChoYXNoX3ZhbHVlID4+IDI2KSAmIDB4MUY7CisJbXRhID0gaW9yZWFkMzIoKGh3ICsgUkVHX1JYX0hBU0hfVEFCTEUpICsgKGhhc2hfcmVnIDw8IDIpKTsKKwltdGEgfD0gKDEgPDwgaGFzaF9iaXQpOworCWlvd3JpdGUzMihtdGEsIChody0+aHdfYWRkciArIFJFR19SWF9IQVNIX1RBQkxFKSArIChoYXNoX3JlZyA8PCAyKSk7Cit9CisKKy8qCisgKiBXcml0ZXMgYSB2YWx1ZSB0byBhIFBIWSByZWdpc3RlcgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIHJlZ19hZGRyIC0gYWRkcmVzcyBvZiB0aGUgUEhZIHJlZ2lzdGVyIHRvIHdyaXRlCisgKiBkYXRhIC0gZGF0YSB0byB3cml0ZSB0byB0aGUgUEhZCisgKi8KK3MzMiBhdGwxX3dyaXRlX3BoeV9yZWcoc3RydWN0IGF0bDFfaHcgKmh3LCB1MzIgcmVnX2FkZHIsIHUxNiBwaHlfZGF0YSkKK3sKKwlpbnQgaTsKKwl1MzIgdmFsOworCisJdmFsID0gKCh1MzIpIChwaHlfZGF0YSAmIE1ESU9fREFUQV9NQVNLKSkgPDwgTURJT19EQVRBX1NISUZUIHwKKwkgICAgKHJlZ19hZGRyICYgTURJT19SRUdfQUREUl9NQVNLKSA8PCBNRElPX1JFR19BRERSX1NISUZUIHwKKwkgICAgTURJT19TVVBfUFJFQU1CTEUgfAorCSAgICBNRElPX1NUQVJUIHwgTURJT19DTEtfMjVfNCA8PCBNRElPX0NMS19TRUxfU0hJRlQ7CisJaW93cml0ZTMyKHZhbCwgaHctPmh3X2FkZHIgKyBSRUdfTURJT19DVFJMKTsKKwlpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19NRElPX0NUUkwpOworCisJZm9yIChpID0gMDsgaSA8IE1ESU9fV0FJVF9USU1FUzsgaSsrKSB7CisJCXVkZWxheSgyKTsKKwkJdmFsID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfTURJT19DVFJMKTsKKwkJaWYgKCEodmFsICYgKE1ESU9fU1RBUlQgfCBNRElPX0JVU1kpKSkKKwkJCWJyZWFrOworCX0KKworCWlmICghKHZhbCAmIChNRElPX1NUQVJUIHwgTURJT19CVVNZKSkpCisJCXJldHVybiBBVEwxX1NVQ0NFU1M7CisKKwlyZXR1cm4gQVRMMV9FUlJfUEhZOworfQorCisvKgorICogTWFrZSBMMDAxJ3MgUEhZIG91dCBvZiBQb3dlciBTYXZpbmcgU3RhdGUgKGJ1ZykKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiB3aGVuIHBvd2VyIG9uLCBMMDAxJ3MgUEhZIGFsd2F5cyBvbiBQb3dlciBzYXZpbmcgU3RhdGUKKyAqIChHaWdhYml0IExpbmsgZm9yYmlkZGVuKQorICovCitzdGF0aWMgczMyIGF0bDFfcGh5X2xlYXZlX3Bvd2VyX3NhdmluZyhzdHJ1Y3QgYXRsMV9odyAqaHcpCit7CisJczMyIHJldDsKKwlyZXQgPSBhdGwxX3dyaXRlX3BoeV9yZWcoaHcsIDI5LCAweDAwMjkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGF0bDFfd3JpdGVfcGh5X3JlZyhodywgMzAsIDApOworfQorCisvKgorICpUT0RPOiBkbyBzb21ldGhpbmcgb3IgZ2V0IHJpZCBvZiB0aGlzCisgKi8KK3MzMiBhdGwxX3BoeV9lbnRlcl9wb3dlcl9zYXZpbmcoc3RydWN0IGF0bDFfaHcgKmh3KQoreworLyogICAgczMyIHJldF92YWw7CisgKiAgICB1MTYgcGh5X2RhdGE7CisgKi8KKworLyoKKyAgICByZXRfdmFsID0gYXRsMV93cml0ZV9waHlfcmVnKGh3LCAuLi4pOworICAgIHJldF92YWwgPSBhdGwxX3dyaXRlX3BoeV9yZWcoaHcsIC4uLik7CisgICAgLi4uLgorKi8KKwlyZXR1cm4gQVRMMV9TVUNDRVNTOworfQorCisvKgorICogUmVzZXRzIHRoZSBQSFkgYW5kIG1ha2UgYWxsIGNvbmZpZyB2YWxpZGF0ZQorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBTZXRzIGJpdCAxNSBhbmQgMTIgb2YgdGhlIE1JSSBDb250cm9sIHJlZ2lzZXIgKGZvciBGMDAxIGJ1ZykKKyAqLworc3RhdGljIHMzMiBhdGwxX3BoeV9yZXNldChzdHJ1Y3QgYXRsMV9odyAqaHcpCit7CisJczMyIHJldF92YWw7CisJdTE2IHBoeV9kYXRhOworCisJaWYgKGh3LT5tZWRpYV90eXBlID09IE1FRElBX1RZUEVfQVVUT19TRU5TT1IgfHwKKwkgICAgaHctPm1lZGlhX3R5cGUgPT0gTUVESUFfVFlQRV8xMDAwTV9GVUxMKQorCQlwaHlfZGF0YSA9IE1JSV9DUl9SRVNFVCB8IE1JSV9DUl9BVVRPX05FR19FTjsKKwllbHNlIHsKKwkJc3dpdGNoIChody0+bWVkaWFfdHlwZSkgeworCQljYXNlIE1FRElBX1RZUEVfMTAwTV9GVUxMOgorCQkJcGh5X2RhdGEgPQorCQkJICAgIE1JSV9DUl9GVUxMX0RVUExFWCB8IE1JSV9DUl9TUEVFRF8xMDAgfAorCQkJICAgIE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQljYXNlIE1FRElBX1RZUEVfMTAwTV9IQUxGOgorCQkJcGh5X2RhdGEgPSBNSUlfQ1JfU1BFRURfMTAwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCWNhc2UgTUVESUFfVFlQRV8xME1fRlVMTDoKKwkJCXBoeV9kYXRhID0KKwkJCSAgICBNSUlfQ1JfRlVMTF9EVVBMRVggfCBNSUlfQ1JfU1BFRURfMTAgfCBNSUlfQ1JfUkVTRVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogTUVESUFfVFlQRV8xME1fSEFMRjogKi8KKwkJCXBoeV9kYXRhID0gTUlJX0NSX1NQRUVEXzEwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXRfdmFsID0gYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQk1DUiwgcGh5X2RhdGEpOworCWlmIChyZXRfdmFsKSB7CisJCXUzMiB2YWw7CisJCWludCBpOworCQkvKiBwY2llIHNlcmRlcyBsaW5rIG1heSBiZSBkb3duISAqLworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGF1dG9uZWcgY2F1c2VkIHBjaWUgcGh5IGxpbmsgZG93blxuIiwgCisJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMjU7IGkrKykgeworCQkJbXNsZWVwKDEpOworCQkJdmFsID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfTURJT19DVFJMKTsKKwkJCWlmICghKHZhbCAmIChNRElPX1NUQVJUIHwgTURJT19CVVNZKSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHZhbCAmIChNRElPX1NUQVJUIHwgTURJT19CVVNZKSkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCQkiJXM6IHBjaWUgbGluayBkb3duIGF0IGxlYXN0IGZvciAyNW1zXG4iLCAKKwkJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisJfQorCXJldHVybiBBVEwxX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBDb25maWd1cmVzIFBIWSBhdXRvbmVnIGFuZCBmbG93IGNvbnRyb2wgYWR2ZXJ0aXNlbWVudCBzZXR0aW5ncworICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqLworczMyIGF0bDFfcGh5X3NldHVwX2F1dG9uZWdfYWR2KHN0cnVjdCBhdGwxX2h3ICpodykKK3sKKwlzMzIgcmV0X3ZhbDsKKwlzMTYgbWlpX2F1dG9uZWdfYWR2X3JlZzsKKwlzMTYgbWlpXzEwMDB0X2N0cmxfcmVnOworCisJLyogUmVhZCB0aGUgTUlJIEF1dG8tTmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKEFkZHJlc3MgNCkuICovCisJbWlpX2F1dG9uZWdfYWR2X3JlZyA9IE1JSV9BUl9ERUZBVUxUX0NBUF9NQVNLOworCisJLyogUmVhZCB0aGUgTUlJIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4gKi8KKwltaWlfMTAwMHRfY3RybF9yZWcgPSBNSUlfQVQwMDFfQ1JfMTAwMFRfREVGQVVMVF9DQVBfTUFTSzsKKworCS8qCisJICogRmlyc3Qgd2UgY2xlYXIgYWxsIHRoZSAxMC8xMDAgbWIgc3BlZWQgYml0cyBpbiB0aGUgQXV0by1OZWcKKwkgKiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyIChBZGRyZXNzIDQpIGFuZCB0aGUgMTAwMCBtYiBzcGVlZCBiaXRzIGluCisJICogdGhlICAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKEFkZHJlc3MgOSkuCisJICovCisJbWlpX2F1dG9uZWdfYWR2X3JlZyAmPSB+TUlJX0FSX1NQRUVEX01BU0s7CisJbWlpXzEwMDB0X2N0cmxfcmVnICY9IH5NSUlfQVQwMDFfQ1JfMTAwMFRfU1BFRURfTUFTSzsKKworCS8qCisJICogTmVlZCB0byBwYXJzZSBtZWRpYV90eXBlICBhbmQgc2V0IHVwCisJICogdGhlIGFwcHJvcHJpYXRlIFBIWSByZWdpc3RlcnMuCisJICovCisJc3dpdGNoIChody0+bWVkaWFfdHlwZSkgeworCWNhc2UgTUVESUFfVFlQRV9BVVRPX1NFTlNPUjoKKwkJbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSAoTUlJX0FSXzEwVF9IRF9DQVBTIHwKKwkJCQkJTUlJX0FSXzEwVF9GRF9DQVBTIHwKKwkJCQkJTUlJX0FSXzEwMFRYX0hEX0NBUFMgfAorCQkJCQlNSUlfQVJfMTAwVFhfRkRfQ0FQUyk7CisJCW1paV8xMDAwdF9jdHJsX3JlZyB8PSBNSUlfQVQwMDFfQ1JfMTAwMFRfRkRfQ0FQUzsKKwkJYnJlYWs7CisKKwljYXNlIE1FRElBX1RZUEVfMTAwME1fRlVMTDoKKwkJbWlpXzEwMDB0X2N0cmxfcmVnIHw9IE1JSV9BVDAwMV9DUl8xMDAwVF9GRF9DQVBTOworCQlicmVhazsKKworCWNhc2UgTUVESUFfVFlQRV8xMDBNX0ZVTEw6CisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTUlJX0FSXzEwMFRYX0ZEX0NBUFM7CisJCWJyZWFrOworCisJY2FzZSBNRURJQV9UWVBFXzEwME1fSEFMRjoKKwkJbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBNSUlfQVJfMTAwVFhfSERfQ0FQUzsKKwkJYnJlYWs7CisKKwljYXNlIE1FRElBX1RZUEVfMTBNX0ZVTEw6CisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTUlJX0FSXzEwVF9GRF9DQVBTOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTUlJX0FSXzEwVF9IRF9DQVBTOworCQlicmVhazsKKwl9CisKKwkvKiBmbG93IGNvbnRyb2wgZml4ZWQgdG8gZW5hYmxlIGFsbCAqLworCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE1JSV9BUl9BU01fRElSIHwgTUlJX0FSX1BBVVNFKTsKKworCWh3LT5taWlfYXV0b25lZ19hZHZfcmVnID0gbWlpX2F1dG9uZWdfYWR2X3JlZzsKKwlody0+bWlpXzEwMDB0X2N0cmxfcmVnID0gbWlpXzEwMDB0X2N0cmxfcmVnOworCisJcmV0X3ZhbCA9IGF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0FEVkVSVElTRSwgbWlpX2F1dG9uZWdfYWR2X3JlZyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCisJcmV0X3ZhbCA9IGF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0FUMDAxX0NSLCBtaWlfMTAwMHRfY3RybF9yZWcpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXJldHVybiBBVEwxX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBDb25maWd1cmVzIGxpbmsgc2V0dGluZ3MuCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQXNzdW1lcyB0aGUgaGFyZHdhcmUgaGFzIHByZXZpb3VzbHkgYmVlbiByZXNldCBhbmQgdGhlCisgKiB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIgYXJlIG5vdCBlbmFibGVkLgorICovCitzdGF0aWMgczMyIGF0bDFfc2V0dXBfbGluayhzdHJ1Y3QgYXRsMV9odyAqaHcpCit7CisJczMyIHJldF92YWw7CisKKwkvKgorCSAqIE9wdGlvbnM6CisJICogIFBIWSB3aWxsIGFkdmVydGlzZSB2YWx1ZShzKSBwYXJzZWQgZnJvbQorCSAqICBhdXRvbmVnX2FkdmVydGlzZWQgYW5kIGZjCisJICogIG5vIG1hdHRlciB3aGF0IGF1dG9uZWcgaXMgLCBXZSB3aWxsIG5vdCB3YWl0IGxpbmsgcmVzdWx0LgorCSAqLworCXJldF92YWwgPSBhdGwxX3BoeV9zZXR1cF9hdXRvbmVnX2Fkdihodyk7CisJaWYgKHJldF92YWwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlcnJvciBzZXR0aW5nIHVwIGF1dG9uZWdvdGlhdGlvblxuIiwgCisJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCS8qIFNXLlJlc2V0ICwgRW4tQXV0by1OZWcgaWYgbmVlZGVkICovCisJcmV0X3ZhbCA9IGF0bDFfcGh5X3Jlc2V0KGh3KTsKKwlpZiAocmV0X3ZhbCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVycm9yIHJlc2V0dGluZyB0aGUgcGh5XG4iLCAKKwkJCWF0bDFfZHJpdmVyX25hbWUpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisJaHctPnBoeV9jb25maWd1cmVkID0gdHJ1ZTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIHN0cnVjdCBhdGwxX3NwaV9mbGFzaF9kZXYgZmxhc2hfdGFibGVbXSA9IHsKKy8qCU1GUl9OQU1FICBXUlNSICBSRUFEICBQUkdNICBXUkVOICBXUkRJICBSRFNSICBSRElEICBTRUNUT1JfRVJBU0UgQ0hJUF9FUkFTRSAqLworCXsiQXRtZWwiLCAweDAwLCAweDAzLCAweDAyLCAweDA2LCAweDA0LCAweDA1LCAweDE1LCAweDUyLCAgICAgICAgMHg2Mn0sCisJeyJTU1QiLCAgIDB4MDEsIDB4MDMsIDB4MDIsIDB4MDYsIDB4MDQsIDB4MDUsIDB4OTAsIDB4MjAsICAgICAgICAweDYwfSwKKwl7IlNUIiwgICAgMHgwMSwgMHgwMywgMHgwMiwgMHgwNiwgMHgwNCwgMHgwNSwgMHhBQiwgMHhEOCwgICAgICAgIDB4Qzd9LAorfTsKKworc3RhdGljIHZvaWQgYXRsMV9pbml0X2ZsYXNoX29wY29kZShzdHJ1Y3QgYXRsMV9odyAqaHcpCit7CisJaWYgKGh3LT5mbGFzaF92ZW5kb3IgPj0gc2l6ZW9mKGZsYXNoX3RhYmxlKSAvIHNpemVvZihmbGFzaF90YWJsZVswXSkpCisJCWh3LT5mbGFzaF92ZW5kb3IgPSAwOwkvKiBBVE1FTCAqLworCisJLyogSW5pdCBPUCB0YWJsZSAqLworCWlvd3JpdGU4KGZsYXNoX3RhYmxlW2h3LT5mbGFzaF92ZW5kb3JdLmNtZF9wcm9ncmFtLAorCQlody0+aHdfYWRkciArIFJFR19TUElfRkxBU0hfT1BfUFJPR1JBTSk7CisJaW93cml0ZTgoZmxhc2hfdGFibGVbaHctPmZsYXNoX3ZlbmRvcl0uY21kX3NlY3Rvcl9lcmFzZSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfU1BJX0ZMQVNIX09QX1NDX0VSQVNFKTsKKwlpb3dyaXRlOChmbGFzaF90YWJsZVtody0+Zmxhc2hfdmVuZG9yXS5jbWRfY2hpcF9lcmFzZSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfU1BJX0ZMQVNIX09QX0NISVBfRVJBU0UpOworCWlvd3JpdGU4KGZsYXNoX3RhYmxlW2h3LT5mbGFzaF92ZW5kb3JdLmNtZF9yZGlkLAorCQlody0+aHdfYWRkciArIFJFR19TUElfRkxBU0hfT1BfUkRJRCk7CisJaW93cml0ZTgoZmxhc2hfdGFibGVbaHctPmZsYXNoX3ZlbmRvcl0uY21kX3dyZW4sCisJCWh3LT5od19hZGRyICsgUkVHX1NQSV9GTEFTSF9PUF9XUkVOKTsKKwlpb3dyaXRlOChmbGFzaF90YWJsZVtody0+Zmxhc2hfdmVuZG9yXS5jbWRfcmRzciwKKwkJaHctPmh3X2FkZHIgKyBSRUdfU1BJX0ZMQVNIX09QX1JEU1IpOworCWlvd3JpdGU4KGZsYXNoX3RhYmxlW2h3LT5mbGFzaF92ZW5kb3JdLmNtZF93cnNyLAorCQlody0+aHdfYWRkciArIFJFR19TUElfRkxBU0hfT1BfV1JTUik7CisJaW93cml0ZTgoZmxhc2hfdGFibGVbaHctPmZsYXNoX3ZlbmRvcl0uY21kX3JlYWQsCisJCWh3LT5od19hZGRyICsgUkVHX1NQSV9GTEFTSF9PUF9SRUFEKTsKK30KKworLyoKKyAqIFBlcmZvcm1zIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGFkYXB0ZXIuCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogQXNzdW1lcyB0aGF0IHRoZSBjb250cm9sbGVyIGhhcyBwcmV2aW91c2x5IGJlZW4gcmVzZXQgYW5kIGlzIGluIGEKKyAqIHBvc3QtcmVzZXQgdW5pbml0aWFsaXplZCBzdGF0ZS4gSW5pdGlhbGl6ZXMgbXVsdGljYXN0IHRhYmxlLCAKKyAqIGFuZCAgQ2FsbHMgcm91dGluZXMgdG8gc2V0dXAgbGluaworICogTGVhdmVzIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSB1bml0cyBkaXNhYmxlZCBhbmQgdW5pbml0aWFsaXplZC4KKyAqLworczMyIGF0bDFfaW5pdF9odyhzdHJ1Y3QgYXRsMV9odyAqaHcpCit7CisJdTMyIHJldF92YWwgPSAwOworCisJLyogWmVybyBvdXQgdGhlIE11bHRpY2FzdCBIQVNIIHRhYmxlICovCisJaW93cml0ZTMyKDAsIGh3LT5od19hZGRyICsgUkVHX1JYX0hBU0hfVEFCTEUpOworCS8qIGNsZWFyIHRoZSBvbGQgc2V0dGluZ3MgZnJvbSB0aGUgbXVsdGljYXN0IGhhc2ggdGFibGUgKi8KKwlpb3dyaXRlMzIoMCwgKGh3LT5od19hZGRyICsgUkVHX1JYX0hBU0hfVEFCTEUpICsgKDEgPDwgMikpOworCisJYXRsMV9pbml0X2ZsYXNoX29wY29kZShodyk7CisKKwlpZiAoIWh3LT5waHlfY29uZmlndXJlZCkgeworCQkvKiBlbmFibGUgR1BIWSBMaW5rQ2hhbmdlIEludGVycnJ1cHQgKi8KKwkJcmV0X3ZhbCA9IGF0bDFfd3JpdGVfcGh5X3JlZyhodywgMTgsIDB4QzAwKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJLyogbWFrZSBQSFkgb3V0IG9mIHBvd2VyLXNhdmluZyBzdGF0ZSAqLworCQlyZXRfdmFsID0gYXRsMV9waHlfbGVhdmVfcG93ZXJfc2F2aW5nKGh3KTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJLyogQ2FsbCBhIHN1YnJvdXRpbmUgdG8gY29uZmlndXJlIHRoZSBsaW5rICovCisJCXJldF92YWwgPSBhdGwxX3NldHVwX2xpbmsoaHcpOworCX0KKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoKKyAqIERldGVjdHMgdGhlIGN1cnJlbnQgc3BlZWQgYW5kIGR1cGxleCBzZXR0aW5ncyBvZiB0aGUgaGFyZHdhcmUuCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogc3BlZWQgLSBTcGVlZCBvZiB0aGUgY29ubmVjdGlvbgorICogZHVwbGV4IC0gRHVwbGV4IHNldHRpbmcgb2YgdGhlIGNvbm5lY3Rpb24KKyAqLworczMyIGF0bDFfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoc3RydWN0IGF0bDFfaHcgKmh3LCB1MTYgKnNwZWVkLCB1MTYgKmR1cGxleCkKK3sKKwlzMzIgcmV0X3ZhbDsKKwl1MTYgcGh5X2RhdGE7CisKKwkvKiA7IC0tLSBSZWFkICAgUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAoMTcpICovCisJcmV0X3ZhbCA9IGF0bDFfcmVhZF9waHlfcmVnKGh3LCBNSUlfQVQwMDFfUFNTUiwgJnBoeV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlpZiAoIShwaHlfZGF0YSAmIE1JSV9BVDAwMV9QU1NSX1NQRF9EUExYX1JFU09MVkVEKSkKKwkJcmV0dXJuIEFUTDFfRVJSX1BIWV9SRVM7CisKKwlzd2l0Y2ggKHBoeV9kYXRhICYgTUlJX0FUMDAxX1BTU1JfU1BFRUQpIHsKKwljYXNlIE1JSV9BVDAwMV9QU1NSXzEwMDBNQlM6CisJCSpzcGVlZCA9IFNQRUVEXzEwMDA7CisJCWJyZWFrOworCWNhc2UgTUlJX0FUMDAxX1BTU1JfMTAwTUJTOgorCQkqc3BlZWQgPSBTUEVFRF8xMDA7CisJCWJyZWFrOworCWNhc2UgTUlJX0FUMDAxX1BTU1JfMTBNQlM6CisJCSpzcGVlZCA9IFNQRUVEXzEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVycm9yIGdldHRpbmcgc3BlZWRcbiIsIAorCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisJCXJldHVybiBBVEwxX0VSUl9QSFlfU1BFRUQ7CisJCWJyZWFrOworCX0KKwlpZiAocGh5X2RhdGEgJiBNSUlfQVQwMDFfUFNTUl9EUExYKQorCQkqZHVwbGV4ID0gRlVMTF9EVVBMRVg7CisJZWxzZQorCQkqZHVwbGV4ID0gSEFMRl9EVVBMRVg7CisKKwlyZXR1cm4gQVRMMV9TVUNDRVNTOworfQorCit2b2lkIGF0bDFfc2V0X21hY19hZGRyKHN0cnVjdCBhdGwxX2h3ICpodykKK3sKKwl1MzIgdmFsdWU7CisJLyoKKwkgKiAwMC0wQi02QS1GNi0wMC1EQworCSAqIDA6ICA2QUY2MDBEQyAgIDE6IDAwMEIKKwkgKiBsb3cgZHdvcmQKKwkgKi8KKwl2YWx1ZSA9ICgoKHUzMikgaHctPm1hY19hZGRyWzJdKSA8PCAyNCkgfAorCSAgICAoKCh1MzIpIGh3LT5tYWNfYWRkclszXSkgPDwgMTYpIHwKKwkgICAgKCgodTMyKSBody0+bWFjX2FkZHJbNF0pIDw8IDgpIHwgKCgodTMyKSBody0+bWFjX2FkZHJbNV0pKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BQ19TVEFfQUREUik7CisJLyogaGlnaCBkd29yZCAqLworCXZhbHVlID0gKCgodTMyKSBody0+bWFjX2FkZHJbMF0pIDw8IDgpIHwgKCgodTMyKSBody0+bWFjX2FkZHJbMV0pKTsKKwlpb3dyaXRlMzIodmFsdWUsIChody0+aHdfYWRkciArIFJFR19NQUNfU1RBX0FERFIpICsgKDEgPDwgMikpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRsMS9hdGwxX2h3LmggYi9kcml2ZXJzL25ldC9hdGwxL2F0bDFfaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBjMDljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX2h3LmgKQEAgLTAsMCArMSw5NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMDYgQXR0YW5zaWMgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAwNiBDaHJpcyBTbm9vayA8Y3Nub29rQHJlZGhhdC5jb20+CisgKiBDb3B5cmlnaHQoYykgMjAwNiBKYXkgQ2xpYnVybiA8amNsaWJ1cm5AZ21haWwuY29tPgorICoKKyAqIERlcml2ZWQgZnJvbSBJbnRlbCBlMTAwMCBkcml2ZXIKKyAqIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBUaGVyZSBhcmUgYSBsb3Qgb2YgZGVmaW5lcyBpbiBoZXJlIHRoYXQgYXJlIHVudXNlZCBhbmQvb3IgaGF2ZSBjcnlwdGljCisgKiBuYW1lcy4gIFBsZWFzZSBsZWF2ZSB0aGVtIGFsb25lLCBhcyB0aGV5J3JlIHRoZSBjbG9zZXN0IHRoaW5nIHdlIGhhdmUKKyAqIHRvIGEgc3BlYyBmcm9tIEF0dGFuc2ljIGF0IHByZXNlbnQuICphaGVtKiAtLSBDSFMKKyAqLworCisjaWZuZGVmIF9BVEwxX0hXX0hfCisjZGVmaW5lIF9BVEwxX0hXX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorCitzdHJ1Y3QgYXRsMV9hZGFwdGVyOworc3RydWN0IGF0bDFfaHc7CisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgbmVlZGVkIGJ5IG11bHRpcGxlIGZpbGVzICovCitzMzIgYXRsMV9waHlfc2V0dXBfYXV0b25lZ19hZHYoc3RydWN0IGF0bDFfaHcgKmh3KTsKK3MzMiBhdGwxX3dyaXRlX3BoeV9yZWcoc3RydWN0IGF0bDFfaHcgKmh3LCB1MzIgcmVnX2FkZHIsIHUxNiBwaHlfZGF0YSk7CitzMzIgYXRsMV9nZXRfc3BlZWRfYW5kX2R1cGxleChzdHJ1Y3QgYXRsMV9odyAqaHcsIHUxNiAqc3BlZWQsIHUxNiAqZHVwbGV4KTsKK3MzMiBhdGwxX3JlYWRfbWFjX2FkZHIoc3RydWN0IGF0bDFfaHcgKmh3KTsKK3MzMiBhdGwxX2luaXRfaHcoc3RydWN0IGF0bDFfaHcgKmh3KTsKK3MzMiBhdGwxX2dldF9zcGVlZF9hbmRfZHVwbGV4KHN0cnVjdCBhdGwxX2h3ICpodywgdTE2ICpzcGVlZCwgdTE2ICpkdXBsZXgpOworczMyIGF0bDFfc2V0X3NwZWVkX2FuZF9kdXBsZXgoc3RydWN0IGF0bDFfaHcgKmh3LCB1MTYgc3BlZWQsIHUxNiBkdXBsZXgpOwordTMyIGF0bDFfaGFzaF9tY19hZGRyKHN0cnVjdCBhdGwxX2h3ICpodywgdTggKm1jX2FkZHIpOwordm9pZCBhdGwxX2hhc2hfc2V0KHN0cnVjdCBhdGwxX2h3ICpodywgdTMyIGhhc2hfdmFsdWUpOworczMyIGF0bDFfcmVhZF9waHlfcmVnKHN0cnVjdCBhdGwxX2h3ICpodywgdTE2IHJlZ19hZGRyLCB1MTYgKnBoeV9kYXRhKTsKK3ZvaWQgYXRsMV9zZXRfbWFjX2FkZHIoc3RydWN0IGF0bDFfaHcgKmh3KTsKK3MzMiBhdGwxX3BoeV9lbnRlcl9wb3dlcl9zYXZpbmcoc3RydWN0IGF0bDFfaHcgKmh3KTsKK3MzMiBhdGwxX3Jlc2V0X2h3KHN0cnVjdCBhdGwxX2h3ICpodyk7Cit2b2lkIGF0bDFfY2hlY2tfb3B0aW9ucyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKTsKKworLyogcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUkVHX1BDSUVfQ0FQX0xJU1QJCQkweDU4CisKKyNkZWZpbmUgUkVHX1ZQRF9DQVAJCQkJMHg2QworI2RlZmluZSBWUERfQ0FQX0lEX01BU0sJCQkJMHhmZgorI2RlZmluZSBWUERfQ0FQX0lEX1NISUZUCQkJMAorI2RlZmluZSBWUERfQ0FQX05FWFRfUFRSX01BU0sJCQkweEZGCisjZGVmaW5lIFZQRF9DQVBfTkVYVF9QVFJfU0hJRlQJCQk4CisjZGVmaW5lIFZQRF9DQVBfVlBEX0FERFJfTUFTSwkJCTB4N0ZGRgorI2RlZmluZSBWUERfQ0FQX1ZQRF9BRERSX1NISUZUCQkJMTYKKyNkZWZpbmUgVlBEX0NBUF9WUERfRkxBRwkJCTB4ODAwMDAwMDAKKworI2RlZmluZSBSRUdfVlBEX0RBVEEJCQkJMHg3MAorCisjZGVmaW5lIFJFR19TUElfRkxBU0hfQ1RSTAkJCTB4MjAwCisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX1NUU19OT05fUkRZCQkweDEKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfU1RTX1dFTgkJCTB4MgorI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9TVFNfV1BFTgkJCTB4ODAKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfREVWX1NUU19NQVNLCQkweEZGCisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX0RFVl9TVFNfU0hJRlQJCTAKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfSU5TX01BU0sJCQkweDcKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfSU5TX1NISUZUCQk4CisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX1NUQVJUCQkJMHg4MDAKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfRU5fVlBECQkJMHgyMDAwCisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX0xEU1RBUlQJCQkweDgwMDAKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfQ1NfSElfTUFTSwkJMHgzCisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX0NTX0hJX1NISUZUCQkxNgorI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9DU19IT0xEX01BU0sJCTB4MworI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9DU19IT0xEX1NISUZUCQkxOAorI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9DTEtfTE9fTUFTSwkJMHgzCisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX0NMS19MT19TSElGVAkJMjAKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfQ0xLX0hJX01BU0sJCTB4MworI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9DTEtfSElfU0hJRlQJCTIyCisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX0NTX1NFVFVQX01BU0sJCTB4MworI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9DU19TRVRVUF9TSElGVAkJMjQKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfRVJPTV9QR1NaX01BU0sJCTB4MworI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9FUk9NX1BHU1pfU0hJRlQJCTI2CisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX1dBSVRfUkVBRFkJCTB4MTAwMDAwMDAKKworI2RlZmluZSBSRUdfU1BJX0FERFIJCQkJMHgyMDQKKworI2RlZmluZSBSRUdfU1BJX0RBVEEJCQkJMHgyMDgKKworI2RlZmluZSBSRUdfU1BJX0ZMQVNIX0NPTkZJRwkJCTB4MjBDCisjZGVmaW5lIFNQSV9GTEFTSF9DT05GSUdfTERfQUREUl9NQVNLCQkweEZGRkZGRgorI2RlZmluZSBTUElfRkxBU0hfQ09ORklHX0xEX0FERFJfU0hJRlQJCTAKKyNkZWZpbmUgU1BJX0ZMQVNIX0NPTkZJR19WUERfQUREUl9NQVNLCQkweDMKKyNkZWZpbmUgU1BJX0ZMQVNIX0NPTkZJR19WUERfQUREUl9TSElGVAkJMjQKKyNkZWZpbmUgU1BJX0ZMQVNIX0NPTkZJR19MRF9FWElTVAkJMHg0MDAwMDAwCisKKyNkZWZpbmUgUkVHX1NQSV9GTEFTSF9PUF9QUk9HUkFNCQkweDIxMAorI2RlZmluZSBSRUdfU1BJX0ZMQVNIX09QX1NDX0VSQVNFCQkweDIxMQorI2RlZmluZSBSRUdfU1BJX0ZMQVNIX09QX0NISVBfRVJBU0UJCTB4MjEyCisjZGVmaW5lIFJFR19TUElfRkxBU0hfT1BfUkRJRAkJCTB4MjEzCisjZGVmaW5lIFJFR19TUElfRkxBU0hfT1BfV1JFTgkJCTB4MjE0CisjZGVmaW5lIFJFR19TUElfRkxBU0hfT1BfUkRTUgkJCTB4MjE1CisjZGVmaW5lIFJFR19TUElfRkxBU0hfT1BfV1JTUgkJCTB4MjE2CisjZGVmaW5lIFJFR19TUElfRkxBU0hfT1BfUkVBRAkJCTB4MjE3CisKKyNkZWZpbmUgUkVHX1RXU0lfQ1RSTAkJCQkweDIxOAorI2RlZmluZSBUV1NJX0NUUkxfTERfT0ZGU0VUX01BU0sJCTB4RkYKKyNkZWZpbmUgVFdTSV9DVFJMX0xEX09GRlNFVF9TSElGVAkJMAorI2RlZmluZSBUV1NJX0NUUkxfTERfU0xWX0FERFJfTUFTSwkJMHg3CisjZGVmaW5lIFRXU0lfQ1RSTF9MRF9TTFZfQUREUl9TSElGVAkJOAorI2RlZmluZSBUV1NJX0NUUkxfU1dfTERTVEFSVAkJCTB4ODAwCisjZGVmaW5lIFRXU0lfQ1RSTF9IV19MRFNUQVJUCQkJMHgxMDAwCisjZGVmaW5lIFRXU0lfQ1RSTF9TTUJfU0xWX0FERFJfTUFTSwkJMHg3RgorI2RlZmluZSBUV1NJX0NUUkxfU01CX1NMVl9BRERSX1NISUZUCQkxNQorI2RlZmluZSBUV1NJX0NUUkxfTERfRVhJU1QJCQkweDQwMDAwMAorI2RlZmluZSBUV1NJX0NUUkxfUkVBRF9GUkVRX1NFTF9NQVNLCQkweDMKKyNkZWZpbmUgVFdTSV9DVFJMX1JFQURfRlJFUV9TRUxfU0hJRlQJCTIzCisjZGVmaW5lIFRXU0lfQ1RSTF9GUkVRX1NFTF8xMDBLCQkJMAorI2RlZmluZSBUV1NJX0NUUkxfRlJFUV9TRUxfMjAwSwkJCTEKKyNkZWZpbmUgVFdTSV9DVFJMX0ZSRVFfU0VMXzMwMEsJCQkyCisjZGVmaW5lIFRXU0lfQ1RSTF9GUkVRX1NFTF80MDBLCQkJMworI2RlZmluZSBUV1NJX0NUUkxfU01CX1NMVl9BRERSCisjZGVmaW5lIFRXU0lfQ1RSTF9XUklURV9GUkVRX1NFTF9NQVNLCQkweDMKKyNkZWZpbmUgVFdTSV9DVFJMX1dSSVRFX0ZSRVFfU0VMX1NISUZUCQkyNAorCisjZGVmaW5lIFJFR19QQ0lFX0RFVl9NSVNDX0NUUkwJCQkweDIxQworI2RlZmluZSBQQ0lFX0RFVl9NSVNDX0NUUkxfRVhUX1BJUEUJCTB4MgorI2RlZmluZSBQQ0lFX0RFVl9NSVNDX0NUUkxfUkVUUllfQlVGRElTCQkweDEKKyNkZWZpbmUgUENJRV9ERVZfTUlTQ19DVFJMX1NQSVJPTV9FWElTVAkJMHg0CisjZGVmaW5lIFBDSUVfREVWX01JU0NfQ1RSTF9TRVJERVNfRU5ESUFOCTB4OAorI2RlZmluZSBQQ0lFX0RFVl9NSVNDX0NUUkxfU0VSREVTX1NFTF9ESU4JMHgxMAorCisvKiBTZWxlbmUgTWFzdGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX01BU1RFUl9DVFJMCQkJCTB4MTQwMAorI2RlZmluZSBNQVNURVJfQ1RSTF9TT0ZUX1JTVAkJCTB4MQorI2RlZmluZSBNQVNURVJfQ1RSTF9NVElNRVJfRU4JCQkweDIKKyNkZWZpbmUgTUFTVEVSX0NUUkxfSVRJTUVSX0VOCQkJMHg0CisjZGVmaW5lIE1BU1RFUl9DVFJMX01BTlVBTF9JTlQJCQkweDgKKyNkZWZpbmUgTUFTVEVSX0NUUkxfUkVWX05VTV9TSElGVAkJMTYKKyNkZWZpbmUgTUFTVEVSX0NUUkxfUkVWX05VTV9NQVNLCQkweGZmCisjZGVmaW5lIE1BU1RFUl9DVFJMX0RFVl9JRF9TSElGVAkJMjQKKyNkZWZpbmUgTUFTVEVSX0NUUkxfREVWX0lEX01BU0sJCQkweGZmCisKKy8qIFRpbWVyIEluaXRpYWwgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX01BTlVBTF9USU1FUl9JTklUCQkJMHgxNDA0CisKKy8qIElSUSBNb2RlcmF0b3JUaW1lciBJbml0aWFsIFZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19JUlFfTU9EVV9USU1FUl9JTklUCQkJMHgxNDA4CisKKyNkZWZpbmUgUkVHX0dQSFlfRU5BQkxFCQkJCTB4MTQwQworCisvKiBJUlEgQW50aS1Mb3N0IFRpbWVyIEluaXRpYWwgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX0NNQkRJU0RNQV9USU1FUgkJCTB4MTQwRQorCisvKiBCbG9jayBJRExFIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfSURMRV9TVEFUVVMJCQkJMHgxNDEwCisjZGVmaW5lIElETEVfU1RBVFVTX1JYTUFDCQkJMQorI2RlZmluZSBJRExFX1NUQVRVU19UWE1BQwkJCTIKKyNkZWZpbmUgSURMRV9TVEFUVVNfUlhRCQkJCTQKKyNkZWZpbmUgSURMRV9TVEFUVVNfVFhRCQkJCTgKKyNkZWZpbmUgSURMRV9TVEFUVVNfRE1BUgkJCTB4MTAKKyNkZWZpbmUgSURMRV9TVEFUVVNfRE1BVwkJCTB4MjAKKyNkZWZpbmUgSURMRV9TVEFUVVNfU01CCQkJCTB4NDAKKyNkZWZpbmUgSURMRV9TVEFUVVNfQ01CCQkJCTB4ODAKKworLyogTURJTyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19NRElPX0NUUkwJCQkJMHgxNDE0CisjZGVmaW5lIE1ESU9fREFUQV9NQVNLCQkJCTB4ZmZmZgorI2RlZmluZSBNRElPX0RBVEFfU0hJRlQJCQkJMAorI2RlZmluZSBNRElPX1JFR19BRERSX01BU0sJCQkweDFmCisjZGVmaW5lIE1ESU9fUkVHX0FERFJfU0hJRlQJCQkxNgorI2RlZmluZSBNRElPX1JXCQkJCQkweDIwMDAwMAorI2RlZmluZSBNRElPX1NVUF9QUkVBTUJMRQkJCTB4NDAwMDAwCisjZGVmaW5lIE1ESU9fU1RBUlQJCQkJMHg4MDAwMDAKKyNkZWZpbmUgTURJT19DTEtfU0VMX1NISUZUCQkJMjQKKyNkZWZpbmUgTURJT19DTEtfMjVfNAkJCQkwCisjZGVmaW5lIE1ESU9fQ0xLXzI1XzYJCQkJMgorI2RlZmluZSBNRElPX0NMS18yNV84CQkJCTMKKyNkZWZpbmUgTURJT19DTEtfMjVfMTAJCQkJNAorI2RlZmluZSBNRElPX0NMS18yNV8xNAkJCQk1CisjZGVmaW5lIE1ESU9fQ0xLXzI1XzIwCQkJCTYKKyNkZWZpbmUgTURJT19DTEtfMjVfMjgJCQkJNworI2RlZmluZSBNRElPX0JVU1kJCQkJMHg4MDAwMDAwCisjZGVmaW5lIE1ESU9fV0FJVF9USU1FUwkJCQkzMAorCisvKiBNSUkgUEhZIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfUEhZX1NUQVRVUwkJCQkweDE0MTgKKworLyogQklTVCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIwIChmb3IgdGhlIFBhY2tldCBNZW1vcnkpICovCisjZGVmaW5lIFJFR19CSVNUMF9DVFJMCQkJCTB4MTQxYworI2RlZmluZSBCSVNUMF9OT1cJCQkJMHgxCisjZGVmaW5lIEJJU1QwX1NSQU1fRkFJTAkJCQkweDIKKyNkZWZpbmUgQklTVDBfRlVTRV9GTEFHCQkJCTB4NAorI2RlZmluZSBSRUdfQklTVDFfQ1RSTAkJCQkweDE0MjAKKyNkZWZpbmUgQklTVDFfTk9XCQkJCTB4MQorI2RlZmluZSBCSVNUMV9TUkFNX0ZBSUwJCQkJMHgyCisjZGVmaW5lIEJJU1QxX0ZVU0VfRkxBRwkJCQkweDQKKworLyogTUFDIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX01BQ19DVFJMCQkJCTB4MTQ4MAorI2RlZmluZSBNQUNfQ1RSTF9UWF9FTgkJCQkxCisjZGVmaW5lIE1BQ19DVFJMX1JYX0VOCQkJCTIKKyNkZWZpbmUgTUFDX0NUUkxfVFhfRkxPVwkJCTQKKyNkZWZpbmUgTUFDX0NUUkxfUlhfRkxPVwkJCTgKKyNkZWZpbmUgTUFDX0NUUkxfTE9PUEJBQ0sJCQkweDEwCisjZGVmaW5lIE1BQ19DVFJMX0RVUExYCQkJCTB4MjAKKyNkZWZpbmUgTUFDX0NUUkxfQUREX0NSQwkJCTB4NDAKKyNkZWZpbmUgTUFDX0NUUkxfUEFECQkJCTB4ODAKKyNkZWZpbmUgTUFDX0NUUkxfTEVOQ0hLCQkJCTB4MTAwCisjZGVmaW5lIE1BQ19DVFJMX0hVR0VfRU4JCQkweDIwMAorI2RlZmluZSBNQUNfQ1RSTF9QUk1MRU5fU0hJRlQJCQkxMAorI2RlZmluZSBNQUNfQ1RSTF9QUk1MRU5fTUFTSwkJCTB4ZgorI2RlZmluZSBNQUNfQ1RSTF9STVZfVkxBTgkJCTB4NDAwMAorI2RlZmluZSBNQUNfQ1RSTF9QUk9NSVNfRU4JCQkweDgwMDAKKyNkZWZpbmUgTUFDX0NUUkxfVFhfUEFVU0UJCQkweDEwMDAwCisjZGVmaW5lIE1BQ19DVFJMX1NDTlQJCQkJMHgyMDAwMAorI2RlZmluZSBNQUNfQ1RSTF9TUlNUX1RYCQkJMHg0MDAwMAorI2RlZmluZSBNQUNfQ1RSTF9UWF9TSU1VUlNUCQkJMHg4MDAwMAorI2RlZmluZSBNQUNfQ1RSTF9TUEVFRF9TSElGVAkJCTIwCisjZGVmaW5lIE1BQ19DVFJMX1NQRUVEX01BU0sJCQkweDMwMDAwMAorI2RlZmluZSBNQUNfQ1RSTF9TUEVFRF8xMDAwCQkJMgorI2RlZmluZSBNQUNfQ1RSTF9TUEVFRF8xMF8xMDAJCQkxCisjZGVmaW5lIE1BQ19DVFJMX0RCR19UWF9CS1BSRVNVUkUJCTB4NDAwMDAwCisjZGVmaW5lIE1BQ19DVFJMX1RYX0hVR0UJCQkweDgwMDAwMAorI2RlZmluZSBNQUNfQ1RSTF9SWF9DSEtTVU1fRU4JCQkweDEwMDAwMDAKKyNkZWZpbmUgTUFDX0NUUkxfTUNfQUxMX0VOCQkJMHgyMDAwMDAwCisjZGVmaW5lIE1BQ19DVFJMX0JDX0VOCQkJCTB4NDAwMDAwMAorI2RlZmluZSBNQUNfQ1RSTF9EQkcJCQkJMHg4MDAwMDAwCisKKy8qIE1BQyBJUEcvSUZHIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX01BQ19JUEdfSUZHCQkJCTB4MTQ4NAorI2RlZmluZSBNQUNfSVBHX0lGR19JUEdUX1NISUZUCQkJMAorI2RlZmluZSBNQUNfSVBHX0lGR19JUEdUX01BU0sJCQkweDdmCisjZGVmaW5lIE1BQ19JUEdfSUZHX01JRkdfU0hJRlQJCQk4CisjZGVmaW5lIE1BQ19JUEdfSUZHX01JRkdfTUFTSwkJCTB4ZmYKKyNkZWZpbmUgTUFDX0lQR19JRkdfSVBHUjFfU0hJRlQJCQkxNgorI2RlZmluZSBNQUNfSVBHX0lGR19JUEdSMV9NQVNLCQkJMHg3ZgorI2RlZmluZSBNQUNfSVBHX0lGR19JUEdSMl9TSElGVAkJCTI0CisjZGVmaW5lIE1BQ19JUEdfSUZHX0lQR1IyX01BU0sJCQkweDdmCisKKy8qIE1BQyBTVEFUSU9OIEFERFJFU1MgKi8KKyNkZWZpbmUgUkVHX01BQ19TVEFfQUREUgkJCTB4MTQ4OAorCisvKiBIYXNoIHRhYmxlIGZvciBtdWx0aWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBSRUdfUlhfSEFTSF9UQUJMRQkJCTB4MTQ5MAorCisvKiBNQUMgSGFsZi1EdXBsZXggQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfTUFDX0hBTEZfRFVQTFhfQ1RSTAkJCTB4MTQ5OAorI2RlZmluZSBNQUNfSEFMRl9EVVBMWF9DVFJMX0xDT0xfU0hJRlQJCTAKKyNkZWZpbmUgTUFDX0hBTEZfRFVQTFhfQ1RSTF9MQ09MX01BU0sJCTB4M2ZmCisjZGVmaW5lIE1BQ19IQUxGX0RVUExYX0NUUkxfUkVUUllfU0hJRlQJCTEyCisjZGVmaW5lIE1BQ19IQUxGX0RVUExYX0NUUkxfUkVUUllfTUFTSwkJMHhmCisjZGVmaW5lIE1BQ19IQUxGX0RVUExYX0NUUkxfRVhDX0RFRl9FTgkJMHgxMDAwMAorI2RlZmluZSBNQUNfSEFMRl9EVVBMWF9DVFJMX05PX0JBQ0tfQwkJMHgyMDAwMAorI2RlZmluZSBNQUNfSEFMRl9EVVBMWF9DVFJMX05PX0JBQ0tfUAkJMHg0MDAwMAorI2RlZmluZSBNQUNfSEFMRl9EVVBMWF9DVFJMX0FCRUJFCQkweDgwMDAwCisjZGVmaW5lIE1BQ19IQUxGX0RVUExYX0NUUkxfQUJFQlRfU0hJRlQJCTIwCisjZGVmaW5lIE1BQ19IQUxGX0RVUExYX0NUUkxfQUJFQlRfTUFTSwkJMHhmCisjZGVmaW5lIE1BQ19IQUxGX0RVUExYX0NUUkxfSkFNSVBHX1NISUZUCTI0CisjZGVmaW5lIE1BQ19IQUxGX0RVUExYX0NUUkxfSkFNSVBHX01BU0sJCTB4ZgorCisvKiBNYXhpbXVtIEZyYW1lIExlbmd0aCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19NVFUJCQkJCTB4MTQ5YworCisvKiBXYWtlLU9uLUxhbiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19XT0xfQ1RSTAkJCQkweDE0YTAKKyNkZWZpbmUgV09MX1BBVFRFUk5fRU4JCQkJMHgwMDAwMDAwMQorI2RlZmluZSBXT0xfUEFUVEVSTl9QTUVfRU4JCQkweDAwMDAwMDAyCisjZGVmaW5lIFdPTF9NQUdJQ19FTgkJCQkweDAwMDAwMDA0CisjZGVmaW5lIFdPTF9NQUdJQ19QTUVfRU4JCQkweDAwMDAwMDA4CisjZGVmaW5lIFdPTF9MSU5LX0NIR19FTgkJCQkweDAwMDAwMDEwCisjZGVmaW5lIFdPTF9MSU5LX0NIR19QTUVfRU4JCQkweDAwMDAwMDIwCisjZGVmaW5lIFdPTF9QQVRURVJOX1NUCQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgV09MX01BR0lDX1NUCQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgV09MX0xJTktDSEdfU1QJCQkJMHgwMDAwMDQwMAorI2RlZmluZSBXT0xfQ0xLX1NXSVRDSF9FTgkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgV09MX1BUMF9FTgkJCQkweDAwMDEwMDAwCisjZGVmaW5lIFdPTF9QVDFfRU4JCQkJMHgwMDAyMDAwMAorI2RlZmluZSBXT0xfUFQyX0VOCQkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgV09MX1BUM19FTgkJCQkweDAwMDgwMDAwCisjZGVmaW5lIFdPTF9QVDRfRU4JCQkJMHgwMDEwMDAwMAorI2RlZmluZSBXT0xfUFQ1X0VOCQkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgV09MX1BUNl9FTgkJCQkweDAwNDAwMDAwCisKKy8qIFdPTCBMZW5ndGggKCAyIERXT1JEICkgKi8KKyNkZWZpbmUgUkVHX1dPTF9QQVRURVJOX0xFTgkJCTB4MTRhNAorI2RlZmluZSBXT0xfUFRfTEVOX01BU0sJCQkJMHg3ZgorI2RlZmluZSBXT0xfUFQwX0xFTl9TSElGVAkJCTAKKyNkZWZpbmUgV09MX1BUMV9MRU5fU0hJRlQJCQk4CisjZGVmaW5lIFdPTF9QVDJfTEVOX1NISUZUCQkJMTYKKyNkZWZpbmUgV09MX1BUM19MRU5fU0hJRlQJCQkyNAorI2RlZmluZSBXT0xfUFQ0X0xFTl9TSElGVAkJCTAKKyNkZWZpbmUgV09MX1BUNV9MRU5fU0hJRlQJCQk4CisjZGVmaW5lIFdPTF9QVDZfTEVOX1NISUZUCQkJMTYKKworLyogSW50ZXJuYWwgU1JBTSBQYXJ0aXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1NSQU1fUkZEX0FERFIJCQkweDE1MDAKKyNkZWZpbmUgUkVHX1NSQU1fUkZEX0xFTgkJCShSRUdfU1JBTV9SRkRfQUREUisgNCkKKyNkZWZpbmUgUkVHX1NSQU1fUlJEX0FERFIJCQkoUkVHX1NSQU1fUkZEX0FERFIrIDgpCisjZGVmaW5lIFJFR19TUkFNX1JSRF9MRU4JCQkoUkVHX1NSQU1fUkZEX0FERFIrMTIpCisjZGVmaW5lIFJFR19TUkFNX1RQRF9BRERSCQkJKFJFR19TUkFNX1JGRF9BRERSKzE2KQorI2RlZmluZSBSRUdfU1JBTV9UUERfTEVOCQkJKFJFR19TUkFNX1JGRF9BRERSKzIwKQorI2RlZmluZSBSRUdfU1JBTV9UUkRfQUREUgkJCShSRUdfU1JBTV9SRkRfQUREUisyNCkKKyNkZWZpbmUgUkVHX1NSQU1fVFJEX0xFTgkJCShSRUdfU1JBTV9SRkRfQUREUisyOCkKKyNkZWZpbmUgUkVHX1NSQU1fUlhGX0FERFIJCQkoUkVHX1NSQU1fUkZEX0FERFIrMzIpCisjZGVmaW5lIFJFR19TUkFNX1JYRl9MRU4JCQkoUkVHX1NSQU1fUkZEX0FERFIrMzYpCisjZGVmaW5lIFJFR19TUkFNX1RYRl9BRERSCQkJKFJFR19TUkFNX1JGRF9BRERSKzQwKQorI2RlZmluZSBSRUdfU1JBTV9UWEZfTEVOCQkJKFJFR19TUkFNX1JGRF9BRERSKzQ0KQorI2RlZmluZSBSRUdfU1JBTV9UQ1BIX1BBVEhfQUREUgkJCShSRUdfU1JBTV9SRkRfQUREUis0OCkKKyNkZWZpbmUgU1JBTV9UQ1BIX0FERFJfTUFTSwkJCTB4MGZmZgorI2RlZmluZSBTUkFNX1RDUEhfQUREUl9TSElGVAkJCTAKKyNkZWZpbmUgU1JBTV9QQVRIX0FERFJfTUFTSwkJCTB4MGZmZgorI2RlZmluZSBTUkFNX1BBVEhfQUREUl9TSElGVAkJCTE2CisKKy8qIExvYWQgUHRyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19MT0FEX1BUUgkJCQkoUkVHX1NSQU1fUkZEX0FERFIrNTIpCisKKy8qIERlc2NyaXB0b3IgQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBSRUdfREVTQ19CQVNFX0FERFJfSEkJCQkweDE1NDAKKyNkZWZpbmUgUkVHX0RFU0NfUkZEX0FERFJfTE8JCQkoUkVHX0RFU0NfQkFTRV9BRERSX0hJKzQpCisjZGVmaW5lIFJFR19ERVNDX1JSRF9BRERSX0xPCQkJKFJFR19ERVNDX0JBU0VfQUREUl9ISSs4KQorI2RlZmluZSBSRUdfREVTQ19UUERfQUREUl9MTwkJCShSRUdfREVTQ19CQVNFX0FERFJfSEkrMTIpCisjZGVmaW5lIFJFR19ERVNDX0NNQl9BRERSX0xPCQkJKFJFR19ERVNDX0JBU0VfQUREUl9ISSsxNikKKyNkZWZpbmUgUkVHX0RFU0NfU01CX0FERFJfTE8JCQkoUkVHX0RFU0NfQkFTRV9BRERSX0hJKzIwKQorI2RlZmluZSBSRUdfREVTQ19SRkRfUlJEX1JJTkdfU0laRQkJKFJFR19ERVNDX0JBU0VfQUREUl9ISSsyNCkKKyNkZWZpbmUgREVTQ19SRkRfUklOR19TSVpFX01BU0sJCQkweDdmZgorI2RlZmluZSBERVNDX1JGRF9SSU5HX1NJWkVfU0hJRlQJCTAKKyNkZWZpbmUgREVTQ19SUkRfUklOR19TSVpFX01BU0sJCQkweDdmZgorI2RlZmluZSBERVNDX1JSRF9SSU5HX1NJWkVfU0hJRlQJCTE2CisjZGVmaW5lIFJFR19ERVNDX1RQRF9SSU5HX1NJWkUJCQkoUkVHX0RFU0NfQkFTRV9BRERSX0hJKzI4KQorI2RlZmluZSBERVNDX1RQRF9SSU5HX1NJWkVfTUFTSwkJCTB4M2ZmCisjZGVmaW5lIERFU0NfVFBEX1JJTkdfU0laRV9TSElGVAkJMAorCisvKiBUWFEgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfVFhRX0NUUkwJCQkJMHgxNTgwCisjZGVmaW5lIFRYUV9DVFJMX1RQRF9CVVJTVF9OVU1fU0hJRlQJCTAKKyNkZWZpbmUgVFhRX0NUUkxfVFBEX0JVUlNUX05VTV9NQVNLCQkweDFmCisjZGVmaW5lIFRYUV9DVFJMX0VOCQkJCTB4MjAKKyNkZWZpbmUgVFhRX0NUUkxfRU5IX01PREUJCQkweDQwCisjZGVmaW5lIFRYUV9DVFJMX1RQRF9GRVRDSF9USF9TSElGVAkJOAorI2RlZmluZSBUWFFfQ1RSTF9UUERfRkVUQ0hfVEhfTUFTSwkJMHgzZgorI2RlZmluZSBUWFFfQ1RSTF9UWEZfQlVSU1RfTlVNX1NISUZUCQkxNgorI2RlZmluZSBUWFFfQ1RSTF9UWEZfQlVSU1RfTlVNX01BU0sJCTB4ZmZmZgorCisvKiBKdW1ibyBwYWNrZXQgVGhyZXNob2xkIGZvciB0YXNrIG9mZmxvYWQgKi8KKyNkZWZpbmUgUkVHX1RYX0pVTUJPX1RBU0tfVEhfVFBEX0lQRwkJMHgxNTg0CisjZGVmaW5lIFRYX0pVTUJPX1RBU0tfVEhfTUFTSwkJCTB4N2ZmCisjZGVmaW5lIFRYX0pVTUJPX1RBU0tfVEhfU0hJRlQJCQkwCisjZGVmaW5lIFRYX1RQRF9NSU5fSVBHX01BU0sJCQkweDFmCisjZGVmaW5lIFRYX1RQRF9NSU5fSVBHX1NISUZUCQkJMTYKKworLyogUlhRIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1JYUV9DVFJMCQkJCTB4MTVhMAorI2RlZmluZSBSWFFfQ1RSTF9SRkRfQlVSU1RfTlVNX1NISUZUCQkwCisjZGVmaW5lIFJYUV9DVFJMX1JGRF9CVVJTVF9OVU1fTUFTSwkJMHhmZgorI2RlZmluZSBSWFFfQ1RSTF9SUkRfQlVSU1RfVEhSRVNIX1NISUZUCQk4CisjZGVmaW5lIFJYUV9DVFJMX1JSRF9CVVJTVF9USFJFU0hfTUFTSwkJMHhmZgorI2RlZmluZSBSWFFfQ1RSTF9SRkRfUFJFRl9NSU5fSVBHX1NISUZUCQkxNgorI2RlZmluZSBSWFFfQ1RSTF9SRkRfUFJFRl9NSU5fSVBHX01BU0sJCTB4MWYKKyNkZWZpbmUgUlhRX0NUUkxfQ1VUX1RIUlVfRU4JCQkweDQwMDAwMDAwCisjZGVmaW5lIFJYUV9DVFJMX0VOCQkJCTB4ODAwMDAwMDAKKworLyogUngganVtYm8gcGFja2V0IHRocmVzaG9sZCBhbmQgcnJkICByZXRpcmVtZW50IHRpbWVyICovCisjZGVmaW5lIFJFR19SWFFfSk1CT1NaX1JSRFRJTQkJCShSRUdfUlhRX0NUUkwrIDQpCisjZGVmaW5lIFJYUV9KTUJPU1pfVEhfTUFTSwkJCTB4N2ZmCisjZGVmaW5lIFJYUV9KTUJPU1pfVEhfU0hJRlQJCQkwCisjZGVmaW5lIFJYUV9KTUJPX0xLQUhfTUFTSwkJCTB4ZgorI2RlZmluZSBSWFFfSk1CT19MS0FIX1NISUZUCQkJMTEKKyNkZWZpbmUgUlhRX1JSRF9USU1FUl9NQVNLCQkJMHhmZmZmCisjZGVmaW5lIFJYUV9SUkRfVElNRVJfU0hJRlQJCQkxNgorCisvKiBSRkQgZmxvdyBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19SWFFfUlhGX1BBVVNFX1RIUkVTSAkJKFJFR19SWFFfQ1RSTCsgOCkKKyNkZWZpbmUgUlhRX1JYRl9QQVVTRV9USF9ISV9TSElGVAkJMTYKKyNkZWZpbmUgUlhRX1JYRl9QQVVTRV9USF9ISV9NQVNLCQkweGZmZgorI2RlZmluZSBSWFFfUlhGX1BBVVNFX1RIX0xPX1NISUZUCQkwCisjZGVmaW5lIFJYUV9SWEZfUEFVU0VfVEhfTE9fTUFTSwkJMHhmZmYKKworLyogUlJEIGZsb3cgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBSRUdfUlhRX1JSRF9QQVVTRV9USFJFU0gJCShSRUdfUlhRX0NUUkwrMTIpCisjZGVmaW5lIFJYUV9SUkRfUEFVU0VfVEhfSElfU0hJRlQJCTAKKyNkZWZpbmUgUlhRX1JSRF9QQVVTRV9USF9ISV9NQVNLCQkweGZmZgorI2RlZmluZSBSWFFfUlJEX1BBVVNFX1RIX0xPX1NISUZUCQkxNgorI2RlZmluZSBSWFFfUlJEX1BBVVNFX1RIX0xPX01BU0sJCTB4ZmZmCisKKy8qIERNQSBFbmdpbmUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfRE1BX0NUUkwJCQkJMHgxNWMwCisjZGVmaW5lIERNQV9DVFJMX0RNQVJfSU5fT1JERVIJCQkweDEKKyNkZWZpbmUgRE1BX0NUUkxfRE1BUl9FTkhfT1JERVIJCQkweDIKKyNkZWZpbmUgRE1BX0NUUkxfRE1BUl9PVVRfT1JERVIJCQkweDQKKyNkZWZpbmUgRE1BX0NUUkxfUkNCX1ZBTFVFCQkJMHg4CisjZGVmaW5lIERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX1NISUZUCQk0CisjZGVmaW5lIERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX01BU0sJCTcKKyNkZWZpbmUgRE1BX0NUUkxfRE1BV19CVVJTVF9MRU5fU0hJRlQJCTcKKyNkZWZpbmUgRE1BX0NUUkxfRE1BV19CVVJTVF9MRU5fTUFTSwkJNworI2RlZmluZSBETUFfQ1RSTF9ETUFSX0VOCQkJCTB4NDAwCisjZGVmaW5lIERNQV9DVFJMX0RNQVdfRU4JCQkJMHg4MDAKKworLyogQ01CL1NNQiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19DU01CX0NUUkwJCQkJMHgxNWQwCisjZGVmaW5lIENTTUJfQ1RSTF9DTUJfTk9XCQkJMQorI2RlZmluZSBDU01CX0NUUkxfU01CX05PVwkJCTIKKyNkZWZpbmUgQ1NNQl9DVFJMX0NNQl9FTgkJCTQKKyNkZWZpbmUgQ1NNQl9DVFJMX1NNQl9FTgkJCTgKKworLyogQ01CIERNQSBXcml0ZSBUaHJlc2hvbGQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX0NNQl9XUklURV9USAkJCShSRUdfQ1NNQl9DVFJMKyA0KQorI2RlZmluZSBDTUJfUlJEX1RIX1NISUZUCQkJMAorI2RlZmluZSBDTUJfUlJEX1RIX01BU0sJCQkJMHg3ZmYKKyNkZWZpbmUgQ01CX1RQRF9USF9TSElGVAkJCTE2CisjZGVmaW5lIENNQl9UUERfVEhfTUFTSwkJCQkweDdmZgorCisvKiBSWC9UWCBjb3VudC1kb3duIHRpbWVyIHRvIHRyaWdnZXIgQ01CLXdyaXRlLiAydXMgcmVzb2x1dGlvbi4gKi8KKyNkZWZpbmUgUkVHX0NNQl9XUklURV9USU1FUgkJCShSRUdfQ1NNQl9DVFJMKyA4KQorI2RlZmluZSBDTUJfUlhfVE1fU0hJRlQJCQkJMAorI2RlZmluZSBDTUJfUlhfVE1fTUFTSwkJCQkweGZmZmYKKyNkZWZpbmUgQ01CX1RYX1RNX1NISUZUCQkJCTE2CisjZGVmaW5lIENNQl9UWF9UTV9NQVNLCQkJCTB4ZmZmZgorCisvKiBOdW1iZXIgb2YgcGFja2V0IHJlY2VpdmVkIHNpbmNlIGxhc3QgQ01CIHdyaXRlICovCisjZGVmaW5lIFJFR19DTUJfUlhfUEtUX0NOVAkJCShSRUdfQ1NNQl9DVFJMKzEyKQorCisvKiBOdW1iZXIgb2YgcGFja2V0IHRyYW5zbWl0dGVkIHNpbmNlIGxhc3QgQ01CIHdyaXRlICovCisjZGVmaW5lIFJFR19DTUJfVFhfUEtUX0NOVAkJCShSRUdfQ1NNQl9DVFJMKzE2KQorCisvKiBTTUIgYXV0byBETUEgdGltZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1NNQl9USU1FUgkJCQkoUkVHX0NTTUJfQ1RSTCsyMCkKKworLyogTWFpbGJveCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfTUFJTEJPWAkJCQkweDE1ZjAKKyNkZWZpbmUgTUJfUkZEX1BST0RfSU5EWF9TSElGVAkJCTAKKyNkZWZpbmUgTUJfUkZEX1BST0RfSU5EWF9NQVNLCQkJMHg3ZmYKKyNkZWZpbmUgTUJfUlJEX0NPTlNfSU5EWF9TSElGVAkJCTExCisjZGVmaW5lIE1CX1JSRF9DT05TX0lORFhfTUFTSwkJCTB4N2ZmCisjZGVmaW5lIE1CX1RQRF9QUk9EX0lORFhfU0hJRlQJCQkyMgorI2RlZmluZSBNQl9UUERfUFJPRF9JTkRYX01BU0sJCQkweDNmZgorCisvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19JU1IJCQkJCTB4MTYwMAorI2RlZmluZSBJU1JfU01CCQkJCQkxCisjZGVmaW5lIElTUl9USU1FUgkJCQkyCisjZGVmaW5lIElTUl9NQU5VQUwJCQkJNAorI2RlZmluZSBJU1JfUlhGX09WCQkJCTgKKyNkZWZpbmUgSVNSX1JGRF9VTlJVTgkJCQkweDEwCisjZGVmaW5lIElTUl9SUkRfT1YJCQkJMHgyMAorI2RlZmluZSBJU1JfVFhGX1VOUlVOCQkJCTB4NDAKKyNkZWZpbmUgSVNSX0xJTksJCQkJMHg4MAorI2RlZmluZSBJU1JfSE9TVF9SRkRfVU5SVU4JCQkweDEwMAorI2RlZmluZSBJU1JfSE9TVF9SUkRfT1YJCQkJMHgyMDAKKyNkZWZpbmUgSVNSX0RNQVJfVE9fUlNUCQkJCTB4NDAwCisjZGVmaW5lIElTUl9ETUFXX1RPX1JTVAkJCQkweDgwMAorI2RlZmluZSBJU1JfR1BIWQkJCQkweDEwMDAKKyNkZWZpbmUgSVNSX1JYX1BLVAkJCQkweDEwMDAwCisjZGVmaW5lIElTUl9UWF9QS1QJCQkJMHgyMDAwMAorI2RlZmluZSBJU1JfVFhfRE1BCQkJCTB4NDAwMDAKKyNkZWZpbmUgSVNSX1JYX0RNQQkJCQkweDgwMDAwCisjZGVmaW5lIElTUl9DTUJfUlgJCQkJMHgxMDAwMDAKKyNkZWZpbmUgSVNSX0NNQl9UWAkJCQkweDIwMDAwMAorI2RlZmluZSBJU1JfTUFDX1JYCQkJCTB4NDAwMDAwCisjZGVmaW5lIElTUl9NQUNfVFgJCQkJMHg4MDAwMDAKKyNkZWZpbmUgSVNSX1VSX0RFVEVDVEVECQkJCTB4MTAwMDAwMAorI2RlZmluZSBJU1JfRkVSUl9ERVRFQ1RFRAkJCTB4MjAwMDAwMAorI2RlZmluZSBJU1JfTkZFUlJfREVURUNURUQJCQkweDQwMDAwMDAKKyNkZWZpbmUgSVNSX0NFUlJfREVURUNURUQJCQkweDgwMDAwMDAKKyNkZWZpbmUgSVNSX1BIWV9MSU5LRE9XTgkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgSVNSX0RJU19TTUIJCQkJMHgyMDAwMDAwMAorI2RlZmluZSBJU1JfRElTX0RNQQkJCQkweDQwMDAwMDAwCisjZGVmaW5lIElTUl9ESVNfSU5UCQkJCTB4ODAwMDAwMDAKKworLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX0lNUgkJCQkJMHgxNjA0CisKKy8qIE5vcm1hbCBJbnRlcnJ1cHQgbWFzayAgKi8KKyNkZWZpbmUgSU1SX05PUk1BTF9NQVNLCShcCisJSVNSX1NNQgkJfFwKKwlJU1JfR1BIWQl8XAorCUlTUl9QSFlfTElOS0RPV058XAorCUlTUl9ETUFSX1RPX1JTVAl8XAorCUlTUl9ETUFXX1RPX1JTVAl8XAorCUlTUl9DTUJfVFgJfFwKKwlJU1JfQ01CX1JYCSkKKworLyogRGVidWcgSW50ZXJydXB0IE1hc2sgIChlbmFibGUgYWxsIGludGVycnVwdCkgKi8KKyNkZWZpbmUgSU1SX0RFQlVHX01BU0sJKFwKKwlJU1JfU01CCQl8XAorCUlTUl9USU1FUgl8XAorCUlTUl9NQU5VQUwJfFwKKwlJU1JfUlhGX09WCXxcCisJSVNSX1JGRF9VTlJVTgl8XAorCUlTUl9SUkRfT1YJfFwKKwlJU1JfVFhGX1VOUlVOCXxcCisJSVNSX0xJTksJfFwKKwlJU1JfQ01CX1RYCXxcCisJSVNSX0NNQl9SWAl8XAorCUlTUl9SWF9QS1QJfFwKKwlJU1JfVFhfUEtUCXxcCisJSVNSX01BQ19SWAl8XAorCUlTUl9NQUNfVFgJKQorCisvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19SRkRfUlJEX0lEWAkJCQkweDE4MDAKKyNkZWZpbmUgUkVHX1RQRF9JRFgJCQkJMHgxODA0CisKKy8qICBNSUkgZGVmaW5pdGlvbiAqLworLyogUEhZIENvbW1vbiBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQVQwMDFfQ1IJCQkJCTB4MDkKKyNkZWZpbmUgTUlJX0FUMDAxX1NSCQkJCQkweDBBCisjZGVmaW5lIE1JSV9BVDAwMV9FU1IJCQkJCTB4MEYKKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1IJCQkJCTB4MTAKKyNkZWZpbmUgTUlJX0FUMDAxX1BTU1IJCQkJCTB4MTEKKworLyogUEhZIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0NSX1NQRUVEX1NFTEVDVF9NU0IJCQkJMHgwMDQwCS8qIGJpdHMgNiwxMzogMTA9MTAwMCwgMDE9MTAwLCAwMD0xMCAqLworI2RlZmluZSBNSUlfQ1JfQ09MTF9URVNUX0VOQUJMRQkJCQkweDAwODAJLyogQ29sbGlzaW9uIHRlc3QgZW5hYmxlICovCisjZGVmaW5lIE1JSV9DUl9GVUxMX0RVUExFWAkJCQkweDAxMDAJLyogRkRYID0xLCBoYWxmIGR1cGxleCA9MCAqLworI2RlZmluZSBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRwkJCQkweDAyMDAJLyogUmVzdGFydCBhdXRvIG5lZ290aWF0aW9uICovCisjZGVmaW5lIE1JSV9DUl9JU09MQVRFCQkJCQkweDA0MDAJLyogSXNvbGF0ZSBQSFkgZnJvbSBNSUkgKi8KKyNkZWZpbmUgTUlJX0NSX1BPV0VSX0RPV04JCQkJMHgwODAwCS8qIFBvd2VyIGRvd24gKi8KKyNkZWZpbmUgTUlJX0NSX0FVVE9fTkVHX0VOCQkJCTB4MTAwMAkvKiBBdXRvIE5lZyBFbmFibGUgKi8KKyNkZWZpbmUgTUlJX0NSX1NQRUVEX1NFTEVDVF9MU0IJCQkJMHgyMDAwCS8qIGJpdHMgNiwxMzogMTA9MTAwMCwgMDE9MTAwLCAwMD0xMCAqLworI2RlZmluZSBNSUlfQ1JfTE9PUEJBQ0sJCQkJCTB4NDAwMAkvKiAwID0gbm9ybWFsLCAxID0gbG9vcGJhY2sgKi8KKyNkZWZpbmUgTUlJX0NSX1JFU0VUCQkJCQkweDgwMDAJLyogMCA9IG5vcm1hbCwgMSA9IFBIWSByZXNldCAqLworI2RlZmluZSBNSUlfQ1JfU1BFRURfTUFTSwkJCQkweDIwNDAKKyNkZWZpbmUgTUlJX0NSX1NQRUVEXzEwMDAJCQkJMHgwMDQwCisjZGVmaW5lIE1JSV9DUl9TUEVFRF8xMDAJCQkJMHgyMDAwCisjZGVmaW5lIE1JSV9DUl9TUEVFRF8xMAkJCQkJMHgwMDAwCisKKy8qIFBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1NSX0VYVEVOREVEX0NBUFMJCQkJMHgwMDAxCS8qIEV4dGVuZGVkIHJlZ2lzdGVyIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBNSUlfU1JfSkFCQkVSX0RFVEVDVAkJCQkweDAwMDIJLyogSmFiYmVyIERldGVjdGVkICovCisjZGVmaW5lIE1JSV9TUl9MSU5LX1NUQVRVUwkJCQkweDAwMDQJLyogTGluayBTdGF0dXMgMSA9IGxpbmsgKi8KKyNkZWZpbmUgTUlJX1NSX0FVVE9ORUdfQ0FQUwkJCQkweDAwMDgJLyogQXV0byBOZWcgQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfUkVNT1RFX0ZBVUxUCQkJCTB4MDAxMAkvKiBSZW1vdGUgRmF1bHQgRGV0ZWN0ICovCisjZGVmaW5lIE1JSV9TUl9BVVRPTkVHX0NPTVBMRVRFCQkJCTB4MDAyMAkvKiBBdXRvIE5lZyBDb21wbGV0ZSAqLworI2RlZmluZSBNSUlfU1JfUFJFQU1CTEVfU1VQUFJFU1MJCQkweDAwNDAJLyogUHJlYW1ibGUgbWF5IGJlIHN1cHByZXNzZWQgKi8KKyNkZWZpbmUgTUlJX1NSX0VYVEVOREVEX1NUQVRVUwkJCQkweDAxMDAJLyogRXh0LiBzdGF0dXMgaW5mbyBpbiBSZWcgMHgwRiAqLworI2RlZmluZSBNSUlfU1JfMTAwVDJfSERfQ0FQUwkJCQkweDAyMDAJLyogMTAwVDIgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTAwVDJfRkRfQ0FQUwkJCQkweDA0MDAJLyogMTAwVDIgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTBUX0hEX0NBUFMJCQkJMHgwODAwCS8qIDEwVCAgIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwVF9GRF9DQVBTCQkJCTB4MTAwMAkvKiAxMFQgICBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBYX0hEX0NBUFMJCQkJMHgyMDAwCS8qIDEwMFggIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFhfRkRfQ0FQUwkJCQkweDQwMDAJLyogMTAwWCAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTAwVDRfQ0FQUwkJCQkweDgwMDAJLyogMTAwVDQgQ2FwYWJsZSAqLworCisvKiBMaW5rIHBhcnRuZXIgYWJpbGl0eSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUlJX0xQQV9TTENUCQkJCQkweDAwMWYJLyogU2FtZSBhcyBhZHZlcnRpc2Ugc2VsZWN0b3IgICovCisjZGVmaW5lIE1JSV9MUEFfMTBIQUxGCQkJCQkweDAwMjAJLyogQ2FuIGRvIDEwbWJwcyBoYWxmLWR1cGxleCAgICovCisjZGVmaW5lIE1JSV9MUEFfMTBGVUxMCQkJCQkweDAwNDAJLyogQ2FuIGRvIDEwbWJwcyBmdWxsLWR1cGxleCAgICovCisjZGVmaW5lIE1JSV9MUEFfMTAwSEFMRgkJCQkJMHgwMDgwCS8qIENhbiBkbyAxMDBtYnBzIGhhbGYtZHVwbGV4ICAqLworI2RlZmluZSBNSUlfTFBBXzEwMEZVTEwJCQkJCTB4MDEwMAkvKiBDYW4gZG8gMTAwbWJwcyBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgTUlJX0xQQV8xMDBCQVNFNAkJCQkweDAyMDAJLyogMTAwQkFTRS1UNCAgKi8KKyNkZWZpbmUgTUlJX0xQQV9QQVVTRQkJCQkJMHgwNDAwCS8qIFBBVVNFICovCisjZGVmaW5lIE1JSV9MUEFfQVNZUEFVU0UJCQkJMHgwODAwCS8qIEFzeW1tZXRyaWNhbCBQQVVTRSAqLworI2RlZmluZSBNSUlfTFBBX1JGQVVMVAkJCQkJMHgyMDAwCS8qIExpbmsgcGFydG5lciBmYXVsdGVkICAgICAgICAqLworI2RlZmluZSBNSUlfTFBBX0xQQUNLCQkJCQkweDQwMDAJLyogTGluayBwYXJ0bmVyIGFja2VkIHVzICAgICAgICovCisjZGVmaW5lIE1JSV9MUEFfTlBBR0UJCQkJCTB4ODAwMAkvKiBOZXh0IHBhZ2UgYml0ICAgICAgICAgICAgICAgKi8KKworLyogQXV0b25lZyBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9BUl9TRUxFQ1RPUl9GSUVMRAkJCQkweDAwMDEJLyogaW5kaWNhdGVzIElFRUUgODAyLjMgQ1NNQS9DRCAqLworI2RlZmluZSBNSUlfQVJfMTBUX0hEX0NBUFMJCQkJMHgwMDIwCS8qIDEwVCAgIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX0FSXzEwVF9GRF9DQVBTCQkJCTB4MDA0MAkvKiAxMFQgICBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9BUl8xMDBUWF9IRF9DQVBTCQkJCTB4MDA4MAkvKiAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9BUl8xMDBUWF9GRF9DQVBTCQkJCTB4MDEwMAkvKiAxMDBUWCBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9BUl8xMDBUNF9DQVBTCQkJCTB4MDIwMAkvKiAxMDBUNCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9BUl9QQVVTRQkJCQkJMHgwNDAwCS8qIFBhdXNlIG9wZXJhdGlvbiBkZXNpcmVkICovCisjZGVmaW5lIE1JSV9BUl9BU01fRElSCQkJCQkweDA4MDAJLyogQXN5bW1ldHJpYyBQYXVzZSBEaXJlY3Rpb24gYml0ICovCisjZGVmaW5lIE1JSV9BUl9SRU1PVEVfRkFVTFQJCQkJMHgyMDAwCS8qIFJlbW90ZSBGYXVsdCBkZXRlY3RlZCAqLworI2RlZmluZSBNSUlfQVJfTkVYVF9QQUdFCQkJCTB4ODAwMAkvKiBOZXh0IFBhZ2UgYWJpbGl0eSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgTUlJX0FSX1NQRUVEX01BU0sJCQkJMHgwMUUwCisjZGVmaW5lIE1JSV9BUl9ERUZBVUxUX0NBUF9NQVNLCQkJCTB4MERFMAorCisvKiAxMDAwQkFTRS1UIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX0hEX0NBUFMJCQkweDAxMDAJLyogQWR2ZXJ0aXNlIDEwMDBUIEhEIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX0ZEX0NBUFMJCQkweDAyMDAJLyogQWR2ZXJ0aXNlIDEwMDBUIEZEIGNhcGFiaWxpdHkgICovCisjZGVmaW5lIE1JSV9BVDAwMV9DUl8xMDAwVF9SRVBFQVRFUl9EVEUJCQkweDA0MDAJLyogMT1SZXBlYXRlci9zd2l0Y2ggZGV2aWNlIHBvcnQsIDA9RFRFIGRldmljZSAqLworI2RlZmluZSBNSUlfQVQwMDFfQ1JfMTAwMFRfTVNfVkFMVUUJCQkweDA4MDAJLyogMT1Db25maWd1cmUgUEhZIGFzIE1hc3RlciwgMD1Db25maWd1cmUgUEhZIGFzIFNsYXZlICovCisjZGVmaW5lIE1JSV9BVDAwMV9DUl8xMDAwVF9NU19FTkFCTEUJCQkweDEwMDAJLyogMT1NYXN0ZXIvU2xhdmUgbWFudWFsIGNvbmZpZyB2YWx1ZSwgMD1BdXRvbWF0aWMgTWFzdGVyL1NsYXZlIGNvbmZpZyAqLworI2RlZmluZSBNSUlfQVQwMDFfQ1JfMTAwMFRfVEVTVF9NT0RFX05PUk1BTAkJMHgwMDAwCS8qIE5vcm1hbCBPcGVyYXRpb24gKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX1RFU1RfTU9ERV8xCQkJMHgyMDAwCS8qIFRyYW5zbWl0IFdhdmVmb3JtIHRlc3QgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX1RFU1RfTU9ERV8yCQkJMHg0MDAwCS8qIE1hc3RlciBUcmFuc21pdCBKaXR0ZXIgdGVzdCAqLworI2RlZmluZSBNSUlfQVQwMDFfQ1JfMTAwMFRfVEVTVF9NT0RFXzMJCQkweDYwMDAJLyogU2xhdmUgVHJhbnNtaXQgSml0dGVyIHRlc3QgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX1RFU1RfTU9ERV80CQkJMHg4MDAwCS8qIFRyYW5zbWl0dGVyIERpc3RvcnRpb24gdGVzdCAqLworI2RlZmluZSBNSUlfQVQwMDFfQ1JfMTAwMFRfU1BFRURfTUFTSwkJCTB4MDMwMAorI2RlZmluZSBNSUlfQVQwMDFfQ1JfMTAwMFRfREVGQVVMVF9DQVBfTUFTSwkJMHgwMzAwCisKKy8qIDEwMDBCQVNFLVQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9BVDAwMV9TUl8xMDAwVF9MUF9IRF9DQVBTCQkJMHgwNDAwCS8qIExQIGlzIDEwMDBUIEhEIGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1NSXzEwMDBUX0xQX0ZEX0NBUFMJCQkweDA4MDAJLyogTFAgaXMgMTAwMFQgRkQgY2FwYWJsZSAqLworI2RlZmluZSBNSUlfQVQwMDFfU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVUwkJMHgxMDAwCS8qIFJlbW90ZSByZWNlaXZlciBPSyAqLworI2RlZmluZSBNSUlfQVQwMDFfU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTCQkweDIwMDAJLyogTG9jYWwgcmVjZWl2ZXIgT0sgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1NSXzEwMDBUX01TX0NPTkZJR19SRVMJCTB4NDAwMAkvKiAxPUxvY2FsIFRYIGlzIE1hc3RlciwgMD1TbGF2ZSAqLworI2RlZmluZSBNSUlfQVQwMDFfU1JfMTAwMFRfTVNfQ09ORklHX0ZBVUxUCQkweDgwMDAJLyogTWFzdGVyL1NsYXZlIGNvbmZpZyBmYXVsdCAqLworI2RlZmluZSBNSUlfQVQwMDFfU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVU19TSElGVAkxMgorI2RlZmluZSBNSUlfQVQwMDFfU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTX1NISUZUCTEzCisKKy8qIEV4dGVuZGVkIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQVQwMDFfRVNSXzEwMDBUX0hEX0NBUFMJCQkweDEwMDAJLyogMTAwMFQgSEQgY2FwYWJsZSAqLworI2RlZmluZSBNSUlfQVQwMDFfRVNSXzEwMDBUX0ZEX0NBUFMJCQkweDIwMDAJLyogMTAwMFQgRkQgY2FwYWJsZSAqLworI2RlZmluZSBNSUlfQVQwMDFfRVNSXzEwMDBYX0hEX0NBUFMJCQkweDQwMDAJLyogMTAwMFggSEQgY2FwYWJsZSAqLworI2RlZmluZSBNSUlfQVQwMDFfRVNSXzEwMDBYX0ZEX0NBUFMJCQkweDgwMDAJLyogMTAwMFggRkQgY2FwYWJsZSAqLworCisvKiBBVDAwMSBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNDUl9KQUJCRVJfRElTQUJMRQkJCTB4MDAwMQkvKiAxPUphYmJlciBGdW5jdGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNDUl9QT0xBUklUWV9SRVZFUlNBTAkJMHgwMDAyCS8qIDE9UG9sYXJpdHkgUmV2ZXJzYWwgZW5hYmxlZCAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNDUl9TUUVfVEVTVAkJCQkweDAwMDQJLyogMT1TUUUgVGVzdCBlbmFibGVkICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX01BQ19QT1dFUkRPV04JCQkweDAwMDgKKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfQ0xLMTI1X0RJU0FCTEUJCQkweDAwMTAJLyogMT1DTEsxMjUgbG93LCAwPUNMSzEyNSB0b2dnbGluZyAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNDUl9NRElfTUFOVUFMX01PREUJCQkweDAwMDAJLyogTURJIENyb3Nzb3ZlciBNb2RlIGJpdHMgNjo1LCBNYW51YWwgTURJIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfTURJWF9NQU5VQUxfTU9ERQkJCTB4MDAyMAkvKiBNYW51YWwgTURJWCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX0FVVE9fWF8xMDAwVAkJCTB4MDA0MAkvKiAxMDAwQkFTRS1UOiBBdXRvIGNyb3Nzb3ZlciwgMTAwQkFTRS1UWC8xMEJBU0UtVDogTURJIE1vZGUgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfQVVUT19YX01PREUJCQkweDAwNjAJLyogQXV0byBjcm9zc292ZXIgZW5hYmxlZCBhbGwgc3BlZWRzLiAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNDUl8xMEJUX0VYVF9ESVNUX0VOQUJMRQkJMHgwMDgwCS8qIDE9RW5hYmxlIEV4dGVuZGVkIDEwQkFTRS1UIGRpc3RhbmNlIChMb3dlciAxMEJBU0UtVCBSWCBUaHJlc2hvbGQpLCAwPU5vcm1hbCAxMEJBU0UtVCBSWCBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfTUlJXzVCSVRfRU5BQkxFCQkJMHgwMTAwCS8qIDE9NS1CaXQgaW50ZXJmYWNlIGluIDEwMEJBU0UtVFgsIDA9TUlJIGludGVyZmFjZSBpbiAxMDBCQVNFLVRYICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX1NDUkFNQkxFUl9ESVNBQkxFCQkweDAyMDAJLyogMT1TY3JhbWJsZXIgZGlzYWJsZSAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNDUl9GT1JDRV9MSU5LX0dPT0QJCQkweDA0MDAJLyogMT1Gb3JjZSBsaW5rIGdvb2QgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfQVNTRVJUX0NSU19PTl9UWAkJCTB4MDgwMAkvKiAxPUFzc2VydCBDUlMgb24gVHJhbnNtaXQgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUxfU0hJRlQJCTEKKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfQVVUT19YX01PREVfU0hJRlQJCTUKKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfMTBCVF9FWFRfRElTVF9FTkFCTEVfU0hJRlQJNworCisvKiBBVDAwMSBQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU1NSX1NQRF9EUExYX1JFU09MVkVECQkweDA4MDAJLyogMT1TcGVlZCAmIER1cGxleCByZXNvbHZlZCAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNTUl9EUExYCQkJCTB4MjAwMAkvKiAxPUR1cGxleCAwPUhhbGYgRHVwbGV4ICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU1NSX1NQRUVECQkJCTB4QzAwMAkvKiBTcGVlZCwgYml0cyAxNDoxNSAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNTUl8xME1CUwkJCQkweDAwMDAJLyogMDA9MTBNYnMgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTU1JfMTAwTUJTCQkJCTB4NDAwMAkvKiAwMT0xMDBNYnMgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTU1JfMTAwME1CUwkJCQkweDgwMDAJLyogMTA9MTAwME1icyAqLworCisvKiBQQ0kgQ29tbWFuZCBSZWdpc3RlciBCaXQgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUENJX1JFR19DT01NQU5ECQkJCQkweDA0CS8qIFBDSSBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIENNRF9JT19TUEFDRQkJCQkJMHgwMDAxCisjZGVmaW5lIENNRF9NRU1PUllfU1BBQ0UJCQkJMHgwMDAyCisjZGVmaW5lIENNRF9CVVNfTUFTVEVSCQkJCQkweDAwMDQKKworLyogV2FrZSBVcCBGaWx0ZXIgQ29udHJvbCAqLworI2RlZmluZSBBVEwxX1dVRkNfTE5LQwkweDAwMDAwMDAxCS8qIExpbmsgU3RhdHVzIENoYW5nZSBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEFUTDFfV1VGQ19NQUcJMHgwMDAwMDAwMgkvKiBNYWdpYyBQYWNrZXQgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBBVEwxX1dVRkNfRVgJMHgwMDAwMDAwNAkvKiBEaXJlY3RlZCBFeGFjdCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEFUTDFfV1VGQ19NQwkweDAwMDAwMDA4CS8qIE11bHRpY2FzdCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEFUTDFfV1VGQ19CQwkweDAwMDAwMDEwCS8qIEJyb2FkY2FzdCBXYWtldXAgRW5hYmxlICovCisKKy8qIEVycm9yIENvZGVzICovCisjZGVmaW5lIEFUTDFfU1VDQ0VTUwkJCTAKKyNkZWZpbmUgQVRMMV9FUlJfRUVQUk9NCQkJMQorI2RlZmluZSBBVEwxX0VSUl9QSFkJCQkyCisjZGVmaW5lIEFUTDFfRVJSX0NPTkZJRwkJCTMKKyNkZWZpbmUgQVRMMV9FUlJfUEFSQU0JCQk0CisjZGVmaW5lIEFUTDFfRVJSX01BQ19UWVBFCQk1CisjZGVmaW5lIEFUTDFfRVJSX1BIWV9UWVBFCQk2CisjZGVmaW5lIEFUTDFfRVJSX1BIWV9TUEVFRAkJNworI2RlZmluZSBBVEwxX0VSUl9QSFlfUkVTCQk4CisKKyNkZWZpbmUgU1BFRURfMAkJMHhmZmZmCisjZGVmaW5lIFNQRUVEXzEwCTEwCisjZGVmaW5lIFNQRUVEXzEwMAkxMDAKKyNkZWZpbmUgU1BFRURfMTAwMAkxMDAwCisjZGVmaW5lIEhBTEZfRFVQTEVYCTEKKyNkZWZpbmUgRlVMTF9EVVBMRVgJMgorCisjZGVmaW5lIE1FRElBX1RZUEVfQVVUT19TRU5TT1IJMAorI2RlZmluZSBNRURJQV9UWVBFXzEwMDBNX0ZVTEwJMQorI2RlZmluZSBNRURJQV9UWVBFXzEwME1fRlVMTAkyCisjZGVmaW5lIE1FRElBX1RZUEVfMTAwTV9IQUxGCTMKKyNkZWZpbmUgTUVESUFfVFlQRV8xME1fRlVMTAk0CisjZGVmaW5lIE1FRElBX1RZUEVfMTBNX0hBTEYJNQorCisjZGVmaW5lIEFEVkVSVElTRV8xMF9IQUxGCQkweDAwMDEKKyNkZWZpbmUgQURWRVJUSVNFXzEwX0ZVTEwJCTB4MDAwMgorI2RlZmluZSBBRFZFUlRJU0VfMTAwX0hBTEYJCTB4MDAwNAorI2RlZmluZSBBRFZFUlRJU0VfMTAwX0ZVTEwJCTB4MDAwOAorI2RlZmluZSBBRFZFUlRJU0VfMTAwMF9IQUxGCQkweDAwMTAKKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBfRlVMTAkJMHgwMDIwCisjZGVmaW5lIEFVVE9ORUdfQURWRVJUSVNFX1NQRUVEX0RFRkFVTFQJMHgwMDJGCS8qIEV2ZXJ5dGhpbmcgYnV0IDEwMDAtSGFsZiAqLworI2RlZmluZSBBVVRPTkVHX0FEVkVSVElTRV8xMF8xMDBfQUxMCTB4MDAwRgkvKiBBbGwgMTAvMTAwIHNwZWVkcyAqLworI2RlZmluZSBBVVRPTkVHX0FEVkVSVElTRV8xMF9BTEwJMHgwMDAzCS8qIDEwTWJwcyBGdWxsICYgSGFsZiBzcGVlZHMgKi8KKworLyogVGhlIHNpemUgKGluIGJ5dGVzKSBvZiBhIGV0aGVybmV0IHBhY2tldCAqLworI2RlZmluZSBFTkVUX0hFQURFUl9TSVpFCQkxNAorI2RlZmluZSBNQVhJTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUJMTUxOAkvKiB3aXRoIEZDUyAqLworI2RlZmluZSBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUJNjQJLyogd2l0aCBGQ1MgKi8KKyNkZWZpbmUgRVRIRVJORVRfRkNTX1NJWkUJCTQKKyNkZWZpbmUgTUFYX0pVTUJPX0ZSQU1FX1NJWkUJCTB4MjgwMAorCisjZGVmaW5lIFBIWV9BVVRPX05FR19USU1FCTQ1CS8qIDQuNSBTZWNvbmRzICovCisjZGVmaW5lIFBIWV9GT1JDRV9USU1FCQkyMAkvKiAyLjAgU2Vjb25kcyAqLworCisvKiBGb3IgY2hlY2tzdW1taW5nICwgdGhlIHN1bSBvZiBhbGwgd29yZHMgaW4gdGhlIEVFUFJPTSBzaG91bGQgZXF1YWwgMHhCQUJBICovCisjZGVmaW5lIEVFUFJPTV9TVU0JCTB4QkFCQQorCisjZGVmaW5lIEFUTDFfRUVEVU1QX0xFTgkJNDgKKworLyogU3RhdGlzdGljcyBjb3VudGVycyBjb2xsZWN0ZWQgYnkgdGhlIE1BQyAqLworc3RydWN0IHN0YXRzX21zZ19ibG9jayB7CisJLyogcnggKi8KKwl1MzIgcnhfb2s7CQkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgcGFja2V0IHJlY2VpdmVkLiAqLworCXUzMiByeF9iY2FzdDsJCS8qIFRoZSBudW1iZXIgb2YgZ29vZCBicm9hZGNhc3QgcGFja2V0IHJlY2VpdmVkLiAqLworCXUzMiByeF9tY2FzdDsJCS8qIFRoZSBudW1iZXIgb2YgZ29vZCBtdWx0aWNhc3QgcGFja2V0IHJlY2VpdmVkLiAqLworCXUzMiByeF9wYXVzZTsJCS8qIFRoZSBudW1iZXIgb2YgUGF1c2UgcGFja2V0IHJlY2VpdmVkLiAqLworCXUzMiByeF9jdHJsOwkJLyogVGhlIG51bWJlciBvZiBDb250cm9sIHBhY2tldCByZWNlaXZlZCBvdGhlciB0aGFuIFBhdXNlIGZyYW1lLiAqLworCXUzMiByeF9mY3NfZXJyOwkJLyogVGhlIG51bWJlciBvZiBwYWNrZXRzIHdpdGggYmFkIEZDUy4gKi8KKwl1MzIgcnhfbGVuX2VycjsJCS8qIFRoZSBudW1iZXIgb2YgcGFja2V0cyB3aXRoIG1pc21hdGNoIG9mIGxlbmd0aCBmaWVsZCBhbmQgYWN0dWFsIHNpemUuICovCisJdTMyIHJ4X2J5dGVfY250OwkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGdvb2QgcGFja2V0IHJlY2VpdmVkLiBGQ1MgaXMgTk9UIGluY2x1ZGVkLiAqLworCXUzMiByeF9ydW50OwkJLyogVGhlIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkIHRoYXQgYXJlIGxlc3MgdGhhbiA2NCBieXRlIGxvbmcgYW5kIHdpdGggZ29vZCBGQ1MuICovCisJdTMyIHJ4X2ZyYWc7CQkvKiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgdGhhdCBhcmUgbGVzcyB0aGFuIDY0IGJ5dGUgbG9uZyBhbmQgd2l0aCBiYWQgRkNTLiAqLworCXUzMiByeF9zel82NDsJCS8qIFRoZSBudW1iZXIgb2YgZ29vZCBhbmQgYmFkIHBhY2tldHMgcmVjZWl2ZWQgdGhhdCBhcmUgNjQgYnl0ZSBsb25nLiAqLworCXUzMiByeF9zel82NV8xMjc7CS8qIFRoZSBudW1iZXIgb2YgZ29vZCBhbmQgYmFkIHBhY2tldHMgcmVjZWl2ZWQgdGhhdCBhcmUgYmV0d2VlbiA2NSBhbmQgMTI3LWJ5dGUgbG9uZy4gKi8KKwl1MzIgcnhfc3pfMTI4XzI1NTsJLyogVGhlIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcGFja2V0cyByZWNlaXZlZCB0aGF0IGFyZSBiZXR3ZWVuIDEyOCBhbmQgMjU1LWJ5dGUgbG9uZy4gKi8KKwl1MzIgcnhfc3pfMjU2XzUxMTsJLyogVGhlIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcGFja2V0cyByZWNlaXZlZCB0aGF0IGFyZSBiZXR3ZWVuIDI1NiBhbmQgNTExLWJ5dGUgbG9uZy4gKi8KKwl1MzIgcnhfc3pfNTEyXzEwMjM7CS8qIFRoZSBudW1iZXIgb2YgZ29vZCBhbmQgYmFkIHBhY2tldHMgcmVjZWl2ZWQgdGhhdCBhcmUgYmV0d2VlbiA1MTIgYW5kIDEwMjMtYnl0ZSBsb25nLiAqLworCXUzMiByeF9zel8xMDI0XzE1MTg7CS8qIFRoZSBudW1iZXIgb2YgZ29vZCBhbmQgYmFkIHBhY2tldHMgcmVjZWl2ZWQgdGhhdCBhcmUgYmV0d2VlbiAxMDI0IGFuZCAxNTE4LWJ5dGUgbG9uZy4gKi8KKwl1MzIgcnhfc3pfMTUxOV9tYXg7CS8qIFRoZSBudW1iZXIgb2YgZ29vZCBhbmQgYmFkIHBhY2tldHMgcmVjZWl2ZWQgdGhhdCBhcmUgYmV0d2VlbiAxNTE5LWJ5dGUgYW5kIE1UVS4gKi8KKwl1MzIgcnhfc3pfb3Y7CQkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgYW5kIGJhZCBwYWNrZXRzIHJlY2VpdmVkIHRoYXQgYXJlIG1vcmUgdGhhbiBNVFUgc2l6ZSDFoUMgdHJ1bmNhdGVkIGJ5IFNlbGVuZS4gKi8KKwl1MzIgcnhfcnhmX292OwkJLyogVGhlIG51bWJlciBvZiBmcmFtZSBkcm9wcGVkIGR1ZSB0byBvY2N1cnJlbmNlIG9mIFJYIEZJRk8gb3ZlcmZsb3cuICovCisJdTMyIHJ4X3JyZF9vdjsJCS8qIFRoZSBudW1iZXIgb2YgZnJhbWUgZHJvcHBlZCBkdWUgdG8gb2NjdXJyZW5jZSBvZiBSUkQgb3ZlcmZsb3cuICovCisJdTMyIHJ4X2FsaWduX2VycjsJLyogQWxpZ25tZW50IEVycm9yICovCisJdTMyIHJ4X2JjYXN0X2J5dGVfY250OwkvKiBUaGUgYnl0ZSBjb3VudCBvZiBicm9hZGNhc3QgcGFja2V0IHJlY2VpdmVkLCBleGNsdWRpbmcgRkNTLiAqLworCXUzMiByeF9tY2FzdF9ieXRlX2NudDsJLyogVGhlIGJ5dGUgY291bnQgb2YgbXVsdGljYXN0IHBhY2tldCByZWNlaXZlZCwgZXhjbHVkaW5nIEZDUy4gKi8KKwl1MzIgcnhfZXJyX2FkZHI7CS8qIFRoZSBudW1iZXIgb2YgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBhZGRyZXNzIGZpbHRlcmluZy4gKi8KKworCS8qIHR4ICovCisJdTMyIHR4X29rOwkJLyogVGhlIG51bWJlciBvZiBnb29kIHBhY2tldCB0cmFuc21pdHRlZC4gKi8KKwl1MzIgdHhfYmNhc3Q7CQkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgYnJvYWRjYXN0IHBhY2tldCB0cmFuc21pdHRlZC4gKi8KKwl1MzIgdHhfbWNhc3Q7CQkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgbXVsdGljYXN0IHBhY2tldCB0cmFuc21pdHRlZC4gKi8KKwl1MzIgdHhfcGF1c2U7CQkvKiBUaGUgbnVtYmVyIG9mIFBhdXNlIHBhY2tldCB0cmFuc21pdHRlZC4gKi8KKwl1MzIgdHhfZXhjX2RlZmVyOwkvKiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgdHJhbnNtaXR0ZWQgd2l0aCBleGNlc3NpdmUgZGVmZXJyYWwuICovCisJdTMyIHR4X2N0cmw7CQkvKiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgdHJhbnNtaXR0ZWQgaXMgYSBjb250cm9sIGZyYW1lLCBleGNsdWRpbmcgUGF1c2UgZnJhbWUuICovCisJdTMyIHR4X2RlZmVyOwkJLyogVGhlIG51bWJlciBvZiBwYWNrZXRzIHRyYW5zbWl0dGVkIHRoYXQgaXMgZGVmZXJyZWQuICovCisJdTMyIHR4X2J5dGVfY250OwkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdHJhbnNtaXR0ZWQuIEZDUyBpcyBOT1QgaW5jbHVkZWQuICovCisJdTMyIHR4X3N6XzY0OwkJLyogVGhlIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcGFja2V0cyB0cmFuc21pdHRlZCB0aGF0IGFyZSA2NCBieXRlIGxvbmcuICovCisJdTMyIHR4X3N6XzY1XzEyNzsJLyogVGhlIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcGFja2V0cyB0cmFuc21pdHRlZCB0aGF0IGFyZSBiZXR3ZWVuIDY1IGFuZCAxMjctYnl0ZSBsb25nLiAqLworCXUzMiB0eF9zel8xMjhfMjU1OwkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgYW5kIGJhZCBwYWNrZXRzIHRyYW5zbWl0dGVkIHRoYXQgYXJlIGJldHdlZW4gMTI4IGFuZCAyNTUtYnl0ZSBsb25nLiAqLworCXUzMiB0eF9zel8yNTZfNTExOwkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgYW5kIGJhZCBwYWNrZXRzIHRyYW5zbWl0dGVkIHRoYXQgYXJlIGJldHdlZW4gMjU2IGFuZCA1MTEtYnl0ZSBsb25nLiAqLworCXUzMiB0eF9zel81MTJfMTAyMzsJLyogVGhlIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcGFja2V0cyB0cmFuc21pdHRlZCB0aGF0IGFyZSBiZXR3ZWVuIDUxMiBhbmQgMTAyMy1ieXRlIGxvbmcuICovCisJdTMyIHR4X3N6XzEwMjRfMTUxODsJLyogVGhlIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcGFja2V0cyB0cmFuc21pdHRlZCB0aGF0IGFyZSBiZXR3ZWVuIDEwMjQgYW5kIDE1MTgtYnl0ZSBsb25nLiAqLworCXUzMiB0eF9zel8xNTE5X21heDsJLyogVGhlIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcGFja2V0cyB0cmFuc21pdHRlZCB0aGF0IGFyZSBiZXR3ZWVuIDE1MTktYnl0ZSBhbmQgTVRVLiAqLworCXUzMiB0eF8xX2NvbDsJCS8qIFRoZSBudW1iZXIgb2YgcGFja2V0cyBzdWJzZXF1ZW50bHkgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5IHdpdGggYSBzaW5nbGUgcHJpb3IgY29sbGlzaW9uLiAqLworCXUzMiB0eF8yX2NvbDsJCS8qIFRoZSBudW1iZXIgb2YgcGFja2V0cyBzdWJzZXF1ZW50bHkgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5IHdpdGggbXVsdGlwbGUgcHJpb3IgY29sbGlzaW9ucy4gKi8KKwl1MzIgdHhfbGF0ZV9jb2w7CS8qIFRoZSBudW1iZXIgb2YgcGFja2V0cyB0cmFuc21pdHRlZCB3aXRoIGxhdGUgY29sbGlzaW9ucy4gKi8KKwl1MzIgdHhfYWJvcnRfY29sOwkvKiBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0IHBhY2tldHMgYWJvcnRlZCBkdWUgdG8gZXhjZXNzaXZlIGNvbGxpc2lvbnMuICovCisJdTMyIHR4X3VuZGVycnVuOwkvKiBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0IHBhY2tldHMgYWJvcnRlZCBkdWUgdG8gdHJhbnNtaXQgRklGTyB1bmRlcnJ1biwgb3IgVFJEIEZJRk8gdW5kZXJydW4gKi8KKwl1MzIgdHhfcmRfZW9wOwkJLyogVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHJlYWQgYmV5b25kIHRoZSBFT1AgaW50byB0aGUgbmV4dCBmcmFtZSBhcmVhIHdoZW4gVFJEIHdhcyBub3Qgd3JpdHRlbiB0aW1lbHkgKi8KKwl1MzIgdHhfbGVuX2VycjsJCS8qIFRoZSBudW1iZXIgb2YgdHJhbnNtaXQgcGFja2V0cyB3aXRoIGxlbmd0aCBmaWVsZCBkb2VzIE5PVCBtYXRjaCB0aGUgYWN0dWFsIGZyYW1lIHNpemUuICovCisJdTMyIHR4X3RydW5jOwkJLyogVGhlIG51bWJlciBvZiB0cmFuc21pdCBwYWNrZXRzIHRydW5jYXRlZCBkdWUgdG8gc2l6ZSBleGNlZWRpbmcgTVRVLiAqLworCXUzMiB0eF9iY2FzdF9ieXRlOwkvKiBUaGUgYnl0ZSBjb3VudCBvZiBicm9hZGNhc3QgcGFja2V0IHRyYW5zbWl0dGVkLCBleGNsdWRpbmcgRkNTLiAqLworCXUzMiB0eF9tY2FzdF9ieXRlOwkvKiBUaGUgYnl0ZSBjb3VudCBvZiBtdWx0aWNhc3QgcGFja2V0IHRyYW5zbWl0dGVkLCBleGNsdWRpbmcgRkNTLiAqLworCXUzMiBzbWJfdXBkYXRlZDsJLyogMTogU01CIFVwZGF0ZWQuIFRoaXMgaXMgdXNlZCBieSBzb2Z0d2FyZSBhcyB0aGUgaW5kaWNhdGlvbiBvZiB0aGUgc3RhdGlzdGljcyB1cGRhdGUuCisJCQkJICogU29mdHdhcmUgc2hvdWxkIGNsZWFyIHRoaXMgYml0IGFzIHNvb24gYXMgcmV0cmlldmluZyB0aGUgc3RhdGlzdGljcyBpbmZvcm1hdGlvbi4gKi8KK307CisKKy8qIENvYWxlc2NpbmcgTWVzc2FnZSBCbG9jayAqLworc3RydWN0IGNvYWxzX21zZ19ibG9jayB7CisJdTMyIGludF9zdGF0czsJCS8qIGludGVycnVwdCBzdGF0dXMgKi8KKwl1MTYgcnJkX3Byb2RfaWR4OwkvKiBUUkQgUHJvZHVjZXIgSW5kZXguICovCisJdTE2IHJmZF9jb25zX2lkeDsJLyogUkZEIENvbnN1bWVyIEluZGV4LiAqLworCXUxNiB1cGRhdGU7CQkvKiBTZWxlbmUgc2V0cyB0aGlzIGJpdCBldmVyeSB0aW1lIGl0IERNQSB0aGUgQ01CIHRvIGhvc3QgbWVtb3J5LgorCQkJCSAqIFNvZnR3YXJlIHN1cHBvc2VzIHRvIGNsZWFyIHRoaXMgYml0IHdoZW4gQ01CIGluZm9ybWF0aW9uIGlzIHByb2Nlc3NlZC4gKi8KKwl1MTYgdHBkX2NvbnNfaWR4OwkvKiBUUEQgQ29uc3VtZXIgSW5kZXguICovCit9OworCisvKiBSUkQgZGVzY3JpcHRvciAqLworc3RydWN0IHJ4X3JldHVybl9kZXNjIHsKKwl1OCBudW1fYnVmOwkJLyogTnVtYmVyIG9mIFJGRCBidWZmZXJzIHVzZWQgYnkgdGhlIHJlY2VpdmVkIHBhY2tldCAqLworCXU4IHJlc3ZlZDsKKwl1MTYgYnVmX2luZHg7CQkvKiBSRkQgSW5kZXggb2YgdGhlIGZpcnN0IGJ1ZmZlciAqLworCXVuaW9uIHsKKwkJdTMyIHZhbGlkOworCQlzdHJ1Y3QgeworCQkJdTE2IHJ4X2Noa3N1bTsKKwkJCXUxNiBwa3Rfc2l6ZTsKKwkJfSB4c3VtX3N6OworCX0geHN6OworCisJdTE2IHBrdF9mbGc7CQkvKiBQYWNrZXQgZmxhZ3MgKi8KKwl1MTYgZXJyX2ZsZzsJCS8qIEVycm9yIGZsYWdzICovCisJdTE2IHJlc3ZlZDI7CisJdTE2IHZsYW5fdGFnOwkJLyogVkxBTiBUQUcgKi8KK307CisKKyNkZWZpbmUgUEFDS0VUX0ZMQUdfRVRIX1RZUEUJMHgwMDgwCisjZGVmaW5lIFBBQ0tFVF9GTEFHX1ZMQU5fSU5TCTB4MDEwMAorI2RlZmluZSBQQUNLRVRfRkxBR19FUlIJCTB4MDIwMAorI2RlZmluZSBQQUNLRVRfRkxBR19JUFY0CTB4MDQwMAorI2RlZmluZSBQQUNLRVRfRkxBR19VRFAJCTB4MDgwMAorI2RlZmluZSBQQUNLRVRfRkxBR19UQ1AJCTB4MTAwMAorI2RlZmluZSBQQUNLRVRfRkxBR19CQ0FTVAkweDIwMDAKKyNkZWZpbmUgUEFDS0VUX0ZMQUdfTUNBU1QJMHg0MDAwCisjZGVmaW5lIFBBQ0tFVF9GTEFHX1BBVVNFCTB4ODAwMAorCisjZGVmaW5lIEVSUl9GTEFHX0NSQwkJMHgwMDAxCisjZGVmaW5lIEVSUl9GTEFHX0NPREUJCTB4MDAwMgorI2RlZmluZSBFUlJfRkxBR19EUklCQkxFCTB4MDAwNAorI2RlZmluZSBFUlJfRkxBR19SVU5UCQkweDAwMDgKKyNkZWZpbmUgRVJSX0ZMQUdfT1YJCTB4MDAxMAorI2RlZmluZSBFUlJfRkxBR19UUlVOQwkJMHgwMDIwCisjZGVmaW5lIEVSUl9GTEFHX0lQX0NIS1NVTQkweDAwNDAKKyNkZWZpbmUgRVJSX0ZMQUdfTDRfQ0hLU1VNCTB4MDA4MAorI2RlZmluZSBFUlJfRkxBR19MRU4JCTB4MDEwMAorI2RlZmluZSBFUlJfRkxBR19ERVNfQUREUgkweDAyMDAKKworLyogUkZEIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCByeF9mcmVlX2Rlc2MgeworCV9fbGU2NCBidWZmZXJfYWRkcjsJLyogQWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvcidzIGRhdGEgYnVmZmVyICovCisJX19sZTE2IGJ1Zl9sZW47CQkvKiBTaXplIG9mIHRoZSByZWNlaXZlIGJ1ZmZlciBpbiBob3N0IG1lbW9yeSwgaW4gYnl0ZSAqLworCXUxNiBjb2FsZXNlOwkJLyogVXBkYXRlIGNvbnN1bWVyIGluZGV4IHRvIGhvc3QgYWZ0ZXIgdGhlIHJlY2VwdGlvbiBvZiB0aGlzIGZyYW1lICovCisJLyogX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGlzIHJlcXVpcmVkICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogdHNvcHUgZGVmaW5lcyAqLworI2RlZmluZSBUU09fUEFSQU1fQlVGTEVOX01BU0sgICAgICAgICAgIDB4M0ZGRgorI2RlZmluZSBUU09fUEFSQU1fQlVGTEVOX1NISUZUICAgICAgICAgIDAKKyNkZWZpbmUgVFNPX1BBUkFNX0RNQUlOVF9NQVNLICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFNPX1BBUkFNX0RNQUlOVF9TSElGVCAgICAgICAgICAxNAorI2RlZmluZSBUU09fUEFSQU1fUEtUTlRfTUFTSyAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBUU09fUEFSQU1fUEtUSU5UX1NISUZUICAgICAgICAgIDE1CisjZGVmaW5lIFRTT19QQVJBTV9WTEFOVEFHX01BU0sgICAgICAgICAgMHhGRkZGCisjZGVmaW5lIFRTT19QQVJBTV9WTEFOX1NISUZUICAgICAgICAgICAgMTYKKworLyogdHNvcGwgZGVmaW5lcyAqLworI2RlZmluZSBUU09fUEFSQU1fRU9QX01BU0sgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBUU09fUEFSQU1fRU9QX1NISUZUICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFNPX1BBUkFNX0NPQUxFU0NFX01BU0sgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFNPX1BBUkFNX0NPQUxFU0NFX1NISUZUICAgICAgICAxCisjZGVmaW5lIFRTT19QQVJBTV9JTlNWTEFHX01BU0sgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRTT19QQVJBTV9JTlNWTEFHX1NISUZUICAgICAgICAgMgorI2RlZmluZSBUU09fUEFSQU1fQ1VTVE9NQ0tTVU1fTUFTSyAgICAgIDB4MDAwMQorI2RlZmluZSBUU09fUEFSQU1fQ1VTVE9NQ0tTVU1fU0hJRlQgICAgIDMKKyNkZWZpbmUgVFNPX1BBUkFNX1NFR01FTlRfTUFTSyAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFNPX1BBUkFNX1NFR01FTlRfU0hJRlQgICAgICAgICA0CisjZGVmaW5lIFRTT19QQVJBTV9JUENLU1VNX01BU0sgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRTT19QQVJBTV9JUENLU1VNX1NISUZUICAgICAgICAgNQorI2RlZmluZSBUU09fUEFSQU1fVENQQ0tTVU1fTUFTSyAgICAgICAgIDB4MDAwMQorI2RlZmluZSBUU09fUEFSQU1fVENQQ0tTVU1fU0hJRlQgICAgICAgIDYKKyNkZWZpbmUgVFNPX1BBUkFNX1VEUENLU1VNX01BU0sgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFNPX1BBUkFNX1VEUENLU1VNX1NISUZUICAgICAgICA3CisjZGVmaW5lIFRTT19QQVJBTV9WTEFOVEFHR0VEX01BU0sgICAgICAgMHgwMDAxCisjZGVmaW5lIFRTT19QQVJBTV9WTEFOVEFHR0VEX1NISUZUICAgICAgOAorI2RlZmluZSBUU09fUEFSQU1fRVRIVFlQRV9NQVNLICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBUU09fUEFSQU1fRVRIVFlQRV9TSElGVCAgICAgICAgIDkKKyNkZWZpbmUgVFNPX1BBUkFNX0lQSExfTUFTSyAgICAgICAgICAgICAweDAwMEYKKyNkZWZpbmUgVFNPX1BBUkFNX0lQSExfU0hJRlQgICAgICAgICAgICAxMAorI2RlZmluZSBUU09fUEFSQU1fVENQSERSTEVOX01BU0sgICAgICAgIDB4MDAwRgorI2RlZmluZSBUU09fUEFSQU1fVENQSERSTEVOX1NISUZUICAgICAgIDE0CisjZGVmaW5lIFRTT19QQVJBTV9IRFJGTEFHX01BU0sgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRTT19QQVJBTV9IRFJGTEFHX1NISUZUICAgICAgICAgMTgKKyNkZWZpbmUgVFNPX1BBUkFNX01TU19NQVNLICAgICAgICAgICAgICAweDFGRkYKKyNkZWZpbmUgVFNPX1BBUkFNX01TU19TSElGVCAgICAgICAgICAgICAxOQorCisvKiBjc3VtcHUgZGVmaW5lcyAqLworI2RlZmluZSBDU1VNX1BBUkFNX0JVRkxFTl9NQVNLICAgICAgICAgIDB4M0ZGRgorI2RlZmluZSBDU1VNX1BBUkFNX0JVRkxFTl9TSElGVCAgICAgICAgIDAKKyNkZWZpbmUgQ1NVTV9QQVJBTV9ETUFJTlRfTUFTSyAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQ1NVTV9QQVJBTV9ETUFJTlRfU0hJRlQgICAgICAgICAxNAorI2RlZmluZSBDU1VNX1BBUkFNX1BLVElOVF9NQVNLICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBDU1VNX1BBUkFNX1BLVElOVF9TSElGVCAgICAgICAgIDE1CisjZGVmaW5lIENTVU1fUEFSQU1fVkFMQU5UQUdfTUFTSyAgICAgICAgMHhGRkZGCisjZGVmaW5lIENTVU1fUEFSQU1fVkFMQU5fU0hJRlQgICAgICAgICAgMTYKKworLyogY3N1bXBsIGRlZmluZXMqLworI2RlZmluZSBDU1VNX1BBUkFNX0VPUF9NQVNLICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBDU1VNX1BBUkFNX0VPUF9TSElGVCAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1NVTV9QQVJBTV9DT0FMRVNDRV9NQVNLICAgICAgICAweDAwMDEKKyNkZWZpbmUgQ1NVTV9QQVJBTV9DT0FMRVNDRV9TSElGVCAgICAgICAxCisjZGVmaW5lIENTVU1fUEFSQU1fSU5TVkxBR19NQVNLICAgICAgICAgMHgwMDAxCisjZGVmaW5lIENTVU1fUEFSQU1fSU5TVkxBR19TSElGVCAgICAgICAgMgorI2RlZmluZSBDU1VNX1BBUkFNX0NVU1RPTUNLU1VNX01BU0sgICAgIDB4MDAwMQorI2RlZmluZSBDU1VNX1BBUkFNX0NVU1RPTUNLU1VNX1NISUZUICAgIDMKKyNkZWZpbmUgQ1NVTV9QQVJBTV9TRUdNRU5UX01BU0sgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQ1NVTV9QQVJBTV9TRUdNRU5UX1NISUZUICAgICAgICA0CisjZGVmaW5lIENTVU1fUEFSQU1fSVBDS1NVTV9NQVNLICAgICAgICAgMHgwMDAxCisjZGVmaW5lIENTVU1fUEFSQU1fSVBDS1NVTV9TSElGVCAgICAgICAgNQorI2RlZmluZSBDU1VNX1BBUkFNX1RDUENLU1VNX01BU0sgICAgICAgIDB4MDAwMQorI2RlZmluZSBDU1VNX1BBUkFNX1RDUENLU1VNX1NISUZUICAgICAgIDYKKyNkZWZpbmUgQ1NVTV9QQVJBTV9VRFBDS1NVTV9NQVNLICAgICAgICAweDAwMDEKKyNkZWZpbmUgQ1NVTV9QQVJBTV9VRFBDS1NVTV9TSElGVCAgICAgICA3CisjZGVmaW5lIENTVU1fUEFSQU1fVkxBTlRBR0dFRF9NQVNLICAgICAgMHgwMDAxCisjZGVmaW5lIENTVU1fUEFSQU1fVkxBTlRBR0dFRF9TSElGVCAgICAgOAorI2RlZmluZSBDU1VNX1BBUkFNX0VUSFRZUEVfTUFTSyAgICAgICAgIDB4MDAwMQorI2RlZmluZSBDU1VNX1BBUkFNX0VUSFRZUEVfU0hJRlQgICAgICAgIDkKKyNkZWZpbmUgQ1NVTV9QQVJBTV9JUEhMX01BU0sgICAgICAgICAgICAweDAwMEYKKyNkZWZpbmUgQ1NVTV9QQVJBTV9JUEhMX1NISUZUICAgICAgICAgICAxMAorI2RlZmluZSBDU1VNX1BBUkFNX1BMT0FET0ZGU0VUX01BU0sgICAgIDB4MDBGRgorI2RlZmluZSBDU1VNX1BBUkFNX1BMT0FET0ZGU0VUX1NISUZUICAgIDE2CisjZGVmaW5lIENTVU1fUEFSQU1fWFNVTU9GRlNFVF9NQVNLICAgICAgMHgwMEZGCisjZGVmaW5lIENTVU1fUEFSQU1fWFNVTU9GRlNFVF9TSElGVCAgICAgMjQKKworLyogVFBEIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCB0c29fcGFyYW0geworICAgICAgICAvKiBUaGUgb3JkZXIgb2YgdGhlc2UgZGVjbGFyYXRpb25zIGlzIGltcG9ydGFudCAtLSBkb24ndCBjaGFuZ2UgaXQgKi8KKyAgICAgICAgdTMyIHRzb3B1OyAgICAgIC8qIHRzb19wYXJhbSB1cHBlciB3b3JkICovCisgICAgICAgIHUzMiB0c29wbDsgICAgICAvKiB0c29fcGFyYW0gbG93ZXIgd29yZCAqLworfTsKKworc3RydWN0IGNzdW1fcGFyYW0geworICAgICAgICAvKiBUaGUgb3JkZXIgb2YgdGhlc2UgZGVjbGFyYXRpb25zIGlzIGltcG9ydGFudCAtLSBkb24ndCBjaGFuZ2UgaXQgKi8KKyAgICAgICAgdTMyIGNzdW1wdTsgICAgIC8qIGNzdW1fcGFyYW0gdXBwZXIgd29yZCAqLworICAgICAgICB1MzIgY3N1bXBsOyAgICAgLyogY3N1bV9wYXJhbSBsb3dlciB3b3JkICovCit9OworCit1bmlvbiB0cGRfZGVzY3IgeworCXU2NCBkYXRhOworCXN0cnVjdCBjc3VtX3BhcmFtIGNzdW07CisJc3RydWN0IHRzb19wYXJhbSB0c287Cit9OworCitzdHJ1Y3QgdHhfcGFja2V0X2Rlc2MgeworCV9fbGU2NCBidWZmZXJfYWRkcjsKKwl1bmlvbiB0cGRfZGVzY3IgZGVzYzsKK307CisKKy8qIERNQSBPcmRlciBTZXR0aW5ncyAqLworZW51bSBhdGwxX2RtYV9vcmRlciB7CisJYXRsMV9kbWFfb3JkX2luID0gMSwKKwlhdGwxX2RtYV9vcmRfZW5oID0gMiwKKwlhdGwxX2RtYV9vcmRfb3V0ID0gNAorfTsKKworZW51bSBhdGwxX2RtYV9yY2IgeworCWF0bDFfcmNiXzY0ID0gMCwKKwlhdGwxX3JjYl8xMjggPSAxCit9OworCitlbnVtIGF0bDFfZG1hX3JlcV9ibG9jayB7CisJYXRsMV9kbWFfcmVxXzEyOCA9IDAsCisJYXRsMV9kbWFfcmVxXzI1NiA9IDEsCisJYXRsMV9kbWFfcmVxXzUxMiA9IDIsCisJYXRsMV9kYW1fcmVxXzEwMjQgPSAzLAorCWF0bDFfZGFtX3JlcV8yMDQ4ID0gNCwKKwlhdGwxX2RtYV9yZXFfNDA5NiA9IDUKK307CisKK3N0cnVjdCBhdGwxX3NwaV9mbGFzaF9kZXYgeworCWNvbnN0IGNoYXIgKm1hbnVfbmFtZTsJLyogbWFudWZhY3R1cmVyIGlkICovCisJLyogb3AtY29kZSAqLworCXU4IGNtZF93cnNyOworCXU4IGNtZF9yZWFkOworCXU4IGNtZF9wcm9ncmFtOworCXU4IGNtZF93cmVuOworCXU4IGNtZF93cmRpOworCXU4IGNtZF9yZHNyOworCXU4IGNtZF9yZGlkOworCXU4IGNtZF9zZWN0b3JfZXJhc2U7CisJdTggY21kX2NoaXBfZXJhc2U7Cit9OworCisjZW5kaWYJLyogX0FUTDFfSFdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9tYWluLmMgYi9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTU2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jCkBAIC0wLDAgKzEsMjQ2OCBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAwNiBBdHRhbnNpYyBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDA2IENocmlzIFNub29rIDxjc25vb2tAcmVkaGF0LmNvbT4KKyAqIENvcHlyaWdodChjKSAyMDA2IEpheSBDbGlidXJuIDxqY2xpYnVybkBnbWFpbC5jb20+CisgKgorICogRGVyaXZlZCBmcm9tIEludGVsIGUxMDAwIGRyaXZlcgorICogQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogWGlvbmcgSHVhbmcgPHhpb25nX2h1YW5nQGF0dGFuc2ljLmNvbT4KKyAqIEF0dGFuc2ljIFRlY2hub2xvZ3kgQ29ycC4gM0YgMTQ3LCBYaWFuemhlbmcgOXRoIFJvYWQsIFpodWJlaSwKKyAqIFhpbnpodSAgMzAyLCBUQUlXQU4sIFJFUFVCTElDIE9GIENISU5BCisgKgorICogQ2hyaXMgU25vb2sgPGNzbm9va0ByZWRoYXQuY29tPgorICogSmF5IENsaWJ1cm4gPGpjbGlidXJuQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHZlcnNpb24gaXMgYWRhcHRlZCBmcm9tIHRoZSBBdHRhbnNpYyByZWZlcmVuY2UgZHJpdmVyIGZvcgorICogaW5jbHVzaW9uIGluIHRoZSBMaW51eCBrZXJuZWwuICBJdCBpcyBjdXJyZW50bHkgdW5kZXIgaGVhdnkgZGV2ZWxvcG1lbnQuCisgKiBBIHZlcnkgaW5jb21wbGV0ZSBsaXN0IG9mIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUgZGVhbHQgd2l0aDoKKyAqCisgKiBUT0RPOgorICogRml4IFRTTzsgdHggcGVyZm9ybWFuY2UgaXMgaG9ycmlibGUgd2l0aCBUU08gZW5hYmxlZC4KKyAqIFdha2Ugb24gTEFOLgorICogQWRkIG1vcmUgZXRodG9vbCBmdW5jdGlvbnMsIGluY2x1ZGluZyBzZXQgcmluZyBwYXJhbWV0ZXJzLgorICogRml4IGFic3RydXNlIGlycSBlbmFibGUvZGlzYWJsZSBjb25kaXRpb24gZGVzY3JpYmVkIGhlcmU6CisgKglodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWxpbnV4LW5ldGRldiZtPTExNjM5ODUwODUwMDU1MyZ3PTIKKyAqCisgKiBORUVEUyBURVNUSU5HOgorICogVkxBTgorICogbXVsdGljYXN0CisgKiBwcm9taXNjdW91cyBtb2RlCisgKiBpbnRlcnJ1cHQgY29hbGVzY2luZworICogU01QIHRvcnR1cmUgdGVzdGluZworICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgImF0bDEuaCIKKworI2RlZmluZSBSVU5fUkVBTFRJTUUgMAorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMi4wLjYiCisKK2NoYXIgYXRsMV9kcml2ZXJfbmFtZVtdID0gImF0bDEiOworc3RhdGljIGNvbnN0IGNoYXIgYXRsMV9kcml2ZXJfc3RyaW5nW10gPSAiQXR0YW5zaWMgTDEgRXRoZXJuZXQgTmV0d29yayBEcml2ZXIiOworc3RhdGljIGNvbnN0IGNoYXIgYXRsMV9jb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQoYykgMjAwNS0yMDA2IEF0dGFuc2ljIENvcnBvcmF0aW9uLiI7CitjaGFyIGF0bDFfZHJpdmVyX3ZlcnNpb25bXSA9IERSSVZFUl9WRVJTSU9OOworCitNT0RVTEVfQVVUSE9SCisgICAgKCJBdHRhbnNpYyBDb3Jwb3JhdGlvbiA8eGlvbmdfaHVhbmdAYXR0YW5zaWMuY29tPiwgQ2hyaXMgU25vb2sgPGNzbm9va0ByZWRoYXQuY29tPiwgSmF5IENsaWJ1cm4gPGpjbGlidXJuQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQXR0YW5zaWMgMTAwME0gRXRoZXJuZXQgTmV0d29yayBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKKworLyoKKyAqIGF0bDFfcGNpX3RibCAtIFBDSSBEZXZpY2UgSUQgVGFibGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGF0bDFfcGNpX3RibFtdID0geworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVRUQU5TSUMsIDB4MTA0OCl9LAorCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KKwl7MCx9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYXRsMV9wY2lfdGJsKTsKKworLyoKKyAqIGF0bDFfc3dfaW5pdCAtIEluaXRpYWxpemUgZ2VuZXJhbCBzb2Z0d2FyZSBzdHJ1Y3R1cmVzIChzdHJ1Y3QgYXRsMV9hZGFwdGVyKQorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUKKyAqCisgKiBhdGwxX3N3X2luaXQgaW5pdGlhbGl6ZXMgdGhlIEFkYXB0ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZS4KKyAqIEZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgYmFzZWQgb24gUENJIGRldmljZSBpbmZvcm1hdGlvbiBhbmQKKyAqIE9TIG5ldHdvcmsgZGV2aWNlIHNldHRpbmdzIChNVFUgc2l6ZSkuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGF0bDFfc3dfaW5pdChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKworCS8qIFBDSSBjb25maWcgc3BhY2UgaW5mbyAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmh3LT5yZXZpc2lvbl9pZCk7CisKKwlody0+bWF4X2ZyYW1lX3NpemUgPSBuZXRkZXYtPm10dSArIEVORVRfSEVBREVSX1NJWkUgKyBFVEhFUk5FVF9GQ1NfU0laRTsKKwlody0+bWluX2ZyYW1lX3NpemUgPSBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkU7CisKKwlhZGFwdGVyLT53b2wgPSAwOworCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSAoaHctPm1heF9mcmFtZV9zaXplICsgNykgJiB+NzsKKwlhZGFwdGVyLT5pY3QgPSA1MDAwMDsJLyogMTAwbXMgKi8KKwlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMDsJLyogaGFyZHdhcmUgaW5pdCAqLworCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gRlVMTF9EVVBMRVg7CisKKwlody0+cGh5X2NvbmZpZ3VyZWQgPSBmYWxzZTsKKwlody0+cHJlYW1ibGVfbGVuID0gNzsKKwlody0+aXBndCA9IDB4NjA7CisJaHctPm1pbl9pZmcgPSAweDUwOworCWh3LT5pcGdyMSA9IDB4NDA7CisJaHctPmlwZ3IyID0gMHg2MDsKKwlody0+bWF4X3JldHJ5ID0gMHhmOworCWh3LT5sY29sID0gMHgzNzsKKwlody0+amFtX2lwZyA9IDc7CisJaHctPnJmZF9idXJzdCA9IDg7CisJaHctPnJyZF9idXJzdCA9IDg7CisJaHctPnJmZF9mZXRjaF9nYXAgPSAxOworCWh3LT5yeF9qdW1ib190aCA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gLyA4OworCWh3LT5yeF9qdW1ib19sa2FoID0gMTsKKwlody0+cnJkX3JldF90aW1lciA9IDE2OworCWh3LT50cGRfYnVyc3QgPSA0OworCWh3LT50cGRfZmV0Y2hfdGggPSAxNjsKKwlody0+dHhmX2J1cnN0ID0gMHgxMDA7CisJaHctPnR4X2p1bWJvX3Rhc2tfdGggPSAoaHctPm1heF9mcmFtZV9zaXplICsgNykgPj4gMzsKKwlody0+dHBkX2ZldGNoX2dhcCA9IDE7CisJaHctPnJjYl92YWx1ZSA9IGF0bDFfcmNiXzY0OworCWh3LT5kbWFfb3JkID0gYXRsMV9kbWFfb3JkX2VuaDsKKwlody0+ZG1hcl9ibG9jayA9IGF0bDFfZG1hX3JlcV8yNTY7CisJaHctPmRtYXdfYmxvY2sgPSBhdGwxX2RtYV9yZXFfMjU2OworCWh3LT5jbWJfcnJkID0gNDsKKwlody0+Y21iX3RwZCA9IDQ7CisJaHctPmNtYl9yeF90aW1lciA9IDE7CS8qIGFib3V0IDJ1cyAqLworCWh3LT5jbWJfdHhfdGltZXIgPSAxOwkvKiBhYm91dCAydXMgKi8KKwlody0+c21iX3RpbWVyID0gMTAwMDAwOwkvKiBhYm91dCAyMDBtcyAqLworCisJYXRvbWljX3NldCgmYWRhcHRlci0+aXJxX3NlbSwgMCk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5tYl9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogYXRsMV9zZXR1cF9tZW1fcmVzb3VyY2VzIC0gYWxsb2NhdGUgVHggLyBSWCBkZXNjcmlwdG9yIHJlc291cmNlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzMzIgYXRsMV9zZXR1cF9yaW5nX3Jlc291cmNlcyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZyA9ICZhZGFwdGVyLT50cGRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7CisJc3RydWN0IGF0bDFfcnJkX3JpbmcgKnJyZF9yaW5nID0gJmFkYXB0ZXItPnJyZF9yaW5nOworCXN0cnVjdCBhdGwxX3JpbmdfaGVhZGVyICpyaW5nX2hlYWRlciA9ICZhZGFwdGVyLT5yaW5nX2hlYWRlcjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJaW50IHNpemU7CisJdTggb2Zmc2V0ID0gMDsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGF0bDFfYnVmZmVyKSAqICh0cGRfcmluZy0+Y291bnQgKyByZmRfcmluZy0+Y291bnQpOworCXRwZF9yaW5nLT5idWZmZXJfaW5mbyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCF0cGRfcmluZy0+YnVmZmVyX2luZm8pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBremFsbG9jIGZhaWxlZCAsIHNpemUgPSBEJWRcbiIsCisJCQlhdGwxX2RyaXZlcl9uYW1lLCBzaXplKTsKKwkJZ290byBlcnJfbm9tZW07CisJfQorCXJmZF9yaW5nLT5idWZmZXJfaW5mbyA9CisJICAgIChzdHJ1Y3QgYXRsMV9idWZmZXIgKikodHBkX3JpbmctPmJ1ZmZlcl9pbmZvICsgdHBkX3JpbmctPmNvdW50KTsKKworCS8qIHJlYWwgcmluZyBETUEgYnVmZmVyICovCisJcmluZ19oZWFkZXItPnNpemUgPSBzaXplID0gc2l6ZW9mKHN0cnVjdCB0eF9wYWNrZXRfZGVzYykgKgorCQkJCQl0cGRfcmluZy0+Y291bnQKKwkgICAgKyBzaXplb2Yoc3RydWN0IHJ4X2ZyZWVfZGVzYykgKiByZmRfcmluZy0+Y291bnQKKwkgICAgKyBzaXplb2Yoc3RydWN0IHJ4X3JldHVybl9kZXNjKSAqIHJyZF9yaW5nLT5jb3VudAorCSAgICArIHNpemVvZihzdHJ1Y3QgY29hbHNfbXNnX2Jsb2NrKQorCSAgICArIHNpemVvZihzdHJ1Y3Qgc3RhdHNfbXNnX2Jsb2NrKQorCSAgICArIDQwOwkJLyogIjQwOiBmb3IgOCBieXRlcyBhbGlnbiIgaHVoPyAtLSBDSFMgKi8KKworCXJpbmdfaGVhZGVyLT5kZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgcmluZ19oZWFkZXItPnNpemUsCisJCQkJCQkmcmluZ19oZWFkZXItPmRtYSk7CisJaWYgKHVubGlrZWx5KCFyaW5nX2hlYWRlci0+ZGVzYykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIiVzOiBwY2lfYWxsb2NfY29uc2lzdGVudCBmYWlsZWQsIHNpemUgPSBEJWRcbiIsCisJCQlhdGwxX2RyaXZlcl9uYW1lLCBzaXplKTsKKwkJZ290byBlcnJfbm9tZW07CisJfQorCisJbWVtc2V0KHJpbmdfaGVhZGVyLT5kZXNjLCAwLCByaW5nX2hlYWRlci0+c2l6ZSk7CisKKwkvKiBpbml0IFRQRCByaW5nICovCisJdHBkX3JpbmctPmRtYSA9IHJpbmdfaGVhZGVyLT5kbWE7CisJb2Zmc2V0ID0gKHRwZF9yaW5nLT5kbWEgJiAweDcpID8gKDggLSAocmluZ19oZWFkZXItPmRtYSAmIDB4NykpIDogMDsKKwl0cGRfcmluZy0+ZG1hICs9IG9mZnNldDsKKwl0cGRfcmluZy0+ZGVzYyA9ICh1OCAqKSByaW5nX2hlYWRlci0+ZGVzYyArIG9mZnNldDsKKwl0cGRfcmluZy0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHhfcGFja2V0X2Rlc2MpICogdHBkX3JpbmctPmNvdW50OworCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSwgMCk7CisJYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fY2xlYW4sIDApOworCisJLyogaW5pdCBSRkQgcmluZyAqLworCXJmZF9yaW5nLT5kbWEgPSB0cGRfcmluZy0+ZG1hICsgdHBkX3JpbmctPnNpemU7CisJb2Zmc2V0ID0gKHJmZF9yaW5nLT5kbWEgJiAweDcpID8gKDggLSAocmZkX3JpbmctPmRtYSAmIDB4NykpIDogMDsKKwlyZmRfcmluZy0+ZG1hICs9IG9mZnNldDsKKwlyZmRfcmluZy0+ZGVzYyA9ICh1OCAqKSB0cGRfcmluZy0+ZGVzYyArICh0cGRfcmluZy0+c2l6ZSArIG9mZnNldCk7CisJcmZkX3JpbmctPnNpemUgPSBzaXplb2Yoc3RydWN0IHJ4X2ZyZWVfZGVzYykgKiByZmRfcmluZy0+Y291bnQ7CisJcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCS8qIHJmZF9yaW5nLT5uZXh0X3RvX3VzZSA9IHJmZF9yaW5nLT5jb3VudCAtIDE7ICovCisJYXRvbWljX3NldCgmcmZkX3JpbmctPm5leHRfdG9fdXNlLCAwKTsKKworCS8qIGluaXQgUlJEIHJpbmcgKi8KKwlycmRfcmluZy0+ZG1hID0gcmZkX3JpbmctPmRtYSArIHJmZF9yaW5nLT5zaXplOworCW9mZnNldCA9IChycmRfcmluZy0+ZG1hICYgMHg3KSA/ICg4IC0gKHJyZF9yaW5nLT5kbWEgJiAweDcpKSA6IDA7CisJcnJkX3JpbmctPmRtYSArPSBvZmZzZXQ7CisJcnJkX3JpbmctPmRlc2MgPSAodTggKikgcmZkX3JpbmctPmRlc2MgKyAocmZkX3JpbmctPnNpemUgKyBvZmZzZXQpOworCXJyZF9yaW5nLT5zaXplID0gc2l6ZW9mKHN0cnVjdCByeF9yZXR1cm5fZGVzYykgKiBycmRfcmluZy0+Y291bnQ7CisJcnJkX3JpbmctPm5leHRfdG9fdXNlID0gMDsKKwlhdG9taWNfc2V0KCZycmRfcmluZy0+bmV4dF90b19jbGVhbiwgMCk7CisKKwkvKiBpbml0IENNQiAqLworCWFkYXB0ZXItPmNtYi5kbWEgPSBycmRfcmluZy0+ZG1hICsgcnJkX3JpbmctPnNpemU7CisJb2Zmc2V0ID0gKGFkYXB0ZXItPmNtYi5kbWEgJiAweDcpID8gKDggLSAoYWRhcHRlci0+Y21iLmRtYSAmIDB4NykpIDogMDsKKwlhZGFwdGVyLT5jbWIuZG1hICs9IG9mZnNldDsKKwlhZGFwdGVyLT5jbWIuY21iID0KKwkgICAgKHN0cnVjdCBjb2Fsc19tc2dfYmxvY2sgKikgKCh1OCAqKSBycmRfcmluZy0+ZGVzYyArCisJCQkJICAgKHJyZF9yaW5nLT5zaXplICsgb2Zmc2V0KSk7CisKKwkvKiBpbml0IFNNQiAqLworCWFkYXB0ZXItPnNtYi5kbWEgPSBhZGFwdGVyLT5jbWIuZG1hICsgc2l6ZW9mKHN0cnVjdCBjb2Fsc19tc2dfYmxvY2spOworCW9mZnNldCA9IChhZGFwdGVyLT5zbWIuZG1hICYgMHg3KSA/ICg4IC0gKGFkYXB0ZXItPnNtYi5kbWEgJiAweDcpKSA6IDA7CisJYWRhcHRlci0+c21iLmRtYSArPSBvZmZzZXQ7CisJYWRhcHRlci0+c21iLnNtYiA9IChzdHJ1Y3Qgc3RhdHNfbXNnX2Jsb2NrICopCisJICAgICgodTggKikgYWRhcHRlci0+Y21iLmNtYiArIChzaXplb2Yoc3RydWN0IGNvYWxzX21zZ19ibG9jaykgKyBvZmZzZXQpKTsKKworCXJldHVybiBBVEwxX1NVQ0NFU1M7CisKK2Vycl9ub21lbToKKwlrZnJlZSh0cGRfcmluZy0+YnVmZmVyX2luZm8pOworCXJldHVybiAtRU5PTUVNOworfQorCisvKgorICogYXRsMV9pcnFfZW5hYmxlIC0gRW5hYmxlIGRlZmF1bHQgaW50ZXJydXB0IGdlbmVyYXRpb24gc2V0dGluZ3MKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBhdGwxX2lycV9lbmFibGUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZhZGFwdGVyLT5pcnFfc2VtKSkpCisJCWlvd3JpdGUzMihJTVJfTk9STUFMX01BU0ssIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKK30KKworc3RhdGljIHZvaWQgYXRsMV9jbGVhcl9waHlfaW50KHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTE2IHBoeV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCWF0bDFfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgMTksICZwaHlfZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhdGwxX2luY19zbWIoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3Qgc3RhdHNfbXNnX2Jsb2NrICpzbWIgPSBhZGFwdGVyLT5zbWIuc21iOworCisJLyogRmlsbCBvdXQgdGhlIE9TIHN0YXRpc3RpY3Mgc3RydWN0dXJlICovCisJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9wYWNrZXRzICs9IHNtYi0+cnhfb2s7CisJYWRhcHRlci0+c29mdF9zdGF0cy50eF9wYWNrZXRzICs9IHNtYi0+dHhfb2s7CisJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9ieXRlcyArPSBzbWItPnJ4X2J5dGVfY250OworCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfYnl0ZXMgKz0gc21iLT50eF9ieXRlX2NudDsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLm11bHRpY2FzdCArPSBzbWItPnJ4X21jYXN0OworCWFkYXB0ZXItPnNvZnRfc3RhdHMuY29sbGlzaW9ucyArPSAoc21iLT50eF8xX2NvbCArCisJCQkJCSAgIHNtYi0+dHhfMl9jb2wgKiAyICsKKwkJCQkJICAgc21iLT50eF9sYXRlX2NvbCArCisJCQkJCSAgIHNtYi0+dHhfYWJvcnRfY29sICoKKwkJCQkJICAgYWRhcHRlci0+aHcubWF4X3JldHJ5KTsKKworCS8qIFJ4IEVycm9ycyAqLworCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZXJyb3JzICs9IChzbWItPnJ4X2ZyYWcgKworCQkJCQkgIHNtYi0+cnhfZmNzX2VyciArCisJCQkJCSAgc21iLT5yeF9sZW5fZXJyICsKKwkJCQkJICBzbWItPnJ4X3N6X292ICsKKwkJCQkJICBzbWItPnJ4X3J4Zl9vdiArCisJCQkJCSAgc21iLT5yeF9ycmRfb3YgKyBzbWItPnJ4X2FsaWduX2Vycik7CisJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9maWZvX2Vycm9ycyArPSBzbWItPnJ4X3J4Zl9vdjsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgKz0gc21iLT5yeF9sZW5fZXJyOworCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfY3JjX2Vycm9ycyArPSBzbWItPnJ4X2Zjc19lcnI7CisJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gc21iLT5yeF9hbGlnbl9lcnI7CisJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IChzbWItPnJ4X3JyZF9vdiArCisJCQkJCQkgc21iLT5yeF9yeGZfb3YpOworCisJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9wYXVzZSArPSBzbWItPnJ4X3BhdXNlOworCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfcnJkX292ICs9IHNtYi0+cnhfcnJkX292OworCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfdHJ1bmMgKz0gc21iLT5yeF9zel9vdjsKKworCS8qIFR4IEVycm9ycyAqLworCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfZXJyb3JzICs9IChzbWItPnR4X2xhdGVfY29sICsKKwkJCQkJICBzbWItPnR4X2Fib3J0X2NvbCArCisJCQkJCSAgc21iLT50eF91bmRlcnJ1biArIHNtYi0+dHhfdHJ1bmMpOworCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfZmlmb19lcnJvcnMgKz0gc21iLT50eF91bmRlcnJ1bjsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IHNtYi0+dHhfYWJvcnRfY29sOworCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfd2luZG93X2Vycm9ycyArPSBzbWItPnR4X2xhdGVfY29sOworCisJYWRhcHRlci0+c29mdF9zdGF0cy5leGNlY29sICs9IHNtYi0+dHhfYWJvcnRfY29sOworCWFkYXB0ZXItPnNvZnRfc3RhdHMuZGVmZmVyICs9IHNtYi0+dHhfZGVmZXI7CisJYWRhcHRlci0+c29mdF9zdGF0cy5zY2MgKz0gc21iLT50eF8xX2NvbDsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLm1jYyArPSBzbWItPnR4XzJfY29sOworCWFkYXB0ZXItPnNvZnRfc3RhdHMubGF0ZWNvbCArPSBzbWItPnR4X2xhdGVfY29sOworCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfdW5kZXJ1biArPSBzbWItPnR4X3VuZGVycnVuOworCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfdHJ1bmMgKz0gc21iLT50eF90cnVuYzsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X3BhdXNlICs9IHNtYi0+dHhfcGF1c2U7CisKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfcGFja2V0cyA9IGFkYXB0ZXItPnNvZnRfc3RhdHMucnhfcGFja2V0czsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfcGFja2V0cyA9IGFkYXB0ZXItPnNvZnRfc3RhdHMudHhfcGFja2V0czsKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfYnl0ZXMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2J5dGVzOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9ieXRlcyA9IGFkYXB0ZXItPnNvZnRfc3RhdHMudHhfYnl0ZXM7CisJYWRhcHRlci0+bmV0X3N0YXRzLm11bHRpY2FzdCA9IGFkYXB0ZXItPnNvZnRfc3RhdHMubXVsdGljYXN0OworCWFkYXB0ZXItPm5ldF9zdGF0cy5jb2xsaXNpb25zID0gYWRhcHRlci0+c29mdF9zdGF0cy5jb2xsaXNpb25zOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9lcnJvcnMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2Vycm9yczsKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfb3Zlcl9lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2NyY19lcnJvcnM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9CisJICAgIGFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZnJhbWVfZXJyb3JzOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9maWZvX2Vycm9ycyA9IGFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZmlmb19lcnJvcnM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2Vycm9ycyA9IGFkYXB0ZXItPnNvZnRfc3RhdHMudHhfZXJyb3JzOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9maWZvX2Vycm9ycyA9IGFkYXB0ZXItPnNvZnRfc3RhdHMudHhfZmlmb19lcnJvcnM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0KKwkgICAgYWRhcHRlci0+c29mdF9zdGF0cy50eF9hYm9ydGVkX2Vycm9yczsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfd2luZG93X2Vycm9ycyA9CisJICAgIGFkYXB0ZXItPnNvZnRfc3RhdHMudHhfd2luZG93X2Vycm9yczsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzOworfQorCitzdGF0aWMgdm9pZCBhdGwxX3J4X2NoZWNrc3VtKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCXN0cnVjdCByeF9yZXR1cm5fZGVzYyAqcnJkLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCWlmICh1bmxpa2VseShycmQtPnBrdF9mbGcgJiBQQUNLRVRfRkxBR19FUlIpKSB7CisJCWlmIChycmQtPmVycl9mbGcgJiAoRVJSX0ZMQUdfQ1JDIHwgRVJSX0ZMQUdfVFJVTkMgfAorCQkJCQlFUlJfRkxBR19DT0RFIHwgRVJSX0ZMQUdfT1YpKSB7CisJCQlhZGFwdGVyLT5od19jc3VtX2VycisrOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByeCBjaGVja3N1bSBlcnJvclxuIiwKKwkJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIG5vdCBJUHY0ICovCisJaWYgKCEocnJkLT5wa3RfZmxnICYgUEFDS0VUX0ZMQUdfSVBWNCkpCisJCS8qIGNoZWNrc3VtIGlzIGludmFsaWQsIGJ1dCBpdCdzIG5vdCBhbiBJUHY0IHBrdCwgc28gb2sgKi8KKwkJcmV0dXJuOworCisJLyogSVB2NCBwYWNrZXQgKi8KKwlpZiAobGlrZWx5KCEocnJkLT5lcnJfZmxnICYKKwkJKEVSUl9GTEFHX0lQX0NIS1NVTSB8IEVSUl9GTEFHX0w0X0NIS1NVTSkpKSkgeworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQlhZGFwdGVyLT5od19jc3VtX2dvb2QrKzsKKwkJcmV0dXJuOworCX0KKworCS8qIElQdjQsIGJ1dCBoYXJkd2FyZSB0aGlua3MgaXRzIGNoZWNrc3VtIGlzIHdyb25nICovCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBodyBjc3VtIHdyb25nIHBrdF9mbGFnOiV4LCBlcnJfZmxhZzoleFxuIiwKKwkJYXRsMV9kcml2ZXJfbmFtZSwgcnJkLT5wa3RfZmxnLCBycmQtPmVycl9mbGcpOworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fQ09NUExFVEU7CisJc2tiLT5jc3VtID0gaHRvbnMocnJkLT54c3oueHN1bV9zei5yeF9jaGtzdW0pOworCWFkYXB0ZXItPmh3X2NzdW1fZXJyKys7CisJcmV0dXJuOworfQorCisvKgorICogYXRsMV9hbGxvY19yeF9idWZmZXJzIC0gUmVwbGFjZSB1c2VkIHJlY2VpdmUgYnVmZmVycworICogQGFkYXB0ZXI6IGFkZHJlc3Mgb2YgYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHUxNiBhdGwxX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IGF0bDFfYnVmZmVyICpidWZmZXJfaW5mbywgKm5leHRfaW5mbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUxNiBudW1fYWxsb2MgPSAwOworCXUxNiByZmRfbmV4dF90b191c2UsIG5leHRfbmV4dDsKKwlzdHJ1Y3QgcnhfZnJlZV9kZXNjICpyZmRfZGVzYzsKKworCW5leHRfbmV4dCA9IHJmZF9uZXh0X3RvX3VzZSA9IGF0b21pY19yZWFkKCZyZmRfcmluZy0+bmV4dF90b191c2UpOworCWlmICgrK25leHRfbmV4dCA9PSByZmRfcmluZy0+Y291bnQpCisJCW5leHRfbmV4dCA9IDA7CisJYnVmZmVyX2luZm8gPSAmcmZkX3JpbmctPmJ1ZmZlcl9pbmZvW3JmZF9uZXh0X3RvX3VzZV07CisJbmV4dF9pbmZvID0gJnJmZF9yaW5nLT5idWZmZXJfaW5mb1tuZXh0X25leHRdOworCisJd2hpbGUgKCFidWZmZXJfaW5mby0+YWxsb2NlZCAmJiAhbmV4dF9pbmZvLT5hbGxvY2VkKSB7CisJCWlmIChidWZmZXJfaW5mby0+c2tiKSB7CisJCQlidWZmZXJfaW5mby0+YWxsb2NlZCA9IDE7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQlyZmRfZGVzYyA9IEFUTDFfUkZEX0RFU0MocmZkX3JpbmcsIHJmZF9uZXh0X3RvX3VzZSk7CisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihhZGFwdGVyLT5yeF9idWZmZXJfbGVuICsgTkVUX0lQX0FMSUdOKTsKKwkJaWYgKHVubGlrZWx5KCFza2IpKSB7CS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQgKi8KKwkJCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIE1ha2UgYnVmZmVyIGFsaWdubWVudCAyIGJleW9uZCBhIDE2IGJ5dGUgYm91bmRhcnkKKwkJICogdGhpcyB3aWxsIHJlc3VsdCBpbiBhIDE2IGJ5dGUgYWxpZ25lZCBJUCBoZWFkZXIgYWZ0ZXIKKwkJICogdGhlIDE0IGJ5dGUgTUFDIGhlYWRlciBpcyByZW1vdmVkCisJCSAqLworCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisJCXNrYi0+ZGV2ID0gbmV0ZGV2OworCisJCWJ1ZmZlcl9pbmZvLT5hbGxvY2VkID0gMTsKKwkJYnVmZmVyX2luZm8tPnNrYiA9IHNrYjsKKwkJYnVmZmVyX2luZm8tPmxlbmd0aCA9ICh1MTYpIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47CisJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKTsKKwkJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhICYgflBBR0VfTUFTSzsKKwkJYnVmZmVyX2luZm8tPmRtYSA9IHBjaV9tYXBfcGFnZShwZGV2LCBwYWdlLCBvZmZzZXQsCisJCQkJCQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuLAorCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcmZkX2Rlc2MtPmJ1ZmZlcl9hZGRyID0gY3B1X3RvX2xlNjQoYnVmZmVyX2luZm8tPmRtYSk7CisJCXJmZF9kZXNjLT5idWZfbGVuID0gY3B1X3RvX2xlMTYoYWRhcHRlci0+cnhfYnVmZmVyX2xlbik7CisJCXJmZF9kZXNjLT5jb2FsZXNlID0gMDsKKworbmV4dDoKKwkJcmZkX25leHRfdG9fdXNlID0gbmV4dF9uZXh0OworCQlpZiAodW5saWtlbHkoKytuZXh0X25leHQgPT0gcmZkX3JpbmctPmNvdW50KSkKKwkJCW5leHRfbmV4dCA9IDA7CisKKwkJYnVmZmVyX2luZm8gPSAmcmZkX3JpbmctPmJ1ZmZlcl9pbmZvW3JmZF9uZXh0X3RvX3VzZV07CisJCW5leHRfaW5mbyA9ICZyZmRfcmluZy0+YnVmZmVyX2luZm9bbmV4dF9uZXh0XTsKKwkJbnVtX2FsbG9jKys7CisJfQorCisJaWYgKG51bV9hbGxvYykgeworCQkvKgorCQkgKiBGb3JjZSBtZW1vcnkgd3JpdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSBsZXR0aW5nIGgvdworCQkgKiBrbm93IHRoZXJlIGFyZSBuZXcgZGVzY3JpcHRvcnMgdG8gZmV0Y2guICAoT25seQorCQkgKiBhcHBsaWNhYmxlIGZvciB3ZWFrLW9yZGVyZWQgbWVtb3J5IG1vZGVsIGFyY2hzLAorCQkgKiBzdWNoIGFzIElBLTY0KS4KKwkJICovCisJCXdtYigpOworCQlhdG9taWNfc2V0KCZyZmRfcmluZy0+bmV4dF90b191c2UsIChpbnQpcmZkX25leHRfdG9fdXNlKTsKKwl9CisJcmV0dXJuIG51bV9hbGxvYzsKK30KKworc3RhdGljIHZvaWQgYXRsMV9pbnRyX3J4KHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGksIGNvdW50OworCXUxNiBsZW5ndGg7CisJdTE2IHJyZF9uZXh0X3RvX2NsZWFuOworCXUzMiB2YWx1ZTsKKwlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7CisJc3RydWN0IGF0bDFfcnJkX3JpbmcgKnJyZF9yaW5nID0gJmFkYXB0ZXItPnJyZF9yaW5nOworCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHJ4X3JldHVybl9kZXNjICpycmQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWNvdW50ID0gMDsKKworCXJyZF9uZXh0X3RvX2NsZWFuID0gYXRvbWljX3JlYWQoJnJyZF9yaW5nLT5uZXh0X3RvX2NsZWFuKTsKKworCXdoaWxlICgxKSB7CisJCXJyZCA9IEFUTDFfUlJEX0RFU0MocnJkX3JpbmcsIHJyZF9uZXh0X3RvX2NsZWFuKTsKKwkJaSA9IDE7CisJCWlmIChsaWtlbHkocnJkLT54c3oudmFsaWQpKSB7CS8qIHBhY2tldCB2YWxpZCAqLworY2hrX3JyZDoKKwkJCS8qIGNoZWNrIHJyZCBzdGF0dXMgKi8KKwkJCWlmIChsaWtlbHkocnJkLT5udW1fYnVmID09IDEpKQorCQkJCWdvdG8gcnJkX29rOworCisJCQkvKiBycmQgc2VlbXMgdG8gYmUgYmFkICovCisJCQlpZiAodW5saWtlbHkoaS0tID4gMCkpIHsKKwkJCQkvKiBycmQgbWF5IG5vdCBiZSBETUFlZCBjb21wbGV0ZWx5ICovCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkJIiVzOiBSUkQgbWF5IG5vdCBiZSBETUFlZCBjb21wbGV0ZWx5XG4iLAorCQkJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwkJCQl1ZGVsYXkoMSk7CisJCQkJZ290byBjaGtfcnJkOworCQkJfQorCQkJLyogYmFkIHJyZCAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiYWQgUlJEXG4iLCBhdGwxX2RyaXZlcl9uYW1lKTsKKwkJCS8qIHNlZSBpZiB1cGRhdGUgUkZEIGluZGV4ICovCisJCQlpZiAocnJkLT5udW1fYnVmID4gMSkgeworCQkJCXUxNiBudW1fYnVmOworCQkJCW51bV9idWYgPQorCQkJCSAgICAocnJkLT54c3oueHN1bV9zei5wa3Rfc2l6ZSArCisJCQkJICAgICBhZGFwdGVyLT5yeF9idWZmZXJfbGVuIC0KKwkJCQkgICAgIDEpIC8gYWRhcHRlci0+cnhfYnVmZmVyX2xlbjsKKwkJCQlpZiAocnJkLT5udW1fYnVmID09IG51bV9idWYpIHsKKwkJCQkJLyogY2xlYW4gYWxsb2MgZmxhZyBmb3IgYmFkIHJyZCAqLworCQkJCQl3aGlsZSAocmZkX3JpbmctPm5leHRfdG9fY2xlYW4gIT0KKwkJCQkJICAgICAgIChycmQtPmJ1Zl9pbmR4ICsgbnVtX2J1ZikpIHsKKwkJCQkJCXJmZF9yaW5nLT5idWZmZXJfaW5mb1tyZmRfcmluZy0+CisJCQkJCQkJCSAgICAgIG5leHRfdG9fY2xlYW5dLmFsbG9jZWQgPSAwOworCQkJCQkJaWYgKCsrcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPT0KKwkJCQkJCSAgICByZmRfcmluZy0+Y291bnQpIHsKKwkJCQkJCQlyZmRfcmluZy0+CisJCQkJCQkJICAgIG5leHRfdG9fY2xlYW4gPSAwOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvKiB1cGRhdGUgcnJkICovCisJCQlycmQtPnhzei52YWxpZCA9IDA7CisJCQlpZiAoKytycmRfbmV4dF90b19jbGVhbiA9PSBycmRfcmluZy0+Y291bnQpCisJCQkJcnJkX25leHRfdG9fY2xlYW4gPSAwOworCQkJY291bnQrKzsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgewkvKiBjdXJyZW50IHJyZCBzdGlsbCBub3QgYmUgdXBkYXRlZCAqLworCisJCQlicmVhazsKKwkJfQorcnJkX29rOgorCQkvKiBjbGVhbiBhbGxvYyBmbGFnIGZvciBiYWQgcnJkICovCisJCXdoaWxlIChyZmRfcmluZy0+bmV4dF90b19jbGVhbiAhPSBycmQtPmJ1Zl9pbmR4KSB7CisJCQlyZmRfcmluZy0+YnVmZmVyX2luZm9bcmZkX3JpbmctPm5leHRfdG9fY2xlYW5dLmFsbG9jZWQgPQorCQkJICAgIDA7CisJCQlpZiAoKytyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9PSByZmRfcmluZy0+Y291bnQpCisJCQkJcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCQl9CisKKwkJYnVmZmVyX2luZm8gPSAmcmZkX3JpbmctPmJ1ZmZlcl9pbmZvW3JyZC0+YnVmX2luZHhdOworCQlpZiAoKytyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9PSByZmRfcmluZy0+Y291bnQpCisJCQlyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7CisKKwkJLyogdXBkYXRlIHJyZCBuZXh0IHRvIGNsZWFuICovCisJCWlmICgrK3JyZF9uZXh0X3RvX2NsZWFuID09IHJyZF9yaW5nLT5jb3VudCkKKwkJCXJyZF9uZXh0X3RvX2NsZWFuID0gMDsKKwkJY291bnQrKzsKKworCQlpZiAodW5saWtlbHkocnJkLT5wa3RfZmxnICYgUEFDS0VUX0ZMQUdfRVJSKSkgeworCQkJaWYgKCEocnJkLT5lcnJfZmxnICYKKwkJCQkoRVJSX0ZMQUdfSVBfQ0hLU1VNIHwgRVJSX0ZMQUdfTDRfQ0hLU1VNCisJCQkJfCBFUlJfRkxBR19MRU4pKSkgeworCQkJCS8qIHBhY2tldCBlcnJvciwgZG9uJ3QgbmVlZCB1cHN0cmVhbSAqLworCQkJCWJ1ZmZlcl9pbmZvLT5hbGxvY2VkID0gMDsKKwkJCQlycmQtPnhzei52YWxpZCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBHb29kIFJlY2VpdmUgKi8KKwkJcGNpX3VubWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgYnVmZmVyX2luZm8tPmRtYSwKKwkJCSAgICAgICBidWZmZXJfaW5mby0+bGVuZ3RoLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlza2IgPSBidWZmZXJfaW5mby0+c2tiOworCQlsZW5ndGggPSBsZTE2X3RvX2NwdShycmQtPnhzei54c3VtX3N6LnBrdF9zaXplKTsKKworCQlza2JfcHV0KHNrYiwgbGVuZ3RoIC0gRVRIRVJORVRfRkNTX1NJWkUpOworCisJCS8qIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCAqLworCQlhdGwxX3J4X2NoZWNrc3VtKGFkYXB0ZXIsIHJyZCwgc2tiKTsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgYWRhcHRlci0+bmV0ZGV2KTsKKworCQlpZiAoYWRhcHRlci0+dmxncnAgJiYgKHJyZC0+cGt0X2ZsZyAmIFBBQ0tFVF9GTEFHX1ZMQU5fSU5TKSkgeworCQkJdTE2IHZsYW5fdGFnID0gKHJyZC0+dmxhbl90YWcgPj4gNCkgfAorCQkJCQkoKHJyZC0+dmxhbl90YWcgJiA3KSA8PCAxMykgfAorCQkJCQkoKHJyZC0+dmxhbl90YWcgJiA4KSA8PCA5KTsKKwkJCXZsYW5faHdhY2NlbF9yeChza2IsIGFkYXB0ZXItPnZsZ3JwLCB2bGFuX3RhZyk7CisJCX0gZWxzZQorCQkJbmV0aWZfcngoc2tiKTsKKworCQkvKiBsZXQgcHJvdG9jb2wgbGF5ZXIgZnJlZSBza2IgKi8KKwkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJCWJ1ZmZlcl9pbmZvLT5hbGxvY2VkID0gMDsKKwkJcnJkLT54c3oudmFsaWQgPSAwOworCisJCWFkYXB0ZXItPm5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfQorCisJYXRvbWljX3NldCgmcnJkX3JpbmctPm5leHRfdG9fY2xlYW4sIHJyZF9uZXh0X3RvX2NsZWFuKTsKKworCWF0bDFfYWxsb2NfcnhfYnVmZmVycyhhZGFwdGVyKTsKKworCS8qIHVwZGF0ZSBtYWlsYm94ID8gKi8KKwlpZiAoY291bnQpIHsKKwkJdTMyIHRwZF9uZXh0X3RvX3VzZTsKKwkJdTMyIHJmZF9uZXh0X3RvX3VzZTsKKwkJdTMyIHJyZF9uZXh0X3RvX2NsZWFuOworCisJCXNwaW5fbG9jaygmYWRhcHRlci0+bWJfbG9jayk7CisKKwkJdHBkX25leHRfdG9fdXNlID0gYXRvbWljX3JlYWQoJmFkYXB0ZXItPnRwZF9yaW5nLm5leHRfdG9fdXNlKTsKKwkJcmZkX25leHRfdG9fdXNlID0KKwkJICAgIGF0b21pY19yZWFkKCZhZGFwdGVyLT5yZmRfcmluZy5uZXh0X3RvX3VzZSk7CisJCXJyZF9uZXh0X3RvX2NsZWFuID0KKwkJICAgIGF0b21pY19yZWFkKCZhZGFwdGVyLT5ycmRfcmluZy5uZXh0X3RvX2NsZWFuKTsKKwkJdmFsdWUgPSAoKHJmZF9uZXh0X3RvX3VzZSAmIE1CX1JGRF9QUk9EX0lORFhfTUFTSykgPDwKKwkJCU1CX1JGRF9QUk9EX0lORFhfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgocnJkX25leHRfdG9fY2xlYW4gJiBNQl9SUkRfQ09OU19JTkRYX01BU0spIDw8CisJCQlNQl9SUkRfQ09OU19JTkRYX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoKHRwZF9uZXh0X3RvX3VzZSAmIE1CX1RQRF9QUk9EX0lORFhfTUFTSykgPDwKKwkJCU1CX1RQRF9QUk9EX0lORFhfU0hJRlQpOworCQlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFJTEJPWCk7CisJCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5tYl9sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfaW50cl90eChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZyA9ICZhZGFwdGVyLT50cGRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCXUxNiBzd190cGRfbmV4dF90b19jbGVhbjsKKwl1MTYgY21iX3RwZF9uZXh0X3RvX2NsZWFuOworCXU4IHVwZGF0ZSA9IDA7CisKKwlzd190cGRfbmV4dF90b19jbGVhbiA9IGF0b21pY19yZWFkKCZ0cGRfcmluZy0+bmV4dF90b19jbGVhbik7CisJY21iX3RwZF9uZXh0X3RvX2NsZWFuID0gbGUxNl90b19jcHUoYWRhcHRlci0+Y21iLmNtYi0+dHBkX2NvbnNfaWR4KTsKKworCXdoaWxlIChjbWJfdHBkX25leHRfdG9fY2xlYW4gIT0gc3dfdHBkX25leHRfdG9fY2xlYW4pIHsKKwkJc3RydWN0IHR4X3BhY2tldF9kZXNjICp0cGQ7CisJCXVwZGF0ZSA9IDE7CisJCXRwZCA9IEFUTDFfVFBEX0RFU0ModHBkX3JpbmcsIHN3X3RwZF9uZXh0X3RvX2NsZWFuKTsKKwkJYnVmZmVyX2luZm8gPSAmdHBkX3JpbmctPmJ1ZmZlcl9pbmZvW3N3X3RwZF9uZXh0X3RvX2NsZWFuXTsKKwkJaWYgKGJ1ZmZlcl9pbmZvLT5kbWEpIHsKKwkJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIGJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkJICAgICAgIGJ1ZmZlcl9pbmZvLT5sZW5ndGgsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJYnVmZmVyX2luZm8tPmRtYSA9IDA7CisJCX0KKworCQlpZiAoYnVmZmVyX2luZm8tPnNrYikgeworCQkJZGV2X2tmcmVlX3NrYl9pcnEoYnVmZmVyX2luZm8tPnNrYik7CisJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKKwkJfQorCQl0cGQtPmJ1ZmZlcl9hZGRyID0gMDsKKwkJdHBkLT5kZXNjLmRhdGEgPSAwOworCisJCWlmICgrK3N3X3RwZF9uZXh0X3RvX2NsZWFuID09IHRwZF9yaW5nLT5jb3VudCkKKwkJCXN3X3RwZF9uZXh0X3RvX2NsZWFuID0gMDsKKwl9CisJYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fY2xlYW4sIHN3X3RwZF9uZXh0X3RvX2NsZWFuKTsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGFkYXB0ZXItPm5ldGRldikKKwkgICAgJiYgbmV0aWZfY2Fycmllcl9vayhhZGFwdGVyLT5uZXRkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGFkYXB0ZXItPm5ldGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfY2hlY2tfZm9yX2xpbmsoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXUxNiBwaHlfZGF0YSA9IDA7CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPmxvY2spOworCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gZmFsc2U7CisJYXRsMV9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwlhdGwxX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKworCS8qIG5vdGlmeSB1cHBlciBsYXllciBsaW5rIGRvd24gQVNBUCAqLworCWlmICghKHBoeV9kYXRhICYgQk1TUl9MU1RBVFVTKSkgewkvKiBMaW5rIERvd24gKi8KKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewkvKiBvbGQgbGluayBzdGF0ZTogVXAgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIGlzIGRvd25cbiIsCisJCQkgICAgICAgYXRsMV9kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lKTsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOworCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwkJfQorCX0KKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5saW5rX2NoZ190YXNrKTsKK30KKworLyoKKyAqIGF0bDFfaW50ciAtIEludGVycnVwdCBIYW5kbGVyCisgKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAZGF0YTogcG9pbnRlciB0byBhIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwdF9yZWdzOiBDUFUgcmVnaXN0ZXJzIHN0cnVjdHVyZQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYXRsMV9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJLypzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpLT5wcml2OyovCisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRhdGEpOworCXUzMiBzdGF0dXM7CisJdTggdXBkYXRlX3J4OworCWludCBtYXhfaW50cyA9IDEwOworCisJc3RhdHVzID0gYWRhcHRlci0+Y21iLmNtYi0+aW50X3N0YXRzOworCWlmICghc3RhdHVzKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwl1cGRhdGVfcnggPSAwOworCisJZG8geworCQkvKiBjbGVhciBDTUIgaW50ZXJydXB0IHN0YXR1cyBhdCBvbmNlICovCisJCWFkYXB0ZXItPmNtYi5jbWItPmludF9zdGF0cyA9IDA7CisKKwkJaWYgKHN0YXR1cyAmIElTUl9HUEhZKQkvKiBjbGVhciBwaHkgc3RhdHVzICovCisJCQlhdGwxX2NsZWFyX3BoeV9pbnQoYWRhcHRlcik7CisKKwkJLyogY2xlYXIgSVNSIHN0YXR1cywgYW5kIEVuYWJsZSBDTUIgRE1BL0Rpc2FibGUgSW50ZXJydXB0ICovCisJCWlvd3JpdGUzMihzdGF0dXMgfCBJU1JfRElTX0lOVCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOworCisJCS8qIGNoZWNrIGlmIFNNQiBpbnRyICovCisJCWlmIChzdGF0dXMgJiBJU1JfU01CKQorCQkJYXRsMV9pbmNfc21iKGFkYXB0ZXIpOworCisJCS8qIGNoZWNrIGlmIFBDSUUgUEhZIExpbmsgZG93biAqLworCQlpZiAoc3RhdHVzICYgSVNSX1BIWV9MSU5LRE9XTikgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwY2llIHBoeSBsaW5rIGRvd24gJXhcbiIsCisJCQkJYXRsMV9kcml2ZXJfbmFtZSwgc3RhdHVzKTsKKwkJCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsJLyogcmVzZXQgTUFDICovCisJCQkJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKKwkJCQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5wY2llX2RtYV90b19yc3RfdGFzayk7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQl9CisKKwkJLyogY2hlY2sgaWYgRE1BIHJlYWQvd3JpdGUgZXJyb3IgPyAqLworCQlpZiAoc3RhdHVzICYgKElTUl9ETUFSX1RPX1JTVCB8IElTUl9ETUFXX1RPX1JTVCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJIiVzOiBwY2llIERNQSByL3cgZXJyb3IgKHN0YXR1cyA9IDB4JXgpXG4iLAorCQkJCWF0bDFfZHJpdmVyX25hbWUsIHN0YXR1cyk7CisJCQlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOworCQkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cGNpZV9kbWFfdG9fcnN0X3Rhc2spOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJLyogbGluayBldmVudCAqLworCQlpZiAoc3RhdHVzICYgSVNSX0dQSFkpIHsKKwkJCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCWF0bDFfY2hlY2tfZm9yX2xpbmsoYWRhcHRlcik7CisJCX0KKworCQkvKiB0cmFuc21pdCBldmVudCAqLworCQlpZiAoc3RhdHVzICYgSVNSX0NNQl9UWCkKKwkJCWF0bDFfaW50cl90eChhZGFwdGVyKTsKKworCQkvKiByeCBleGNlcHRpb24gKi8KKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIChJU1JfUlhGX09WIHwgSVNSX1JGRF9VTlJVTiB8CisJCQkJSVNSX1JSRF9PViB8IElTUl9IT1NUX1JGRF9VTlJVTiB8CisJCQkJSVNSX0hPU1RfUlJEX09WIHwgSVNSX0NNQl9SWCkpKSB7CisJCQlpZiAoc3RhdHVzICYKKwkJCSAgICAoSVNSX1JYRl9PViB8IElTUl9SRkRfVU5SVU4gfCBJU1JfUlJEX09WIHwKKwkJCSAgICAgSVNSX0hPU1RfUkZEX1VOUlVOIHwgSVNSX0hPU1RfUlJEX09WKSkKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSIlczogcnggZXhjZXB0aW9uOiBzdGF0dXMgPSAweCV4XG4iLAorCQkJCQlhdGwxX2RyaXZlcl9uYW1lLCBzdGF0dXMpOworCQkJYXRsMV9pbnRyX3J4KGFkYXB0ZXIpOworCQl9CisKKwkJaWYgKC0tbWF4X2ludHMgPCAwKQorCQkJYnJlYWs7CisKKwl9IHdoaWxlICgoc3RhdHVzID0gYWRhcHRlci0+Y21iLmNtYi0+aW50X3N0YXRzKSk7CisKKwkvKiByZS1lbmFibGUgSW50ZXJydXB0ICovCisJaW93cml0ZTMyKElTUl9ESVNfU01CIHwgSVNSX0RJU19ETUEsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBhdGwxX3NldF9tdWx0aSAtIE11bHRpY2FzdCBhbmQgUHJvbWlzY3VvdXMgbW9kZSBzZXQKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGUgc2V0X211bHRpIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgbXVsdGljYXN0IGFkZHJlc3MKKyAqIGxpc3Qgb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGZsYWdzIGFyZSB1cGRhdGVkLiAgVGhpcyByb3V0aW5lIGlzCisgKiByZXNwb25zaWJsZSBmb3IgY29uZmlndXJpbmcgdGhlIGhhcmR3YXJlIGZvciBwcm9wZXIgbXVsdGljYXN0LAorICogcHJvbWlzY3VvdXMgbW9kZSwgYW5kIGFsbC1tdWx0aSBiZWhhdmlvci4KKyAqLworc3RhdGljIHZvaWQgYXRsMV9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IGRldl9tY19saXN0ICptY19wdHI7CisJdTMyIHJjdGw7CisJdTMyIGhhc2hfdmFsdWU7CisKKwkvKiBDaGVjayBmb3IgUHJvbWlzY3VvdXMgYW5kIEFsbCBNdWx0aWNhc3QgbW9kZXMgKi8KKwlyY3RsID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCXJjdGwgfD0gTUFDX0NUUkxfUFJPTUlTX0VOOworCWVsc2UgaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJcmN0bCB8PSBNQUNfQ1RSTF9NQ19BTExfRU47CisJCXJjdGwgJj0gfk1BQ19DVFJMX1BST01JU19FTjsKKwl9IGVsc2UKKwkJcmN0bCAmPSB+KE1BQ19DVFJMX1BST01JU19FTiB8IE1BQ19DVFJMX01DX0FMTF9FTik7CisKKwlpb3dyaXRlMzIocmN0bCwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCisJLyogY2xlYXIgdGhlIG9sZCBzZXR0aW5ncyBmcm9tIHRoZSBtdWx0aWNhc3QgaGFzaCB0YWJsZSAqLworCWlvd3JpdGUzMigwLCBody0+aHdfYWRkciArIFJFR19SWF9IQVNIX1RBQkxFKTsKKwlpb3dyaXRlMzIoMCwgKGh3LT5od19hZGRyICsgUkVHX1JYX0hBU0hfVEFCTEUpICsgKDEgPDwgMikpOworCisJLyogY29tcHV0ZSBtYyBhZGRyZXNzZXMnIGhhc2ggdmFsdWUgLGFuZCBwdXQgaXQgaW50byBoYXNoIHRhYmxlICovCisJZm9yIChtY19wdHIgPSBuZXRkZXYtPm1jX2xpc3Q7IG1jX3B0cjsgbWNfcHRyID0gbWNfcHRyLT5uZXh0KSB7CisJCWhhc2hfdmFsdWUgPSBhdGwxX2hhc2hfbWNfYWRkcihodywgbWNfcHRyLT5kbWlfYWRkcik7CisJCWF0bDFfaGFzaF9zZXQoaHcsIGhhc2hfdmFsdWUpOworCX0KK30KKworc3RhdGljIHZvaWQgYXRsMV9zZXR1cF9tYWNfY3RybChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiB2YWx1ZTsKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwkvKiBDb25maWcgTUFDIENUUkwgUmVnaXN0ZXIgKi8KKwl2YWx1ZSA9IE1BQ19DVFJMX1RYX0VOIHwgTUFDX0NUUkxfUlhfRU47CisJLyogZHVwbGV4ICovCisJaWYgKEZVTExfRFVQTEVYID09IGFkYXB0ZXItPmxpbmtfZHVwbGV4KQorCQl2YWx1ZSB8PSBNQUNfQ1RSTF9EVVBMWDsKKwkvKiBzcGVlZCAqLworCXZhbHVlIHw9ICgodTMyKSAoKFNQRUVEXzEwMDAgPT0gYWRhcHRlci0+bGlua19zcGVlZCkgPworCQkJIE1BQ19DVFJMX1NQRUVEXzEwMDAgOiBNQUNfQ1RSTF9TUEVFRF8xMF8xMDApIDw8CisJCSAgTUFDX0NUUkxfU1BFRURfU0hJRlQpOworCS8qIGZsb3cgY29udHJvbCAqLworCXZhbHVlIHw9IChNQUNfQ1RSTF9UWF9GTE9XIHwgTUFDX0NUUkxfUlhfRkxPVyk7CisJLyogUEFEICYgQ1JDICovCisJdmFsdWUgfD0gKE1BQ19DVFJMX0FERF9DUkMgfCBNQUNfQ1RSTF9QQUQpOworCS8qIHByZWFtYmxlIGxlbmd0aCAqLworCXZhbHVlIHw9ICgoKHUzMikgYWRhcHRlci0+aHcucHJlYW1ibGVfbGVuCisJCSAgICYgTUFDX0NUUkxfUFJNTEVOX01BU0spIDw8IE1BQ19DVFJMX1BSTUxFTl9TSElGVCk7CisJLyogdmxhbiAqLworCWlmIChhZGFwdGVyLT52bGdycCkKKwkJdmFsdWUgfD0gTUFDX0NUUkxfUk1WX1ZMQU47CisJLyogcnggY2hlY2tzdW0KKwkgICBpZiAoYWRhcHRlci0+cnhfY3N1bSkKKwkgICB2YWx1ZSB8PSBNQUNfQ1RSTF9SWF9DSEtTVU1fRU47CisJICovCisJLyogZmlsdGVyIG1vZGUgKi8KKwl2YWx1ZSB8PSBNQUNfQ1RSTF9CQ19FTjsKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQl2YWx1ZSB8PSBNQUNfQ1RSTF9QUk9NSVNfRU47CisJZWxzZSBpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKwkJdmFsdWUgfD0gTUFDX0NUUkxfTUNfQUxMX0VOOworCS8qIHZhbHVlIHw9IE1BQ19DVFJMX0xPT1BCQUNLOyAqLworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworfQorCitzdGF0aWMgdTMyIGF0bDFfY2hlY2tfbGluayhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXUzMiByZXRfdmFsOworCXUxNiBzcGVlZCwgZHVwbGV4LCBwaHlfZGF0YTsKKwlpbnQgcmVjb25maWcgPSAwOworCisJLyogTUlJX0JNU1IgbXVzdCByZWFkIHR3aWNlICovCisJYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOworCWF0bDFfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwlpZiAoIShwaHlfZGF0YSAmIEJNU1JfTFNUQVRVUykpIHsJLyogbGluayBkb3duICovCisJCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsJLyogb2xkIGxpbmsgc3RhdGU6IFVwICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayBpcyBkb3duXG4iLAorCQkJCWF0bDFfZHJpdmVyX25hbWUpOworCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7CisJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQl9CisJCXJldHVybiBBVEwxX1NVQ0NFU1M7CisJfQorCisJLyogTGluayBVcCAqLworCXJldF92YWwgPSBhdGwxX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAmc3BlZWQsICZkdXBsZXgpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXN3aXRjaCAoaHctPm1lZGlhX3R5cGUpIHsKKwljYXNlIE1FRElBX1RZUEVfMTAwME1fRlVMTDoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMDAgfHwgZHVwbGV4ICE9IEZVTExfRFVQTEVYKQorCQkJcmVjb25maWcgPSAxOworCQlicmVhazsKKwljYXNlIE1FRElBX1RZUEVfMTAwTV9GVUxMOgorCQlpZiAoc3BlZWQgIT0gU1BFRURfMTAwIHx8IGR1cGxleCAhPSBGVUxMX0RVUExFWCkKKwkJCXJlY29uZmlnID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwME1fSEFMRjoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMCB8fCBkdXBsZXggIT0gSEFMRl9EVVBMRVgpCisJCQlyZWNvbmZpZyA9IDE7CisJCWJyZWFrOworCWNhc2UgTUVESUFfVFlQRV8xME1fRlVMTDoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwIHx8IGR1cGxleCAhPSBGVUxMX0RVUExFWCkKKwkJCXJlY29uZmlnID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwTV9IQUxGOgorCQlpZiAoc3BlZWQgIT0gU1BFRURfMTAgfHwgZHVwbGV4ICE9IEhBTEZfRFVQTEVYKQorCQkJcmVjb25maWcgPSAxOworCQlicmVhazsKKwl9CisKKwkvKiBsaW5rIHJlc3VsdCBpcyBvdXIgc2V0dGluZyAqLworCWlmICghcmVjb25maWcpIHsKKwkJaWYgKGFkYXB0ZXItPmxpbmtfc3BlZWQgIT0gc3BlZWQKKwkJICAgIHx8IGFkYXB0ZXItPmxpbmtfZHVwbGV4ICE9IGR1cGxleCkgeworCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IHNwZWVkOworCQkJYWRhcHRlci0+bGlua19kdXBsZXggPSBkdXBsZXg7CisJCQlhdGwxX3NldHVwX21hY19jdHJsKGFkYXB0ZXIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGxpbmsgaXMgdXAgJWQgTWJwcyAlc1xuIiwKKwkJCSAgICAgICBhdGwxX2RyaXZlcl9uYW1lLCBuZXRkZXYtPm5hbWUsCisJCQkgICAgICAgYWRhcHRlci0+bGlua19zcGVlZCwKKwkJCSAgICAgICBhZGFwdGVyLT5saW5rX2R1cGxleCA9PQorCQkJICAgICAgIEZVTExfRFVQTEVYID8gImZ1bGwgZHVwbGV4IiA6ICJoYWxmIGR1cGxleCIpOworCQl9CisJCWlmICghbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CS8qIExpbmsgZG93biAtPiBVcCAqLworCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOworCQl9CisJCXJldHVybiBBVEwxX1NVQ0NFU1M7CisJfQorCisJLyogY2hhbmdlIG9yaWduYWwgbGluayBzdGF0dXMgKi8KKwlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CisJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOworCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJfQorCisJaWYgKGh3LT5tZWRpYV90eXBlICE9IE1FRElBX1RZUEVfQVVUT19TRU5TT1IgJiYKKwkgICAgaHctPm1lZGlhX3R5cGUgIT0gTUVESUFfVFlQRV8xMDAwTV9GVUxMKSB7CisJCXN3aXRjaCAoaHctPm1lZGlhX3R5cGUpIHsKKwkJY2FzZSBNRURJQV9UWVBFXzEwME1fRlVMTDoKKwkJCXBoeV9kYXRhID0gTUlJX0NSX0ZVTExfRFVQTEVYIHwgTUlJX0NSX1NQRUVEXzEwMCB8CisJCQkgICAgICAgICAgIE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQljYXNlIE1FRElBX1RZUEVfMTAwTV9IQUxGOgorCQkJcGh5X2RhdGEgPSBNSUlfQ1JfU1BFRURfMTAwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCWNhc2UgTUVESUFfVFlQRV8xME1fRlVMTDoKKwkJCXBoeV9kYXRhID0KKwkJCSAgICBNSUlfQ1JfRlVMTF9EVVBMRVggfCBNSUlfQ1JfU1BFRURfMTAgfCBNSUlfQ1JfUkVTRVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogTUVESUFfVFlQRV8xME1fSEFMRjogKi8KKwkJCXBoeV9kYXRhID0gTUlJX0NSX1NQRUVEXzEwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCX0KKwkJYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQk1DUiwgcGh5X2RhdGEpOworCQlyZXR1cm4gQVRMMV9TVUNDRVNTOworCX0KKworCS8qIGF1dG8tbmVnLCBpbnNlcnQgdGltZXIgdG8gcmUtY29uZmlnIHBoeSAqLworCWlmICghYWRhcHRlci0+cGh5X3RpbWVyX3BlbmRpbmcpIHsKKwkJYWRhcHRlci0+cGh5X3RpbWVyX3BlbmRpbmcgPSB0cnVlOworCQltb2RfdGltZXIoJmFkYXB0ZXItPnBoeV9jb25maWdfdGltZXIsIGppZmZpZXMgKyAzICogSFopOworCX0KKworCXJldHVybiBBVEwxX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mbG93X2N0cmxfb2xkKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIGhpLCBsbywgdmFsdWU7CisKKwkvKiBSRkQgRmxvdyBDb250cm9sICovCisJdmFsdWUgPSBhZGFwdGVyLT5yZmRfcmluZy5jb3VudDsKKwloaSA9IHZhbHVlIC8gMTY7CisJaWYgKGhpIDwgMikKKwkJaGkgPSAyOworCWxvID0gdmFsdWUgKiA3IC8gODsKKworCXZhbHVlID0gKChoaSAmIFJYUV9SWEZfUEFVU0VfVEhfSElfTUFTSykgPDwgUlhRX1JYRl9QQVVTRV9USF9ISV9TSElGVCkgfAorCSAgICAoKGxvICYgUlhRX1JYRl9QQVVTRV9USF9MT19NQVNLKSA8PCBSWFFfUlhGX1BBVVNFX1RIX0xPX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfUlhRX1JYRl9QQVVTRV9USFJFU0gpOworCisJLyogUlJEIEZsb3cgQ29udHJvbCAqLworCXZhbHVlID0gYWRhcHRlci0+cnJkX3JpbmcuY291bnQ7CisJbG8gPSB2YWx1ZSAvIDE2OworCWhpID0gdmFsdWUgKiA3IC8gODsKKwlpZiAobG8gPCAyKQorCQlsbyA9IDI7CisJdmFsdWUgPSAoKGhpICYgUlhRX1JSRF9QQVVTRV9USF9ISV9NQVNLKSA8PCBSWFFfUlJEX1BBVVNFX1RIX0hJX1NISUZUKSB8CisJICAgICgobG8gJiBSWFFfUlJEX1BBVVNFX1RIX0xPX01BU0spIDw8IFJYUV9SUkRfUEFVU0VfVEhfTE9fU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19SWFFfUlJEX1BBVVNFX1RIUkVTSCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mbG93X2N0cmxfbmV3KHN0cnVjdCBhdGwxX2h3ICpodykKK3sKKwl1MzIgaGksIGxvLCB2YWx1ZTsKKworCS8qIFJYRiBGbG93IENvbnRyb2wgKi8KKwl2YWx1ZSA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX1NSQU1fUlhGX0xFTik7CisJbG8gPSB2YWx1ZSAvIDE2OworCWlmIChsbyA8IDE5MikKKwkJbG8gPSAxOTI7CisJaGkgPSB2YWx1ZSAqIDcgLyA4OworCWlmIChoaSA8IGxvKQorCQloaSA9IGxvICsgMTY7CisJdmFsdWUgPSAoKGhpICYgUlhRX1JYRl9QQVVTRV9USF9ISV9NQVNLKSA8PCBSWFFfUlhGX1BBVVNFX1RIX0hJX1NISUZUKSB8CisJICAgICgobG8gJiBSWFFfUlhGX1BBVVNFX1RIX0xPX01BU0spIDw8IFJYUV9SWEZfUEFVU0VfVEhfTE9fU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfUlhRX1JYRl9QQVVTRV9USFJFU0gpOworCisJLyogUlJEIEZsb3cgQ29udHJvbCAqLworCXZhbHVlID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfU1JBTV9SUkRfTEVOKTsKKwlsbyA9IHZhbHVlIC8gODsKKwloaSA9IHZhbHVlICogNyAvIDg7CisJaWYgKGxvIDwgMikKKwkJbG8gPSAyOworCWlmIChoaSA8IGxvKQorCQloaSA9IGxvICsgMzsKKwl2YWx1ZSA9ICgoaGkgJiBSWFFfUlJEX1BBVVNFX1RIX0hJX01BU0spIDw8IFJYUV9SUkRfUEFVU0VfVEhfSElfU0hJRlQpIHwKKwkgICAgKChsbyAmIFJYUV9SUkRfUEFVU0VfVEhfTE9fTUFTSykgPDwgUlhRX1JSRF9QQVVTRV9USF9MT19TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19SWFFfUlJEX1BBVVNFX1RIUkVTSCk7Cit9CisKKy8qCisgKiBhdGwxX2NvbmZpZ3VyZSAtIENvbmZpZ3VyZSBUcmFuc21pdCZSZWNlaXZlIFVuaXQgYWZ0ZXIgUmVzZXQKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIENvbmZpZ3VyZSB0aGUgVHggL1J4IHVuaXQgb2YgdGhlIE1BQyBhZnRlciBhIHJlc2V0LgorICovCitzdGF0aWMgdTMyIGF0bDFfY29uZmlndXJlKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiB2YWx1ZTsKKworCS8qIGNsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKwlpb3dyaXRlMzIoMHhmZmZmZmZmZiwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOworCisJLyogc2V0IE1BQyBBZGRyZXNzICovCisJdmFsdWUgPSAoKCh1MzIpIGh3LT5tYWNfYWRkclsyXSkgPDwgMjQpIHwKKwkJKCgodTMyKSBody0+bWFjX2FkZHJbM10pIDw8IDE2KSB8CisJCSgoKHUzMikgaHctPm1hY19hZGRyWzRdKSA8PCA4KSB8CisJCSgoKHUzMikgaHctPm1hY19hZGRyWzVdKSk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19NQUNfU1RBX0FERFIpOworCXZhbHVlID0gKCgodTMyKSBody0+bWFjX2FkZHJbMF0pIDw8IDgpIHwgKCgodTMyKSBody0+bWFjX2FkZHJbMV0pKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgKFJFR19NQUNfU1RBX0FERFIgKyA0KSk7CisKKwkvKiB0eCAvIHJ4IHJpbmcgKi8KKworCS8qIEhJIGJhc2UgYWRkcmVzcyAqLworCWlvd3JpdGUzMigodTMyKSAoKGFkYXB0ZXItPnRwZF9yaW5nLmRtYSAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkgPj4gMzIpLAorCQlody0+aHdfYWRkciArIFJFR19ERVNDX0JBU0VfQUREUl9ISSk7CisJLyogTE8gYmFzZSBhZGRyZXNzICovCisJaW93cml0ZTMyKCh1MzIpIChhZGFwdGVyLT5yZmRfcmluZy5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAorCQlody0+aHdfYWRkciArIFJFR19ERVNDX1JGRF9BRERSX0xPKTsKKwlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPnJyZF9yaW5nLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCisJCWh3LT5od19hZGRyICsgUkVHX0RFU0NfUlJEX0FERFJfTE8pOworCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+dHBkX3JpbmcuZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19UUERfQUREUl9MTyk7CisJaW93cml0ZTMyKCh1MzIpIChhZGFwdGVyLT5jbWIuZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19DTUJfQUREUl9MTyk7CisJaW93cml0ZTMyKCh1MzIpIChhZGFwdGVyLT5zbWIuZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19TTUJfQUREUl9MTyk7CisKKwkvKiBlbGVtZW50IGNvdW50ICovCisJdmFsdWUgPSBhZGFwdGVyLT5ycmRfcmluZy5jb3VudDsKKwl2YWx1ZSA8PD0gMTY7CisJdmFsdWUgKz0gYWRhcHRlci0+cmZkX3JpbmcuY291bnQ7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19ERVNDX1JGRF9SUkRfUklOR19TSVpFKTsKKwlpb3dyaXRlMzIoYWRhcHRlci0+dHBkX3JpbmcuY291bnQsIGh3LT5od19hZGRyICsgUkVHX0RFU0NfVFBEX1JJTkdfU0laRSk7CisKKwkvKiBMb2FkIFB0ciAqLworCWlvd3JpdGUzMigxLCBody0+aHdfYWRkciArIFJFR19MT0FEX1BUUik7CisKKwkvKiBjb25maWcgTWFpbGJveCAqLworCXZhbHVlID0gKChhdG9taWNfcmVhZCgmYWRhcHRlci0+dHBkX3JpbmcubmV4dF90b191c2UpCisJCSAgJiBNQl9UUERfUFJPRF9JTkRYX01BU0spIDw8IE1CX1RQRF9QUk9EX0lORFhfU0hJRlQpIHwKKwkgICAgKChhdG9taWNfcmVhZCgmYWRhcHRlci0+cnJkX3JpbmcubmV4dF90b19jbGVhbikKKwkgICAgICAmIE1CX1JSRF9DT05TX0lORFhfTUFTSykgPDwgTUJfUlJEX0NPTlNfSU5EWF9TSElGVCkgfAorCSAgICAoKGF0b21pY19yZWFkKCZhZGFwdGVyLT5yZmRfcmluZy5uZXh0X3RvX3VzZSkKKwkgICAgICAmIE1CX1JGRF9QUk9EX0lORFhfTUFTSykgPDwgTUJfUkZEX1BST0RfSU5EWF9TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19NQUlMQk9YKTsKKworCS8qIGNvbmZpZyBJUEcvSUZHICovCisJdmFsdWUgPSAoKCh1MzIpIGh3LT5pcGd0ICYgTUFDX0lQR19JRkdfSVBHVF9NQVNLKQorCQkgPDwgTUFDX0lQR19JRkdfSVBHVF9TSElGVCkgfAorCSAgICAoKCh1MzIpIGh3LT5taW5faWZnICYgTUFDX0lQR19JRkdfTUlGR19NQVNLKQorCSAgICAgPDwgTUFDX0lQR19JRkdfTUlGR19TSElGVCkgfAorCSAgICAoKCh1MzIpIGh3LT5pcGdyMSAmIE1BQ19JUEdfSUZHX0lQR1IxX01BU0spCisJICAgICA8PCBNQUNfSVBHX0lGR19JUEdSMV9TSElGVCkgfAorCSAgICAoKCh1MzIpIGh3LT5pcGdyMiAmIE1BQ19JUEdfSUZHX0lQR1IyX01BU0spCisJICAgICA8PCBNQUNfSVBHX0lGR19JUEdSMl9TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19NQUNfSVBHX0lGRyk7CisKKwkvKiBjb25maWcgIEhhbGYtRHVwbGV4IENvbnRyb2wgKi8KKwl2YWx1ZSA9ICgodTMyKSBody0+bGNvbCAmIE1BQ19IQUxGX0RVUExYX0NUUkxfTENPTF9NQVNLKSB8CisJICAgICgoKHUzMikgaHctPm1heF9yZXRyeSAmIE1BQ19IQUxGX0RVUExYX0NUUkxfUkVUUllfTUFTSykKKwkgICAgIDw8IE1BQ19IQUxGX0RVUExYX0NUUkxfUkVUUllfU0hJRlQpIHwKKwkgICAgTUFDX0hBTEZfRFVQTFhfQ1RSTF9FWENfREVGX0VOIHwKKwkgICAgKDB4YSA8PCBNQUNfSEFMRl9EVVBMWF9DVFJMX0FCRUJUX1NISUZUKSB8CisJICAgICgoKHUzMikgaHctPmphbV9pcGcgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX0pBTUlQR19NQVNLKQorCSAgICAgPDwgTUFDX0hBTEZfRFVQTFhfQ1RSTF9KQU1JUEdfU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0hBTEZfRFVQTFhfQ1RSTCk7CisKKwkvKiBzZXQgSW50ZXJydXB0IE1vZGVyYXRvciBUaW1lciAqLworCWlvd3JpdGUxNihhZGFwdGVyLT5pbXQsIGh3LT5od19hZGRyICsgUkVHX0lSUV9NT0RVX1RJTUVSX0lOSVQpOworCWlvd3JpdGUzMihNQVNURVJfQ1RSTF9JVElNRVJfRU4sIGh3LT5od19hZGRyICsgUkVHX01BU1RFUl9DVFJMKTsKKworCS8qIHNldCBJbnRlcnJ1cHQgQ2xlYXIgVGltZXIgKi8KKwlpb3dyaXRlMTYoYWRhcHRlci0+aWN0LCBody0+aHdfYWRkciArIFJFR19DTUJESVNETUFfVElNRVIpOworCisJLyogc2V0IE1UVSwgNCA6IFZMQU4gKi8KKwlpb3dyaXRlMzIoaHctPm1heF9mcmFtZV9zaXplICsgNCwgaHctPmh3X2FkZHIgKyBSRUdfTVRVKTsKKworCS8qIGp1bWJvIHNpemUgJiBycmQgcmV0aXJlbWVudCB0aW1lciAqLworCXZhbHVlID0gKCgodTMyKSBody0+cnhfanVtYm9fdGggJiBSWFFfSk1CT1NaX1RIX01BU0spCisJCSA8PCBSWFFfSk1CT1NaX1RIX1NISUZUKSB8CisJICAgICgoKHUzMikgaHctPnJ4X2p1bWJvX2xrYWggJiBSWFFfSk1CT19MS0FIX01BU0spCisJICAgICA8PCBSWFFfSk1CT19MS0FIX1NISUZUKSB8CisJICAgICgoKHUzMikgaHctPnJyZF9yZXRfdGltZXIgJiBSWFFfUlJEX1RJTUVSX01BU0spCisJICAgICA8PCBSWFFfUlJEX1RJTUVSX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1JYUV9KTUJPU1pfUlJEVElNKTsKKworCS8qIEZsb3cgQ29udHJvbCAqLworCXN3aXRjaCAoaHctPmRldl9yZXYpIHsKKwljYXNlIDB4ODAwMToKKwljYXNlIDB4OTAwMToKKwljYXNlIDB4OTAwMjoKKwljYXNlIDB4OTAwMzoKKwkJc2V0X2Zsb3dfY3RybF9vbGQoYWRhcHRlcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNldF9mbG93X2N0cmxfbmV3KGh3KTsKKwkJYnJlYWs7CisJfQorCisJLyogY29uZmlnIFRYUSAqLworCXZhbHVlID0gKCgodTMyKSBody0+dHBkX2J1cnN0ICYgVFhRX0NUUkxfVFBEX0JVUlNUX05VTV9NQVNLKQorCQkgPDwgVFhRX0NUUkxfVFBEX0JVUlNUX05VTV9TSElGVCkgfAorCSAgICAoKCh1MzIpIGh3LT50eGZfYnVyc3QgJiBUWFFfQ1RSTF9UWEZfQlVSU1RfTlVNX01BU0spCisJICAgICA8PCBUWFFfQ1RSTF9UWEZfQlVSU1RfTlVNX1NISUZUKSB8CisJICAgICgoKHUzMikgaHctPnRwZF9mZXRjaF90aCAmIFRYUV9DVFJMX1RQRF9GRVRDSF9USF9NQVNLKQorCSAgICAgPDwgVFhRX0NUUkxfVFBEX0ZFVENIX1RIX1NISUZUKSB8IFRYUV9DVFJMX0VOSF9NT0RFIHwgVFhRX0NUUkxfRU47CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19UWFFfQ1RSTCk7CisKKwkvKiBtaW4gdHBkIGZldGNoIGdhcCAmIHR4IGp1bWJvIHBhY2tldCBzaXplIHRocmVzaG9sZCBmb3IgdGFza29mZmxvYWQgKi8KKwl2YWx1ZSA9ICgoKHUzMikgaHctPnR4X2p1bWJvX3Rhc2tfdGggJiBUWF9KVU1CT19UQVNLX1RIX01BU0spCisJCSA8PCBUWF9KVU1CT19UQVNLX1RIX1NISUZUKSB8CisJICAgICgoKHUzMikgaHctPnRwZF9mZXRjaF9nYXAgJiBUWF9UUERfTUlOX0lQR19NQVNLKQorCSAgICAgPDwgVFhfVFBEX01JTl9JUEdfU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfVFhfSlVNQk9fVEFTS19USF9UUERfSVBHKTsKKworCS8qIGNvbmZpZyBSWFEgKi8KKwl2YWx1ZSA9ICgoKHUzMikgaHctPnJmZF9idXJzdCAmIFJYUV9DVFJMX1JGRF9CVVJTVF9OVU1fTUFTSykKKwkJIDw8IFJYUV9DVFJMX1JGRF9CVVJTVF9OVU1fU0hJRlQpIHwKKwkgICAgKCgodTMyKSBody0+cnJkX2J1cnN0ICYgUlhRX0NUUkxfUlJEX0JVUlNUX1RIUkVTSF9NQVNLKQorCSAgICAgPDwgUlhRX0NUUkxfUlJEX0JVUlNUX1RIUkVTSF9TSElGVCkgfAorCSAgICAoKCh1MzIpIGh3LT5yZmRfZmV0Y2hfZ2FwICYgUlhRX0NUUkxfUkZEX1BSRUZfTUlOX0lQR19NQVNLKQorCSAgICAgPDwgUlhRX0NUUkxfUkZEX1BSRUZfTUlOX0lQR19TSElGVCkgfAorCSAgICBSWFFfQ1RSTF9DVVRfVEhSVV9FTiB8IFJYUV9DVFJMX0VOOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfUlhRX0NUUkwpOworCisJLyogY29uZmlnIERNQSBFbmdpbmUgKi8KKwl2YWx1ZSA9ICgoKCh1MzIpIGh3LT5kbWFyX2Jsb2NrKSAmIERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX01BU0spCisJCSA8PCBETUFfQ1RSTF9ETUFSX0JVUlNUX0xFTl9TSElGVCkgfAorCSAgICAoKCgodTMyKSBody0+ZG1hd19ibG9jaykgJiBETUFfQ1RSTF9ETUFSX0JVUlNUX0xFTl9NQVNLKQorCSAgICAgPDwgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fU0hJRlQpIHwKKwkgICAgRE1BX0NUUkxfRE1BUl9FTiB8IERNQV9DVFJMX0RNQVdfRU47CisJdmFsdWUgfD0gKHUzMikgaHctPmRtYV9vcmQ7CisJaWYgKGF0bDFfcmNiXzEyOCA9PSBody0+cmNiX3ZhbHVlKQorCQl2YWx1ZSB8PSBETUFfQ1RSTF9SQ0JfVkFMVUU7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19ETUFfQ1RSTCk7CisKKwkvKiBjb25maWcgQ01CIC8gU01CICovCisJdmFsdWUgPSBody0+Y21iX3JyZCB8ICgodTMyKSBody0+Y21iX3RwZCA8PCAxNik7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19DTUJfV1JJVEVfVEgpOworCXZhbHVlID0gaHctPmNtYl9yeF90aW1lciB8ICgodTMyKSBody0+Y21iX3R4X3RpbWVyIDw8IDE2KTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX0NNQl9XUklURV9USU1FUik7CisJaW93cml0ZTMyKGh3LT5zbWJfdGltZXIsIGh3LT5od19hZGRyICsgUkVHX1NNQl9USU1FUik7CisKKwkvKiAtLS0gZW5hYmxlIENNQiAvIFNNQiAqLworCXZhbHVlID0gQ1NNQl9DVFJMX0NNQl9FTiB8IENTTUJfQ1RSTF9TTUJfRU47CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19DU01CX0NUUkwpOworCisJdmFsdWUgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7CisJaWYgKHVubGlrZWx5KCh2YWx1ZSAmIElTUl9QSFlfTElOS0RPV04pICE9IDApKQorCQl2YWx1ZSA9IDE7CS8qIGNvbmZpZyBmYWlsZWQgKi8KKwllbHNlCisJCXZhbHVlID0gMDsKKworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHQgc3RhdHVzICovCisJaW93cml0ZTMyKDB4M2ZmZmZmZmYsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKKwlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOworCXJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIGF0bDFfaXJxX2Rpc2FibGUgLSBNYXNrIG9mZiBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBvbiB0aGUgTklDCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgYXRsMV9pcnFfZGlzYWJsZShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCWF0b21pY19pbmMoJmFkYXB0ZXItPmlycV9zZW0pOworCWlvd3JpdGUzMigwLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lNUik7CisJaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOworCXN5bmNocm9uaXplX2lycShhZGFwdGVyLT5wZGV2LT5pcnEpOworfQorCitzdGF0aWMgdm9pZCBhdGwxX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGN0cmw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCS8qIGF0bDFfaXJxX2Rpc2FibGUoYWRhcHRlcik7ICovCisJYWRhcHRlci0+dmxncnAgPSBncnA7CisKKwlpZiAoZ3JwKSB7CisJCS8qIGVuYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KKwkJY3RybCA9IGlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCQljdHJsIHw9IE1BQ19DVFJMX1JNVl9WTEFOOworCQlpb3dyaXRlMzIoY3RybCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19NQUNfQ1RSTCk7CisJfSBlbHNlIHsKKwkJLyogZGlzYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KKwkJY3RybCA9IGlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCQljdHJsICY9IH5NQUNfQ1RSTF9STVZfVkxBTjsKKwkJaW93cml0ZTMyKGN0cmwsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCX0KKworCS8qIGF0bDFfaXJxX2VuYWJsZShhZGFwdGVyKTsgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIEZJWE1FOiBqdXN0aWZ5IG9yIHJlbW92ZSAtLSBDSFMgKi8KK3N0YXRpYyB2b2lkIGF0bDFfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCit7CisJLyogV2UgZG9uJ3QgZG8gVmxhbiBmaWx0ZXJpbmcgKi8KKwlyZXR1cm47Cit9CisKKy8qIEZJWE1FOiB0aGlzIGxvb2tzIHdyb25nIHRvbyAtLSBDSFMgKi8KK3N0YXRpYyB2b2lkIGF0bDFfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCS8qIGF0bDFfaXJxX2Rpc2FibGUoYWRhcHRlcik7ICovCisJaWYgKGFkYXB0ZXItPnZsZ3JwKQorCQlhZGFwdGVyLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZpZF0gPSBOVUxMOworCS8qIGF0bDFfaXJxX2VuYWJsZShhZGFwdGVyKTsgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJLyogV2UgZG9uJ3QgZG8gVmxhbiBmaWx0ZXJpbmcgKi8KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfcmVzdG9yZV92bGFuKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJYXRsMV92bGFuX3J4X3JlZ2lzdGVyKGFkYXB0ZXItPm5ldGRldiwgYWRhcHRlci0+dmxncnApOworCWlmIChhZGFwdGVyLT52bGdycCkgeworCQl1MTYgdmlkOworCQlmb3IgKHZpZCA9IDA7IHZpZCA8IFZMQU5fR1JPVVBfQVJSQVlfTEVOOyB2aWQrKykgeworCQkJaWYgKCFhZGFwdGVyLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZpZF0pCisJCQkJY29udGludWU7CisJCQlhdGwxX3ZsYW5fcnhfYWRkX3ZpZChhZGFwdGVyLT5uZXRkZXYsIHZpZCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1MTYgdHBkX2F2YWlsKHN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZykKK3sKKwl1MTYgbmV4dF90b19jbGVhbiA9IGF0b21pY19yZWFkKCZ0cGRfcmluZy0+bmV4dF90b19jbGVhbik7CisJdTE2IG5leHRfdG9fdXNlID0gYXRvbWljX3JlYWQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSk7CisJcmV0dXJuICgobmV4dF90b19jbGVhbiA+CisJCSBuZXh0X3RvX3VzZSkgPyBuZXh0X3RvX2NsZWFuIC0gbmV4dF90b191c2UgLQorCQkxIDogdHBkX3JpbmctPmNvdW50ICsgbmV4dF90b19jbGVhbiAtIG5leHRfdG9fdXNlIC0gMSk7Cit9CisKK3N0YXRpYyBpbnQgYXRsMV90c28oc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSBzdHJ1Y3QgdHNvX3BhcmFtICp0c28pCit7CisJLyogV2UgZW50ZXIgdGhpcyBmdW5jdGlvbiBob2xkaW5nIGEgc3BpbmxvY2suICovCisJdTggaXBvZnN0OworCWludCBlcnI7CisKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgeworCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSkgeworCQkJZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpOworCQkJaWYgKHVubGlrZWx5KGVycikpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWlmIChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QX0lQKSkgeworCQkJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSAwOworCQkJc2tiLT5uaC5pcGgtPmNoZWNrID0gMDsKKwkJCXNrYi0+aC50aC0+Y2hlY2sgPQorCQkJICAgIH5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCisJCQkJCSAgICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsIDAsCisJCQkJCSAgICAgICBJUFBST1RPX1RDUCwgMCk7CisJCQlpcG9mc3QgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJCWlmIChpcG9mc3QgIT0gRU5FVF9IRUFERVJfU0laRSkgLyogODAyLjMgZnJhbWUgKi8KKwkJCQl0c28tPnRzb3BsIHw9IDEgPDwgVFNPX1BBUkFNX0VUSFRZUEVfU0hJRlQ7CisKKwkJCXRzby0+dHNvcGwgfD0gKHNrYi0+bmguaXBoLT5paGwgJgorCQkJCUNTVU1fUEFSQU1fSVBITF9NQVNLKSA8PCBDU1VNX1BBUkFNX0lQSExfU0hJRlQ7CisJCQl0c28tPnRzb3BsIHw9ICgoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpICYKKwkJCQlUU09fUEFSQU1fVENQSERSTEVOX01BU0spIDw8IFRTT19QQVJBTV9UQ1BIRFJMRU5fU0hJRlQ7CisJCQl0c28tPnRzb3BsIHw9IChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplICYKKwkJCQlUU09fUEFSQU1fTVNTX01BU0spIDw8IFRTT19QQVJBTV9NU1NfU0hJRlQ7CisJCQl0c28tPnRzb3BsIHw9IDEgPDwgVFNPX1BBUkFNX0lQQ0tTVU1fU0hJRlQ7CisJCQl0c28tPnRzb3BsIHw9IDEgPDwgVFNPX1BBUkFNX1RDUENLU1VNX1NISUZUOworCQkJdHNvLT50c29wbCB8PSAxIDw8IFRTT19QQVJBTV9TRUdNRU5UX1NISUZUOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IGF0bDFfdHhfY3N1bShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGNzdW1fcGFyYW0gKmNzdW0pCit7CisJdTggY3NzLCBjc287CisKKwlpZiAobGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpKSB7CisJCWNzbyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CisJCWNzcyA9IChza2ItPmgucmF3ICsgc2tiLT5jc3VtKSAtIHNrYi0+ZGF0YTsKKwkJaWYgKHVubGlrZWx5KGNzbyAmIDB4MSkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcGF5bG9hZCBvZmZzZXQgIT0gZXZlbiBudW1iZXJcbiIsCisJCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY3N1bS0+Y3N1bXBsIHw9IChjc28gJiBDU1VNX1BBUkFNX1BMT0FET0ZGU0VUX01BU0spIDw8CisJCQlDU1VNX1BBUkFNX1BMT0FET0ZGU0VUX1NISUZUOworCQljc3VtLT5jc3VtcGwgfD0gKGNzcyAmIENTVU1fUEFSQU1fWFNVTU9GRlNFVF9NQVNLKSA8PAorCQkJQ1NVTV9QQVJBTV9YU1VNT0ZGU0VUX1NISUZUOworCQljc3VtLT5jc3VtcGwgfD0gMSA8PCBDU1VNX1BBUkFNX0NVU1RPTUNLU1VNX1NISUZUOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgYXRsMV90eF9tYXAoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHRjcF9zZWcpCit7CisJLyogV2UgZW50ZXIgdGhpcyBmdW5jdGlvbiBob2xkaW5nIGEgc3BpbmxvY2suICovCisJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOworCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGZpcnN0X2J1Zl9sZW4gPSBza2ItPmxlbjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgbnJfZnJhZ3M7CisJdW5zaWduZWQgaW50IGY7CisJdTE2IHRwZF9uZXh0X3RvX3VzZTsKKwl1MTYgcHJvdG9faGRyX2xlbjsKKwl1MTYgaSwgbSwgbGVuMTI7CisKKwlmaXJzdF9idWZfbGVuIC09IHNrYi0+ZGF0YV9sZW47CisJbnJfZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCXRwZF9uZXh0X3RvX3VzZSA9IGF0b21pY19yZWFkKCZ0cGRfcmluZy0+bmV4dF90b191c2UpOworCWJ1ZmZlcl9pbmZvID0gJnRwZF9yaW5nLT5idWZmZXJfaW5mb1t0cGRfbmV4dF90b191c2VdOworCWlmICh1bmxpa2VseShidWZmZXJfaW5mby0+c2tiKSkKKwkJQlVHKCk7CisJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CS8qIHB1dCBza2IgaW4gbGFzdCBUUEQgKi8KKworCWlmICh0Y3Bfc2VnKSB7CisJCS8qIFRTTy9HU08gKi8KKwkJcHJvdG9faGRyX2xlbiA9CisJCSAgICAoKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpICsgKHNrYi0+aC50aC0+ZG9mZiA8PCAyKSk7CisJCWJ1ZmZlcl9pbmZvLT5sZW5ndGggPSBwcm90b19oZHJfbGVuOworCQlwYWdlID0gdmlydF90b19wYWdlKHNrYi0+ZGF0YSk7CisJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSAmIH5QQUdFX01BU0s7CisJCWJ1ZmZlcl9pbmZvLT5kbWEgPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgcGFnZSwKKwkJCQkJCW9mZnNldCwgcHJvdG9faGRyX2xlbiwKKwkJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWlmICgrK3RwZF9uZXh0X3RvX3VzZSA9PSB0cGRfcmluZy0+Y291bnQpCisJCQl0cGRfbmV4dF90b191c2UgPSAwOworCisJCWlmIChmaXJzdF9idWZfbGVuID4gcHJvdG9faGRyX2xlbikgeworCQkJbGVuMTIgPSBmaXJzdF9idWZfbGVuIC0gcHJvdG9faGRyX2xlbjsKKwkJCW0gPSAobGVuMTIgKyBNQVhfVFhfQlVGX0xFTiAtIDEpIC8gTUFYX1RYX0JVRl9MRU47CisJCQlmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7CisJCQkJYnVmZmVyX2luZm8gPQorCQkJCSAgICAmdHBkX3JpbmctPmJ1ZmZlcl9pbmZvW3RwZF9uZXh0X3RvX3VzZV07CisJCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCA9CisJCQkJICAgIChNQVhfVFhfQlVGX0xFTiA+PQorCQkJCSAgICAgbGVuMTIpID8gTUFYX1RYX0JVRl9MRU4gOiBsZW4xMjsKKwkJCQlsZW4xMiAtPSBidWZmZXJfaW5mby0+bGVuZ3RoOworCQkJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhICsKKwkJCQkJCSAocHJvdG9faGRyX2xlbiArCisJCQkJCQkgIGkgKiBNQVhfVFhfQlVGX0xFTikpOworCQkJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKShza2ItPmRhdGEgKworCQkJCQkJCShwcm90b19oZHJfbGVuICsKKwkJCQkJCQlpICogTUFYX1RYX0JVRl9MRU4pKSAmCisJCQkJCQkJflBBR0VfTUFTSzsKKwkJCQlidWZmZXJfaW5mby0+ZG1hID0KKwkJCQkgICAgcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIHBhZ2UsIG9mZnNldCwKKwkJCQkJCSBidWZmZXJfaW5mby0+bGVuZ3RoLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWlmICgrK3RwZF9uZXh0X3RvX3VzZSA9PSB0cGRfcmluZy0+Y291bnQpCisJCQkJCXRwZF9uZXh0X3RvX3VzZSA9IDA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBub3QgVFNPL0dTTyAqLworCQlidWZmZXJfaW5mby0+bGVuZ3RoID0gZmlyc3RfYnVmX2xlbjsKKwkJcGFnZSA9IHZpcnRfdG9fcGFnZShza2ItPmRhdGEpOworCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylza2ItPmRhdGEgJiB+UEFHRV9NQVNLOworCQlidWZmZXJfaW5mby0+ZG1hID0gcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIHBhZ2UsCisJCQkJCQlvZmZzZXQsIGZpcnN0X2J1Zl9sZW4sCisJCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJaWYgKCsrdHBkX25leHRfdG9fdXNlID09IHRwZF9yaW5nLT5jb3VudCkKKwkJCXRwZF9uZXh0X3RvX3VzZSA9IDA7CisJfQorCisJZm9yIChmID0gMDsgZiA8IG5yX2ZyYWdzOyBmKyspIHsKKwkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKKwkJdTE2IGxlbmYsIGksIG07CisKKwkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZdOworCQlsZW5mID0gZnJhZy0+c2l6ZTsKKworCQltID0gKGxlbmYgKyBNQVhfVFhfQlVGX0xFTiAtIDEpIC8gTUFYX1RYX0JVRl9MRU47CisJCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHsKKwkJCWJ1ZmZlcl9pbmZvID0gJnRwZF9yaW5nLT5idWZmZXJfaW5mb1t0cGRfbmV4dF90b191c2VdOworCQkJaWYgKHVubGlrZWx5KGJ1ZmZlcl9pbmZvLT5za2IpKQorCQkJCUJVRygpOworCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJCQlidWZmZXJfaW5mby0+bGVuZ3RoID0KKwkJCSAgICAobGVuZiA+IE1BWF9UWF9CVUZfTEVOKSA/IE1BWF9UWF9CVUZfTEVOIDogbGVuZjsKKwkJCWxlbmYgLT0gYnVmZmVyX2luZm8tPmxlbmd0aDsKKwkJCWJ1ZmZlcl9pbmZvLT5kbWEgPQorCQkJICAgIHBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCBmcmFnLT5wYWdlLAorCQkJCQkgZnJhZy0+cGFnZV9vZmZzZXQgKyBpICogTUFYX1RYX0JVRl9MRU4sCisJCQkJCSBidWZmZXJfaW5mby0+bGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQkJaWYgKCsrdHBkX25leHRfdG9fdXNlID09IHRwZF9yaW5nLT5jb3VudCkKKwkJCQl0cGRfbmV4dF90b191c2UgPSAwOworCQl9CisJfQorCisJLyogbGFzdCB0cGQncyBidWZmZXItaW5mbyAqLworCWJ1ZmZlcl9pbmZvLT5za2IgPSBza2I7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfdHhfcXVldWUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwgaW50IGNvdW50LAorCQkJICAgICAgIHVuaW9uIHRwZF9kZXNjciAqZGVzY3IpCit7CisJLyogV2UgZW50ZXIgdGhpcyBmdW5jdGlvbiBob2xkaW5nIGEgc3BpbmxvY2suICovCisJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOworCWludCBqOworCXUzMiB2YWw7CisJc3RydWN0IGF0bDFfYnVmZmVyICpidWZmZXJfaW5mbzsKKwlzdHJ1Y3QgdHhfcGFja2V0X2Rlc2MgKnRwZDsKKwl1MTYgdHBkX25leHRfdG9fdXNlID0gYXRvbWljX3JlYWQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSk7CisKKwlmb3IgKGogPSAwOyBqIDwgY291bnQ7IGorKykgeworCQlidWZmZXJfaW5mbyA9ICZ0cGRfcmluZy0+YnVmZmVyX2luZm9bdHBkX25leHRfdG9fdXNlXTsKKwkJdHBkID0gQVRMMV9UUERfREVTQygmYWRhcHRlci0+dHBkX3JpbmcsIHRwZF9uZXh0X3RvX3VzZSk7CisJCXRwZC0+ZGVzYy5jc3VtLmNzdW1wdSA9IGRlc2NyLT5jc3VtLmNzdW1wdTsKKwkJdHBkLT5kZXNjLmNzdW0uY3N1bXBsID0gZGVzY3ItPmNzdW0uY3N1bXBsOworCQl0cGQtPmRlc2MudHNvLnRzb3B1ID0gZGVzY3ItPnRzby50c29wdTsKKwkJdHBkLT5kZXNjLnRzby50c29wbCA9IGRlc2NyLT50c28udHNvcGw7CisJCXRwZC0+YnVmZmVyX2FkZHIgPSBjcHVfdG9fbGU2NChidWZmZXJfaW5mby0+ZG1hKTsKKwkJdHBkLT5kZXNjLmRhdGEgPSBkZXNjci0+ZGF0YTsKKwkJdHBkLT5kZXNjLmNzdW0uY3N1bXB1IHw9IChjcHVfdG9fbGUxNihidWZmZXJfaW5mby0+bGVuZ3RoKSAmCisJCQlDU1VNX1BBUkFNX0JVRkxFTl9NQVNLKSA8PCBDU1VNX1BBUkFNX0JVRkxFTl9TSElGVDsKKworCQl2YWwgPSAoZGVzY3ItPnRzby50c29wbCA+PiBUU09fUEFSQU1fU0VHTUVOVF9TSElGVCkgJgorCQkJVFNPX1BBUkFNX1NFR01FTlRfTUFTSzsKKwkJaWYgKHZhbCAmJiAhaikKKwkJCXRwZC0+ZGVzYy50c28udHNvcGwgfD0gMSA8PCBUU09fUEFSQU1fSERSRkxBR19TSElGVDsKKworCQlpZiAoaiA9PSAoY291bnQgLSAxKSkKKwkJCXRwZC0+ZGVzYy5jc3VtLmNzdW1wbCB8PSAxIDw8IENTVU1fUEFSQU1fRU9QX1NISUZUOworCisJCWlmICgrK3RwZF9uZXh0X3RvX3VzZSA9PSB0cGRfcmluZy0+Y291bnQpCisJCQl0cGRfbmV4dF90b191c2UgPSAwOworCX0KKwkvKgorCSAqIEZvcmNlIG1lbW9yeSB3cml0ZXMgdG8gY29tcGxldGUgYmVmb3JlIGxldHRpbmcgaC93CisJICoga25vdyB0aGVyZSBhcmUgbmV3IGRlc2NyaXB0b3JzIHRvIGZldGNoLiAgKE9ubHkKKwkgKiBhcHBsaWNhYmxlIGZvciB3ZWFrLW9yZGVyZWQgbWVtb3J5IG1vZGVsIGFyY2hzLAorCSAqIHN1Y2ggYXMgSUEtNjQpLgorCSAqLworCXdtYigpOworCisJYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fdXNlLCAoaW50KXRwZF9uZXh0X3RvX3VzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfdXBkYXRlX21haWxib3goc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0cGRfbmV4dF90b191c2U7CisJdTMyIHJmZF9uZXh0X3RvX3VzZTsKKwl1MzIgcnJkX25leHRfdG9fY2xlYW47CisJdTMyIHZhbHVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPm1iX2xvY2ssIGZsYWdzKTsKKworCXRwZF9uZXh0X3RvX3VzZSA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT50cGRfcmluZy5uZXh0X3RvX3VzZSk7CisJcmZkX25leHRfdG9fdXNlID0gYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJmZF9yaW5nLm5leHRfdG9fdXNlKTsKKwlycmRfbmV4dF90b19jbGVhbiA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT5ycmRfcmluZy5uZXh0X3RvX2NsZWFuKTsKKworCXZhbHVlID0gKChyZmRfbmV4dF90b191c2UgJiBNQl9SRkRfUFJPRF9JTkRYX01BU0spIDw8CisJCU1CX1JGRF9QUk9EX0lORFhfU0hJRlQpIHwKKwkJKChycmRfbmV4dF90b19jbGVhbiAmIE1CX1JSRF9DT05TX0lORFhfTUFTSykgPDwKKwkJTUJfUlJEX0NPTlNfSU5EWF9TSElGVCkgfAorCQkoKHRwZF9uZXh0X3RvX3VzZSAmIE1CX1RQRF9QUk9EX0lORFhfTUFTSykgPDwKKwkJTUJfVFBEX1BST0RfSU5EWF9TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BSUxCT1gpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bWJfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGF0bDFfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBsZW4gPSBza2ItPmxlbjsKKwlpbnQgdHNvOworCWludCBjb3VudCA9IDE7CisJaW50IHJldF92YWw7CisJdTMyIHZhbDsKKwl1bmlvbiB0cGRfZGVzY3IgcGFyYW07CisJdTE2IGZyYWdfc2l6ZTsKKwl1MTYgdmxhbl90YWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbnJfZnJhZ3MgPSAwOworCXVuc2lnbmVkIGludCBtc3MgPSAwOworCXVuc2lnbmVkIGludCBmOworCXVuc2lnbmVkIGludCBwcm90b19oZHJfbGVuOworCisJbGVuIC09IHNrYi0+ZGF0YV9sZW47CisKKwlpZiAodW5saWtlbHkoc2tiLT5sZW4gPT0gMCkpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CisKKwlwYXJhbS5kYXRhID0gMDsKKwlwYXJhbS50c28udHNvcHUgPSAwOworCXBhcmFtLnRzby50c29wbCA9IDA7CisJcGFyYW0uY3N1bS5jc3VtcHUgPSAwOworCXBhcmFtLmNzdW0uY3N1bXBsID0gMDsKKworCS8qIG5yX2ZyYWdzIHdpbGwgYmUgbm9uemVybyBpZiB3ZSdyZSBkb2luZyBzY2F0dGVyL2dhdGhlciAoU0cpICovCisJbnJfZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCWZvciAoZiA9IDA7IGYgPCBucl9mcmFnczsgZisrKSB7CisJCWZyYWdfc2l6ZSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbZl0uc2l6ZTsKKwkJaWYgKGZyYWdfc2l6ZSkKKwkJCWNvdW50ICs9CisJCQkgICAgKGZyYWdfc2l6ZSArIE1BWF9UWF9CVUZfTEVOIC0gMSkgLyBNQVhfVFhfQlVGX0xFTjsKKwl9CisKKwkvKiBtc3Mgd2lsbCBiZSBub256ZXJvIGlmIHdlJ3JlIGRvaW5nIHNlZ21lbnQgb2ZmbG9hZCAoVFNPL0dTTykgKi8KKwltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOworCWlmIChtc3MpIHsKKwkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gbnRvaHMoRVRIX1BfSVApKSB7CisJCQlwcm90b19oZHJfbGVuID0gKChza2ItPmgucmF3IC0gc2tiLT5kYXRhKSArCisJCQkJCSAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJCWlmICh1bmxpa2VseShwcm90b19oZHJfbGVuID4gbGVuKSkgeworCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwkJCX0KKwkJCS8qIG5lZWQgYWRkaXRpb25hbCBUUEQgPyAqLworCQkJaWYgKHByb3RvX2hkcl9sZW4gIT0gbGVuKQorCQkJCWNvdW50ICs9IChsZW4gLSBwcm90b19oZHJfbGVuICsKKwkJCQkJTUFYX1RYX0JVRl9MRU4gLSAxKSAvIE1BWF9UWF9CVUZfTEVOOworCQl9CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmICghc3Bpbl90cnlsb2NrKCZhZGFwdGVyLT5sb2NrKSkgeworCQkvKiBDYW4ndCBnZXQgbG9jayAtIHRlbGwgdXBwZXIgbGF5ZXIgdG8gcmVxdWV1ZSAqLworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVFggbG9ja2VkXG4iLCBhdGwxX2RyaXZlcl9uYW1lKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7CisJfQorCisJaWYgKHRwZF9hdmFpbCgmYWRhcHRlci0+dHBkX3JpbmcpIDwgY291bnQpIHsKKwkJLyogbm90IGVub3VnaCBkZXNjcmlwdG9ycyAqLworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUWCBidXN5XG4iLCBhdGwxX2RyaXZlcl9uYW1lKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCXBhcmFtLmRhdGEgPSAwOworCisJaWYgKGFkYXB0ZXItPnZsZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQl2bGFuX3RhZyA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCQl2bGFuX3RhZyA9ICh2bGFuX3RhZyA8PCA0KSB8ICh2bGFuX3RhZyA+PiAxMykgfAorCQkJKCh2bGFuX3RhZyA+PiA5KSAmIDB4OCk7CisJCXBhcmFtLmNzdW0uY3N1bXBsIHw9IDEgPDwgQ1NVTV9QQVJBTV9JTlNWTEFHX1NISUZUOworCQlwYXJhbS5jc3VtLmNzdW1wdSB8PSAodmxhbl90YWcgJiBDU1VNX1BBUkFNX1ZBTEFOVEFHX01BU0spIDw8CisJCQlDU1VNX1BBUkFNX1ZBTEFOX1NISUZUOworCX0KKworCXRzbyA9IGF0bDFfdHNvKGFkYXB0ZXIsIHNrYiwgJnBhcmFtLnRzbyk7CisJaWYgKHRzbyA8IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKworCWlmICghdHNvKSB7CisJCXJldF92YWwgPSBhdGwxX3R4X2NzdW0oYWRhcHRlciwgc2tiLCAmcGFyYW0uY3N1bSk7CisJCWlmIChyZXRfdmFsIDwgMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCXJldHVybiBORVRERVZfVFhfT0s7CisJCX0KKwl9CisKKwl2YWwgPSAocGFyYW0uY3N1bS5jc3VtcGwgPj4gQ1NVTV9QQVJBTV9TRUdNRU5UX1NISUZUKSAmCisJCUNTVU1fUEFSQU1fU0VHTUVOVF9NQVNLOworCWF0bDFfdHhfbWFwKGFkYXB0ZXIsIHNrYiwgMSA9PSB2YWwpOworCWF0bDFfdHhfcXVldWUoYWRhcHRlciwgY291bnQsICZwYXJhbSk7CisJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCWF0bDFfdXBkYXRlX21haWxib3goYWRhcHRlcik7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworLyoKKyAqIGF0bDFfZ2V0X3N0YXRzIC0gR2V0IFN5c3RlbSBOZXR3b3JrIFN0YXRpc3RpY3MKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2Ugc3RhdGlzdGljcyBzdHJ1Y3R1cmUuCisgKiBUaGUgc3RhdGlzdGljcyBhcmUgYWN0dWFsbHkgdXBkYXRlZCBmcm9tIHRoZSB0aW1lciBjYWxsYmFjay4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdGwxX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiAmYWRhcHRlci0+bmV0X3N0YXRzOworfQorCisvKgorICogYXRsMV9jbGVhbl9yeF9yaW5nIC0gRnJlZSBSRkQgQnVmZmVycworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfY2xlYW5fcnhfcmluZyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxX3JmZF9yaW5nICpyZmRfcmluZyA9ICZhZGFwdGVyLT5yZmRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9ycmRfcmluZyAqcnJkX3JpbmcgPSAmYWRhcHRlci0+cnJkX3Jpbmc7CisJc3RydWN0IGF0bDFfYnVmZmVyICpidWZmZXJfaW5mbzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGludCBpOworCisJLyogRnJlZSBhbGwgdGhlIFJ4IHJpbmcgc2tfYnVmZnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmZkX3JpbmctPmNvdW50OyBpKyspIHsKKwkJYnVmZmVyX2luZm8gPSAmcmZkX3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCQlpZiAoYnVmZmVyX2luZm8tPmRtYSkgeworCQkJcGNpX3VubWFwX3BhZ2UocGRldiwKKwkJCQkJYnVmZmVyX2luZm8tPmRtYSwKKwkJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwKKwkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSAwOworCQl9CisJCWlmIChidWZmZXJfaW5mby0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiKGJ1ZmZlcl9pbmZvLT5za2IpOworCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJCX0KKwl9CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdGwxX2J1ZmZlcikgKiByZmRfcmluZy0+Y291bnQ7CisJbWVtc2V0KHJmZF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CisKKwkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCisJbWVtc2V0KHJmZF9yaW5nLT5kZXNjLCAwLCByZmRfcmluZy0+c2l6ZSk7CisKKwlyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7CisJYXRvbWljX3NldCgmcmZkX3JpbmctPm5leHRfdG9fdXNlLCAwKTsKKworCXJyZF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisJYXRvbWljX3NldCgmcnJkX3JpbmctPm5leHRfdG9fY2xlYW4sIDApOworfQorCisvKgorICogYXRsMV9jbGVhbl90eF9yaW5nIC0gRnJlZSBUeCBCdWZmZXJzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgYXRsMV9jbGVhbl90eF9yaW5nKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOworCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEZyZWUgYWxsIHRoZSBUeCByaW5nIHNrX2J1ZmZzICovCisJZm9yIChpID0gMDsgaSA8IHRwZF9yaW5nLT5jb3VudDsgaSsrKSB7CisJCWJ1ZmZlcl9pbmZvID0gJnRwZF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJaWYgKGJ1ZmZlcl9pbmZvLT5kbWEpIHsKKwkJCXBjaV91bm1hcF9wYWdlKHBkZXYsIGJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkJICAgICAgIGJ1ZmZlcl9pbmZvLT5sZW5ndGgsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJYnVmZmVyX2luZm8tPmRtYSA9IDA7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgdHBkX3JpbmctPmNvdW50OyBpKyspIHsKKwkJYnVmZmVyX2luZm8gPSAmdHBkX3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCQlpZiAoYnVmZmVyX2luZm8tPnNrYikgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmZmVyX2luZm8tPnNrYik7CisJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKKwkJfQorCX0KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGF0bDFfYnVmZmVyKSAqIHRwZF9yaW5nLT5jb3VudDsKKwltZW1zZXQodHBkX3JpbmctPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKKworCS8qIFplcm8gb3V0IHRoZSBkZXNjcmlwdG9yIHJpbmcgKi8KKwltZW1zZXQodHBkX3JpbmctPmRlc2MsIDAsIHRwZF9yaW5nLT5zaXplKTsKKworCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSwgMCk7CisJYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fY2xlYW4sIDApOworfQorCisvKgorICogYXRsMV9mcmVlX3JpbmdfcmVzb3VyY2VzIC0gRnJlZSBUeCAvIFJYIGRlc2NyaXB0b3IgUmVzb3VyY2VzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBGcmVlIGFsbCB0cmFuc21pdCBzb2Z0d2FyZSByZXNvdXJjZXMKKyAqLwordm9pZCBhdGwxX2ZyZWVfcmluZ19yZXNvdXJjZXMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOworCXN0cnVjdCBhdGwxX3JmZF9yaW5nICpyZmRfcmluZyA9ICZhZGFwdGVyLT5yZmRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9ycmRfcmluZyAqcnJkX3JpbmcgPSAmYWRhcHRlci0+cnJkX3Jpbmc7CisJc3RydWN0IGF0bDFfcmluZ19oZWFkZXIgKnJpbmdfaGVhZGVyID0gJmFkYXB0ZXItPnJpbmdfaGVhZGVyOworCisJYXRsMV9jbGVhbl90eF9yaW5nKGFkYXB0ZXIpOworCWF0bDFfY2xlYW5fcnhfcmluZyhhZGFwdGVyKTsKKworCWtmcmVlKHRwZF9yaW5nLT5idWZmZXJfaW5mbyk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByaW5nX2hlYWRlci0+c2l6ZSwgcmluZ19oZWFkZXItPmRlc2MsCisJCQkgICAgcmluZ19oZWFkZXItPmRtYSk7CisKKwl0cGRfcmluZy0+YnVmZmVyX2luZm8gPSBOVUxMOworCXRwZF9yaW5nLT5kZXNjID0gTlVMTDsKKwl0cGRfcmluZy0+ZG1hID0gMDsKKworCXJmZF9yaW5nLT5idWZmZXJfaW5mbyA9IE5VTEw7CisJcmZkX3JpbmctPmRlc2MgPSBOVUxMOworCXJmZF9yaW5nLT5kbWEgPSAwOworCisJcnJkX3JpbmctPmRlc2MgPSBOVUxMOworCXJyZF9yaW5nLT5kbWEgPSAwOworfQorCitzMzIgYXRsMV91cChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJaW50IGVycjsKKwlpbnQgaXJxX2ZsYWdzID0gSVJRRl9TQU1QTEVfUkFORE9NOworCisJLyogaGFyZHdhcmUgaGFzIGJlZW4gcmVzZXQsIHdlIG5lZWQgdG8gcmVsb2FkIHNvbWUgdGhpbmdzICovCisJYXRsMV9zZXRfbXVsdGkobmV0ZGV2KTsKKwlhdGwxX3Jlc3RvcmVfdmxhbihhZGFwdGVyKTsKKwllcnIgPSBhdGwxX2FsbG9jX3J4X2J1ZmZlcnMoYWRhcHRlcik7CisJaWYgKHVubGlrZWx5KCFlcnIpKQkJLyogbm8gUlggQlVGRkVSIGFsbG9jYXRlZCAqLworCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICh1bmxpa2VseShhdGwxX2NvbmZpZ3VyZShhZGFwdGVyKSkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfdXA7CisJfQorCisJZXJyID0gcGNpX2VuYWJsZV9tc2koYWRhcHRlci0+cGRldik7CisJaWYgKGVycikgeworCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIlVuYWJsZSB0byBlbmFibGUgTVNJOiAlZFxuIiwgZXJyKTsKKwkJaXJxX2ZsYWdzIHw9IElSUUZfU0hBUkVEOworCX0KKworCWVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgJmF0bDFfaW50ciwgaXJxX2ZsYWdzLAorCQkJbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIGVycl91cDsKKworCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMpOworCWF0bDFfaXJxX2VuYWJsZShhZGFwdGVyKTsKKwlhdGwxX2NoZWNrX2xpbmsoYWRhcHRlcik7CisJcmV0dXJuIDA7CisKKwkvKiBGSVhNRTogdW5yZWFjaGFibGUgY29kZSEgLS0gQ0hTICovCisJLyogZnJlZSBpcnEgZGlzYWJsZSBhbnkgaW50ZXJydXB0ICovCisJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKKwlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIG5ldGRldik7CisKK2Vycl91cDoKKwlwY2lfZGlzYWJsZV9tc2koYWRhcHRlci0+cGRldik7CisJLyogZnJlZSByeF9idWZmZXJzICovCisJYXRsMV9jbGVhbl9yeF9yaW5nKGFkYXB0ZXIpOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgYXRsMV9kb3duKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnBoeV9jb25maWdfdGltZXIpOworCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gZmFsc2U7CisKKwlhdGwxX2lycV9kaXNhYmxlKGFkYXB0ZXIpOworCWZyZWVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgbmV0ZGV2KTsKKwlwY2lfZGlzYWJsZV9tc2koYWRhcHRlci0+cGRldik7CisJYXRsMV9yZXNldF9odygmYWRhcHRlci0+aHcpOworCWFkYXB0ZXItPmNtYi5jbWItPmludF9zdGF0cyA9IDA7CisKKwlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMDsKKwlhZGFwdGVyLT5saW5rX2R1cGxleCA9IC0xOworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJYXRsMV9jbGVhbl90eF9yaW5nKGFkYXB0ZXIpOworCWF0bDFfY2xlYW5fcnhfcmluZyhhZGFwdGVyKTsKK30KKworLyoKKyAqIGF0bDFfY2hhbmdlX210dSAtIENoYW5nZSB0aGUgTWF4aW11bSBUcmFuc2ZlciBVbml0CisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbmV3X210dTogbmV3IHZhbHVlIGZvciBtYXhpbXVtIGZyYW1lIHNpemUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGF0bDFfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgb2xkX210dSA9IG5ldGRldi0+bXR1OworCWludCBtYXhfZnJhbWUgPSBuZXdfbXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVUSEVSTkVUX0ZDU19TSVpFOworCisJaWYgKChtYXhfZnJhbWUgPCBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUpIHx8CisJICAgIChtYXhfZnJhbWUgPiBNQVhfSlVNQk9fRlJBTUVfU0laRSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgTVRVIHNldHRpbmdcbiIsCisJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWRhcHRlci0+aHcubWF4X2ZyYW1lX3NpemUgPSBtYXhfZnJhbWU7CisJYWRhcHRlci0+aHcudHhfanVtYm9fdGFza190aCA9IChtYXhfZnJhbWUgKyA3KSA+PiAzOworCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSAobWF4X2ZyYW1lICsgNykgJiB+NzsKKwlhZGFwdGVyLT5ody5yeF9qdW1ib190aCA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gLyA4OworCisJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OworCWlmICgob2xkX210dSAhPSBuZXdfbXR1KSAmJiBuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJYXRsMV9kb3duKGFkYXB0ZXIpOworCQlhdGwxX3VwKGFkYXB0ZXIpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogYXRsMV9zZXRfbWFjIC0gQ2hhbmdlIHRoZSBFdGhlcm5ldCBBZGRyZXNzIG9mIHRoZSBOSUMKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwOiBwb2ludGVyIHRvIGFuIGFkZHJlc3Mgc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBhdGwxX3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOworCW1lbWNweShhZGFwdGVyLT5ody5tYWNfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CisKKwlhdGwxX3NldF9tYWNfYWRkcigmYWRhcHRlci0+aHcpOworCXJldHVybiAwOworfQorCisvKgorICogYXRsMV93YXRjaGRvZyAtIFRpbWVyIENhbGwtYmFjaworICogQGRhdGE6IHBvaW50ZXIgdG8gbmV0ZGV2IGNhc3QgaW50byBhbiB1bnNpZ25lZCBsb25nCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGF0bDFfYWRhcHRlciAqKWRhdGE7CisKKwkvKiBSZXNldCB0aGUgdGltZXIgKi8KKwltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzICsgMiAqIEhaKTsKK30KKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0pCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTE2IHJlc3VsdDsKKworCWF0bDFfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgcmVnX251bSAmIDB4MWYsICZyZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWF0bDFfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIHJlZ19udW0sIHZhbCk7Cit9CisKKy8qCisgKiBhdGwxX21paV9pb2N0bCAtCisgKiBAbmV0ZGV2OgorICogQGlmcmVxOgorICogQGNtZDoKKyAqLworc3RhdGljIGludCBhdGwxX21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWw7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCXJldHZhbCA9IGdlbmVyaWNfbWlpX2lvY3RsKCZhZGFwdGVyLT5taWksIGlmX21paShpZnIpLCBjbWQsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBhdGwxX2lvY3RsIC0KKyAqIEBuZXRkZXY6CisgKiBAaWZyZXE6CisgKiBAY21kOgorICovCitzdGF0aWMgaW50IGF0bDFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCWNhc2UgU0lPQ0dNSUlSRUc6CisJY2FzZSBTSU9DU01JSVJFRzoKKwkJcmV0dXJuIGF0bDFfbWlpX2lvY3RsKG5ldGRldiwgaWZyLCBjbWQpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKKy8qCisgKiBhdGwxX3R4X3RpbWVvdXQgLSBSZXNwb25kIHRvIGEgVHggSGFuZworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBhdGwxX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwkvKiBEbyB0aGUgcmVzZXQgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCAqLworCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnR4X3RpbWVvdXRfdGFzayk7Cit9CisKKy8qCisgKiBhdGwxX3BoeV9jb25maWcgLSBUaW1lciBDYWxsLWJhY2sKKyAqIEBkYXRhOiBwb2ludGVyIHRvIG5ldGRldiBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZworICovCitzdGF0aWMgdm9pZCBhdGwxX3BoeV9jb25maWcodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGF0bDFfYWRhcHRlciAqKWRhdGE7CisJc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gZmFsc2U7CisJYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQURWRVJUSVNFLCBody0+bWlpX2F1dG9uZWdfYWR2X3JlZyk7CisJYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQVQwMDFfQ1IsIGh3LT5taWlfMTAwMHRfY3RybF9yZWcpOworCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIE1JSV9DUl9SRVNFVCB8IE1JSV9DUl9BVVRPX05FR19FTik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworfQorCitpbnQgYXRsMV9yZXNldChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCByZXQ7CisKKwlyZXQgPSBhdGwxX3Jlc2V0X2h3KCZhZGFwdGVyLT5odyk7CisJaWYgKHJldCAhPSBBVEwxX1NVQ0NFU1MpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGF0bDFfaW5pdF9odygmYWRhcHRlci0+aHcpOworfQorCisvKgorICogYXRsMV9vcGVuIC0gQ2FsbGVkIHdoZW4gYSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlIGFjdGl2ZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlCisgKgorICogVGhlIG9wZW4gZW50cnkgcG9pbnQgaXMgY2FsbGVkIHdoZW4gYSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlCisgKiBhY3RpdmUgYnkgdGhlIHN5c3RlbSAoSUZGX1VQKS4gIEF0IHRoaXMgcG9pbnQgYWxsIHJlc291cmNlcyBuZWVkZWQKKyAqIGZvciB0cmFuc21pdCBhbmQgcmVjZWl2ZSBvcGVyYXRpb25zIGFyZSBhbGxvY2F0ZWQsIHRoZSBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBPUywgdGhlIHdhdGNoZG9nIHRpbWVyIGlzIHN0YXJ0ZWQsCisgKiBhbmQgdGhlIHN0YWNrIGlzIG5vdGlmaWVkIHRoYXQgdGhlIGludGVyZmFjZSBpcyByZWFkeS4KKyAqLworc3RhdGljIGludCBhdGwxX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgZXJyOworCisJLyogYWxsb2NhdGUgdHJhbnNtaXQgZGVzY3JpcHRvcnMgKi8KKwllcnIgPSBhdGwxX3NldHVwX3JpbmdfcmVzb3VyY2VzKGFkYXB0ZXIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBhdGwxX3VwKGFkYXB0ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3VwOworCisJcmV0dXJuIDA7CisKK2Vycl91cDoKKwlhdGwxX3Jlc2V0KGFkYXB0ZXIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBhdGwxX2Nsb3NlIC0gRGlzYWJsZXMgYSBuZXR3b3JrIGludGVyZmFjZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCwgdGhpcyBpcyBub3QgYWxsb3dlZCB0byBmYWlsCisgKgorICogVGhlIGNsb3NlIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuIGFuIGludGVyZmFjZSBpcyBkZS1hY3RpdmF0ZWQKKyAqIGJ5IHRoZSBPUy4gIFRoZSBoYXJkd2FyZSBpcyBzdGlsbCB1bmRlciB0aGUgZHJpdmVycyBjb250cm9sLCBidXQKKyAqIG5lZWRzIHRvIGJlIGRpc2FibGVkLiAgQSBnbG9iYWwgTUFDIHJlc2V0IGlzIGlzc3VlZCB0byBzdG9wIHRoZQorICogaGFyZHdhcmUsIGFuZCBhbGwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcmVzb3VyY2VzIGFyZSBmcmVlZC4KKyAqLworc3RhdGljIGludCBhdGwxX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYXRsMV9kb3duKGFkYXB0ZXIpOworCWF0bDFfZnJlZV9yaW5nX3Jlc291cmNlcyhhZGFwdGVyKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElmIFRQRCBCdWZmZXIgc2l6ZSBlcXVhbCB0byAwLCBQQ0lFIERNQVJfVE9fSU5UCisgKiB3aWxsIGFzc2VydC4gV2UgZG8gc29mdCByZXNldCA8MHgxNDAwPTE+IGFjY29yZGluZworICogd2l0aCB0aGUgU1BFQy4gQlVULCBpdCBzZWVtZXMgdGhhdCBQQ0lFIG9yIERNQQorICogc3RhdGUtbWFjaGluZSB3aWxsIG5vdCBiZSByZXNldC4gRE1BUl9UT19JTlQgd2lsbAorICogYXNzZXJ0IGFnYWluIGFuZCBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgYXRsMV90eF90aW1lb3V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0bDFfYWRhcHRlciwgdHhfdGltZW91dF90YXNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCWF0bDFfZG93bihhZGFwdGVyKTsKKwlhdGwxX3VwKGFkYXB0ZXIpOworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKK30KKworLyoKKyAqIGF0bDFfbGlua19jaGdfdGFzayAtIGRlYWwgd2l0aCBsaW5rIGNoYW5nZSBldmVudCBPdXQgb2YgaW50ZXJydXB0IGNvbnRleHQKKyAqLworc3RhdGljIHZvaWQgYXRsMV9saW5rX2NoZ190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0KKyAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRsMV9hZGFwdGVyLCBsaW5rX2NoZ190YXNrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwlhdGwxX2NoZWNrX2xpbmsoYWRhcHRlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogYXRsMV9wY2llX3BhdGNoIC0gUGF0Y2ggZm9yIFBDSUUgbW9kdWxlCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfcGNpZV9wYXRjaChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiB2YWx1ZTsKKwl2YWx1ZSA9IDB4NjUwMDsKKwlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyAweDEyRkMpOworCS8qIHBjaWUgZmxvdyBjb250cm9sIG1vZGUgY2hhbmdlICovCisJdmFsdWUgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgMHgxMDA4KTsKKwl2YWx1ZSB8PSAweDgwMDA7CisJaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgMHgxMDA4KTsKK30KKworLyoKKyAqIFdoZW4gQUNQSSByZXN1bWUgb24gc29tZSBWSUEgTW90aGVyQm9hcmQsIHRoZSBJbnRlcnJ1cHQgRGlzYWJsZSBiaXQvMHg0MDAKKyAqIG9uIFBDSSBDb21tYW5kIHJlZ2lzdGVyIGlzIGRpc2FibGUuCisgKiBUaGUgZnVuY3Rpb24gZW5hYmxlIHRoaXMgYml0LgorICogQnJhY2tldHQsIDIwMDYvMDMvMTUKKyAqLworc3RhdGljIHZvaWQgYXRsMV92aWFfd29ya2Fyb3VuZChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwl2YWx1ZSA9IGlvcmVhZDE2KGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBQQ0lfQ09NTUFORCk7CisJaWYgKHZhbHVlICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKQorCQl2YWx1ZSAmPSB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOworCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFBDSV9DT01NQU5EKTsKK30KKworLyoKKyAqIGF0bDFfcHJvYmUgLSBEZXZpY2UgSW5pdGlhbGl6YXRpb24gUm91dGluZQorICogQHBkZXY6IFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0CisgKiBAZW50OiBlbnRyeSBpbiBhdGwxX3BjaV90YmwKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICoKKyAqIGF0bDFfcHJvYmUgaW5pdGlhbGl6ZXMgYW4gYWRhcHRlciBpZGVudGlmaWVkIGJ5IGEgcGNpX2RldiBzdHJ1Y3R1cmUuCisgKiBUaGUgT1MgaW5pdGlhbGl6YXRpb24sIGNvbmZpZ3VyaW5nIG9mIHRoZSBhZGFwdGVyIHByaXZhdGUgc3RydWN0dXJlLAorICogYW5kIGEgaGFyZHdhcmUgcmVzZXQgb2NjdXIuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGF0bDFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcjsKKwlzdGF0aWMgaW50IGNhcmRzX2ZvdW5kID0gMDsKKwlib29sIHBjaV91c2luZ182NCA9IHRydWU7CisJaW50IGVycjsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKKwlpZiAoZXJyKSB7CisJCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSIlczogbm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCBhYm9ydGluZ1xuIiwKKwkJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwkJCWdvdG8gZXJyX2RtYTsKKwkJfQorCQlwY2lfdXNpbmdfNjQgPSBmYWxzZTsKKwl9CisJLyogTWFyayBhbGwgUENJIHJlZ2lvbnMgYXNzb2NpYXRlZCB3aXRoIFBDSSBkZXZpY2UKKwkgKiBwZGV2IGFzIGJlaW5nIHJlc2VydmVkIGJ5IG93bmVyIGF0bDFfZHJpdmVyX25hbWUKKwkgKi8KKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIGF0bDFfZHJpdmVyX25hbWUpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JlcXVlc3RfcmVnaW9uczsKKworCS8qIEVuYWJsZXMgYnVzLW1hc3RlcmluZyBvbiB0aGUgZGV2aWNlIGFuZCBjYWxscworCSAqIHBjaWJpb3Nfc2V0X21hc3RlciB0byBkbyB0aGUgbmVlZGVkIGFyY2ggc3BlY2lmaWMgc2V0dGluZ3MKKwkgKi8KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgYXRsMV9hZGFwdGVyKSk7CisJaWYgKCFuZXRkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfYWxsb2NfZXRoZXJkZXY7CisJfQorCVNFVF9NT0RVTEVfT1dORVIobmV0ZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7CisJYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYWRhcHRlci0+bmV0ZGV2ID0gbmV0ZGV2OworCWFkYXB0ZXItPnBkZXYgPSBwZGV2OworCWFkYXB0ZXItPmh3LmJhY2sgPSBhZGFwdGVyOworCisJYWRhcHRlci0+aHcuaHdfYWRkciA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKKwlpZiAoIWFkYXB0ZXItPmh3Lmh3X2FkZHIpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfcGNpX2lvbWFwOworCX0KKwkvKiBnZXQgZGV2aWNlIHJldmlzaW9uIG51bWJlciAqLworCWFkYXB0ZXItPmh3LmRldl9yZXYgPSBpb3JlYWQxNihhZGFwdGVyLT5ody5od19hZGRyICsgKFJFR19NQVNURVJfQ1RSTCArIDIpKTsKKworCS8qIHNldCBkZWZhdWx0IHJpbmcgcmVzb3VyY2UgY291bnRzICovCisJYWRhcHRlci0+cmZkX3JpbmcuY291bnQgPSBhZGFwdGVyLT5ycmRfcmluZy5jb3VudCA9IEFUTDFfREVGQVVMVF9SRkQ7CisJYWRhcHRlci0+dHBkX3JpbmcuY291bnQgPSBBVEwxX0RFRkFVTFRfVFBEOworCisJYWRhcHRlci0+bWlpLmRldiA9IG5ldGRldjsKKwlhZGFwdGVyLT5taWkubWRpb19yZWFkID0gbWRpb19yZWFkOworCWFkYXB0ZXItPm1paS5tZGlvX3dyaXRlID0gbWRpb193cml0ZTsKKwlhZGFwdGVyLT5taWkucGh5X2lkX21hc2sgPSAweDFmOworCWFkYXB0ZXItPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOworCisJbmV0ZGV2LT5vcGVuID0gJmF0bDFfb3BlbjsKKwluZXRkZXYtPnN0b3AgPSAmYXRsMV9jbG9zZTsKKwluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZhdGwxX3htaXRfZnJhbWU7CisJbmV0ZGV2LT5nZXRfc3RhdHMgPSAmYXRsMV9nZXRfc3RhdHM7CisJbmV0ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmYXRsMV9zZXRfbXVsdGk7CisJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmYXRsMV9zZXRfbWFjOworCW5ldGRldi0+Y2hhbmdlX210dSA9ICZhdGwxX2NoYW5nZV9tdHU7CisJbmV0ZGV2LT5kb19pb2N0bCA9ICZhdGwxX2lvY3RsOworCW5ldGRldi0+dHhfdGltZW91dCA9ICZhdGwxX3R4X3RpbWVvdXQ7CisJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IDUgKiBIWjsKKwluZXRkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBhdGwxX3ZsYW5fcnhfcmVnaXN0ZXI7CisJbmV0ZGV2LT52bGFuX3J4X2FkZF92aWQgPSBhdGwxX3ZsYW5fcnhfYWRkX3ZpZDsKKwluZXRkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBhdGwxX3ZsYW5fcnhfa2lsbF92aWQ7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZhdGwxX2V0aHRvb2xfb3BzOworCWFkYXB0ZXItPmJkX251bWJlciA9IGNhcmRzX2ZvdW5kOworCWFkYXB0ZXItPnBjaV91c2luZ182NCA9IHBjaV91c2luZ182NDsKKworCS8qIHNldHVwIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLworCWVyciA9IGF0bDFfc3dfaW5pdChhZGFwdGVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9jb21tb247CisKKwluZXRkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9IV19DU1VNOworCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRzsKKwluZXRkZXYtPmZlYXR1cmVzIHw9IChORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlgpOworCisJLyoKKwkgKiBGSVhNRSAtIFVudGlsIHRzbyBwZXJmb3JtYW5jZSBnZXRzIGZpeGVkLCBkaXNhYmxlIHRoZSBmZWF0dXJlLgorCSAqIEVuYWJsZSBpdCB3aXRoIGV0aHRvb2wgLUsgaWYgZGVzaXJlZC4KKwkgKi8KKwkvKiBuZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOyAqLworCisJaWYgKHBjaV91c2luZ182NCkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisKKwluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKKworCS8qCisJICogcGF0Y2ggZm9yIHNvbWUgTDEgb2Ygb2xkIHZlcnNpb24sCisJICogdGhlIGZpbmFsIHZlcnNpb24gb2YgTDEgbWF5IG5vdCBuZWVkIHRoZXNlCisJICogcGF0Y2hlcworCSAqLworCS8qIGF0bDFfcGNpZV9wYXRjaChhZGFwdGVyKTsgKi8KKworCS8qIHJlYWxseSByZXNldCBHUEhZIGNvcmUgKi8KKwlpb3dyaXRlMTYoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19HUEhZX0VOQUJMRSk7CisKKwkvKgorCSAqIHJlc2V0IHRoZSBjb250cm9sbGVyIHRvCisJICogcHV0IHRoZSBkZXZpY2UgaW4gYSBrbm93biBnb29kIHN0YXJ0aW5nIHN0YXRlCisJICovCisJaWYgKGF0bDFfcmVzZXRfaHcoJmFkYXB0ZXItPmh3KSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9jb21tb247CisJfQorCisJLyogY29weSB0aGUgTUFDIGFkZHJlc3Mgb3V0IG9mIHRoZSBFRVBST00gKi8KKwlhdGwxX3JlYWRfbWFjX2FkZHIoJmFkYXB0ZXItPmh3KTsKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+aHcubWFjX2FkZHIsIG5ldGRldi0+YWRkcl9sZW4pOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG5ldGRldi0+ZGV2X2FkZHIpKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2NvbW1vbjsKKwl9CisKKwlhdGwxX2NoZWNrX29wdGlvbnMoYWRhcHRlcik7CisKKwkvKiBwcmUtaW5pdCB0aGUgTUFDLCBhbmQgc2V0dXAgbGluayAqLworCWVyciA9IGF0bDFfaW5pdF9odygmYWRhcHRlci0+aHcpOworCWlmIChlcnIpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfY29tbW9uOworCX0KKworCWF0bDFfcGNpZV9wYXRjaChhZGFwdGVyKTsKKwkvKiBhc3N1bWUgd2UgaGF2ZSBubyBsaW5rIGZvciBub3cgKi8KKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCWluaXRfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyKTsKKwlhZGFwdGVyLT53YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9ICZhdGwxX3dhdGNoZG9nOworCWFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylhZGFwdGVyOworCisJaW5pdF90aW1lcigmYWRhcHRlci0+cGh5X2NvbmZpZ190aW1lcik7CisJYWRhcHRlci0+cGh5X2NvbmZpZ190aW1lci5mdW5jdGlvbiA9ICZhdGwxX3BoeV9jb25maWc7CisJYWRhcHRlci0+cGh5X2NvbmZpZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpYWRhcHRlcjsKKwlhZGFwdGVyLT5waHlfdGltZXJfcGVuZGluZyA9IGZhbHNlOworCisJSU5JVF9XT1JLKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2ssIGF0bDFfdHhfdGltZW91dF90YXNrKTsKKworCUlOSVRfV09SSygmYWRhcHRlci0+bGlua19jaGdfdGFzaywgYXRsMV9saW5rX2NoZ190YXNrKTsKKworCUlOSVRfV09SSygmYWRhcHRlci0+cGNpZV9kbWFfdG9fcnN0X3Rhc2ssIGF0bDFfdHhfdGltZW91dF90YXNrKTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2NvbW1vbjsKKworCWNhcmRzX2ZvdW5kKys7CisJYXRsMV92aWFfd29ya2Fyb3VuZChhZGFwdGVyKTsKKwlyZXR1cm4gMDsKKworZXJyX2NvbW1vbjoKKwlwY2lfaW91bm1hcChwZGV2LCBhZGFwdGVyLT5ody5od19hZGRyKTsKK2Vycl9wY2lfaW9tYXA6CisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKK2Vycl9hbGxvY19ldGhlcmRldjoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX2RtYToKK2Vycl9yZXF1ZXN0X3JlZ2lvbnM6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBhdGwxX3JlbW92ZSAtIERldmljZSBSZW1vdmFsIFJvdXRpbmUKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdAorICoKKyAqIGF0bDFfcmVtb3ZlIGlzIGNhbGxlZCBieSB0aGUgUENJIHN1YnN5c3RlbSB0byBhbGVydCB0aGUgZHJpdmVyCisgKiB0aGF0IGl0IHNob3VsZCByZWxlYXNlIGEgUENJIGRldmljZS4gIFRoZSBjb3VsZCBiZSBjYXVzZWQgYnkgYQorICogSG90LVBsdWcgZXZlbnQsIG9yIGJlY2F1c2UgdGhlIGRyaXZlciBpcyBnb2luZyB0byBiZSByZW1vdmVkIGZyb20KKyAqIG1lbW9yeS4KKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IGF0bDFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcjsKKwkvKiBEZXZpY2Ugbm90IGF2YWlsYWJsZS4gUmV0dXJuLiAqLworCWlmICghbmV0ZGV2KQorCQlyZXR1cm47CisKKwlhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpb3dyaXRlMTYoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19HUEhZX0VOQUJMRSk7CisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlwY2lfaW91bm1hcChwZGV2LCBhZGFwdGVyLT5ody5od19hZGRyKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCWZyZWVfbmV0ZGV2KG5ldGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGF0bDFfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiBjdHJsID0gMDsKKwl1MzIgd3VmYyA9IGFkYXB0ZXItPndvbDsKKworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlhdGwxX2Rvd24oYWRhcHRlcik7CisKKwlhdGwxX3JlYWRfcGh5X3JlZyhodywgTUlJX0JNU1IsICh1MTYgKikgJiBjdHJsKTsKKwlhdGwxX3JlYWRfcGh5X3JlZyhodywgTUlJX0JNU1IsICh1MTYgKikgJiBjdHJsKTsKKwlpZiAoY3RybCAmIEJNU1JfTFNUQVRVUykKKwkJd3VmYyAmPSB+QVRMMV9XVUZDX0xOS0M7CisKKwkvKiByZWR1Y2Ugc3BlZWQgdG8gMTAvMTAwTSAqLworCWlmICh3dWZjKSB7CisJCWF0bDFfcGh5X2VudGVyX3Bvd2VyX3NhdmluZyhodyk7CisJCS8qIGlmIHJlc3VtZSwgbGV0IGRyaXZlciB0byByZS0gc2V0dXAgbGluayAqLworCQlody0+cGh5X2NvbmZpZ3VyZWQgPSBmYWxzZTsKKwkJYXRsMV9zZXRfbWFjX2FkZHIoaHcpOworCQlhdGwxX3NldF9tdWx0aShuZXRkZXYpOworCisJCWN0cmwgPSAwOworCQkvKiB0dXJuIG9uIG1hZ2ljIHBhY2tldCB3b2wgKi8KKwkJaWYgKHd1ZmMgJiBBVEwxX1dVRkNfTUFHKQorCQkJY3RybCA9IFdPTF9NQUdJQ19FTiB8IFdPTF9NQUdJQ19QTUVfRU47CisKKwkJLyogdHVybiBvbiBMaW5rIGNoYW5nZSBXT0wgKi8KKwkJaWYgKHd1ZmMgJiBBVEwxX1dVRkNfTE5LQykKKwkJCWN0cmwgfD0gKFdPTF9MSU5LX0NIR19FTiB8IFdPTF9MSU5LX0NIR19QTUVfRU4pOworCQlpb3dyaXRlMzIoY3RybCwgaHctPmh3X2FkZHIgKyBSRUdfV09MX0NUUkwpOworCisJCS8qIHR1cm4gb24gYWxsLW11bHRpIG1vZGUgaWYgd2FrZSBvbiBtdWx0aWNhc3QgaXMgZW5hYmxlZCAqLworCQljdHJsID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCQljdHJsICY9IH5NQUNfQ1RSTF9EQkc7CisJCWN0cmwgJj0gfk1BQ19DVFJMX1BST01JU19FTjsKKwkJaWYgKHd1ZmMgJiBBVEwxX1dVRkNfTUMpCisJCQljdHJsIHw9IE1BQ19DVFJMX01DX0FMTF9FTjsKKwkJZWxzZQorCQkJY3RybCAmPSB+TUFDX0NUUkxfTUNfQUxMX0VOOworCisJCS8qIHR1cm4gb24gYnJvYWRjYXN0IG1vZGUgaWYgd2FrZSBvbi1CQyBpcyBlbmFibGVkICovCisJCWlmICh3dWZjICYgQVRMMV9XVUZDX0JDKQorCQkJY3RybCB8PSBNQUNfQ1RSTF9CQ19FTjsKKwkJZWxzZQorCQkJY3RybCAmPSB+TUFDX0NUUkxfQkNfRU47CisKKwkJLyogZW5hYmxlIFJYICovCisJCWN0cmwgfD0gTUFDX0NUUkxfUlhfRU47CisJCWlvd3JpdGUzMihjdHJsLCBody0+aHdfYWRkciArIFJFR19NQUNfQ1RSTCk7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDEpOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMSk7CS8qIDQgPT0gRDMgY29sZCAqLworCX0gZWxzZSB7CisJCWlvd3JpdGUzMigwLCBody0+aHdfYWRkciArIFJFR19XT0xfQ1RSTCk7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7CS8qIDQgPT0gRDMgY29sZCAqLworCX0KKworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QzaG90KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bDFfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIHJldF92YWw7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJcmV0X3ZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAwKTsKKworCWlvd3JpdGUzMigwLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX1dPTF9DVFJMKTsKKwlhdGwxX3Jlc2V0KGFkYXB0ZXIpOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJYXRsMV91cChhZGFwdGVyKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CisKKwlhdGwxX3ZpYV93b3JrYXJvdW5kKGFkYXB0ZXIpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBhdGwxX3N1c3BlbmQgTlVMTAorI2RlZmluZSBhdGwxX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGF0bDFfZHJpdmVyID0geworCS5uYW1lID0gYXRsMV9kcml2ZXJfbmFtZSwKKwkuaWRfdGFibGUgPSBhdGwxX3BjaV90YmwsCisJLnByb2JlID0gYXRsMV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYXRsMV9yZW1vdmUpLAorCS8qIFBvd2VyIE1hbmFnbWVudCBIb29rcyAqLworCS8qIHByb2JhYmx5IGJyb2tlbiByaWdodCBub3cgLS0gQ0hTICovCisJLnN1c3BlbmQgPSBhdGwxX3N1c3BlbmQsCisJLnJlc3VtZSA9IGF0bDFfcmVzdW1lCit9OworCisvKgorICogYXRsMV9leGl0X21vZHVsZSAtIERyaXZlciBFeGl0IENsZWFudXAgUm91dGluZQorICoKKyAqIGF0bDFfZXhpdF9tb2R1bGUgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBkcml2ZXIgaXMgcmVtb3ZlZAorICogZnJvbSBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBhdGwxX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhdGwxX2RyaXZlcik7Cit9CisKKy8qCisgKiBhdGwxX2luaXRfbW9kdWxlIC0gRHJpdmVyIFJlZ2lzdHJhdGlvbiBSb3V0aW5lCisgKgorICogYXRsMV9pbml0X21vZHVsZSBpcyB0aGUgZmlyc3Qgcm91dGluZSBjYWxsZWQgd2hlbiB0aGUgZHJpdmVyIGlzCisgKiBsb2FkZWQuIEFsbCBpdCBkb2VzIGlzIHJlZ2lzdGVyIHdpdGggdGhlIFBDSSBzdWJzeXN0ZW0uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGF0bDFfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlcyAtIHZlcnNpb24gJXNcbiIsIGF0bDFfZHJpdmVyX3N0cmluZywgRFJJVkVSX1ZFUlNJT04pOworCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBhdGwxX2NvcHlyaWdodCk7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmF0bDFfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXRsMV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhdGwxX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9wYXJhbS5jIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX3BhcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwNzIxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9wYXJhbS5jCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDA2IEF0dGFuc2ljIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMDYgQ2hyaXMgU25vb2sgPGNzbm9va0ByZWRoYXQuY29tPgorICogQ29weXJpZ2h0KGMpIDIwMDYgSmF5IENsaWJ1cm4gPGpjbGlidXJuQGdtYWlsLmNvbT4KKyAqCisgKiBEZXJpdmVkIGZyb20gSW50ZWwgZTEwMDAgZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlICJhdGwxLmgiCisKKy8qCisgKiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBhZGp1c3QgdGhlCisgKiBtYXhpbXVtIG51bWJlciBvZiBwb3J0cyB0aGF0IHRoZSBkcml2ZXIgY2FuIG1hbmFnZS4KKyAqLworI2RlZmluZSBBVEwxX01BWF9OSUMgNAorCisjZGVmaW5lIE9QVElPTl9VTlNFVCAgICAtMQorI2RlZmluZSBPUFRJT05fRElTQUJMRUQgMAorI2RlZmluZSBPUFRJT05fRU5BQkxFRCAgMQorCisjZGVmaW5lIEFUTDFfUEFSQU1fSU5JVCB7IFswIC4uLiBBVEwxX01BWF9OSUNdID0gT1BUSU9OX1VOU0VUIH0KKworLyoKKyAqIEludGVycnVwdCBNb2RlcmF0ZSBUaW1lciBpbiB1bml0cyBvZiAyIHVzCisgKgorICogVmFsaWQgUmFuZ2U6IDEwLTY1NTM1CisgKgorICogRGVmYXVsdCBWYWx1ZTogMTAwICgyMDB1cykKKyAqLworc3RhdGljIGludCBfX2RldmluaXRkYXRhIGludF9tb2RfdGltZXJbQVRMMV9NQVhfTklDKzFdID0gQVRMMV9QQVJBTV9JTklUOworc3RhdGljIGludCBudW1faW50X21vZF90aW1lciA9IDA7Cittb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQoaW50X21vZF90aW1lciwgaW50X21vZF90aW1lciwgaW50LCAmbnVtX2ludF9tb2RfdGltZXIsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbnRfbW9kX3RpbWVyLCAiSW50ZXJydXB0IG1vZGVyYXRvciB0aW1lciIpOworCisvKgorICogZmxhc2hfdmVuZG9yCisgKgorICogVmFsaWQgUmFuZ2U6IDAtMgorICoKKyAqIDAgLSBBdG1lbAorICogMSAtIFNTVAorICogMiAtIFNUCisgKgorICogRGVmYXVsdCBWYWx1ZTogMAorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgZmxhc2hfdmVuZG9yW0FUTDFfTUFYX05JQysxXSA9IEFUTDFfUEFSQU1fSU5JVDsKK3N0YXRpYyBpbnQgbnVtX2ZsYXNoX3ZlbmRvciA9IDA7Cittb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQoZmxhc2hfdmVuZG9yLCBmbGFzaF92ZW5kb3IsIGludCwgJm51bV9mbGFzaF92ZW5kb3IsIDApOworTU9EVUxFX1BBUk1fREVTQyhmbGFzaF92ZW5kb3IsICJTUEkgZmxhc2ggdmVuZG9yIik7CisKKyNkZWZpbmUgREVGQVVMVF9JTlRfTU9EX0NOVAkxMDAJLyogMjAwdXMgKi8KKyNkZWZpbmUgTUFYX0lOVF9NT0RfQ05UCQk2NTAwMAorI2RlZmluZSBNSU5fSU5UX01PRF9DTlQJCTUwCisKKyNkZWZpbmUgRkxBU0hfVkVORE9SX0RFRkFVTFQJMAorI2RlZmluZSBGTEFTSF9WRU5ET1JfTUlOCTAKKyNkZWZpbmUgRkxBU0hfVkVORE9SX01BWAkyCisKK3N0cnVjdCBhdGwxX29wdGlvbiB7CisJZW51bSB7IGVuYWJsZV9vcHRpb24sIHJhbmdlX29wdGlvbiwgbGlzdF9vcHRpb24gfSB0eXBlOworCWNoYXIgKm5hbWU7CisJY2hhciAqZXJyOworCWludCBkZWY7CisJdW5pb24geworCQlzdHJ1Y3QgewkvKiByYW5nZV9vcHRpb24gaW5mbyAqLworCQkJaW50IG1pbjsKKwkJCWludCBtYXg7CisJCX0gcjsKKwkJc3RydWN0IHsJLyogbGlzdF9vcHRpb24gaW5mbyAqLworCQkJaW50IG5yOworCQkJc3RydWN0IGF0bDFfb3B0X2xpc3QgeworCQkJCWludCBpOworCQkJCWNoYXIgKnN0cjsKKwkJCX0gKnA7CisJCX0gbDsKKwl9IGFyZzsKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGF0bDFfdmFsaWRhdGVfb3B0aW9uKGludCAqdmFsdWUsIHN0cnVjdCBhdGwxX29wdGlvbiAqb3B0KQoreworCWlmICgqdmFsdWUgPT0gT1BUSU9OX1VOU0VUKSB7CisJCSp2YWx1ZSA9IG9wdC0+ZGVmOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKG9wdC0+dHlwZSkgeworCWNhc2UgZW5hYmxlX29wdGlvbjoKKwkJc3dpdGNoICgqdmFsdWUpIHsKKwkJY2FzZSBPUFRJT05fRU5BQkxFRDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBFbmFibGVkXG4iLCBhdGwxX2RyaXZlcl9uYW1lLAorCQkJCW9wdC0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBPUFRJT05fRElTQUJMRUQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgRGlzYWJsZWRcbiIsIGF0bDFfZHJpdmVyX25hbWUsCisJCQkJb3B0LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgcmFuZ2Vfb3B0aW9uOgorCQlpZiAoKnZhbHVlID49IG9wdC0+YXJnLnIubWluICYmICp2YWx1ZSA8PSBvcHQtPmFyZy5yLm1heCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIHNldCB0byAlaVxuIiwKKwkJCQlhdGwxX2RyaXZlcl9uYW1lLCBvcHQtPm5hbWUsICp2YWx1ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIGxpc3Rfb3B0aW9uOnsKKwkJCWludCBpOworCQkJc3RydWN0IGF0bDFfb3B0X2xpc3QgKmVudDsKKworCQkJZm9yIChpID0gMDsgaSA8IG9wdC0+YXJnLmwubnI7IGkrKykgeworCQkJCWVudCA9ICZvcHQtPmFyZy5sLnBbaV07CisJCQkJaWYgKCp2YWx1ZSA9PSBlbnQtPmkpIHsKKwkJCQkJaWYgKGVudC0+c3RyWzBdICE9ICdcMCcpCisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXNcbiIsCisJCQkJCQkgICAgICAgYXRsMV9kcml2ZXJfbmFtZSwgZW50LT5zdHIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCAlcyBzcGVjaWZpZWQgKCVpKSAlc1xuIiwKKwkgICAgICAgYXRsMV9kcml2ZXJfbmFtZSwgb3B0LT5uYW1lLCAqdmFsdWUsIG9wdC0+ZXJyKTsKKwkqdmFsdWUgPSBvcHQtPmRlZjsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBhdGwxX2NoZWNrX29wdGlvbnMgLSBSYW5nZSBDaGVja2luZyBmb3IgQ29tbWFuZCBMaW5lIFBhcmFtZXRlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgcm91dGluZSBjaGVja3MgYWxsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGZvciB2YWxpZCB1c2VyCisgKiBpbnB1dC4gIElmIGFuIGludmFsaWQgdmFsdWUgaXMgZ2l2ZW4sIG9yIGlmIG5vIHVzZXIgc3BlY2lmaWVkCisgKiB2YWx1ZSBleGlzdHMsIGEgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkLiAgVGhlIGZpbmFsIHZhbHVlIGlzIHN0b3JlZAorICogaW4gYSB2YXJpYWJsZSBpbiB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQgX19kZXZpbml0IGF0bDFfY2hlY2tfb3B0aW9ucyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBiZCA9IGFkYXB0ZXItPmJkX251bWJlcjsKKwlpZiAoYmQgPj0gQVRMMV9NQVhfTklDKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHdhcm5pbmc6IG5vIGNvbmZpZ3VyYXRpb24gZm9yIGJvYXJkICMlaVxuIiwKKwkJCWF0bDFfZHJpdmVyX25hbWUsIGJkKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogdXNpbmcgZGVmYXVsdHMgZm9yIGFsbCB2YWx1ZXNcbiIsCisJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwl9CisJewkJCS8qIEludGVycnVwdCBNb2RlcmF0ZSBUaW1lciAqLworCQlzdHJ1Y3QgYXRsMV9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSByYW5nZV9vcHRpb24sCisJCQkubmFtZSA9ICJJbnRlcnJ1cHQgTW9kZXJhdG9yIFRpbWVyIiwKKwkJCS5lcnIgPSAidXNpbmcgZGVmYXVsdCBvZiAiCisJCQkJX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfSU5UX01PRF9DTlQpLAorCQkJLmRlZiA9IERFRkFVTFRfSU5UX01PRF9DTlQsCisJCQkuYXJnID0gey5yID0KKwkJCQl7Lm1pbiA9IE1JTl9JTlRfTU9EX0NOVCwubWF4ID0gTUFYX0lOVF9NT0RfQ05UfX0KKwkJfTsKKwkJaW50IHZhbDsKKwkJaWYgKG51bV9pbnRfbW9kX3RpbWVyID4gYmQpIHsKKwkJCXZhbCA9IGludF9tb2RfdGltZXJbYmRdOworCQkJYXRsMV92YWxpZGF0ZV9vcHRpb24oJnZhbCwgJm9wdCk7CisJCQlhZGFwdGVyLT5pbXQgPSAodTE2KSB2YWw7CisJCX0gZWxzZQorCQkJYWRhcHRlci0+aW10ID0gKHUxNikgKG9wdC5kZWYpOworCX0KKworCXsJCQkvKiBGbGFzaCBWZW5kb3IgKi8KKwkJc3RydWN0IGF0bDFfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiU1BJIEZsYXNoIFZlbmRvciIsCisJCQkuZXJyID0gInVzaW5nIGRlZmF1bHQgb2YgIgorCQkJCV9fTU9EVUxFX1NUUklORyhGTEFTSF9WRU5ET1JfREVGQVVMVCksCisJCQkuZGVmID0gREVGQVVMVF9JTlRfTU9EX0NOVCwKKwkJCS5hcmcgPSB7LnIgPQorCQkJCXsubWluID0gRkxBU0hfVkVORE9SX01JTiwubWF4ID0KKwkJCQkgRkxBU0hfVkVORE9SX01BWH19CisJCX07CisJCWludCB2YWw7CisJCWlmIChudW1fZmxhc2hfdmVuZG9yID4gYmQpIHsKKwkJCXZhbCA9IGZsYXNoX3ZlbmRvcltiZF07CisJCQlhdGwxX3ZhbGlkYXRlX29wdGlvbigmdmFsLCAmb3B0KTsKKwkJCWFkYXB0ZXItPmh3LmZsYXNoX3ZlbmRvciA9ICh1OCkgdmFsOworCQl9IGVsc2UKKwkJCWFkYXB0ZXItPmh3LmZsYXNoX3ZlbmRvciA9ICh1OCkgKG9wdC5kZWYpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwppbmRleCAzMjkyMzE2Li4yMTdhMmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAogCXNwaW5fbG9ja19pbml0KCYoYm9uZF9pbmZvLT50eF9oYXNodGJsX2xvY2spKTsKIAotCW5ld19oYXNodGJsID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwluZXdfaGFzaHRibCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdfaGFzaHRibCkgewogCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKIAkJICAgICAgICI6ICVzOiBFcnJvcjogRmFpbGVkIHRvIGFsbG9jYXRlIFRMQiBoYXNoIHRhYmxlXG4iLApAQCAtMTk1LDggKzE5NSw2IEBACiAKIAlib25kX2luZm8tPnR4X2hhc2h0YmwgPSBuZXdfaGFzaHRibDsKIAotCW1lbXNldChib25kX2luZm8tPnR4X2hhc2h0YmwsIDAsIHNpemUpOwotCiAJZm9yIChpID0gMDsgaSA8IFRMQl9IQVNIX1RBQkxFX1NJWkU7IGkrKykgewogCQl0bGJfaW5pdF90YWJsZV9lbnRyeSgmYm9uZF9pbmZvLT50eF9oYXNodGJsW2ldLCAxKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwppbmRleCBkMzgwMWEwLi44Y2U4ZmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKQEAgLTEzNDMsMTQgKzEzNDMsMTIgQEAKIAkJCSJpbmFjY3VyYXRlLlxuIiwgYm9uZF9kZXYtPm5hbWUsIHNsYXZlX2Rldi0+bmFtZSk7CiAJfQogCi0JbmV3X3NsYXZlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNsYXZlKSwgR0ZQX0tFUk5FTCk7CisJbmV3X3NsYXZlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNsYXZlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdfc2xhdmUpIHsKIAkJcmVzID0gLUVOT01FTTsKIAkJZ290byBlcnJfdW5kb19mbGFnczsKIAl9CiAKLQltZW1zZXQobmV3X3NsYXZlLCAwLCBzaXplb2Yoc3RydWN0IHNsYXZlKSk7Ci0KIAkvKiBzYXZlIHNsYXZlJ3Mgb3JpZ2luYWwgZmxhZ3MgYmVmb3JlIGNhbGxpbmcKIAkgKiBuZXRkZXZfc2V0X21hc3RlciBhbmQgZGV2X29wZW4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYwppbmRleCBkZmEwMzVhLi5jNjdmN2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfbWFpbi5jCkBAIC03NCw4ICs3NCw2IEBACiAKICNkZWZpbmUgRUVQUk9NX01BR0lDIDB4MzhFMkYxMEMKIAotI2RlZmluZSB0b19uZXRfZGV2KGNsYXNzKSBjb250YWluZXJfb2YoY2xhc3MsIHN0cnVjdCBuZXRfZGV2aWNlLCBjbGFzc19kZXYpCi0KICNkZWZpbmUgQ0hfREVWSUNFKGRldmlkLCBzc2lkLCBpZHgpIFwKIAl7IFBDSV9WRU5ET1JfSURfQ0hFTFNJTywgZGV2aWQsIFBDSV9BTllfSUQsIHNzaWQsIDAsIDAsIGlkeCB9CiAKQEAgLTQzNCwxMSArNDMyLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGF0dHJfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmLAorc3RhdGljIHNzaXplX3QgYXR0cl9zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1ZiwKIAkJCSBzc2l6ZV90KCpmb3JtYXQpIChzdHJ1Y3QgYWRhcHRlciAqLCBjaGFyICopKQogewogCXNzaXplX3QgbGVuOwotCXN0cnVjdCBhZGFwdGVyICphZGFwID0gdG9fbmV0X2RldihjZCktPnByaXY7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSB0b19uZXRfZGV2KGQpLT5wcml2OwogCiAJLyogU3luY2hyb25pemUgd2l0aCBpb2N0bHMgdGhhdCBtYXkgc2h1dCBkb3duIHRoZSBkZXZpY2UgKi8KIAlydG5sX2xvY2soKTsKQEAgLTQ0NywxNCArNDQ2LDE1IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIHNzaXplX3QgYXR0cl9zdG9yZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLAorc3RhdGljIHNzaXplX3QgYXR0cl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLAogCQkJICBzc2l6ZV90KCpzZXQpIChzdHJ1Y3QgYWRhcHRlciAqLCB1bnNpZ25lZCBpbnQpLAogCQkJICB1bnNpZ25lZCBpbnQgbWluX3ZhbCwgdW5zaWduZWQgaW50IG1heF92YWwpCiB7CiAJY2hhciAqZW5kcDsKIAlzc2l6ZV90IHJldDsKIAl1bnNpZ25lZCBpbnQgdmFsOwotCXN0cnVjdCBhZGFwdGVyICphZGFwID0gdG9fbmV0X2RldihjZCktPnByaXY7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSB0b19uZXRfZGV2KGQpLT5wcml2OwogCiAJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwpAQCAtNDc2LDkgKzQ3NiwxMCBAQAogeyBcCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbF9leHByKTsgXAogfSBcCi1zdGF0aWMgc3NpemVfdCBzaG93XyMjbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjbmFtZShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQkJICAgY2hhciAqYnVmKSBcCiB7IFwKLQlyZXR1cm4gYXR0cl9zaG93KGNkLCBidWYsIGZvcm1hdF8jI25hbWUpOyBcCisJcmV0dXJuIGF0dHJfc2hvdyhkLCBhdHRyLCBidWYsIGZvcm1hdF8jI25hbWUpOyBcCiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNldF9uZmlsdGVycyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHZhbCkKQEAgLTQ5MywxMCArNDk0LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX25maWx0ZXJzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWYsCi0JCQkgICAgICBzaXplX3QgbGVuKQorc3RhdGljIHNzaXplX3Qgc3RvcmVfbmZpbHRlcnMoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7Ci0JcmV0dXJuIGF0dHJfc3RvcmUoY2QsIGJ1ZiwgbGVuLCBzZXRfbmZpbHRlcnMsIDAsIH4wKTsKKwlyZXR1cm4gYXR0cl9zdG9yZShkLCBhdHRyLCBidWYsIGxlbiwgc2V0X25maWx0ZXJzLCAwLCB+MCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNldF9uc2VydmVycyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHZhbCkKQEAgLTUwOSwzOCArNTEwLDM5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX25zZXJ2ZXJzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWYsCi0JCQkgICAgICBzaXplX3QgbGVuKQorc3RhdGljIHNzaXplX3Qgc3RvcmVfbnNlcnZlcnMoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7Ci0JcmV0dXJuIGF0dHJfc3RvcmUoY2QsIGJ1ZiwgbGVuLCBzZXRfbnNlcnZlcnMsIDAsIH4wKTsKKwlyZXR1cm4gYXR0cl9zdG9yZShkLCBhdHRyLCBidWYsIGxlbiwgc2V0X25zZXJ2ZXJzLCAwLCB+MCk7CiB9CiAKICNkZWZpbmUgQ1hHQjNfQVRUUl9SKG5hbWUsIHZhbF9leHByKSBcCiBDWEdCM19TSE9XKG5hbWUsIHZhbF9leHByKSBcCi1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd18jI25hbWUsIE5VTEwpCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd18jI25hbWUsIE5VTEwpCiAKICNkZWZpbmUgQ1hHQjNfQVRUUl9SVyhuYW1lLCB2YWxfZXhwciwgc3RvcmVfbWV0aG9kKSBcCiBDWEdCM19TSE9XKG5hbWUsIHZhbF9leHByKSBcCi1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfIyNuYW1lLCBzdG9yZV9tZXRob2QpCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfIyNuYW1lLCBzdG9yZV9tZXRob2QpCiAKIENYR0IzX0FUVFJfUihjYW1fc2l6ZSwgdDNfbWM1X3NpemUoJmFkYXAtPm1jNSkpOwogQ1hHQjNfQVRUUl9SVyhuZmlsdGVycywgYWRhcC0+cGFyYW1zLm1jNS5uZmlsdGVycywgc3RvcmVfbmZpbHRlcnMpOwogQ1hHQjNfQVRUUl9SVyhuc2VydmVycywgYWRhcC0+cGFyYW1zLm1jNS5uc2VydmVycywgc3RvcmVfbnNlcnZlcnMpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY3hnYjNfYXR0cnNbXSA9IHsKLQkmY2xhc3NfZGV2aWNlX2F0dHJfY2FtX3NpemUuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfbmZpbHRlcnMuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfbnNlcnZlcnMuYXR0ciwKKwkmZGV2X2F0dHJfY2FtX3NpemUuYXR0ciwKKwkmZGV2X2F0dHJfbmZpbHRlcnMuYXR0ciwKKwkmZGV2X2F0dHJfbnNlcnZlcnMuYXR0ciwKIAlOVUxMCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjeGdiM19hdHRyX2dyb3VwID0gey5hdHRycyA9IGN4Z2IzX2F0dHJzIH07CiAKLXN0YXRpYyBzc2l6ZV90IHRtX2F0dHJfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmLCBpbnQgc2NoZWQpCitzdGF0aWMgc3NpemVfdCB0bV9hdHRyX3Nob3coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmLCBpbnQgc2NoZWQpCiB7CiAJc3NpemVfdCBsZW47CiAJdW5zaWduZWQgaW50IHYsIGFkZHIsIGJwdCwgY3B0OwotCXN0cnVjdCBhZGFwdGVyICphZGFwID0gdG9fbmV0X2RldihjZCktPnByaXY7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSB0b19uZXRfZGV2KGQpLT5wcml2OwogCiAJYWRkciA9IEFfVFBfVFhfTU9EX1ExX1EwX1JBVEVfTElNSVQgLSBzY2hlZCAvIDI7CiAJcnRubF9sb2NrKCk7CkBAIC01NjAsMTMgKzU2MiwxMyBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHRtX2F0dHJfc3RvcmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSAgICAgc2l6ZV90IGxlbiwgaW50IHNjaGVkKQorc3RhdGljIHNzaXplX3QgdG1fYXR0cl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLCBpbnQgc2NoZWQpCiB7CiAJY2hhciAqZW5kcDsKIAlzc2l6ZV90IHJldDsKIAl1bnNpZ25lZCBpbnQgdmFsOwotCXN0cnVjdCBhZGFwdGVyICphZGFwID0gdG9fbmV0X2RldihjZCktPnByaXY7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSB0b19uZXRfZGV2KGQpLT5wcml2OwogCiAJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwpAQCAtNTg0LDE1ICs1ODYsMTcgQEAKIH0KIAogI2RlZmluZSBUTV9BVFRSKG5hbWUsIHNjaGVkKSBcCi1zdGF0aWMgc3NpemVfdCBzaG93XyMjbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjbmFtZShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQkJICAgY2hhciAqYnVmKSBcCiB7IFwKLQlyZXR1cm4gdG1fYXR0cl9zaG93KGNkLCBidWYsIHNjaGVkKTsgXAorCXJldHVybiB0bV9hdHRyX3Nob3coZCwgYXR0ciwgYnVmLCBzY2hlZCk7IFwKIH0gXAotc3RhdGljIHNzaXplX3Qgc3RvcmVfIyNuYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pIFwKK3N0YXRpYyBzc2l6ZV90IHN0b3JlXyMjbmFtZShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgXAogeyBcCi0JcmV0dXJuIHRtX2F0dHJfc3RvcmUoY2QsIGJ1ZiwgbGVuLCBzY2hlZCk7IFwKKwlyZXR1cm4gdG1fYXR0cl9zdG9yZShkLCBhdHRyLCBidWYsIGxlbiwgc2NoZWQpOyBcCiB9IFwKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd18jI25hbWUsIHN0b3JlXyMjbmFtZSkKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd18jI25hbWUsIHN0b3JlXyMjbmFtZSkKIAogVE1fQVRUUihzY2hlZDAsIDApOwogVE1fQVRUUihzY2hlZDEsIDEpOwpAQCAtNjA0LDE0ICs2MDgsMTQgQEAKIFRNX0FUVFIoc2NoZWQ3LCA3KTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm9mZmxvYWRfYXR0cnNbXSA9IHsKLQkmY2xhc3NfZGV2aWNlX2F0dHJfc2NoZWQwLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3NjaGVkMS5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9zY2hlZDIuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfc2NoZWQzLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3NjaGVkNC5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9zY2hlZDUuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfc2NoZWQ2LmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3NjaGVkNy5hdHRyLAorCSZkZXZfYXR0cl9zY2hlZDAuYXR0ciwKKwkmZGV2X2F0dHJfc2NoZWQxLmF0dHIsCisJJmRldl9hdHRyX3NjaGVkMi5hdHRyLAorCSZkZXZfYXR0cl9zY2hlZDMuYXR0ciwKKwkmZGV2X2F0dHJfc2NoZWQ0LmF0dHIsCisJJmRldl9hdHRyX3NjaGVkNS5hdHRyLAorCSZkZXZfYXR0cl9zY2hlZDYuYXR0ciwKKwkmZGV2X2F0dHJfc2NoZWQ3LmF0dHIsCiAJTlVMTAogfTsKIApAQCAtODM2LDcgKzg0MCw3IEBACiAJaW5pdF9zbXQoYWRhcHRlcik7CiAKIAkvKiBOZXZlciBtaW5kIGlmIHRoZSBuZXh0IHN0ZXAgZmFpbHMgKi8KLQlzeXNmc19jcmVhdGVfZ3JvdXAoJnRkZXYtPmxsZGV2LT5jbGFzc19kZXYua29iaiwgJm9mZmxvYWRfYXR0cl9ncm91cCk7CisJc3lzZnNfY3JlYXRlX2dyb3VwKCZ0ZGV2LT5sbGRldi0+ZGV2LmtvYmosICZvZmZsb2FkX2F0dHJfZ3JvdXApOwogCiAJLyogQ2FsbCBiYWNrIGFsbCByZWdpc3RlcmVkIGNsaWVudHMgKi8KIAljeGdiM19hZGRfY2xpZW50cyh0ZGV2KTsKQEAgLTg2MSw3ICs4NjUsNyBAQAogCS8qIENhbGwgYmFjayBhbGwgcmVnaXN0ZXJlZCBjbGllbnRzICovCiAJY3hnYjNfcmVtb3ZlX2NsaWVudHModGRldik7CiAKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnRkZXYtPmxsZGV2LT5jbGFzc19kZXYua29iaiwgJm9mZmxvYWRfYXR0cl9ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZ0ZGV2LT5sbGRldi0+ZGV2LmtvYmosICZvZmZsb2FkX2F0dHJfZ3JvdXApOwogCiAJdGRldi0+bGxkZXYgPSBOVUxMOwogCWN4Z2IzX3NldF9kdW1teV9vcHModGRldik7CkBAIC0yNDIwLDcgKzI0MjQsNyBAQAogCWVsc2UgaWYgKG1zaSA+IDAgJiYgcGNpX2VuYWJsZV9tc2kocGRldikgPT0gMCkKIAkJYWRhcHRlci0+ZmxhZ3MgfD0gVVNJTkdfTVNJOwogCi0JZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZhZGFwdGVyLT5wb3J0WzBdLT5jbGFzc19kZXYua29iaiwKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmFkYXB0ZXItPnBvcnRbMF0tPmRldi5rb2JqLAogCQkJCSAmY3hnYjNfYXR0cl9ncm91cCk7CiAKIAlwcmludF9wb3J0X2luZm8oYWRhcHRlciwgYWkpOwpAQCAtMjQ1Miw3ICsyNDU2LDcgQEAKIAkJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CiAKIAkJdDNfc2dlX3N0b3AoYWRhcHRlcik7Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmYWRhcHRlci0+cG9ydFswXS0+Y2xhc3NfZGV2LmtvYmosCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmYWRhcHRlci0+cG9ydFswXS0+ZGV2LmtvYmosCiAJCQkJICAgJmN4Z2IzX2F0dHJfZ3JvdXApOwogCiAJCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYwppbmRleCBjM2EwMmQ2Li5jNmI3MjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5jCkBAIC0zOTYsNyArMzk2LDcgQEAKIAkJCQlpbnQgbikKIHsKIAlDSF9FUlIodGRldjJhZGFwKGRldiksICIlZCB1bmV4cGVjdGVkIG9mZmxvYWQgcGFja2V0cywgZmlyc3QgZGF0YSAldVxuIiwKLQkgICAgICAgbiwgbnRvaGwoKih1MzIgKilza2JzWzBdLT5kYXRhKSk7CisJICAgICAgIG4sIG50b2hsKCooX19iZTMyICopc2tic1swXS0+ZGF0YSkpOwogCXdoaWxlIChuLS0pCiAJCWRldl9rZnJlZV9za2JfYW55KHNrYnNbbl0pOwogCXJldHVybiAwOwpAQCAtNzU1LDcgKzc1NSw3IEBACiB7CiAJc3RydWN0IGNwbF90cmFjZV9wa3QgKnAgPSBjcGxoZHIoc2tiKTsKIAotCXNrYi0+cHJvdG9jb2wgPSAweGZmZmY7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKDB4ZmZmZik7CiAJc2tiLT5kZXYgPSBkZXYtPmxsZGV2OwogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpwKSk7CiAJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGVmeHguYyBiL2RyaXZlcnMvbmV0L2RlZnh4LmMKaW5kZXggZGMzYWIzYi4uMDdkMjczMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGVmeHguYworKysgYi9kcml2ZXJzL25ldC9kZWZ4eC5jCkBAIC0xMCwxMCArMTAsMTIgQEAKICAqCiAgKiBBYnN0cmFjdDoKICAqICAgQSBMaW51eCBkZXZpY2UgZHJpdmVyIHN1cHBvcnRpbmcgdGhlIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uCi0gKiAgIEZEREkgRUlTQSBhbmQgUENJIGNvbnRyb2xsZXIgZmFtaWxpZXMuICBTdXBwb3J0ZWQgYWRhcHRlcnMgaW5jbHVkZToKKyAqICAgRkRESSBUVVJCT2NoYW5uZWwsIEVJU0EgYW5kIFBDSSBjb250cm9sbGVyIGZhbWlsaWVzLiAgU3VwcG9ydGVkCisgKiAgIGFkYXB0ZXJzIGluY2x1ZGU6CiAgKgotICoJCURFQyBGRERJY29udHJvbGxlci9FSVNBIChERUZFQSkKLSAqCQlERUMgRkRESWNvbnRyb2xsZXIvUENJICAoREVGUEEpCisgKgkJREVDIEZEREljb250cm9sbGVyL1RVUkJPY2hhbm5lbCAoREVGVEEpCisgKgkJREVDIEZEREljb250cm9sbGVyL0VJU0EgICAgICAgICAoREVGRUEpCisgKgkJREVDIEZEREljb250cm9sbGVyL1BDSSAgICAgICAgICAoREVGUEEpCiAgKgogICogVGhlIG9yaWdpbmFsIGF1dGhvcjoKICAqICAgTFZTCUxhd3JlbmNlIFYuIFN0ZWZhbmkgPGxzdGVmYW5pQHlhaG9vLmNvbT4KQEAgLTE5MywyNCArMTk1LDI3IEBACiAgKgkJMTQgQXVnIDIwMDQJbWFjcm8JCUZpeCBkZXZpY2UgbmFtZXMgcmVwb3J0ZWQuCiAgKgkJMTQgSnVuIDIwMDUJbWFjcm8JCVVzZSBpcnFyZXR1cm5fdC4KICAqCQkyMyBPY3QgMjAwNgltYWNybwkJQmlnLWVuZGlhbiBob3N0IHN1cHBvcnQuCisgKgkJMTQgRGVjIDIwMDYJbWFjcm8JCVRVUkJPY2hhbm5lbCBzdXBwb3J0LgogICovCiAKIC8qIEluY2x1ZGUgZmlsZXMgKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZkZGlkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZWlzYS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmRkaWRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGMuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTIxOSw4ICsyMjQsOCBAQAogCiAvKiBWZXJzaW9uIGluZm9ybWF0aW9uIHN0cmluZyBzaG91bGQgYmUgdXBkYXRlZCBwcmlvciB0byBlYWNoIG5ldyByZWxlYXNlISAgKi8KICNkZWZpbmUgRFJWX05BTUUgImRlZnh4IgotI2RlZmluZSBEUlZfVkVSU0lPTiAidjEuMDkiCi0jZGVmaW5lIERSVl9SRUxEQVRFICIyMDA2LzEwLzIzIgorI2RlZmluZSBEUlZfVkVSU0lPTiAidjEuMTAiCisjZGVmaW5lIERSVl9SRUxEQVRFICIyMDA2LzEyLzE0IgogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CiAJRFJWX05BTUUgIjogIiBEUlZfVkVSU0lPTiAiICIgRFJWX1JFTERBVEUKQEAgLTIzNSwxMiArMjQwLDQxIEBACiAgKi8KICNkZWZpbmUgTkVXX1NLQl9TSVpFIChQSV9SQ1ZfREFUQV9LX1NJWkVfTUFYKzEyOCkKIAorI2RlZmluZSBfX3VudXNlZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKKworI2lmZGVmIENPTkZJR19QQ0kKKyNkZWZpbmUgREZYX0JVU19QQ0koZGV2KSAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkKKyNlbHNlCisjZGVmaW5lIERGWF9CVVNfUENJKGRldikgMAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRUlTQQorI2RlZmluZSBERlhfQlVTX0VJU0EoZGV2KSAoZGV2LT5idXMgPT0gJmVpc2FfYnVzX3R5cGUpCisjZWxzZQorI2RlZmluZSBERlhfQlVTX0VJU0EoZGV2KSAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19UQworI2RlZmluZSBERlhfQlVTX1RDKGRldikgKGRldi0+YnVzID09ICZ0Y19idXNfdHlwZSkKKyNlbHNlCisjZGVmaW5lIERGWF9CVVNfVEMoZGV2KSAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ERUZYWF9NTUlPCisjZGVmaW5lIERGWF9NTUlPIDEKKyNlbHNlCisjZGVmaW5lIERGWF9NTUlPIDAKKyNlbmRpZgorCiAvKiBEZWZpbmUgbW9kdWxlLXdpZGUgKHN0YXRpYykgcm91dGluZXMgKi8KIAogc3RhdGljIHZvaWQJCWRmeF9idXNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkCQlkZnhfYnVzX3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkCQlkZnhfYnVzX2NvbmZpZ19jaGVjayhERlhfYm9hcmRfdCAqYnApOwogCi1zdGF0aWMgaW50CQlkZnhfZHJpdmVyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcHJpbnRfbmFtZSk7CitzdGF0aWMgaW50CQlkZnhfZHJpdmVyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJY29uc3QgY2hhciAqcHJpbnRfbmFtZSwKKwkJCQkJcmVzb3VyY2Vfc2l6ZV90IGJhcl9zdGFydCk7CiBzdGF0aWMgaW50CQlkZnhfYWRhcF9pbml0KERGWF9ib2FyZF90ICpicCwgaW50IGdldF9idWZmZXJzKTsKIAogc3RhdGljIGludAkJZGZ4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC0yNzMsMTMgKzMwNywxMyBAQAogCiAvKiBEZWZpbmUgbW9kdWxlLXdpZGUgKHN0YXRpYykgdmFyaWFibGVzICovCiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcm9vdF9kZnhfZWlzYV9kZXY7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZGZ4X3BjaV9kcml2ZXI7CitzdGF0aWMgc3RydWN0IGVpc2FfZHJpdmVyIGRmeF9laXNhX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdGNfZHJpdmVyIGRmeF90Y19kcml2ZXI7CiAKIAogLyoKICAqID09PT09PT09PT09PT09PT09PT09PT09Ci0gKiA9IGRmeF9wb3J0X3dyaXRlX2J5dGUgPQotICogPSBkZnhfcG9ydF9yZWFkX2J5dGUJID0KICAqID0gZGZ4X3BvcnRfd3JpdGVfbG9uZyA9CiAgKiA9IGRmeF9wb3J0X3JlYWRfbG9uZyAgPQogICogPT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTI5MSwxMiArMzI1LDExIEBACiAgKiAgIE5vbmUKICAqCiAgKiBBcmd1bWVudHM6Ci0gKiAgIGJwICAgICAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KLSAqICAgb2Zmc2V0IC0gcmVnaXN0ZXIgb2Zmc2V0IGZyb20gYmFzZSBJL08gYWRkcmVzcwotICogICBkYXRhICAgLSBmb3IgZGZ4X3BvcnRfd3JpdGVfYnl0ZSBhbmQgZGZ4X3BvcnRfd3JpdGVfbG9uZywgdGhpcwotICoJCQkgIGlzIGEgdmFsdWUgdG8gd3JpdGUuCi0gKgkJCSAgZm9yIGRmeF9wb3J0X3JlYWRfYnl0ZSBhbmQgZGZ4X3BvcnRfcmVhZF9ieXRlLCB0aGlzCi0gKgkJCSAgaXMgYSBwb2ludGVyIHRvIHN0b3JlIHRoZSByZWFkIHZhbHVlLgorICogICBicAkJLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKiAgIG9mZnNldAktIHJlZ2lzdGVyIG9mZnNldCBmcm9tIGJhc2UgSS9PIGFkZHJlc3MKKyAqICAgZGF0YQktIGZvciBkZnhfcG9ydF93cml0ZV9sb25nLCB0aGlzIGlzIGEgdmFsdWUgdG8gd3JpdGU7CisgKgkJICBmb3IgZGZ4X3BvcnRfcmVhZF9sb25nLCB0aGlzIGlzIGEgcG9pbnRlciB0byBzdG9yZQorICoJCSAgdGhlIHJlYWQgdmFsdWUKICAqCiAgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgogICogICBUaGVzZSByb3V0aW5lcyBwZXJmb3JtIHRoZSBjb3JyZWN0IG9wZXJhdGlvbiB0byByZWFkIG9yIHdyaXRlCkBAIC0zMTAsNyArMzQzLDcgQEAKICAqICAgcmVnaXN0ZXJzIHVzaW5nIHRoZSByZWdpc3RlciBvZmZzZXRzIGRlZmluZWQgaW4gREVGWFguSC4KICAqCiAgKiAgIFBDSSBwb3J0IGJsb2NrIGJhc2UgYWRkcmVzc2VzIGFyZSBhc3NpZ25lZCBieSB0aGUgUENJIEJJT1Mgb3Igc3lzdGVtCi0gKgkgZmlybXdhcmUuICBUaGVyZSBpcyBvbmUgMTI4IGJ5dGUgcG9ydCBibG9jayB3aGljaCBjYW4gYmUgYWNjZXNzZWQuICBJdAorICogICBmaXJtd2FyZS4gIFRoZXJlIGlzIG9uZSAxMjggYnl0ZSBwb3J0IGJsb2NrIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZC4gIEl0CiAgKiAgIGFsbG93cyBmb3IgSS9PIG1hcHBpbmcgb2YgYm90aCBQRFEgYW5kIFBGSSByZWdpc3RlcnMgdXNpbmcgdGhlIHJlZ2lzdGVyCiAgKiAgIG9mZnNldHMgZGVmaW5lZCBpbiBERUZYWC5ILgogICoKQEAgLTMxOCw3ICszNTEsNyBAQAogICogICBOb25lCiAgKgogICogQXNzdW1wdGlvbnM6Ci0gKiAgIGJwLT5iYXNlX2FkZHIgaXMgYSB2YWxpZCBiYXNlIEkvTyBhZGRyZXNzIGZvciB0aGlzIGFkYXB0ZXIuCisgKiAgIGJwLT5iYXNlIGlzIGEgdmFsaWQgYmFzZSBJL08gYWRkcmVzcyBmb3IgdGhpcyBhZGFwdGVyLgogICogICBvZmZzZXQgaXMgYSB2YWxpZCByZWdpc3RlciBvZmZzZXQgZm9yIHRoaXMgYWRhcHRlci4KICAqCiAgKiBTaWRlIEVmZmVjdHM6CkBAIC0zMjksNjkgKzM2MiwxMzUgQEAKICAqICAgYWR2YW50YWdlIG9mIHN0cmljdCBkYXRhIHR5cGUgY2hlY2tpbmcuCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIGRmeF9wb3J0X3dyaXRlX2J5dGUoCi0JREZYX2JvYXJkX3QJKmJwLAotCWludAkJCW9mZnNldCwKLQl1OAkJCWRhdGEKLQkpCitzdGF0aWMgaW5saW5lIHZvaWQgZGZ4X3dyaXRlbChERlhfYm9hcmRfdCAqYnAsIGludCBvZmZzZXQsIHUzMiBkYXRhKQoreworCXdyaXRlbChkYXRhLCBicC0+YmFzZS5tZW0gKyBvZmZzZXQpOworCW1iKCk7Cit9CiAKLQl7Ci0JdTE2IHBvcnQgPSBicC0+YmFzZV9hZGRyICsgb2Zmc2V0Oworc3RhdGljIGlubGluZSB2b2lkIGRmeF9vdXRsKERGWF9ib2FyZF90ICpicCwgaW50IG9mZnNldCwgdTMyIGRhdGEpCit7CisJb3V0bChkYXRhLCBicC0+YmFzZS5wb3J0ICsgb2Zmc2V0KTsKK30KIAotCW91dGIoZGF0YSwgcG9ydCk7Ci0JfQorc3RhdGljIHZvaWQgZGZ4X3BvcnRfd3JpdGVfbG9uZyhERlhfYm9hcmRfdCAqYnAsIGludCBvZmZzZXQsIHUzMiBkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgX191bnVzZWQgKmJkZXYgPSBicC0+YnVzX2RldjsKKwlpbnQgZGZ4X2J1c190YyA9IERGWF9CVVNfVEMoYmRldik7CisJaW50IGRmeF91c2VfbW1pbyA9IERGWF9NTUlPIHx8IGRmeF9idXNfdGM7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkZnhfcG9ydF9yZWFkX2J5dGUoCi0JREZYX2JvYXJkX3QJKmJwLAotCWludAkJCW9mZnNldCwKLQl1OAkJCSpkYXRhCi0JKQorCWlmIChkZnhfdXNlX21taW8pCisJCWRmeF93cml0ZWwoYnAsIG9mZnNldCwgZGF0YSk7CisJZWxzZQorCQlkZnhfb3V0bChicCwgb2Zmc2V0LCBkYXRhKTsKK30KIAotCXsKLQl1MTYgcG9ydCA9IGJwLT5iYXNlX2FkZHIgKyBvZmZzZXQ7CiAKLQkqZGF0YSA9IGluYihwb3J0KTsKLQl9CitzdGF0aWMgaW5saW5lIHZvaWQgZGZ4X3JlYWRsKERGWF9ib2FyZF90ICpicCwgaW50IG9mZnNldCwgdTMyICpkYXRhKQoreworCW1iKCk7CisJKmRhdGEgPSByZWFkbChicC0+YmFzZS5tZW0gKyBvZmZzZXQpOworfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGZ4X3BvcnRfd3JpdGVfbG9uZygKLQlERlhfYm9hcmRfdAkqYnAsCi0JaW50CQkJb2Zmc2V0LAotCXUzMgkJCWRhdGEKLQkpCitzdGF0aWMgaW5saW5lIHZvaWQgZGZ4X2lubChERlhfYm9hcmRfdCAqYnAsIGludCBvZmZzZXQsIHUzMiAqZGF0YSkKK3sKKwkqZGF0YSA9IGlubChicC0+YmFzZS5wb3J0ICsgb2Zmc2V0KTsKK30KIAotCXsKLQl1MTYgcG9ydCA9IGJwLT5iYXNlX2FkZHIgKyBvZmZzZXQ7CitzdGF0aWMgdm9pZCBkZnhfcG9ydF9yZWFkX2xvbmcoREZYX2JvYXJkX3QgKmJwLCBpbnQgb2Zmc2V0LCB1MzIgKmRhdGEpCit7CisJc3RydWN0IGRldmljZSBfX3VudXNlZCAqYmRldiA9IGJwLT5idXNfZGV2OworCWludCBkZnhfYnVzX3RjID0gREZYX0JVU19UQyhiZGV2KTsKKwlpbnQgZGZ4X3VzZV9tbWlvID0gREZYX01NSU8gfHwgZGZ4X2J1c190YzsKIAotCW91dGwoZGF0YSwgcG9ydCk7Ci0JfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZGZ4X3BvcnRfcmVhZF9sb25nKAotCURGWF9ib2FyZF90CSpicCwKLQlpbnQJCQlvZmZzZXQsCi0JdTMyCQkJKmRhdGEKLQkpCi0KLQl7Ci0JdTE2IHBvcnQgPSBicC0+YmFzZV9hZGRyICsgb2Zmc2V0OwotCi0JKmRhdGEgPSBpbmwocG9ydCk7Ci0JfQorCWlmIChkZnhfdXNlX21taW8pCisJCWRmeF9yZWFkbChicCwgb2Zmc2V0LCBkYXRhKTsKKwllbHNlCisJCWRmeF9pbmwoYnAsIG9mZnNldCwgZGF0YSk7Cit9CiAKIAogLyoKLSAqID09PT09PT09PT09PT0KLSAqID0gZGZ4X2luaXRfb25lX3BjaV9vcl9laXNhID0KLSAqID09PT09PT09PT09PT0KKyAqID09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X2dldF9iYXJzID0KKyAqID09PT09PT09PT09PT09PT0KICAqCiAgKiBPdmVydmlldzoKLSAqICAgSW5pdGlhbGl6ZXMgYSBzdXBwb3J0ZWQgRkRESSBFSVNBIG9yIFBDSSBjb250cm9sbGVyCisgKiAgIFJldHJpZXZlcyB0aGUgYWRkcmVzcyByYW5nZSB1c2VkIHRvIGFjY2VzcyBjb250cm9sIGFuZCBzdGF0dXMKKyAqICAgcmVnaXN0ZXJzLgorICoKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqCisgKiBBcmd1bWVudHM6CisgKiAgIGJkZXYJLSBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorICogICBiYXJfc3RhcnQJLSBwb2ludGVyIHRvIHN0b3JlIHRoZSBzdGFydCBhZGRyZXNzCisgKiAgIGJhcl9sZW4JLSBwb2ludGVyIHRvIHN0b3JlIHRoZSBsZW5ndGggb2YgdGhlIGFyZWEKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgSSBhbSBzdXJlIHRoZXJlIGFyZSBzb21lLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgTm9uZQorICovCitzdGF0aWMgdm9pZCBkZnhfZ2V0X2JhcnMoc3RydWN0IGRldmljZSAqYmRldiwKKwkJCSByZXNvdXJjZV9zaXplX3QgKmJhcl9zdGFydCwgcmVzb3VyY2Vfc2l6ZV90ICpiYXJfbGVuKQoreworCWludCBkZnhfYnVzX3BjaSA9IERGWF9CVVNfUENJKGJkZXYpOworCWludCBkZnhfYnVzX2Vpc2EgPSBERlhfQlVTX0VJU0EoYmRldik7CisJaW50IGRmeF9idXNfdGMgPSBERlhfQlVTX1RDKGJkZXYpOworCWludCBkZnhfdXNlX21taW8gPSBERlhfTU1JTyB8fCBkZnhfYnVzX3RjOworCisJaWYgKGRmeF9idXNfcGNpKSB7CisJCWludCBudW0gPSBkZnhfdXNlX21taW8gPyAwIDogMTsKKworCQkqYmFyX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHRvX3BjaV9kZXYoYmRldiksIG51bSk7CisJCSpiYXJfbGVuID0gcGNpX3Jlc291cmNlX2xlbih0b19wY2lfZGV2KGJkZXYpLCBudW0pOworCX0KKwlpZiAoZGZ4X2J1c19laXNhKSB7CisJCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyID0gdG9fZWlzYV9kZXZpY2UoYmRldiktPmJhc2VfYWRkcjsKKwkJcmVzb3VyY2Vfc2l6ZV90IGJhcjsKKworCQlpZiAoZGZ4X3VzZV9tbWlvKSB7CisJCQliYXIgPSBpbmIoYmFzZV9hZGRyICsgUElfRVNJQ19LX01FTV9BRERfQ01QXzIpOworCQkJYmFyIDw8PSA4OworCQkJYmFyIHw9IGluYihiYXNlX2FkZHIgKyBQSV9FU0lDX0tfTUVNX0FERF9DTVBfMSk7CisJCQliYXIgPDw9IDg7CisJCQliYXIgfD0gaW5iKGJhc2VfYWRkciArIFBJX0VTSUNfS19NRU1fQUREX0NNUF8wKTsKKwkJCWJhciA8PD0gMTY7CisJCQkqYmFyX3N0YXJ0ID0gYmFyOworCQkJYmFyID0gaW5iKGJhc2VfYWRkciArIFBJX0VTSUNfS19NRU1fQUREX01BU0tfMik7CisJCQliYXIgPDw9IDg7CisJCQliYXIgfD0gaW5iKGJhc2VfYWRkciArIFBJX0VTSUNfS19NRU1fQUREX01BU0tfMSk7CisJCQliYXIgPDw9IDg7CisJCQliYXIgfD0gaW5iKGJhc2VfYWRkciArIFBJX0VTSUNfS19NRU1fQUREX01BU0tfMCk7CisJCQliYXIgPDw9IDE2OworCQkJKmJhcl9sZW4gPSAoYmFyIHwgUElfTUVNX0FERF9NQVNLX00pICsgMTsKKwkJfSBlbHNlIHsKKwkJCSpiYXJfc3RhcnQgPSBiYXNlX2FkZHI7CisJCQkqYmFyX2xlbiA9IFBJX0VTSUNfS19DU1JfSU9fTEVOOworCQl9CisJfQorCWlmIChkZnhfYnVzX3RjKSB7CisJCSpiYXJfc3RhcnQgPSB0b190Y19kZXYoYmRldiktPnJlc291cmNlLnN0YXJ0ICsKKwkJCSAgICAgUElfVENfS19DU1JfT0ZGU0VUOworCQkqYmFyX2xlbiA9IFBJX1RDX0tfQ1NSX0xFTjsKKwl9Cit9CisKKy8qCisgKiA9PT09PT09PT09PT09PT09CisgKiA9IGRmeF9yZWdpc3RlciA9CisgKiA9PT09PT09PT09PT09PT09CisgKgorICogT3ZlcnZpZXc6CisgKiAgIEluaXRpYWxpemVzIGEgc3VwcG9ydGVkIEZEREkgY29udHJvbGxlcgogICoKICAqIFJldHVybnM6CiAgKiAgIENvbmRpdGlvbiBjb2RlCiAgKgogICogQXJndW1lbnRzOgotICogICBwZGV2IC0gcG9pbnRlciB0byBwY2kgZGV2aWNlIGluZm9ybWF0aW9uIChOVUxMIGZvciBFSVNBKQotICogICBpb2FkZHIgLSBwb2ludGVyIHRvIHBvcnQgKE5VTEwgZm9yIFBDSSkKKyAqICAgYmRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCiAgKgogICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKICAqCkBAIC00MDcsNTYgKzUwNiw3NCBAQAogICogICBpbml0aWFsaXplZCBhbmQgdGhlIGJvYXJkIHJlc291cmNlcyBhcmUgcmVhZCBhbmQgc3RvcmVkIGluCiAgKiAgIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBkZnhfaW5pdF9vbmVfcGNpX29yX2Vpc2Eoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGxvbmcgaW9hZGRyKQorc3RhdGljIGludCBfX2RldmluaXQgZGZ4X3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmJkZXYpCiB7CiAJc3RhdGljIGludCB2ZXJzaW9uX2Rpc3A7Ci0JY2hhciAqcHJpbnRfbmFtZSA9IERSVl9OQU1FOworCWludCBkZnhfYnVzX3BjaSA9IERGWF9CVVNfUENJKGJkZXYpOworCWludCBkZnhfYnVzX3RjID0gREZYX0JVU19UQyhiZGV2KTsKKwlpbnQgZGZ4X3VzZV9tbWlvID0gREZYX01NSU8gfHwgZGZ4X2J1c190YzsKKwljaGFyICpwcmludF9uYW1lID0gYmRldi0+YnVzX2lkOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJREZYX2JvYXJkX3QJICAqYnA7CQkJLyogYm9hcmQgcG9pbnRlciAqLworCXJlc291cmNlX3NpemVfdCBiYXJfc3RhcnQgPSAwOwkJLyogcG9pbnRlciB0byBwb3J0ICovCisJcmVzb3VyY2Vfc2l6ZV90IGJhcl9sZW4gPSAwOwkJLyogcmVzb3VyY2UgbGVuZ3RoICovCiAJaW50IGFsbG9jX3NpemU7CQkJCS8qIHRvdGFsIGJ1ZmZlciBzaXplIHVzZWQgKi8KLQlpbnQgZXJyOworCXN0cnVjdCByZXNvdXJjZSAqcmVnaW9uOworCWludCBlcnIgPSAwOwogCiAJaWYgKCF2ZXJzaW9uX2Rpc3ApIHsJLyogZGlzcGxheSB2ZXJzaW9uIGluZm8gaWYgYWRhcHRlciBpcyBmb3VuZCAqLwogCQl2ZXJzaW9uX2Rpc3AgPSAxOwkvKiBzZXQgZGlzcGxheSBmbGFnIHRvIFRSVUUgc28gdGhhdCAqLwogCQlwcmludGsodmVyc2lvbik7CS8qIHdlIG9ubHkgZGlzcGxheSB0aGlzIHN0cmluZyBPTkNFICovCiAJfQogCi0JaWYgKHBkZXYgIT0gTlVMTCkKLQkJcHJpbnRfbmFtZSA9IHBjaV9uYW1lKHBkZXYpOwotCiAJZGV2ID0gYWxsb2NfZmRkaWRldihzaXplb2YoKmJwKSk7CiAJaWYgKCFkZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGFsbG9jYXRlIGZkZGlkZXYsIGFib3J0aW5nXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgZmRkaWRldiwgYWJvcnRpbmdcbiIsCiAJCSAgICAgICBwcmludF9uYW1lKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJLyogRW5hYmxlIFBDSSBkZXZpY2UuICovCi0JaWYgKHBkZXYgIT0gTlVMTCkgewotCQllcnIgPSBwY2lfZW5hYmxlX2RldmljZSAocGRldik7Ci0JCWlmIChlcnIpIGdvdG8gZXJyX291dDsKLQkJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAxKTsKLQl9Ci0KLQlTRVRfTU9EVUxFX09XTkVSKGRldik7Ci0JaWYgKHBkZXYgIT0gTlVMTCkKLQkJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKLQotCWJwID0gZGV2LT5wcml2OwotCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsCi0JCQkgICAgcGRldiA/IFBGSV9LX0NTUl9JT19MRU4gOiBQSV9FU0lDX0tfQ1NSX0lPX0xFTiwKLQkJCSAgICBwcmludF9uYW1lKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgcmVzZXJ2ZSBJL08gcmVzb3VyY2UgIgotCQkgICAgICAgIjB4JXggQCAweCVseCwgYWJvcnRpbmdcbiIsIHByaW50X25hbWUsCi0JCSAgICAgICBwZGV2ID8gUEZJX0tfQ1NSX0lPX0xFTiA6IFBJX0VTSUNfS19DU1JfSU9fTEVOLCBpb2FkZHIpOwotCQllcnIgPSAtRUJVU1k7CisJaWYgKGRmeF9idXNfcGNpICYmIHBjaV9lbmFibGVfZGV2aWNlKHRvX3BjaV9kZXYoYmRldikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBlbmFibGUgUENJIGRldmljZSwgYWJvcnRpbmdcbiIsCisJCSAgICAgICBwcmludF9uYW1lKTsKIAkJZ290byBlcnJfb3V0OwogCX0KIAotCS8qIEluaXRpYWxpemUgbmV3IGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCBiZGV2KTsKIAotCWRldi0+YmFzZV9hZGRyCQkJPSBpb2FkZHI7IC8qIHNhdmUgcG9ydCAoSS9PKSBiYXNlIGFkZHJlc3MgKi8KKwlicCA9IG5ldGRldl9wcml2KGRldik7CisJYnAtPmJ1c19kZXYgPSBiZGV2OworCWRldl9zZXRfZHJ2ZGF0YShiZGV2LCBkZXYpOworCisJZGZ4X2dldF9iYXJzKGJkZXYsICZiYXJfc3RhcnQsICZiYXJfbGVuKTsKKworCWlmIChkZnhfdXNlX21taW8pCisJCXJlZ2lvbiA9IHJlcXVlc3RfbWVtX3JlZ2lvbihiYXJfc3RhcnQsIGJhcl9sZW4sIHByaW50X25hbWUpOworCWVsc2UKKwkJcmVnaW9uID0gcmVxdWVzdF9yZWdpb24oYmFyX3N0YXJ0LCBiYXJfbGVuLCBwcmludF9uYW1lKTsKKwlpZiAoIXJlZ2lvbikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgcmVzZXJ2ZSBJL08gcmVzb3VyY2UgIgorCQkgICAgICAgIjB4JWx4IEAgMHglbHgsIGFib3J0aW5nXG4iLAorCQkgICAgICAgcHJpbnRfbmFtZSwgKGxvbmcpYmFyX2xlbiwgKGxvbmcpYmFyX3N0YXJ0KTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisKKwkvKiBTZXQgdXAgSS9PIGJhc2UgYWRkcmVzcy4gKi8KKwlpZiAoZGZ4X3VzZV9tbWlvKSB7CisJCWJwLT5iYXNlLm1lbSA9IGlvcmVtYXBfbm9jYWNoZShiYXJfc3RhcnQsIGJhcl9sZW4pOworCQlpZiAoIWJwLT5iYXNlLm1lbSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IG1hcCBNTUlPXG4iLCBwcmludF9uYW1lKTsKKwkJCWdvdG8gZXJyX291dF9yZWdpb247CisJCX0KKwl9IGVsc2UgeworCQlicC0+YmFzZS5wb3J0ID0gYmFyX3N0YXJ0OworCQlkZXYtPmJhc2VfYWRkciA9IGJhcl9zdGFydDsKKwl9CisKKwkvKiBJbml0aWFsaXplIG5ldyBkZXZpY2Ugc3RydWN0dXJlICovCiAKIAlkZXYtPmdldF9zdGF0cwkJCT0gZGZ4X2N0bF9nZXRfc3RhdHM7CiAJZGV2LT5vcGVuCQkJPSBkZnhfb3BlbjsKQEAgLTQ2NSwyMiArNTgyLDEyIEBACiAJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QJCT0gZGZ4X2N0bF9zZXRfbXVsdGljYXN0X2xpc3Q7CiAJZGV2LT5zZXRfbWFjX2FkZHJlc3MJCT0gZGZ4X2N0bF9zZXRfbWFjX2FkZHJlc3M7CiAKLQlpZiAocGRldiA9PSBOVUxMKSB7Ci0JCS8qIEVJU0EgYm9hcmQgKi8KLQkJYnAtPmJ1c190eXBlID0gREZYX0JVU19UWVBFX0VJU0E7Ci0JCWJwLT5uZXh0ID0gcm9vdF9kZnhfZWlzYV9kZXY7Ci0JCXJvb3RfZGZ4X2Vpc2FfZGV2ID0gZGV2OwotCX0gZWxzZSB7Ci0JCS8qIFBDSSBib2FyZCAqLwotCQlicC0+YnVzX3R5cGUgPSBERlhfQlVTX1RZUEVfUENJOwotCQlicC0+cGNpX2RldiA9IHBkZXY7Ci0JCXBjaV9zZXRfZHJ2ZGF0YSAocGRldiwgZGV2KTsKLQkJcGNpX3NldF9tYXN0ZXIgKHBkZXYpOwotCX0KKwlpZiAoZGZ4X2J1c19wY2kpCisJCXBjaV9zZXRfbWFzdGVyKHRvX3BjaV9kZXYoYmRldikpOwogCi0JaWYgKGRmeF9kcml2ZXJfaW5pdChkZXYsIHByaW50X25hbWUpICE9IERGWF9LX1NVQ0NFU1MpIHsKKwlpZiAoZGZ4X2RyaXZlcl9pbml0KGRldiwgcHJpbnRfbmFtZSwgYmFyX3N0YXJ0KSAhPSBERlhfS19TVUNDRVNTKSB7CiAJCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX291dF9yZWdpb247CisJCWdvdG8gZXJyX291dF91bm1hcDsKIAl9CiAKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKQEAgLTQ5OSw0NCArNjA2LDI4IEBACiAJCSAgICAgc2l6ZW9mKFBJX0NPTlNVTUVSX0JMT0NLKSArCiAJCSAgICAgKFBJX0FMSUdOX0tfREVTQ19CTEsgLSAxKTsKIAlpZiAoYnAtPmttYWxsb2NlZCkKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBhbGxvY19zaXplLAotCQkJCSAgICBicC0+a21hbGxvY2VkLCBicC0+a21hbGxvY2VkX2RtYSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KGJkZXYsIGFsbG9jX3NpemUsCisJCQkJICBicC0+a21hbGxvY2VkLCBicC0+a21hbGxvY2VkX2RtYSk7CisKK2Vycl9vdXRfdW5tYXA6CisJaWYgKGRmeF91c2VfbW1pbykKKwkJaW91bm1hcChicC0+YmFzZS5tZW0pOworCiBlcnJfb3V0X3JlZ2lvbjoKLQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIHBkZXYgPyBQRklfS19DU1JfSU9fTEVOIDogUElfRVNJQ19LX0NTUl9JT19MRU4pOworCWlmIChkZnhfdXNlX21taW8pCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihiYXJfc3RhcnQsIGJhcl9sZW4pOworCWVsc2UKKwkJcmVsZWFzZV9yZWdpb24oYmFyX3N0YXJ0LCBiYXJfbGVuKTsKKworZXJyX291dF9kaXNhYmxlOgorCWlmIChkZnhfYnVzX3BjaSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHRvX3BjaV9kZXYoYmRldikpOworCiBlcnJfb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgZGZ4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQotewotCXJldHVybiBkZnhfaW5pdF9vbmVfcGNpX29yX2Vpc2EocGRldiwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRmeF9laXNhX2luaXQodm9pZCkKLXsKLQlpbnQgcmMgPSAtRU5PREVWOwotCWludCBpOwkJCS8qIHVzZWQgaW4gZm9yIGxvb3BzICovCi0JdTE2IHBvcnQ7CQkvKiB0ZW1wb3JhcnkgSS9PIChwb3J0KSBhZGRyZXNzICovCi0JdTMyIHNsb3RfaWQ7CQkvKiBFSVNBIGhhcmR3YXJlIChzbG90KSBJRCByZWFkIGZyb20gYWRhcHRlciAqLwotCi0JREJHX3ByaW50aygiSW4gZGZ4X2Vpc2FfaW5pdC4uLlxuIik7Ci0KLQkvKiBTY2FuIGZvciBGRERJIEVJU0EgY29udHJvbGxlcnMgKi8KLQotCWZvciAoaT0wOyBpIDwgREZYX01BWF9FSVNBX1NMT1RTOyBpKyspCQkvKiBvbmx5IHNjYW4gZm9yIHVwIHRvIDE2IEVJU0Egc2xvdHMgKi8KLQl7Ci0JCXBvcnQgPSAoaSA8PCAxMikgKyBQSV9FU0lDX0tfU0xPVF9JRDsJLyogcG9ydCA9IEkvTyBhZGRyZXNzIGZvciByZWFkaW5nIHNsb3QgSUQgKi8KLQkJc2xvdF9pZCA9IGlubChwb3J0KTsJCQkJCS8qIHJlYWQgRUlTQSBIVyAoc2xvdCkgSUQgKi8KLQkJaWYgKChzbG90X2lkICYgMHhGMEZGRkZGRikgPT0gREVGRUFfUFJPRFVDVF9JRCkKLQkJewotCQkJcG9ydCA9IChpIDw8IDEyKTsJCQkJCS8qIHJlY2FsYyBiYXNlIGFkZHIgKi8KLQotCQkJaWYgKGRmeF9pbml0X29uZV9wY2lfb3JfZWlzYShOVUxMLCBwb3J0KSA9PSAwKSByYyA9IDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQogCiAvKgogICogPT09PT09PT09PT09PT09PQpAQCAtNTQ0LDcgKzYzNSw3IEBACiAgKiA9PT09PT09PT09PT09PT09CiAgKgogICogT3ZlcnZpZXc6Ci0gKiAgIEluaXRpYWxpemVzIEVJU0EgYW5kIFBDSSBjb250cm9sbGVyIGJ1cy1zcGVjaWZpYyBsb2dpYy4KKyAqICAgSW5pdGlhbGl6ZXMgdGhlIGJ1cy1zcGVjaWZpYyBjb250cm9sbGVyIGxvZ2ljLgogICoKICAqIFJldHVybnM6CiAgKiAgIE5vbmUKQEAgLTU2MCw3ICs2NTEsNyBAQAogICogICBOb25lCiAgKgogICogQXNzdW1wdGlvbnM6Ci0gKiAgIGRldi0+YmFzZV9hZGRyIGhhcyBhbHJlYWR5IGJlZW4gc2V0IHdpdGggdGhlIHByb3BlcgorICogICBicC0+YmFzZSBoYXMgYWxyZWFkeSBiZWVuIHNldCB3aXRoIHRoZSBwcm9wZXIKICAqCSBiYXNlIEkvTyBhZGRyZXNzIGZvciB0aGlzIGRldmljZS4KICAqCiAgKiBTaWRlIEVmZmVjdHM6CkBAIC01NzEsODcgKzY2MiwxMDMgQEAKIAogc3RhdGljIHZvaWQgX19kZXZpbml0IGRmeF9idXNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCURGWF9ib2FyZF90ICpicCA9IGRldi0+cHJpdjsKLQl1OAkJCXZhbDsJLyogdXNlZCBmb3IgSS9PIHJlYWQvd3JpdGVzICovCisJREZYX2JvYXJkX3QgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpiZGV2ID0gYnAtPmJ1c19kZXY7CisJaW50IGRmeF9idXNfcGNpID0gREZYX0JVU19QQ0koYmRldik7CisJaW50IGRmeF9idXNfZWlzYSA9IERGWF9CVVNfRUlTQShiZGV2KTsKKwlpbnQgZGZ4X2J1c190YyA9IERGWF9CVVNfVEMoYmRldik7CisJaW50IGRmeF91c2VfbW1pbyA9IERGWF9NTUlPIHx8IGRmeF9idXNfdGM7CisJdTggdmFsOwogCiAJREJHX3ByaW50aygiSW4gZGZ4X2J1c19pbml0Li4uXG4iKTsKIAotCS8qCi0JICogSW5pdGlhbGl6ZSBiYXNlIEkvTyBhZGRyZXNzIGZpZWxkIGluIGJwIHN0cnVjdHVyZQotCSAqCi0JICogTm90ZTogYnAtPmJhc2VfYWRkciBpcyB0aGUgc2FtZSBhcyBkZXYtPmJhc2VfYWRkci4KLQkgKgkJIEl0J3MgdXNlZnVsIGJlY2F1c2Ugb2Z0ZW4gd2UnbGwgbmVlZCB0byByZWFkCi0JICoJCSBvciB3cml0ZSByZWdpc3RlcnMgd2hlcmUgd2UgYWxyZWFkeSBoYXZlIHRoZQotCSAqCQkgYnAgcG9pbnRlciBpbnN0ZWFkIG9mIHRoZSBkZXYgcG9pbnRlci4gIEhhdmluZwotCSAqCQkgdGhlIGJhc2UgYWRkcmVzcyBpbiB0aGUgYnAgc3RydWN0dXJlIHdpbGwKLQkgKgkJIHNhdmUgYSBwb2ludGVyIGRlcmVmZXJlbmNlLgotCSAqCi0JICoJCSBJTVBPUlRBTlQhISBUaGlzIGZpZWxkIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUKLQkgKgkJIGFueSBvZiB0aGUgZGZ4X3BvcnRfKiBpbmxpbmUgZnVuY3Rpb25zIGFyZQotCSAqCQkgY2FsbGVkLgotCSAqLwotCi0JYnAtPmJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOwotCi0JLyogQW5kIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBuZXRfZGV2aWNlIHN0cnVjdCAqLworCS8qIEluaXRpYWxpemUgYSBwb2ludGVyIGJhY2sgdG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0ICovCiAJYnAtPmRldiA9IGRldjsKIAogCS8qIEluaXRpYWxpemUgYWRhcHRlciBiYXNlZCBvbiBidXMgdHlwZSAqLwogCi0JaWYgKGJwLT5idXNfdHlwZSA9PSBERlhfQlVTX1RZUEVfRUlTQSkKLQkJewotCQkvKiBHZXQgdGhlIGludGVycnVwdCBsZXZlbCBmcm9tIHRoZSBFU0lDIGNoaXAgKi8KKwlpZiAoZGZ4X2J1c190YykKKwkJZGV2LT5pcnEgPSB0b190Y19kZXYoYmRldiktPmludGVycnVwdDsKKwlpZiAoZGZ4X2J1c19laXNhKSB7CisJCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyID0gdG9fZWlzYV9kZXZpY2UoYmRldiktPmJhc2VfYWRkcjsKIAotCQlkZnhfcG9ydF9yZWFkX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCAmdmFsKTsKLQkJc3dpdGNoICgodmFsICYgUElfQ09ORklHX1NUQVRfMF9NX0lSUSkgPj4gUElfQ09ORklHX1NUQVRfMF9WX0lSUSkKLQkJCXsKLQkJCWNhc2UgUElfQ09ORklHX1NUQVRfMF9JUlFfS185OgotCQkJCWRldi0+aXJxID0gOTsKLQkJCQlicmVhazsKKwkJLyogR2V0IHRoZSBpbnRlcnJ1cHQgbGV2ZWwgZnJvbSB0aGUgRVNJQyBjaGlwLiAgKi8KKwkJdmFsID0gaW5iKGJhc2VfYWRkciArIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wKTsKKwkJdmFsICY9IFBJX0NPTkZJR19TVEFUXzBfTV9JUlE7CisJCXZhbCA+Pj0gUElfQ09ORklHX1NUQVRfMF9WX0lSUTsKIAotCQkJY2FzZSBQSV9DT05GSUdfU1RBVF8wX0lSUV9LXzEwOgotCQkJCWRldi0+aXJxID0gMTA7Ci0JCQkJYnJlYWs7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgUElfQ09ORklHX1NUQVRfMF9JUlFfS185OgorCQkJZGV2LT5pcnEgPSA5OworCQkJYnJlYWs7CiAKLQkJCWNhc2UgUElfQ09ORklHX1NUQVRfMF9JUlFfS18xMToKLQkJCQlkZXYtPmlycSA9IDExOwotCQkJCWJyZWFrOworCQljYXNlIFBJX0NPTkZJR19TVEFUXzBfSVJRX0tfMTA6CisJCQlkZXYtPmlycSA9IDEwOworCQkJYnJlYWs7CiAKLQkJCWNhc2UgUElfQ09ORklHX1NUQVRfMF9JUlFfS18xNToKLQkJCQlkZXYtPmlycSA9IDE1OwotCQkJCWJyZWFrOwotCQkJfQorCQljYXNlIFBJX0NPTkZJR19TVEFUXzBfSVJRX0tfMTE6CisJCQlkZXYtPmlycSA9IDExOworCQkJYnJlYWs7CiAKLQkJLyogRW5hYmxlIGFjY2VzcyB0byBJL08gb24gdGhlIGJvYXJkIGJ5IHdyaXRpbmcgMHgwMyB0byBGdW5jdGlvbiBDb250cm9sIFJlZ2lzdGVyICovCi0KLQkJZGZ4X3BvcnRfd3JpdGVfYnl0ZShicCwgUElfRVNJQ19LX0ZVTkNUSU9OX0NOVFJMLCBQSV9FU0lDX0tfRlVOQ1RJT05fQ05UUkxfSU9fRU5CKTsKLQotCQkvKiBTZXQgdGhlIEkvTyBkZWNvZGUgcmFuZ2Ugb2YgdGhlIGJvYXJkICovCi0KLQkJdmFsID0gKChkZXYtPmJhc2VfYWRkciA+PiAxMikgPDwgUElfSU9fQ01QX1ZfU0xPVCk7Ci0JCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DTVBfMF8xLCB2YWwpOwotCQlkZnhfcG9ydF93cml0ZV9ieXRlKGJwLCBQSV9FU0lDX0tfSU9fQ01QXzFfMSwgdmFsKTsKLQotCQkvKiBFbmFibGUgYWNjZXNzIHRvIHJlc3Qgb2YgbW9kdWxlIChpbmNsdWRpbmcgUERRIGFuZCBwYWNrZXQgbWVtb3J5KSAqLwotCi0JCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19TTE9UX0NOVFJMLCBQSV9TTE9UX0NOVFJMX01fRU5CKTsKKwkJY2FzZSBQSV9DT05GSUdfU1RBVF8wX0lSUV9LXzE1OgorCQkJZGV2LT5pcnEgPSAxNTsKKwkJCWJyZWFrOworCQl9CiAKIAkJLyoKLQkJICogTWFwIFBEUSByZWdpc3RlcnMgaW50byBJL08gc3BhY2UuICBUaGlzIGlzIGRvbmUgYnkgY2xlYXJpbmcgYSBiaXQKLQkJICogaW4gQnVyc3QgSG9sZG9mZiByZWdpc3Rlci4KKwkJICogRW5hYmxlIG1lbW9yeSBkZWNvZGluZyAoTUVNQ1MwKSBhbmQvb3IgcG9ydCBkZWNvZGluZworCQkgKiAoSU9DUzEvSU9DUzApIGFzIGFwcHJvcHJpYXRlIGluIEZ1bmN0aW9uIENvbnRyb2wKKwkJICogUmVnaXN0ZXIuICBPbmUgb2YgdGhlIHBvcnQgY2hpcCBzZWxlY3RzIHNlZW1zIHRvIGJlCisJCSAqIHVzZWQgZm9yIHRoZSBCdXJzdCBIb2xkb2ZmIHJlZ2lzdGVyLCBidXQgdGhpcyBiaXQgb2YKKwkJICogZG9jdW1lbnRhdGlvbiBpcyBtaXNzaW5nIGFuZCBhcyB5ZXQgaXQgaGFzIG5vdCBiZWVuCisJCSAqIGRldGVybWluZWQgd2hpY2ggb2YgdGhlIHR3by4gIFRoaXMgaXMgYWxzbyB0aGUgcmVhc29uCisJCSAqIHRoZSBzaXplIG9mIHRoZSBkZWNvZGVkIHBvcnQgcmFuZ2UgaXMgdHdpY2UgYXMgbGFyZ2UKKwkJICogYXMgb25lIHJlcXVpcmVkIGJ5IHRoZSBQRFEuCiAJCSAqLwogCi0JCWRmeF9wb3J0X3JlYWRfYnl0ZShicCwgUElfRVNJQ19LX0JVUlNUX0hPTERPRkYsICZ2YWwpOwotCQlkZnhfcG9ydF93cml0ZV9ieXRlKGJwLCBQSV9FU0lDX0tfQlVSU1RfSE9MRE9GRiwgKHZhbCAmIH5QSV9CVVJTVF9IT0xET0ZGX01fTUVNX01BUCkpOworCQkvKiBTZXQgdGhlIGRlY29kZSByYW5nZSBvZiB0aGUgYm9hcmQuICAqLworCQl2YWwgPSAoKGJwLT5iYXNlLnBvcnQgPj4gMTIpIDw8IFBJX0lPX0NNUF9WX1NMT1QpOworCQlvdXRiKGJhc2VfYWRkciArIFBJX0VTSUNfS19JT19BRERfQ01QXzBfMSwgdmFsKTsKKwkJb3V0YihiYXNlX2FkZHIgKyBQSV9FU0lDX0tfSU9fQUREX0NNUF8wXzAsIDApOworCQlvdXRiKGJhc2VfYWRkciArIFBJX0VTSUNfS19JT19BRERfQ01QXzFfMSwgdmFsKTsKKwkJb3V0YihiYXNlX2FkZHIgKyBQSV9FU0lDX0tfSU9fQUREX0NNUF8xXzAsIDApOworCQl2YWwgPSBQSV9FU0lDX0tfQ1NSX0lPX0xFTiAtIDE7CisJCW91dGIoYmFzZV9hZGRyICsgUElfRVNJQ19LX0lPX0FERF9NQVNLXzBfMSwgKHZhbCA+PiA4KSAmIDB4ZmYpOworCQlvdXRiKGJhc2VfYWRkciArIFBJX0VTSUNfS19JT19BRERfTUFTS18wXzAsIHZhbCAmIDB4ZmYpOworCQlvdXRiKGJhc2VfYWRkciArIFBJX0VTSUNfS19JT19BRERfTUFTS18xXzEsICh2YWwgPj4gOCkgJiAweGZmKTsKKwkJb3V0YihiYXNlX2FkZHIgKyBQSV9FU0lDX0tfSU9fQUREX01BU0tfMV8wLCB2YWwgJiAweGZmKTsKKworCQkvKiBFbmFibGUgdGhlIGRlY29kZXJzLiAgKi8KKwkJdmFsID0gUElfRlVOQ1RJT05fQ05UUkxfTV9JT0NTMSB8IFBJX0ZVTkNUSU9OX0NOVFJMX01fSU9DUzA7CisJCWlmIChkZnhfdXNlX21taW8pCisJCQl2YWwgfD0gUElfRlVOQ1RJT05fQ05UUkxfTV9NRU1DUzA7CisJCW91dGIoYmFzZV9hZGRyICsgUElfRVNJQ19LX0ZVTkNUSU9OX0NOVFJMLCB2YWwpOworCisJCS8qCisJCSAqIEVuYWJsZSBhY2Nlc3MgdG8gdGhlIHJlc3Qgb2YgdGhlIG1vZHVsZQorCQkgKiAoaW5jbHVkaW5nIFBEUSBhbmQgcGFja2V0IG1lbW9yeSkuCisJCSAqLworCQl2YWwgPSBQSV9TTE9UX0NOVFJMX01fRU5COworCQlvdXRiKGJhc2VfYWRkciArIFBJX0VTSUNfS19TTE9UX0NOVFJMLCB2YWwpOworCisJCS8qCisJCSAqIE1hcCBQRFEgcmVnaXN0ZXJzIGludG8gbWVtb3J5IG9yIHBvcnQgc3BhY2UuICBUaGlzIGlzCisJCSAqIGRvbmUgd2l0aCBhIGJpdCBpbiB0aGUgQnVyc3QgSG9sZG9mZiByZWdpc3Rlci4KKwkJICovCisJCXZhbCA9IGluYihiYXNlX2FkZHIgKyBQSV9ERUZFQV9LX0JVUlNUX0hPTERPRkYpOworCQlpZiAoZGZ4X3VzZV9tbWlvKQorCQkJdmFsIHw9IFBJX0JVUlNUX0hPTERPRkZfVl9NRU1fTUFQOworCQllbHNlCisJCQl2YWwgJj0gflBJX0JVUlNUX0hPTERPRkZfVl9NRU1fTUFQOworCQlvdXRiKGJhc2VfYWRkciArIFBJX0RFRkVBX0tfQlVSU1RfSE9MRE9GRiwgdmFsKTsKIAogCQkvKiBFbmFibGUgaW50ZXJydXB0cyBhdCBFSVNBIGJ1cyBpbnRlcmZhY2UgY2hpcCAoRVNJQykgKi8KLQotCQlkZnhfcG9ydF9yZWFkX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCAmdmFsKTsKLQkJZGZ4X3BvcnRfd3JpdGVfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsICh2YWwgfCBQSV9DT05GSUdfU1RBVF8wX01fSU5UX0VOQikpOwotCQl9Ci0JZWxzZQotCQl7Ci0JCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYnAtPnBjaV9kZXY7CisJCXZhbCA9IGluYihiYXNlX2FkZHIgKyBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCk7CisJCXZhbCB8PSBQSV9DT05GSUdfU1RBVF8wX01fSU5UX0VOQjsKKwkJb3V0YihiYXNlX2FkZHIgKyBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCwgdmFsKTsKKwl9CisJaWYgKGRmeF9idXNfcGNpKSB7CisJCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihiZGV2KTsKIAogCQkvKiBHZXQgdGhlIGludGVycnVwdCBsZXZlbCBmcm9tIHRoZSBQQ0kgQ29uZmlndXJhdGlvbiBUYWJsZSAqLwogCkBAIC02NjAsMTcgKzc2Nyw3MCBAQAogCQkvKiBDaGVjayBMYXRlbmN5IFRpbWVyIGFuZCBzZXQgaWYgbGVzcyB0aGFuIG1pbmltYWwgKi8KIAogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJnZhbCk7Ci0JCWlmICh2YWwgPCBQRklfS19MQVRfVElNRVJfTUlOKQkvKiBpZiBsZXNzIHRoYW4gbWluLCBvdmVycmlkZSB3aXRoIGRlZmF1bHQgKi8KLQkJCXsKKwkJaWYgKHZhbCA8IFBGSV9LX0xBVF9USU1FUl9NSU4pIHsKIAkJCXZhbCA9IFBGSV9LX0xBVF9USU1FUl9ERUY7CiAJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIHZhbCk7Ci0JCQl9CisJCX0KIAogCQkvKiBFbmFibGUgaW50ZXJydXB0cyBhdCBQQ0kgYnVzIGludGVyZmFjZSBjaGlwIChQRkkpICovCi0KLQkJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUEZJX0tfUkVHX01PREVfQ1RSTCwgKFBGSV9NT0RFX01fUERRX0lOVF9FTkIgfCBQRklfTU9ERV9NX0RNQV9FTkIpKTsKLQkJfQorCQl2YWwgPSBQRklfTU9ERV9NX1BEUV9JTlRfRU5CIHwgUEZJX01PREVfTV9ETUFfRU5COworCQlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQRklfS19SRUdfTU9ERV9DVFJMLCB2YWwpOwogCX0KK30KKworLyoKKyAqID09PT09PT09PT09PT09PT09PQorICogPSBkZnhfYnVzX3VuaW5pdCA9CisgKiA9PT09PT09PT09PT09PT09PT0KKyAqCisgKiBPdmVydmlldzoKKyAqICAgVW5pbml0aWFsaXplcyB0aGUgYnVzLXNwZWNpZmljIGNvbnRyb2xsZXIgbG9naWMuCisgKgorICogUmV0dXJuczoKKyAqICAgTm9uZQorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgZGV2IC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBQZXJmb3JtIGJ1cy1zcGVjaWZpYyBsb2dpYyB1bmluaXRpYWxpemF0aW9uLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBicC0+YmFzZSBoYXMgYWxyZWFkeSBiZWVuIHNldCB3aXRoIHRoZSBwcm9wZXIKKyAqCSBiYXNlIEkvTyBhZGRyZXNzIGZvciB0aGlzIGRldmljZS4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIEludGVycnVwdHMgYXJlIGRpc2FibGVkIGF0IHRoZSBhZGFwdGVyIGJ1cy1zcGVjaWZpYyBsb2dpYy4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZGZ4X2J1c191bmluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlERlhfYm9hcmRfdCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkZXZpY2UgKmJkZXYgPSBicC0+YnVzX2RldjsKKwlpbnQgZGZ4X2J1c19wY2kgPSBERlhfQlVTX1BDSShiZGV2KTsKKwlpbnQgZGZ4X2J1c19laXNhID0gREZYX0JVU19FSVNBKGJkZXYpOworCXU4IHZhbDsKKworCURCR19wcmludGsoIkluIGRmeF9idXNfdW5pbml0Li4uXG4iKTsKKworCS8qIFVuaW5pdGlhbGl6ZSBhZGFwdGVyIGJhc2VkIG9uIGJ1cyB0eXBlICovCisKKwlpZiAoZGZ4X2J1c19laXNhKSB7CisJCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyID0gdG9fZWlzYV9kZXZpY2UoYmRldiktPmJhc2VfYWRkcjsKKworCQkvKiBEaXNhYmxlIGludGVycnVwdHMgYXQgRUlTQSBidXMgaW50ZXJmYWNlIGNoaXAgKEVTSUMpICovCisJCXZhbCA9IGluYihiYXNlX2FkZHIgKyBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCk7CisJCXZhbCAmPSB+UElfQ09ORklHX1NUQVRfMF9NX0lOVF9FTkI7CisJCW91dGIoYmFzZV9hZGRyICsgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsIHZhbCk7CisJfQorCWlmIChkZnhfYnVzX3BjaSkgeworCQkvKiBEaXNhYmxlIGludGVycnVwdHMgYXQgUENJIGJ1cyBpbnRlcmZhY2UgY2hpcCAoUEZJKSAqLworCQlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQRklfS19SRUdfTU9ERV9DVFJMLCAwKTsKKwl9Cit9CiAKIAogLyoKQEAgLTcwNSwxOCArODY1LDE2IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBkZnhfYnVzX2NvbmZpZ19jaGVjayhERlhfYm9hcmRfdCAqYnApCiB7CisJc3RydWN0IGRldmljZSBfX3VudXNlZCAqYmRldiA9IGJwLT5idXNfZGV2OworCWludCBkZnhfYnVzX2Vpc2EgPSBERlhfQlVTX0VJU0EoYmRldik7CiAJaW50CXN0YXR1czsJCQkJLyogcmV0dXJuIGNvZGUgZnJvbSBhZGFwdGVyIHBvcnQgY29udHJvbCBjYWxsICovCi0JdTMyCXNsb3RfaWQ7CQkJLyogRUlTQS1idXMgaGFyZHdhcmUgaWQgKERFQzMwMDEsIERFQzMwMDIsLi4uKSAqLwogCXUzMglob3N0X2RhdGE7CQkJLyogTFcgZGF0YSByZXR1cm5lZCBmcm9tIHBvcnQgY29udHJvbCBjYWxsICovCiAKIAlEQkdfcHJpbnRrKCJJbiBkZnhfYnVzX2NvbmZpZ19jaGVjay4uLlxuIik7CiAKIAkvKiBDb25maWd1cmF0aW9uIGNoZWNrIG9ubHkgdmFsaWQgZm9yIEVJU0EgYWRhcHRlciAqLwogCi0JaWYgKGJwLT5idXNfdHlwZSA9PSBERlhfQlVTX1RZUEVfRUlTQSkKLQkJewotCQlkZnhfcG9ydF9yZWFkX2xvbmcoYnAsIFBJX0VTSUNfS19TTE9UX0lELCAmc2xvdF9pZCk7Ci0KKwlpZiAoZGZ4X2J1c19laXNhKSB7CiAJCS8qCiAJCSAqIEZpcnN0IGNoZWNrIGlmIHJldmlzaW9uIDIgRUlTQSBjb250cm9sbGVyLiAgUmV2LiAxIGNhcmRzIHVzZWQKIAkJICogUERRIHJldmlzaW9uIEIsIHNvIG5vIHdvcmthcm91bmQgbmVlZGVkIGluIHRoaXMgY2FzZS4gIFJldi4gMwpAQCAtNzI0LDE0ICs4ODIsMTEgQEAKIAkJICogY2FzZSwgZWl0aGVyLiAgT25seSBSZXYuIDIgY2FyZHMgdXNlZCBlaXRoZXIgUmV2LiBEIG9yIEUKIAkJICogY2hpcHMsIHNvIHdlIG11c3QgdmVyaWZ5IHRoZSBjaGlwIHJldmlzaW9uIG9uIFJldi4gMiBjYXJkcy4KIAkJICovCi0KLQkJaWYgKHNsb3RfaWQgPT0gREVGRUFfUFJPRF9JRF8yKQotCQkJeworCQlpZiAodG9fZWlzYV9kZXZpY2UoYmRldiktPmlkLmRyaXZlcl9kYXRhID09IERFRkVBX1BST0RfSURfMikgewogCQkJLyoKLQkJCSAqIFJldmlzaW9uIDIgRkRESSBFSVNBIGNvbnRyb2xsZXIgZm91bmQsIHNvIGxldCdzIGNoZWNrIFBEUQotCQkJICogcmV2aXNpb24gb2YgYWRhcHRlci4KKwkJCSAqIFJldmlzaW9uIDIgRkRESSBFSVNBIGNvbnRyb2xsZXIgZm91bmQsCisJCQkgKiBzbyBsZXQncyBjaGVjayBQRFEgcmV2aXNpb24gb2YgYWRhcHRlci4KIAkJCSAqLwotCiAJCQlzdGF0dXMgPSBkZnhfaHdfcG9ydF9jdHJsX3JlcShicCwKIAkJCQkJCQkJCQkJUElfUENUUkxfTV9TVUJfQ01ELAogCQkJCQkJCQkJCQlQSV9TVUJfQ01EX0tfUERRX1JFVl9HRVQsCkBAIC04MDUsMTMgKzk2MCwyMCBAQAogICovCiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGRmeF9kcml2ZXJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgY29uc3QgY2hhciAqcHJpbnRfbmFtZSkKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnByaW50X25hbWUsCisJCQkJICAgICByZXNvdXJjZV9zaXplX3QgYmFyX3N0YXJ0KQogewotCURGWF9ib2FyZF90ICpicCA9IGRldi0+cHJpdjsKLQlpbnQJCQlhbGxvY19zaXplOwkJCS8qIHRvdGFsIGJ1ZmZlciBzaXplIG5lZWRlZCAqLwotCWNoYXIJCSp0b3BfdiwgKmN1cnJfdjsJLyogdmlydHVhbCBhZGRycyBpbnRvIG1lbW9yeSBibG9jayAqLwotCWRtYV9hZGRyX3QJCXRvcF9wLCBjdXJyX3A7CQkvKiBwaHlzaWNhbCBhZGRycyBpbnRvIG1lbW9yeSBibG9jayAqLwotCXUzMgkJCWRhdGE7CQkJCS8qIGhvc3QgZGF0YSByZWdpc3RlciB2YWx1ZSAqLworCURGWF9ib2FyZF90ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldmljZSAqYmRldiA9IGJwLT5idXNfZGV2OworCWludCBkZnhfYnVzX3BjaSA9IERGWF9CVVNfUENJKGJkZXYpOworCWludCBkZnhfYnVzX2Vpc2EgPSBERlhfQlVTX0VJU0EoYmRldik7CisJaW50IGRmeF9idXNfdGMgPSBERlhfQlVTX1RDKGJkZXYpOworCWludCBkZnhfdXNlX21taW8gPSBERlhfTU1JTyB8fCBkZnhfYnVzX3RjOworCWludCBhbGxvY19zaXplOwkJCS8qIHRvdGFsIGJ1ZmZlciBzaXplIG5lZWRlZCAqLworCWNoYXIgKnRvcF92LCAqY3Vycl92OwkJLyogdmlydHVhbCBhZGRycyBpbnRvIG1lbW9yeSBibG9jayAqLworCWRtYV9hZGRyX3QgdG9wX3AsIGN1cnJfcDsJLyogcGh5c2ljYWwgYWRkcnMgaW50byBtZW1vcnkgYmxvY2sgKi8KKwl1MzIgZGF0YSwgbGUzMjsJCQkvKiBob3N0IGRhdGEgcmVnaXN0ZXIgdmFsdWUgKi8KKwljaGFyICpib2FyZF9uYW1lID0gTlVMTDsKIAogCURCR19wcmludGsoIkluIGRmeF9kcml2ZXJfaW5pdC4uLlxuIik7CiAKQEAgLTg2MCw4ICsxMDIyLDggQEAKIAkJICAgICAgIHByaW50X25hbWUpOwogCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CiAJfQotCWRhdGEgPSBjcHVfdG9fbGUzMihkYXRhKTsKLQltZW1jcHkoJmJwLT5mYWN0b3J5X21hY19hZGRyWzBdLCAmZGF0YSwgc2l6ZW9mKHUzMikpOworCWxlMzIgPSBjcHVfdG9fbGUzMihkYXRhKTsKKwltZW1jcHkoJmJwLT5mYWN0b3J5X21hY19hZGRyWzBdLCAmbGUzMiwgc2l6ZW9mKHUzMikpOwogCiAJaWYgKGRmeF9od19wb3J0X2N0cmxfcmVxKGJwLCBQSV9QQ1RSTF9NX01MQSwgUElfUERBVEFfQV9NTEFfS19ISSwgMCwKIAkJCQkgJmRhdGEpICE9IERGWF9LX1NVQ0NFU1MpIHsKQEAgLTg2OSw4ICsxMDMxLDggQEAKIAkJICAgICAgIHByaW50X25hbWUpOwogCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CiAJfQotCWRhdGEgPSBjcHVfdG9fbGUzMihkYXRhKTsKLQltZW1jcHkoJmJwLT5mYWN0b3J5X21hY19hZGRyWzRdLCAmZGF0YSwgc2l6ZW9mKHUxNikpOworCWxlMzIgPSBjcHVfdG9fbGUzMihkYXRhKTsKKwltZW1jcHkoJmJwLT5mYWN0b3J5X21hY19hZGRyWzRdLCAmbGUzMiwgc2l6ZW9mKHUxNikpOwogCiAJLyoKIAkgKiBTZXQgY3VycmVudCBhZGRyZXNzIHRvIGZhY3RvcnkgYWRkcmVzcwpAQCAtODgwLDIwICsxMDQyLDE4IEBACiAJICovCiAKIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgYnAtPmZhY3RvcnlfbWFjX2FkZHIsIEZERElfS19BTEVOKTsKLQlpZiAoYnAtPmJ1c190eXBlID09IERGWF9CVVNfVFlQRV9FSVNBKQotCQlwcmludGsoIiVzOiBERUZFQSBhdCBJL08gYWRkciA9IDB4JWxYLCBJUlEgPSAlZCwgIgotCQkgICAgICAgIkhhcmR3YXJlIGFkZHIgPSAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWFxuIiwKLQkJICAgICAgIHByaW50X25hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwKLQkJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sCi0JCSAgICAgICBkZXYtPmRldl9hZGRyWzJdLCBkZXYtPmRldl9hZGRyWzNdLAotCQkgICAgICAgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7Ci0JZWxzZQotCQlwcmludGsoIiVzOiBERUZQQSBhdCBJL08gYWRkciA9IDB4JWxYLCBJUlEgPSAlZCwgIgotCQkgICAgICAgIkhhcmR3YXJlIGFkZHIgPSAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWFxuIiwKLQkJICAgICAgIHByaW50X25hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwKLQkJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sCi0JCSAgICAgICBkZXYtPmRldl9hZGRyWzJdLCBkZXYtPmRldl9hZGRyWzNdLAotCQkgICAgICAgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisJaWYgKGRmeF9idXNfdGMpCisJCWJvYXJkX25hbWUgPSAiREVGVEEiOworCWlmIChkZnhfYnVzX2Vpc2EpCisJCWJvYXJkX25hbWUgPSAiREVGRUEiOworCWlmIChkZnhfYnVzX3BjaSkKKwkJYm9hcmRfbmFtZSA9ICJERUZQQSI7CisJcHJfaW5mbygiJXM6ICVzIGF0ICVzYWRkciA9IDB4JWxseCwgSVJRID0gJWQsICIKKwkJIkhhcmR3YXJlIGFkZHIgPSAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWFxuIiwKKwkJcHJpbnRfbmFtZSwgYm9hcmRfbmFtZSwgZGZ4X3VzZV9tbWlvID8gIiIgOiAiSS9PICIsCisJCShsb25nIGxvbmcpYmFyX3N0YXJ0LCBkZXYtPmlycSwKKwkJZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CiAKIAkvKgogCSAqIEdldCBtZW1vcnkgZm9yIGRlc2NyaXB0b3IgYmxvY2ssIGNvbnN1bWVyIGJsb2NrLCBhbmQgb3RoZXIgYnVmZmVycwpAQCAtOTA4LDggKzEwNjgsOSBAQAogI2VuZGlmCiAJCQkJCXNpemVvZihQSV9DT05TVU1FUl9CTE9DSykgKwogCQkJCQkoUElfQUxJR05fS19ERVNDX0JMSyAtIDEpOwotCWJwLT5rbWFsbG9jZWQgPSB0b3BfdiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGJwLT5wY2lfZGV2LCBhbGxvY19zaXplLAotCQkJCQkJICAgICAmYnAtPmttYWxsb2NlZF9kbWEpOworCWJwLT5rbWFsbG9jZWQgPSB0b3BfdiA9IGRtYV9hbGxvY19jb2hlcmVudChicC0+YnVzX2RldiwgYWxsb2Nfc2l6ZSwKKwkJCQkJCSAgICZicC0+a21hbGxvY2VkX2RtYSwKKwkJCQkJCSAgIEdGUF9BVE9NSUMpOwogCWlmICh0b3BfdiA9PSBOVUxMKSB7CiAJCXByaW50aygiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGhvc3QgYnVmZmVycyAiCiAJCSAgICAgICAiYW5kIHN0cnVjdHVyZXMhXG4iLCBwcmludF9uYW1lKTsKQEAgLTEyMTksMTQgKzEzODAsMTUgQEAKIAogc3RhdGljIGludCBkZnhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogeworCURGWF9ib2FyZF90ICpicCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJldDsKLQlERlhfYm9hcmRfdAkqYnAgPSBkZXYtPnByaXY7CiAKIAlEQkdfcHJpbnRrKCJJbiBkZnhfb3Blbi4uLlxuIik7CiAKIAkvKiBSZWdpc3RlciBJUlEgLSBzdXBwb3J0IHNoYXJlZCBpbnRlcnJ1cHRzIGJ5IHBhc3NpbmcgZGV2aWNlIHB0ciAqLwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGRmeF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldik7CisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGRmeF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsCisJCQkgIGRldik7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZXF1ZXN0ZWQgSVJRICVkIGlzIGJ1c3lcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOwogCQlyZXR1cm4gcmV0OwpAQCAtMTMwOSw3ICsxNDcxLDcgQEAKIAogc3RhdGljIGludCBkZnhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlERlhfYm9hcmRfdAkqYnAgPSBkZXYtPnByaXY7CisJREZYX2JvYXJkX3QgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCURCR19wcmludGsoIkluIGRmeF9jbG9zZS4uLlxuIik7CiAKQEAgLTE2NDUsNyArMTgwNyw3IEBACiAKIHN0YXRpYyB2b2lkIGRmeF9pbnRfY29tbW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JREZYX2JvYXJkX3QgCSpicCA9IGRldi0+cHJpdjsKKwlERlhfYm9hcmRfdCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCVBJX1VJTlQzMglwb3J0X3N0YXR1czsJCS8qIFBvcnQgU3RhdHVzIHJlZ2lzdGVyICovCiAKIAkvKiBQcm9jZXNzIHhtdCBpbnRlcnJ1cHRzIC0gZnJlcXVlbnQgY2FzZSwgc28gYWx3YXlzIGNhbGwgdGhpcyByb3V0aW5lICovCkBAIC0xNzE1LDE4ICsxODc3LDE2IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBkZnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2ID0gZGV2X2lkOwotCURGWF9ib2FyZF90CQkqYnA7CS8qIHByaXZhdGUgYm9hcmQgc3RydWN0dXJlIHBvaW50ZXIgKi8KLQotCS8qIEdldCBib2FyZCBwb2ludGVyIG9ubHkgaWYgZGV2aWNlIHN0cnVjdHVyZSBpcyB2YWxpZCAqLwotCi0JYnAgPSBkZXYtPnByaXY7Ci0KLQkvKiBTZWUgaWYgd2UncmUgYWxyZWFkeSBzZXJ2aWNpbmcgYW4gaW50ZXJydXB0ICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlERlhfYm9hcmRfdCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkZXZpY2UgKmJkZXYgPSBicC0+YnVzX2RldjsKKwlpbnQgZGZ4X2J1c19wY2kgPSBERlhfQlVTX1BDSShiZGV2KTsKKwlpbnQgZGZ4X2J1c19laXNhID0gREZYX0JVU19FSVNBKGJkZXYpOworCWludCBkZnhfYnVzX3RjID0gREZYX0JVU19UQyhiZGV2KTsKIAogCS8qIFNlcnZpY2UgYWRhcHRlciBpbnRlcnJ1cHRzICovCiAKLQlpZiAoYnAtPmJ1c190eXBlID09IERGWF9CVVNfVFlQRV9QQ0kpIHsKKwlpZiAoZGZ4X2J1c19wY2kpIHsKIAkJdTMyIHN0YXR1czsKIAogCQlkZnhfcG9ydF9yZWFkX2xvbmcoYnAsIFBGSV9LX1JFR19TVEFUVVMsICZzdGF0dXMpOwpAQCAtMTc1MCwxMCArMTkxMCwxMiBAQAogCQkJCSAgICAgUEZJX01PREVfTV9ETUFfRU5CKSk7CiAKIAkJc3Bpbl91bmxvY2soJmJwLT5sb2NrKTsKLQl9IGVsc2UgeworCX0KKwlpZiAoZGZ4X2J1c19laXNhKSB7CisJCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyID0gdG9fZWlzYV9kZXZpY2UoYmRldiktPmJhc2VfYWRkcjsKIAkJdTggc3RhdHVzOwogCi0JCWRmeF9wb3J0X3JlYWRfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsICZzdGF0dXMpOworCQlzdGF0dXMgPSBpbmIoYmFzZV9hZGRyICsgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzApOwogCQlpZiAoIShzdGF0dXMgJiBQSV9DT05GSUdfU1RBVF8wX01fUEVORCkpCiAJCQlyZXR1cm4gSVJRX05PTkU7CiAKQEAgLTE3NjEsMTUgKzE5MjMsMzUgQEAKIAogCQkvKiBEaXNhYmxlIGludGVycnVwdHMgYXQgdGhlIEVTSUMgKi8KIAkJc3RhdHVzICY9IH5QSV9DT05GSUdfU1RBVF8wX01fSU5UX0VOQjsKLQkJZGZ4X3BvcnRfd3JpdGVfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsIHN0YXR1cyk7CisJCW91dGIoYmFzZV9hZGRyICsgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsIHN0YXR1cyk7CiAKIAkJLyogQ2FsbCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciB0aGlzIGFkYXB0ZXIgKi8KIAkJZGZ4X2ludF9jb21tb24oZGV2KTsKIAogCQkvKiBSZWVuYWJsZSBpbnRlcnJ1cHRzIGF0IHRoZSBFU0lDICovCi0JCWRmeF9wb3J0X3JlYWRfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsICZzdGF0dXMpOworCQlzdGF0dXMgPSBpbmIoYmFzZV9hZGRyICsgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzApOwogCQlzdGF0dXMgfD0gUElfQ09ORklHX1NUQVRfMF9NX0lOVF9FTkI7Ci0JCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCBzdGF0dXMpOworCQlvdXRiKGJhc2VfYWRkciArIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCBzdGF0dXMpOworCisJCXNwaW5fdW5sb2NrKCZicC0+bG9jayk7CisJfQorCWlmIChkZnhfYnVzX3RjKSB7CisJCXUzMiBzdGF0dXM7CisKKwkJZGZ4X3BvcnRfcmVhZF9sb25nKGJwLCBQSV9QRFFfS19SRUdfUE9SVF9TVEFUVVMsICZzdGF0dXMpOworCQlpZiAoIShzdGF0dXMgJiAoUElfUFNUQVRVU19NX1JDVl9EQVRBX1BFTkRJTkcgfAorCQkJCVBJX1BTVEFUVVNfTV9YTVRfREFUQV9QRU5ESU5HIHwKKwkJCQlQSV9QU1RBVFVTX01fU01UX0hPU1RfUEVORElORyB8CisJCQkJUElfUFNUQVRVU19NX1VOU09MX1BFTkRJTkcgfAorCQkJCVBJX1BTVEFUVVNfTV9DTURfUlNQX1BFTkRJTkcgfAorCQkJCVBJX1BTVEFUVVNfTV9DTURfUkVRX1BFTkRJTkcgfAorCQkJCVBJX1BTVEFUVVNfTV9UWVBFXzBfUEVORElORykpKQorCQkJcmV0dXJuIElSUV9OT05FOworCisJCXNwaW5fbG9jaygmYnAtPmxvY2spOworCisJCS8qIENhbGwgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgdGhpcyBhZGFwdGVyICovCisJCWRmeF9pbnRfY29tbW9uKGRldik7CiAKIAkJc3Bpbl91bmxvY2soJmJwLT5sb2NrKTsKIAl9CkBAIC0xODIzLDcgKzIwMDUsNyBAQAogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmRmeF9jdGxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiAJewotCURGWF9ib2FyZF90CSpicCA9IGRldi0+cHJpdjsKKwlERlhfYm9hcmRfdCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJLyogRmlsbCB0aGUgYnAtPnN0YXRzIHN0cnVjdHVyZSB3aXRoIGRyaXZlci1tYWludGFpbmVkIGNvdW50ZXJzICovCiAKQEAgLTIwMDksOCArMjE5MSw4IEBACiAgKi8KIAogc3RhdGljIHZvaWQgZGZ4X2N0bF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLQl7Ci0JREZYX2JvYXJkX3QJCQkqYnAgPSBkZXYtPnByaXY7Cit7CisJREZYX2JvYXJkX3QgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQJCQkJCWk7CQkJLyogdXNlZCBhcyBpbmRleCBpbiBmb3IgbG9vcCAqLwogCXN0cnVjdCBkZXZfbWNfbGlzdAkqZG1pOwkJLyogcHRyIHRvIG11bHRpY2FzdCBhZGRyIGVudHJ5ICovCiAKQEAgLTIxMjQsOCArMjMwNiw4IEBACiAKIHN0YXRpYyBpbnQgZGZ4X2N0bF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKIAl7Ci0JREZYX2JvYXJkX3QJCSpicCA9IGRldi0+cHJpdjsKIAlzdHJ1Y3Qgc29ja2FkZHIJKnBfc29ja2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopYWRkcjsKKwlERlhfYm9hcmRfdCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJLyogQ29weSB1bmljYXN0IGFkZHJlc3MgdG8gZHJpdmVyLW1haW50YWluZWQgc3RydWN0cyBhbmQgdXBkYXRlIGNvdW50ICovCiAKQEAgLTI3NjQsOSArMjk0Niw5IEBACiAKIAkJCW15X3NrYl9hbGlnbihuZXdza2IsIDEyOCk7CiAJCQlicC0+ZGVzY3JfYmxvY2tfdmlydC0+cmN2X2RhdGFbaSArIGpdLmxvbmdfMSA9Ci0JCQkJKHUzMilwY2lfbWFwX3NpbmdsZShicC0+cGNpX2RldiwgbmV3c2tiLT5kYXRhLAorCQkJCSh1MzIpZG1hX21hcF9zaW5nbGUoYnAtPmJ1c19kZXYsIG5ld3NrYi0+ZGF0YSwKIAkJCQkJCSAgICBORVdfU0tCX1NJWkUsCi0JCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkJCSAgICBETUFfRlJPTV9ERVZJQ0UpOwogCQkJLyoKIAkJCSAqIHBfcmN2X2J1ZmZfdmEgaXMgb25seSB1c2VkIGluc2lkZSB0aGUKIAkJCSAqIGtlcm5lbCBzbyB3ZSBwdXQgdGhlIHNrYiBwb2ludGVyIGhlcmUuCkBAIC0yODgwLDE3ICszMDYyLDE3IEBACiAKIAkJCQkJCW15X3NrYl9hbGlnbihuZXdza2IsIDEyOCk7CiAJCQkJCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilicC0+cF9yY3ZfYnVmZl92YVtlbnRyeV07Ci0JCQkJCQlwY2lfdW5tYXBfc2luZ2xlKGJwLT5wY2lfZGV2LAorCQkJCQkJZG1hX3VubWFwX3NpbmdsZShicC0+YnVzX2RldiwKIAkJCQkJCQlicC0+ZGVzY3JfYmxvY2tfdmlydC0+cmN2X2RhdGFbZW50cnldLmxvbmdfMSwKIAkJCQkJCQlORVdfU0tCX1NJWkUsCi0JCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOwogCQkJCQkJc2tiX3Jlc2VydmUoc2tiLCBSQ1ZfQlVGRl9LX1BBRERJTkcpOwogCQkJCQkJYnAtPnBfcmN2X2J1ZmZfdmFbZW50cnldID0gKGNoYXIgKiluZXdza2I7CiAJCQkJCQlicC0+ZGVzY3JfYmxvY2tfdmlydC0+cmN2X2RhdGFbZW50cnldLmxvbmdfMSA9Ci0JCQkJCQkJKHUzMilwY2lfbWFwX3NpbmdsZShicC0+cGNpX2RldiwKKwkJCQkJCQkodTMyKWRtYV9tYXBfc2luZ2xlKGJwLT5idXNfZGV2LAogCQkJCQkJCQluZXdza2ItPmRhdGEsCiAJCQkJCQkJCU5FV19TS0JfU0laRSwKLQkJCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKIAkJCQkJfSBlbHNlCiAJCQkJCQlza2IgPSBOVUxMOwogCQkJCX0gZWxzZQpAQCAtMzAxMCw3ICszMTkyLDcgQEAKIAkpCiAKIAl7Ci0JREZYX2JvYXJkX3QJCSpicCA9IGRldi0+cHJpdjsKKwlERlhfYm9hcmRfdAkJKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OAkJCXByb2Q7CQkJCS8qIGxvY2FsIHRyYW5zbWl0IHByb2R1Y2VyIGluZGV4ICovCiAJUElfWE1UX0RFU0NSCQkqcF94bXRfZGVzY3I7CQkvKiBwdHIgdG8gdHJhbnNtaXQgZGVzY3JpcHRvciBibG9jayBlbnRyeSAqLwogCVhNVF9EUklWRVJfREVTQ1IJKnBfeG10X2Rydl9kZXNjcjsJLyogcHRyIHRvIHRyYW5zbWl0IGRyaXZlciBkZXNjcmlwdG9yICovCkBAIC0zMTE2LDggKzMyOTgsOCBAQAogCSAqLwogCiAJcF94bXRfZGVzY3ItPmxvbmdfMAk9ICh1MzIpIChQSV9YTVRfREVTQ1JfTV9TT1AgfCBQSV9YTVRfREVTQ1JfTV9FT1AgfCAoKHNrYi0+bGVuKSA8PCBQSV9YTVRfREVTQ1JfVl9TRUdfTEVOKSk7Ci0JcF94bXRfZGVzY3ItPmxvbmdfMSA9ICh1MzIpcGNpX21hcF9zaW5nbGUoYnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKLQkJCQkJCSAgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCXBfeG10X2Rlc2NyLT5sb25nXzEgPSAodTMyKWRtYV9tYXBfc2luZ2xlKGJwLT5idXNfZGV2LCBza2ItPmRhdGEsCisJCQkJCQkgIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKIAogCS8qCiAJICogVmVyaWZ5IHRoYXQgZGVzY3JpcHRvciBpcyBhY3R1YWxseSBhdmFpbGFibGUKQEAgLTMyMjAsMTAgKzM0MDIsMTAgQEAKIAogCQkvKiBSZXR1cm4gc2tiIHRvIG9wZXJhdGluZyBzeXN0ZW0gKi8KIAkJY29tcCA9IGJwLT5yY3ZfeG10X3JlZy5pbmRleC54bXRfY29tcDsKLQkJcGNpX3VubWFwX3NpbmdsZShicC0+cGNpX2RldiwKKwkJZG1hX3VubWFwX3NpbmdsZShicC0+YnVzX2RldiwKIAkJCQkgYnAtPmRlc2NyX2Jsb2NrX3ZpcnQtPnhtdF9kYXRhW2NvbXBdLmxvbmdfMSwKIAkJCQkgcF94bXRfZHJ2X2Rlc2NyLT5wX3NrYi0+bGVuLAotCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkgRE1BX1RPX0RFVklDRSk7CiAJCWRldl9rZnJlZV9za2JfaXJxKHBfeG10X2Rydl9kZXNjci0+cF9za2IpOwogCiAJCS8qCkBAIC0zMzQ0LDEwICszNTI2LDEwIEBACiAKIAkJLyogUmV0dXJuIHNrYiB0byBvcGVyYXRpbmcgc3lzdGVtICovCiAJCWNvbXAgPSBicC0+cmN2X3htdF9yZWcuaW5kZXgueG10X2NvbXA7Ci0JCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBjaV9kZXYsCisJCWRtYV91bm1hcF9zaW5nbGUoYnAtPmJ1c19kZXYsCiAJCQkJIGJwLT5kZXNjcl9ibG9ja192aXJ0LT54bXRfZGF0YVtjb21wXS5sb25nXzEsCiAJCQkJIHBfeG10X2Rydl9kZXNjci0+cF9za2ItPmxlbiwKLQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJIERNQV9UT19ERVZJQ0UpOwogCQlkZXZfa2ZyZWVfc2tiKHBfeG10X2Rydl9kZXNjci0+cF9za2IpOwogCiAJCS8qIEluY3JlbWVudCB0cmFuc21pdCBlcnJvciBjb3VudGVyICovCkBAIC0zMzc1LDEzICszNTU3LDQ0IEBACiAJYnAtPmNvbnNfYmxvY2tfdmlydC0+eG10X3Jjdl9kYXRhID0gcHJvZF9jb25zOwogCX0KIAotc3RhdGljIHZvaWQgX19kZXZleGl0IGRmeF9yZW1vdmVfb25lX3BjaV9vcl9laXNhKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorLyoKKyAqID09PT09PT09PT09PT09PT09PQorICogPSBkZnhfdW5yZWdpc3RlciA9CisgKiA9PT09PT09PT09PT09PT09PT0KKyAqCisgKiBPdmVydmlldzoKKyAqICAgU2h1dHMgZG93biBhbiBGRERJIGNvbnRyb2xsZXIKKyAqCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgYmRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIE5vbmUKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgSXQgY29tcGlsZXMgc28gaXQgc2hvdWxkIHdvcmsgOi0oIChQQ0kgY2FyZHMgZG8gOi0pCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBEZXZpY2Ugc3RydWN0dXJlcyBmb3IgRkRESSBhZGFwdGVycyAoZmRkaTAsIGZkZGkxLCBldGMpIGFyZQorICogICBmcmVlZC4KKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IGRmeF91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmJkZXYpCiB7Ci0JREZYX2JvYXJkX3QJKmJwID0gZGV2LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoYmRldik7CisJREZYX2JvYXJkX3QgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZGZ4X2J1c19wY2kgPSBERlhfQlVTX1BDSShiZGV2KTsKKwlpbnQgZGZ4X2J1c190YyA9IERGWF9CVVNfVEMoYmRldik7CisJaW50IGRmeF91c2VfbW1pbyA9IERGWF9NTUlPIHx8IGRmeF9idXNfdGM7CisJcmVzb3VyY2Vfc2l6ZV90IGJhcl9zdGFydCA9IDA7CQkvKiBwb2ludGVyIHRvIHBvcnQgKi8KKwlyZXNvdXJjZV9zaXplX3QgYmFyX2xlbiA9IDA7CQkvKiByZXNvdXJjZSBsZW5ndGggKi8KIAlpbnQJCWFsbG9jX3NpemU7CQkvKiB0b3RhbCBidWZmZXIgc2l6ZSB1c2VkICovCiAKIAl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCAgcGRldiA/IFBGSV9LX0NTUl9JT19MRU4gOiBQSV9FU0lDX0tfQ1NSX0lPX0xFTiApOwogCiAJYWxsb2Nfc2l6ZSA9IHNpemVvZihQSV9ERVNDUl9CTE9DSykgKwogCQkgICAgIFBJX0NNRF9SRVFfS19TSVpFX01BWCArIFBJX0NNRF9SU1BfS19TSVpFX01BWCArCkBAIC0zMzkxLDc4ICszNjA0LDE0MSBAQAogCQkgICAgIHNpemVvZihQSV9DT05TVU1FUl9CTE9DSykgKwogCQkgICAgIChQSV9BTElHTl9LX0RFU0NfQkxLIC0gMSk7CiAJaWYgKGJwLT5rbWFsbG9jZWQpCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgYWxsb2Nfc2l6ZSwgYnAtPmttYWxsb2NlZCwKLQkJCQkgICAgYnAtPmttYWxsb2NlZF9kbWEpOworCQlkbWFfZnJlZV9jb2hlcmVudChiZGV2LCBhbGxvY19zaXplLAorCQkJCSAgYnAtPmttYWxsb2NlZCwgYnAtPmttYWxsb2NlZF9kbWEpOworCisJZGZ4X2J1c191bmluaXQoZGV2KTsKKworCWRmeF9nZXRfYmFycyhiZGV2LCAmYmFyX3N0YXJ0LCAmYmFyX2xlbik7CisJaWYgKGRmeF91c2VfbW1pbykgeworCQlpb3VubWFwKGJwLT5iYXNlLm1lbSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihiYXJfc3RhcnQsIGJhcl9sZW4pOworCX0gZWxzZQorCQlyZWxlYXNlX3JlZ2lvbihiYXJfc3RhcnQsIGJhcl9sZW4pOworCisJaWYgKGRmeF9idXNfcGNpKQorCQlwY2lfZGlzYWJsZV9kZXZpY2UodG9fcGNpX2RldihiZGV2KSk7CisKIAlmcmVlX25ldGRldihkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgZGZ4X3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLQlkZnhfcmVtb3ZlX29uZV9wY2lfb3JfZWlzYShwZGV2LCBkZXYpOwotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLX0KK3N0YXRpYyBpbnQgX19kZXZpbml0IF9fdW51c2VkIGRmeF9kZXZfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyBpbnQgX19kZXZleGl0IF9fdW51c2VkIGRmeF9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICopOwogCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZGZ4X3BjaV90YmxbXSA9IHsKLQl7IFBDSV9WRU5ET1JfSURfREVDLCBQQ0lfREVWSUNFX0lEX0RFQ19GRERJLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAotCXsgMCwgfQorI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRmeF9wY2lfcmVnaXN0ZXIoc3RydWN0IHBjaV9kZXYgKiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqKTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkZnhfcGNpX3VucmVnaXN0ZXIoc3RydWN0IHBjaV9kZXYgKik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkZnhfcGNpX3RhYmxlW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfREVDLCBQQ0lfREVWSUNFX0lEX0RFQ19GRERJKSB9LAorCXsgfQogfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBkZnhfcGNpX3RibCk7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZGZ4X3BjaV90YWJsZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkZnhfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRmeF9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJkZWZ4eCIsCi0JLnByb2JlCQk9IGRmeF9pbml0X29uZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRmeF9yZW1vdmVfb25lKSwKLQkuaWRfdGFibGUJPSBkZnhfcGNpX3RibCwKKwkuaWRfdGFibGUJPSBkZnhfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBkZnhfcGNpX3JlZ2lzdGVyLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZGZ4X3BjaV91bnJlZ2lzdGVyKSwKIH07CiAKLXN0YXRpYyBpbnQgZGZ4X2hhdmVfcGNpOwotc3RhdGljIGludCBkZnhfaGF2ZV9laXNhOwotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBkZnhfZWlzYV9jbGVhbnVwKHZvaWQpCitzdGF0aWMgX19kZXZpbml0IGludCBkZnhfcGNpX3JlZ2lzdGVyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHJvb3RfZGZ4X2Vpc2FfZGV2OwotCi0Jd2hpbGUgKGRldikKLQl7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICp0bXA7Ci0JCURGWF9ib2FyZF90ICpicDsKLQotCQlicCA9IChERlhfYm9hcmRfdCopZGV2LT5wcml2OwotCQl0bXAgPSBicC0+bmV4dDsKLQkJZGZ4X3JlbW92ZV9vbmVfcGNpX29yX2Vpc2EoTlVMTCwgZGV2KTsKLQkJZGV2ID0gdG1wOwotCX0KKwlyZXR1cm4gZGZ4X3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBkZnhfaW5pdCh2b2lkKQorc3RhdGljIHZvaWQgX19kZXZleGl0IGRmeF9wY2lfdW5yZWdpc3RlcihzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlpbnQgcmNfcGNpLCByY19laXNhOworCWRmeF91bnJlZ2lzdGVyKCZwZGV2LT5kZXYpOworfQorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAotCXJjX3BjaSA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRmeF9kcml2ZXIpOwotCWlmIChyY19wY2kgPj0gMCkgZGZ4X2hhdmVfcGNpID0gMTsKKyNpZmRlZiBDT05GSUdfRUlTQQorc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBkZnhfZWlzYV90YWJsZVtdID0geworICAgICAgICB7ICJERUMzMDAxIiwgREVGRUFfUFJPRF9JRF8xIH0sCisgICAgICAgIHsgIkRFQzMwMDIiLCBERUZFQV9QUk9EX0lEXzIgfSwKKyAgICAgICAgeyAiREVDMzAwMyIsIERFRkVBX1BST0RfSURfMyB9LAorICAgICAgICB7ICJERUMzMDA0IiwgREVGRUFfUFJPRF9JRF80IH0sCisgICAgICAgIHsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZWlzYSwgZGZ4X2Vpc2FfdGFibGUpOwogCi0JcmNfZWlzYSA9IGRmeF9laXNhX2luaXQoKTsKLQlpZiAocmNfZWlzYSA+PSAwKSBkZnhfaGF2ZV9laXNhID0gMTsKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kcml2ZXIgZGZ4X2Vpc2FfZHJpdmVyID0geworCS5pZF90YWJsZQk9IGRmeF9laXNhX3RhYmxlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJkZWZ4eCIsCisJCS5idXMJPSAmZWlzYV9idXNfdHlwZSwKKwkJLnByb2JlCT0gZGZ4X2Rldl9yZWdpc3RlciwKKwkJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGRmeF9kZXZfdW5yZWdpc3RlciksCisJfSwKK307CisjZW5kaWYgLyogQ09ORklHX0VJU0EgKi8KIAotCXJldHVybiAoKHJjX2Vpc2EgPCAwKSA/IDAgOiByY19laXNhKSAgKyAoKHJjX3BjaSA8IDApID8gMCA6IHJjX3BjaSk7CisjaWZkZWYgQ09ORklHX1RDCitzdGF0aWMgc3RydWN0IHRjX2RldmljZV9pZCBjb25zdCBkZnhfdGNfdGFibGVbXSA9IHsKKwl7ICJERUMgICAgICIsICJQTUFGLUZBICIgfSwKKwl7ICJERUMgICAgICIsICJQTUFGLUZEICIgfSwKKwl7ICJERUMgICAgICIsICJQTUFGLUZTICIgfSwKKwl7ICJERUMgICAgICIsICJQTUFGLUZVICIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHRjLCBkZnhfdGNfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHRjX2RyaXZlciBkZnhfdGNfZHJpdmVyID0geworCS5pZF90YWJsZQk9IGRmeF90Y190YWJsZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiZGVmeHgiLAorCQkuYnVzCT0gJnRjX2J1c190eXBlLAorCQkucHJvYmUJPSBkZnhfZGV2X3JlZ2lzdGVyLAorCQkucmVtb3ZlCT0gX19kZXZleGl0X3AoZGZ4X2Rldl91bnJlZ2lzdGVyKSwKKwl9LAorfTsKKyNlbmRpZiAvKiBDT05GSUdfVEMgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgX191bnVzZWQgZGZ4X2Rldl9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRmeF9yZWdpc3RlcihkZXYpOworCWlmICghc3RhdHVzKQorCQlnZXRfZGV2aWNlKGRldik7CisJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGRmeF9jbGVhbnVwKHZvaWQpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBfX3VudXNlZCBkZnhfZGV2X3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQogewotCWlmIChkZnhfaGF2ZV9wY2kpCi0JCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZGZ4X2RyaXZlcik7Ci0JaWYgKGRmeF9oYXZlX2Vpc2EpCi0JCWRmeF9laXNhX2NsZWFudXAoKTsKKwlwdXRfZGV2aWNlKGRldik7CisJZGZ4X3VucmVnaXN0ZXIoZGV2KTsKKwlyZXR1cm4gMDsKK30KIAorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkZnhfaW5pdCh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkZnhfcGNpX2RyaXZlcik7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGVpc2FfZHJpdmVyX3JlZ2lzdGVyKCZkZnhfZWlzYV9kcml2ZXIpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSB0Y19yZWdpc3Rlcl9kcml2ZXIoJmRmeF90Y19kcml2ZXIpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkZnhfY2xlYW51cCh2b2lkKQoreworCXRjX3VucmVnaXN0ZXJfZHJpdmVyKCZkZnhfdGNfZHJpdmVyKTsKKwllaXNhX2RyaXZlcl91bnJlZ2lzdGVyKCZkZnhfZWlzYV9kcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZGZ4X3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChkZnhfaW5pdCk7CiBtb2R1bGVfZXhpdChkZnhfY2xlYW51cCk7CiBNT0RVTEVfQVVUSE9SKCJMYXdyZW5jZSBWLiBTdGVmYW5pIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRFQyBGRERJY29udHJvbGxlciBFSVNBL1BDSSAoREVGRUEvREVGUEEpIGRyaXZlciAiCitNT0RVTEVfREVTQ1JJUFRJT04oIkRFQyBGRERJY29udHJvbGxlciBUQy9FSVNBL1BDSSAoREVGVEEvREVGRUEvREVGUEEpIGRyaXZlciAiCiAJCSAgIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlZnh4LmggYi9kcml2ZXJzL25ldC9kZWZ4eC5oCmluZGV4IDJjZThmOTcuLjE5YTZmNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlZnh4LmgKKysrIGIvZHJpdmVycy9uZXQvZGVmeHguaApAQCAtMjYsNiArMjYsNyBAQAogICoJCTEyLVNlcC05NglMVlMJCVJlbW92ZWQgcGFja2V0IHJlcXVlc3QgaGVhZGVyIHBvaW50ZXJzLgogICoJCTA0IEF1ZyAyMDAzCW1hY3JvCQlDb252ZXJ0ZWQgdG8gdGhlIERNQSBBUEkuCiAgKgkJMjMgT2N0IDIwMDYJbWFjcm8JCUJpZy1lbmRpYW4gaG9zdCBzdXBwb3J0LgorICoJCTE0IERlYyAyMDA2CW1hY3JvCQlUVVJCT2NoYW5uZWwgc3VwcG9ydC4KICAqLwogCiAjaWZuZGVmIF9ERUZYWF9IXwpAQCAtMTQ3MSw5ICsxNDcyLDE3IEBACiAKICNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KIAorLyogRGVmaW5lIFRDIFBEUSBDU1Igb2Zmc2V0IGFuZCBsZW5ndGggKi8KKworI2RlZmluZSBQSV9UQ19LX0NTUl9PRkZTRVQJCTB4MTAwMDAwCisjZGVmaW5lIFBJX1RDX0tfQ1NSX0xFTgkJCTB4NDAJCS8qIDY0IGJ5dGVzICovCisKIC8qIERlZmluZSBFSVNBIGNvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0cyAqLwogCi0jZGVmaW5lIFBJX0VTSUNfS19CVVJTVF9IT0xET0ZGCQkweDA0MAorI2RlZmluZSBQSV9FU0lDX0tfQ1NSX0lPX0xFTgkJMHg4MAkJLyogMTI4IGJ5dGVzICovCisKKyNkZWZpbmUgUElfREVGRUFfS19CVVJTVF9IT0xET0ZGCTB4MDQwCisKICNkZWZpbmUgUElfRVNJQ19LX1NMT1RfSUQgICAgICAgICAgICAJMHhDODAKICNkZWZpbmUgUElfRVNJQ19LX1NMT1RfQ05UUkwJCTB4Qzg0CiAjZGVmaW5lIFBJX0VTSUNfS19NRU1fQUREX0NNUF8wICAgICAJMHhDODUKQEAgLTE0ODgsMTQgKzE0OTcsMTQgQEAKICNkZWZpbmUgUElfRVNJQ19LX01FTV9BRERfTE9fQ01QXzAgIAkweEM4RQogI2RlZmluZSBQSV9FU0lDX0tfTUVNX0FERF9MT19DTVBfMSAgCTB4QzhGCiAjZGVmaW5lIFBJX0VTSUNfS19NRU1fQUREX0xPX0NNUF8yICAJMHhDOTAKLSNkZWZpbmUgUElfRVNJQ19LX0lPX0NNUF8wXzAJCTB4QzkxCi0jZGVmaW5lIFBJX0VTSUNfS19JT19DTVBfMF8xCQkweEM5MgotI2RlZmluZSBQSV9FU0lDX0tfSU9fQ01QXzFfMAkJMHhDOTMKLSNkZWZpbmUgUElfRVNJQ19LX0lPX0NNUF8xXzEJCTB4Qzk0Ci0jZGVmaW5lIFBJX0VTSUNfS19JT19DTVBfMl8wCQkweEM5NQotI2RlZmluZSBQSV9FU0lDX0tfSU9fQ01QXzJfMQkJMHhDOTYKLSNkZWZpbmUgUElfRVNJQ19LX0lPX0NNUF8zXzAJCTB4Qzk3Ci0jZGVmaW5lIFBJX0VTSUNfS19JT19DTVBfM18xCQkweEM5OAorI2RlZmluZSBQSV9FU0lDX0tfSU9fQUREX0NNUF8wXzAJMHhDOTEKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0FERF9DTVBfMF8xCTB4QzkyCisjZGVmaW5lIFBJX0VTSUNfS19JT19BRERfQ01QXzFfMAkweEM5MworI2RlZmluZSBQSV9FU0lDX0tfSU9fQUREX0NNUF8xXzEJMHhDOTQKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0FERF9DTVBfMl8wCTB4Qzk1CisjZGVmaW5lIFBJX0VTSUNfS19JT19BRERfQ01QXzJfMQkweEM5NgorI2RlZmluZSBQSV9FU0lDX0tfSU9fQUREX0NNUF8zXzAJMHhDOTcKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0FERF9DTVBfM18xCTB4Qzk4CiAjZGVmaW5lIFBJX0VTSUNfS19JT19BRERfTUFTS18wXzAgICAgCTB4Qzk5CiAjZGVmaW5lIFBJX0VTSUNfS19JT19BRERfTUFTS18wXzEgICAgCTB4QzlBCiAjZGVmaW5lIFBJX0VTSUNfS19JT19BRERfTUFTS18xXzAgICAgCTB4QzlCCkBAIC0xNTE4LDExICsxNTI3LDE2IEBACiAjZGVmaW5lIFBJX0VTSUNfS19JTlBVVF9QT1JUICAgICAgICAgCTB4Q0FDCiAjZGVmaW5lIFBJX0VTSUNfS19PVVRQVVRfUE9SVCAgICAgICAgCTB4Q0FECiAjZGVmaW5lIFBJX0VTSUNfS19GVU5DVElPTl9DTlRSTAkweENBRQotI2RlZmluZSBQSV9FU0lDX0tfQ1NSX0lPX0xFTgkJUElfRVNJQ19LX0ZVTkNUSU9OX0NOVFJMKzEJLyogYWx3YXlzIGxhc3QgcmVnICsgMSAqLwogCi0vKiBEZWZpbmUgdGhlIHZhbHVlIGFsbCBkcml2ZXJzIG11c3Qgd3JpdGUgdG8gdGhlIGZ1bmN0aW9uIGNvbnRyb2wgcmVnaXN0ZXIuICovCisvKiBEZWZpbmUgdGhlIGJpdHMgaW4gdGhlIGZ1bmN0aW9uIGNvbnRyb2wgcmVnaXN0ZXIuICovCiAKLSNkZWZpbmUgUElfRVNJQ19LX0ZVTkNUSU9OX0NOVFJMX0lPX0VOQgkweDAzCisjZGVmaW5lIFBJX0ZVTkNUSU9OX0NOVFJMX01fSU9DUzAJMHgwMQorI2RlZmluZSBQSV9GVU5DVElPTl9DTlRSTF9NX0lPQ1MxCTB4MDIKKyNkZWZpbmUgUElfRlVOQ1RJT05fQ05UUkxfTV9JT0NTMgkweDA0CisjZGVmaW5lIFBJX0ZVTkNUSU9OX0NOVFJMX01fSU9DUzMJMHgwOAorI2RlZmluZSBQSV9GVU5DVElPTl9DTlRSTF9NX01FTUNTMAkweDEwCisjZGVmaW5lIFBJX0ZVTkNUSU9OX0NOVFJMX01fTUVNQ1MxCTB4MjAKKyNkZWZpbmUgUElfRlVOQ1RJT05fQ05UUkxfTV9ETUEJCTB4ODAKIAogLyogRGVmaW5lIHRoZSBiaXRzIGluIHRoZSBzbG90IGNvbnRyb2wgcmVnaXN0ZXIuICovCiAKQEAgLTE1NDAsNiArMTU1NCwxMCBAQAogI2RlZmluZSBQSV9CVVJTVF9IT0xET0ZGX1ZfUkVTRVJWRUQJMQogI2RlZmluZSBQSV9CVVJTVF9IT0xET0ZGX1ZfTUVNX01BUAkwCiAKKy8qIERlZmluZSB0aGUgaW1wbGljaXQgbWFzayBvZiB0aGUgTWVtb3J5IEFkZHJlc3MgTWFzayBSZWdpc3Rlci4gICovCisKKyNkZWZpbmUgUElfTUVNX0FERF9NQVNLX00JCTB4M2ZmCisKIC8qCiAgKiBEZWZpbmUgdGhlIGZpZWxkcyBpbiB0aGUgSU8gQ29tcGFyZSByZWdpc3RlcnMuCiAgKiBUaGUgZHJpdmVyIG11c3QgaW5pdGlhbGl6ZSB0aGUgc2xvdCBmaWVsZCB3aXRoIHRoZSBzbG90IElEIHNoaWZ0ZWQgYnkgdGhlCkBAIC0xNTc3LDYgKzE1OTUsNyBAQAogI2RlZmluZSBERUZFQV9QUk9EX0lEXzEJCTB4MDEzMEEzMTAJCS8qIERFQyBwcm9kdWN0IDMwMCwgcmV2IDEJKi8KICNkZWZpbmUgREVGRUFfUFJPRF9JRF8yCQkweDAyMzBBMzEwCQkvKiBERUMgcHJvZHVjdCAzMDAsIHJldiAyCSovCiAjZGVmaW5lIERFRkVBX1BST0RfSURfMwkJMHgwMzMwQTMxMAkJLyogREVDIHByb2R1Y3QgMzAwLCByZXYgMwkqLworI2RlZmluZSBERUZFQV9QUk9EX0lEXzQJCTB4MDQzMEEzMTAJCS8qIERFQyBwcm9kdWN0IDMwMCwgcmV2IDQJKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEaWdpdGFsIFBGSSBTcGVjaWZpY2F0aW9uIHYxLjAgRGVmaW5pdGlvbnMgKi8KQEAgLTE2MzMsMTIgKzE2NTIsNiBAQAogI2RlZmluZSBQRklfU1RBVFVTX1ZfRklGT19FTVBUWQkJIDEKICNkZWZpbmUgUEZJX1NUQVRVU19WX0RNQV9JTl9QUk9HUkVTUyAwCiAKLSNkZWZpbmUgREZYX01BWF9FSVNBX1NMT1RTCQkxNgkJCS8qIG1heGltdW0gbnVtYmVyIG9mIEVJU0Egc2xvdHMgdG8gc2NhbiAqLwotI2RlZmluZSBERlhfTUFYX05VTV9CT0FSRFMJCTgJCQkvKiBtYXhpbXVtIG51bWJlciBvZiBhZGFwdGVycyBzdXBwb3J0ZWQgKi8KLQotI2RlZmluZSBERlhfQlVTX1RZUEVfUENJCQkwCQkJLyogdHlwZSBjb2RlIGZvciBERUMgRkRESWNvbnRyb2xsZXIvUENJICovCi0jZGVmaW5lIERGWF9CVVNfVFlQRV9FSVNBCQkxCQkJLyogdHlwZSBjb2RlIGZvciBERUMgRkRESWNvbnRyb2xsZXIvRUlTQSAqLwotCiAjZGVmaW5lIERGWF9GQ19QUkgyX1BSSDFfUFJIMAkJMHg1NDAwMzgyMAkvKiBQYWNrZXQgUmVxdWVzdCBIZWFkZXIgYnl0ZXMgKyBGQyAqLwogI2RlZmluZSBERlhfUFJIMF9CWVRFCQkJMHgyMAkJLyogUGFja2V0IFJlcXVlc3QgSGVhZGVyIGJ5dGUgMCAqLwogI2RlZmluZSBERlhfUFJIMV9CWVRFCQkJMHgzOAkJLyogUGFja2V0IFJlcXVlc3QgSGVhZGVyIGJ5dGUgMSAqLwpAQCAtMTc1NiwxMCArMTc2OSwxMSBAQAogCS8qIFN0b3JlIGRldmljZSwgYnVzLXNwZWNpZmljLCBhbmQgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGZvciB0aGlzIGFkYXB0ZXIgKi8KIAogCXN0cnVjdCBuZXRfZGV2aWNlCQkqZGV2OwkJCQkJCS8qIHBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBuZXRfZGV2aWNlCQkqbmV4dDsKLQl1MzIJCQkJYnVzX3R5cGU7CQkJCQkvKiBidXMgdHlwZSAoMCA9PSBQQ0ksIDEgPT0gRUlTQSkgKi8KLQl1MTYJCQkJYmFzZV9hZGRyOwkJCQkJLyogYmFzZSBJL08gYWRkcmVzcyAoc2FtZSBhcyBkZXYtPmJhc2VfYWRkcikgKi8KLQlzdHJ1Y3QgcGNpX2RldiAqCQlwY2lfZGV2OworCXVuaW9uIHsKKwkJdm9pZCBfX2lvbWVtICptZW07CisJCWludCBwb3J0OworCX0gYmFzZTsJCQkJCQkJCQkJLyogYmFzZSBhZGRyZXNzICovCisJc3RydWN0IGRldmljZQkJCSpidXNfZGV2OwogCXUzMgkJCQlmdWxsX2R1cGxleF9lbmI7CQkJCS8qIEZEREkgRnVsbCBEdXBsZXggZW5hYmxlICgxID09IG9uLCAyID09IG9mZikgKi8KIAl1MzIJCQkJcmVxX3R0cnQ7CQkJCQkvKiByZXF1ZXN0ZWQgVFRSVCB2YWx1ZSAoaW4gODBucyB1bml0cykgKi8KIAl1MzIJCQkJYnVyc3Rfc2l6ZTsJCQkJCS8qIGFkYXB0ZXIgYnVyc3Qgc2l6ZSAoZW51bWVyYXRlZCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UyMTAwLmMgYi9kcml2ZXJzL25ldC9lMjEwMC5jCmluZGV4IGM2MmQ5YzYuLmIyYjBhOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UyMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZTIxMDAuYwpAQCAtMzU1LDggKzM1NSw3IEBACiAKIAltZW1fb24oaW9hZGRyLCBzaGFyZWRfbWVtLCAocmluZ19vZmZzZXQ+PjgpKTsKIAotCS8qIFBhY2tldCBpcyBhbHdheXMgaW4gb25lIGNodW5rIC0tIHdlIGNhbiBjb3B5ICsgY2tzdW0uICovCi0JZXRoX2lvX2NvcHlfYW5kX3N1bShza2IsIGVpX3N0YXR1cy5tZW0gKyAocmluZ19vZmZzZXQgJiAweGZmKSwgY291bnQsIDApOworCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCBlaV9zdGF0dXMubWVtICsgKHJpbmdfb2Zmc2V0ICYgMHhmZiksIGNvdW50KTsKIAogCW1lbV9vZmYoaW9hZGRyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VzMzIxMC5jIGIvZHJpdmVycy9uZXQvZXMzMjEwLmMKaW5kZXggMmQyZWE5NC4uODIyZTViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXMzMjEwLmMKKysrIGIvZHJpdmVycy9uZXQvZXMzMjEwLmMKQEAgLTM3NSw3ICszNzUsNyBAQAogCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsIGVpX3N0YXR1cy5tZW0sIGNvdW50KTsKIAl9IGVsc2UgewogCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rLiAqLwotCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgeGZlcl9zdGFydCwgY291bnQsIDApOworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCwgY291bnQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjc29uaWMuYyBiL2RyaXZlcnMvbmV0L21hY3NvbmljLmMKaW5kZXggMjRmNjA1MGYuLjhjYTU3YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY3NvbmljLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjc29uaWMuYwpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CiAKICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYwppbmRleCBiM2JmODY0Li5kOThlNTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKQEAgLTI3ODAsNyArMjc4MCw2IEBACiAJLmdldF9saW5rICAgICAgICAgICAgICAgPSBtdjY0M3h4X2V0aF9nZXRfbGluaywKIAkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKIAkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKLQkuZ2V0X3N0cmluZ3MgICAgICAgICAgICA9IG12NjQzeHhfZ2V0X3N0cmluZ3MsCiAJLmdldF9zdGF0c19jb3VudCAgICAgICAgPSBtdjY0M3h4X2dldF9zdGF0c19jb3VudCwKIAkuZ2V0X2V0aHRvb2xfc3RhdHMgICAgICA9IG12NjQzeHhfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9zdHJpbmdzICAgICAgICAgICAgPSBtdjY0M3h4X2dldF9zdHJpbmdzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcjgxNjkuYyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKaW5kZXggNTc3YmFiZC4uNTU5OGQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcjgxNjkuYworKysgYi9kcml2ZXJzL25ldC9yODE2OS5jCkBAIC0yMDE2LDcgKzIwMTYsNyBAQAogCWlmICghc2tiKQogCQlnb3RvIGVycl9vdXQ7CiAKLQlza2JfcmVzZXJ2ZShza2IsIChhbGlnbiAtIDEpICYgKHUzMilza2ItPmRhdGEpOworCXNrYl9yZXNlcnZlKHNrYiwgKGFsaWduIC0gMSkgJiAodW5zaWduZWQgbG9uZylza2ItPmRhdGEpOwogCSpza19idWZmID0gc2tiOwogCiAJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwgcnhfYnVmX3N6LApAQCAtMjQ4Nyw3ICsyNDg3LDcgQEAKIAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9zaXplICsgYWxpZ24pOwogCQlpZiAoc2tiKSB7Ci0JCQlza2JfcmVzZXJ2ZShza2IsIChhbGlnbiAtIDEpICYgKHUzMilza2ItPmRhdGEpOworCQkJc2tiX3Jlc2VydmUoc2tiLCAoYWxpZ24gLSAxKSAmICh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSk7CiAJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgc2tfYnVmZlswXS0+ZGF0YSwgcGt0X3NpemUsIDApOwogCQkJKnNrX2J1ZmYgPSBza2I7CiAJCQlydGw4MTY5X21hcmtfdG9fYXNpYyhkZXNjLCByeF9idWZfc3opOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby5jIGIvZHJpdmVycy9uZXQvczJpby5jCmluZGV4IDYzOWZiYzAuLjg2NDZiNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3MyaW8uYworKysgYi9kcml2ZXJzL25ldC9zMmlvLmMKQEAgLTcyOTgsNyArNzI5OCw3IEBACiB7CiAJc3RydWN0IGlwaGRyICppcCA9IGxyby0+aXBoOwogCXN0cnVjdCB0Y3BoZHIgKnRjcCA9IGxyby0+dGNwaDsKLQl1MTYgbmNoazsKKwlfX3N1bTE2IG5jaGs7CiAJc3RydWN0IHN0YXRfYmxvY2sgKnN0YXRpbmZvID0gc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm87CiAJREJHX1BSSU5UKElORk9fREJHLCIlczogQmVlbiBoZXJlLi4uXG4iLCBfX0ZVTkNUSU9OX18pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmggYi9kcml2ZXJzL25ldC9zMmlvLmgKaW5kZXggYTVlMWE1MS4uMGRlMGM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5oCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uaApAQCAtNzI3LDEyICs3MjcsMTIgQEAKIAlzdHJ1Y3QgaXBoZHIJKmlwaDsKIAlzdHJ1Y3QgdGNwaGRyCSp0Y3BoOwogCXUzMgkJdGNwX25leHRfc2VxOwotCXUzMgkJdGNwX2FjazsKKwlfX2JlMzIJCXRjcF9hY2s7CiAJaW50CQl0b3RhbF9sZW47CiAJaW50CQlmcmFnc19sZW47CiAJaW50CQlzZ19udW07CiAJaW50CQlpbl91c2U7Ci0JdTE2CQl3aW5kb3c7CisJX19iZTE2CQl3aW5kb3c7CiAJdTMyCQljdXJfdHN2YWw7CiAJdTMyCQljdXJfdHNlY3I7CiAJdTgJCXNhd190czsKQEAgLTEwMDUsNyArMTAwNSw3IEBACiBzdGF0aWMgdm9pZCBzMmlvX2NhcmRfZG93bihzdHJ1Y3QgczJpb19uaWMgKm5pYyk7CiBzdGF0aWMgaW50IHMyaW9fY2FyZF91cChzdHJ1Y3QgczJpb19uaWMgKm5pYyk7CiBzdGF0aWMgaW50IGdldF94ZW5hX3Jldl9pZChzdHJ1Y3QgcGNpX2RldiAqcGRldik7Ci1zdGF0aWMgaW50IHdhaXRfZm9yX2NtZF9jb21wbGV0ZSh2b2lkICphZGRyLCB1NjQgYnVzeV9iaXQpOworc3RhdGljIGludCB3YWl0X2Zvcl9jbWRfY29tcGxldGUodm9pZCBfX2lvbWVtICphZGRyLCB1NjQgYnVzeV9iaXQpOwogc3RhdGljIGludCBzMmlvX2FkZF9pc3Ioc3RydWN0IHMyaW9fbmljICogc3ApOwogc3RhdGljIHZvaWQgczJpb19yZW1faXNyKHN0cnVjdCBzMmlvX25pYyAqIHNwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2xpcC5jIGIvZHJpdmVycy9uZXQvc2xpcC5jCmluZGV4IGEwODA2ZDIuLjJmNGIxZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NsaXAuYworKysgYi9kcml2ZXJzL25ldC9zbGlwLmMKQEAgLTEzNDMsMTUgKzEzNDMsMTIgQEAKIAlwcmludGsoS0VSTl9JTkZPICJTTElQIGxpbmVmaWxsL2tlZXBhbGl2ZSBvcHRpb24uXG4iKTsKICNlbmRpZgogCi0Jc2xpcF9kZXZzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2UgKikqc2xpcF9tYXhkZXYsIEdGUF9LRVJORUwpOworCXNsaXBfZGV2cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlICopKnNsaXBfbWF4ZGV2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNsaXBfZGV2cykgewogCQlwcmludGsoS0VSTl9FUlIgIlNMSVA6IENhbid0IGFsbG9jYXRlIHNsaXAgZGV2aWNlcyBhcnJheSEgIFVhYXJnaCEgKC0+IE5vIFNMSVAgYXZhaWxhYmxlKVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCS8qIENsZWFyIHRoZSBwb2ludGVyIGFycmF5LCB3ZSBhbGxvY2F0ZSBkZXZpY2VzIHdoZW4gd2UgbmVlZCB0aGVtICovCi0JbWVtc2V0KHNsaXBfZGV2cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlICopKnNsaXBfbWF4ZGV2KTsKLQogCS8qIEZpbGwgaW4gb3VyIGxpbmUgcHJvdG9jb2wgZGlzY2lwbGluZSwgYW5kIHJlZ2lzdGVyIGl0ICovCiAJaWYgKChzdGF0dXMgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9TTElQLCAmc2xfbGRpc2MpKSAhPSAwKSAgewogCQlwcmludGsoS0VSTl9FUlIgIlNMSVA6IGNhbid0IHJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iLCBzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jLW1jYS5jIGIvZHJpdmVycy9uZXQvc21jLW1jYS5jCmluZGV4IDcxMjI5MzIuLmFlMWFlMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYy1tY2EuYworKysgYi9kcml2ZXJzL25ldC9zbWMtbWNhLmMKQEAgLTQ4Miw4ICs0ODIsNyBAQAogCQljb3VudCAtPSBzZW1pX2NvdW50OwogCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsIGVpX3N0YXR1cy5tZW0gKyBUWF9QQUdFUyAqIDI1NiwgY291bnQpOwogCX0gZWxzZSB7Ci0JCS8qIFBhY2tldCBpcyBpbiBvbmUgY2h1bmsgLS0gd2UgY2FuIGNvcHkgKyBja3N1bS4gKi8KLQkJZXRoX2lvX2NvcHlfYW5kX3N1bShza2IsIHhmZXJfc3RhcnQsIGNvdW50LCAwKTsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHhmZXJfc3RhcnQsIGNvdW50KTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKaW5kZXggZDcwYmM5Ny4uYTUyYjIyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKKysrIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKQEAgLTQ1NCw4ICs0NTQsNyBAQAogCQljb3VudCAtPSBzZW1pX2NvdW50OwogCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsIGVpX3N0YXR1cy5tZW0gKyBUWF9QQUdFUyAqIDI1NiwgY291bnQpOwogCX0gZWxzZSB7Ci0JCS8qIFBhY2tldCBpcyBpbiBvbmUgY2h1bmsgLS0gd2UgY2FuIGNvcHkgKyBja3N1bS4gKi8KLQkJZXRoX2lvX2NvcHlfYW5kX3N1bShza2IsIHhmZXJfc3RhcnQsIGNvdW50LCAwKTsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHhmZXJfc3RhcnQsIGNvdW50KTsKIAl9CiAKIAlvdXRiKDB4MDAsIGRldi0+YmFzZV9hZGRyIC0gVUxUUkFfTklDX09GRlNFVCk7CS8qIERpc2FibGUgbWVtb3J5LiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jLXVsdHJhMzIuYyBiL2RyaXZlcnMvbmV0L3NtYy11bHRyYTMyLmMKaW5kZXggMmM1MzE5Yy4uODhhMzBlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jLXVsdHJhMzIuYworKysgYi9kcml2ZXJzL25ldC9zbWMtdWx0cmEzMi5jCkBAIC0zOTUsOCArMzk1LDcgQEAKIAkJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwgZWlfc3RhdHVzLm1lbSArIFRYX1BBR0VTICogMjU2LCBjb3VudCk7CiAJCX0KIAl9IGVsc2UgewotCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rIC0tIHdlIGNhbiBjb3B5ICsgY2tzdW0uICovCi0JCWV0aF9pb19jb3B5X2FuZF9zdW0oc2tiLCB4ZmVyX3N0YXJ0LCBjb3VudCwgMCk7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCB4ZmVyX3N0YXJ0LCBjb3VudCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKaW5kZXggYmY2ZmYzOS4uNjRlZDhmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYwpAQCAtMTkwNyw3ICsxOTA3LDcgQEAKIAlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDJNU0ssIDApOwogCiAJLyogZnJlZV9pcnEobmV0ZGV2LT5pcnEsIG5ldGRldik7Ki8KLQlmcmVlX2lycSh0b19wY2lfZGV2KG5ldGRldi0+Y2xhc3NfZGV2LmRldiktPmlycSwgbmV0ZGV2KTsKKwlmcmVlX2lycSh0b19wY2lfZGV2KG5ldGRldi0+ZGV2LnBhcmVudCktPmlycSwgbmV0ZGV2KTsKIAogCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0RURE1BQ0NOVFIsCiAJCQkgICAgIFNQSURFUl9ORVRfRE1BX1RYX0ZFTkRfVkFMVUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmMgYi9kcml2ZXJzL25ldC90ZzMuYwppbmRleCAxMzVjMDk4Li5lMTM2YmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuYworKysgYi9kcml2ZXJzL25ldC90ZzMuYwpAQCAtMzM4MCw3ICszMzgwLDcgQEAKIAkJfQogbmV4dF9wa3Rfbm9wb3N0OgogCQlzd19pZHgrKzsKLQkJc3dfaWR4ICU9IFRHM19SWF9SQ0JfUklOR19TSVpFKHRwKTsKKwkJc3dfaWR4ICY9IChURzNfUlhfUkNCX1JJTkdfU0laRSh0cCkgLSAxKTsKIAogCQkvKiBSZWZyZXNoIGh3X2lkeCB0byBzZWUgaWYgdGhlcmUgaXMgbmV3IHdvcmsgKi8KIAkJaWYgKHN3X2lkeCA9PSBod19pZHgpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCmluZGV4IGFiYjg2MTEuLjMxYzk3YTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKQEAgLTE3MDksNzUgKzE3MDksMTMgQEAKIAkJaWYgKG1paV9pbmZvLT5zcGVlZCAhPSB1Z2V0aC0+b2xkc3BlZWQpIHsKIAkJCXN3aXRjaCAobWlpX2luZm8tPnNwZWVkKSB7CiAJCQljYXNlIDEwMDA6Ci0jaWZkZWYgQ09ORklHX1BQQ19NUEM4MzZ4Ci0vKiBGSVhNRTogVGhpcyBjb2RlIGlzIGZvciAxMDBNYnMgQlVHIGZpeGluZywKLXJlbW92ZSB0aGlzIHdoZW4gaXQgaXMgZml4ZWQhISEgKi8KLQkJCQlpZiAodWdldGgtPnVnX2luZm8tPmVuZXRfaW50ZXJmYWNlID09Ci0JCQkJICAgIEVORVRfMTAwMF9HTUlJKQotCQkJCS8qIFJ1biB0aGUgY29tbWFuZHMgd2hpY2ggaW5pdGlhbGl6ZSB0aGUgUEhZICovCi0JCQkJewotCQkJCQl0ZW1wdmFsID0KLQkJCQkJICAgICh1MzIpIG1paV9pbmZvLT5tZGlvX3JlYWQodWdldGgtPgotCQkJCQkJZGV2LCBtaWlfaW5mby0+bWlpX2lkLCAweDFiKTsKLQkJCQkJdGVtcHZhbCB8PSAweDAwMGY7Ci0JCQkJCW1paV9pbmZvLT5tZGlvX3dyaXRlKHVnZXRoLT5kZXYsCi0JCQkJCQltaWlfaW5mby0+bWlpX2lkLCAweDFiLAotCQkJCQkJKHUxNikgdGVtcHZhbCk7Ci0JCQkJCXRlbXB2YWwgPQotCQkJCQkgICAgKHUzMikgbWlpX2luZm8tPm1kaW9fcmVhZCh1Z2V0aC0+Ci0JCQkJCQlkZXYsIG1paV9pbmZvLT5taWlfaWQsCi0JCQkJCQlNSUlfQk1DUik7Ci0JCQkJCW1paV9pbmZvLT5tZGlvX3dyaXRlKHVnZXRoLT5kZXYsCi0JCQkJCQltaWlfaW5mby0+bWlpX2lkLCBNSUlfQk1DUiwKLQkJCQkJCSh1MTYpICh0ZW1wdmFsIHwgQk1DUl9SRVNFVCkpOwotCQkJCX0gZWxzZSBpZiAodWdldGgtPnVnX2luZm8tPmVuZXRfaW50ZXJmYWNlID09Ci0JCQkJCSAgIEVORVRfMTAwMF9SR01JSSkKLQkJCQkvKiBSdW4gdGhlIGNvbW1hbmRzIHdoaWNoIGluaXRpYWxpemUgdGhlIFBIWSAqLwotCQkJCXsKLQkJCQkJdGVtcHZhbCA9Ci0JCQkJCSAgICAodTMyKSBtaWlfaW5mby0+bWRpb19yZWFkKHVnZXRoLT4KLQkJCQkJCWRldiwgbWlpX2luZm8tPm1paV9pZCwgMHgxYik7Ci0JCQkJCXRlbXB2YWwgPSAodGVtcHZhbCAmIH4weDAwMGYpIHwgMHgwMDBiOwotCQkJCQltaWlfaW5mby0+bWRpb193cml0ZSh1Z2V0aC0+ZGV2LAotCQkJCQkJbWlpX2luZm8tPm1paV9pZCwgMHgxYiwKLQkJCQkJCSh1MTYpIHRlbXB2YWwpOwotCQkJCQl0ZW1wdmFsID0KLQkJCQkJICAgICh1MzIpIG1paV9pbmZvLT5tZGlvX3JlYWQodWdldGgtPgotCQkJCQkJZGV2LCBtaWlfaW5mby0+bWlpX2lkLAotCQkJCQkJTUlJX0JNQ1IpOwotCQkJCQltaWlfaW5mby0+bWRpb193cml0ZSh1Z2V0aC0+ZGV2LAotCQkJCQkJbWlpX2luZm8tPm1paV9pZCwgTUlJX0JNQ1IsCi0JCQkJCQkodTE2KSAodGVtcHZhbCB8IEJNQ1JfUkVTRVQpKTsKLQkJCQl9Ci0JCQkJbXNsZWVwKDQwMDApOwotI2VuZGlmCQkJCS8qIENPTkZJR19NUEM4MzYwICovCi0JCQkJYWRqdXN0X2VuZXRfaW50ZXJmYWNlKHVnZXRoKTsKKwkJCQl1Z2V0aC0+dWdfaW5mby0+ZW5ldF9pbnRlcmZhY2UgPSBFTkVUXzEwMDBfUkdNSUk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDEwMDoKLQkJCWNhc2UgMTA6Ci0jaWZkZWYgQ09ORklHX1BQQ19NUEM4MzZ4Ci0vKiBGSVhNRTogVGhpcyBjb2RlIGlzIGZvciAxMDBNYnMgQlVHIGZpeGluZywKLXJlbW92ZSB0aGlzIGxpbmVzIHdoZW4gaXQgd2lsbCBiZSBmaXhlZCEhISAqLwogCQkJCXVnZXRoLT51Z19pbmZvLT5lbmV0X2ludGVyZmFjZSA9IEVORVRfMTAwX1JHTUlJOwotCQkJCXRlbXB2YWwgPQotCQkJCSAgICAodTMyKSBtaWlfaW5mby0+bWRpb19yZWFkKHVnZXRoLT5kZXYsCi0JCQkJCQkJICAgICAgbWlpX2luZm8tPm1paV9pZCwKLQkJCQkJCQkgICAgICAweDFiKTsKLQkJCQl0ZW1wdmFsID0gKHRlbXB2YWwgJiB+MHgwMDBmKSB8IDB4MDAwYjsKLQkJCQltaWlfaW5mby0+bWRpb193cml0ZSh1Z2V0aC0+ZGV2LAotCQkJCQkJICAgICBtaWlfaW5mby0+bWlpX2lkLCAweDFiLAotCQkJCQkJICAgICAodTE2KSB0ZW1wdmFsKTsKLQkJCQl0ZW1wdmFsID0KLQkJCQkgICAgKHUzMikgbWlpX2luZm8tPm1kaW9fcmVhZCh1Z2V0aC0+ZGV2LAotCQkJCQkJCSAgICAgIG1paV9pbmZvLT5taWlfaWQsCi0JCQkJCQkJICAgICAgTUlJX0JNQ1IpOwotCQkJCW1paV9pbmZvLT5tZGlvX3dyaXRlKHVnZXRoLT5kZXYsCi0JCQkJCQkgICAgIG1paV9pbmZvLT5taWlfaWQsIE1JSV9CTUNSLAotCQkJCQkJICAgICAodTE2KSAodGVtcHZhbCB8Ci0JCQkJCQkJICAgIEJNQ1JfUkVTRVQpKTsKLQkJCQltc2xlZXAoNDAwMCk7Ci0jZW5kaWYJCQkJLyogQ09ORklHX01QQzgzNjAgKi8KLQkJCQlhZGp1c3RfZW5ldF9pbnRlcmZhY2UodWdldGgpOworCQkJCWJyZWFrOworCQkJY2FzZSAxMDoKKwkJCQl1Z2V0aC0+dWdfaW5mby0+ZW5ldF9pbnRlcmZhY2UgPSBFTkVUXzEwX1JHTUlJOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQl1Z2V0aF93YXJuCkBAIC0xNzg1LDYgKzE3MjMsNyBAQAogCQkJCSAgICAgZGV2LT5uYW1lLCBtaWlfaW5mby0+c3BlZWQpOwogCQkJCWJyZWFrOwogCQkJfQorCQkJYWRqdXN0X2VuZXRfaW50ZXJmYWNlKHVnZXRoKTsKIAogCQkJdWdldGhfaW5mbygiJXM6IFNwZWVkICVkQlQiLCBkZXYtPm5hbWUsCiAJCQkJICAgbWlpX2luZm8tPnNwZWVkKTsKQEAgLTQxMzMsNiArNDA3Miw3IEBACiAJc3RhdGljIGludCBtaWlfbW5nX2NvbmZpZ3VyZWQgPSAwOwogCWNvbnN0IHBoYW5kbGUgKnBoOwogCWNvbnN0IHVuc2lnbmVkIGludCAqcHJvcDsKKwljb25zdCB2b2lkICptYWNfYWRkcjsKIAogCXVnZXRoX3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTQyNTgsNyArNDE5OCwxMiBAQAogCiAJdWdldGgtPnVnX2luZm8gPSB1Z19pbmZvOwogCXVnZXRoLT5kZXYgPSBkZXY7Ci0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGdldF9wcm9wZXJ0eShucCwgIm1hYy1hZGRyZXNzIiwgTlVMTCksIDYpOworCisJbWFjX2FkZHIgPSBnZXRfcHJvcGVydHkobnAsICJtYWMtYWRkcmVzcyIsIE5VTEwpOworCWlmIChtYWNfYWRkciA9PSBOVUxMKQorCQltYWNfYWRkciA9IGdldF9wcm9wZXJ0eShucCwgImxvY2FsLW1hYy1hZGRyZXNzIiwgTlVMTCk7CisJaWYgKG1hY19hZGRyKQorCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgbWFjX2FkZHIsIDYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aF9waHkuYyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoX3BoeS5jCmluZGV4IDNjODY1OTIuLjZmZGE2ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoX3BoeS5jCkBAIC0zNzYsNiArMzc2LDggQEAKIAl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwogCiAJdWNjX2dldGhfcGh5X3dyaXRlKG1paV9pbmZvLCAweDE0LCAweDBjZDIpOworCXVjY19nZXRoX3BoeV93cml0ZShtaWlfaW5mbywgMHgxYiwKKwkJKHVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCAweDFiKSAmIH4weDAwMGYpIHwgMHgwMDBiKTsKIAl1Y2NfZ2V0aF9waHlfd3JpdGUobWlpX2luZm8sIE1JSV9CTUNSLAogCQkgIHVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCBNSUlfQk1DUikgfCBCTUNSX1JFU0VUKTsKIAltc2xlZXAoNDAwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vcGMzMDB0b28uYyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMHRvby5jCmluZGV4IDc5YjJkNTQuLmJjMTU2YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMHRvby5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMHRvby5jCkBAIC0xMDEsOCArMTAxLDggQEAKIHR5cGVkZWYgc3RydWN0IGNhcmRfcyB7CiAJaW50IHR5cGU7CQkvKiBSU1YsIFgyMSwgZXRjLiAqLwogCWludCBuX3BvcnRzOwkJLyogMSBvciAyIHBvcnRzICovCi0JdTgqIF9faW9tZW0gcmFtYmFzZTsJLyogYnVmZmVyIG1lbW9yeSBiYXNlICh2aXJ0dWFsKSAqLwotCXU4KiBfX2lvbWVtIHNjYWJhc2U7CS8qIFNDQSBtZW1vcnkgYmFzZSAodmlydHVhbCkgKi8KKwl1OCBfX2lvbWVtICpyYW1iYXNlOwkvKiBidWZmZXIgbWVtb3J5IGJhc2UgKHZpcnR1YWwpICovCisJdTggX19pb21lbSAqc2NhYmFzZTsJLyogU0NBIG1lbW9yeSBiYXNlICh2aXJ0dWFsKSAqLwogCXBseDkwNTAgX19pb21lbSAqcGx4YmFzZTsgLyogUExYIHJlZ2lzdGVycyBtZW1vcnkgYmFzZSAodmlydHVhbCkgKi8KIAl1MzIgaW5pdF9jdHJsX3ZhbHVlOwkvKiBTYXZlZCB2YWx1ZSAtIDkwNTAgYnVnIHdvcmthcm91bmQgKi8KIAl1MTYgcnhfcmluZ19idWZmZXJzOwkvKiBudW1iZXIgb2YgYnVmZmVycyBpbiBhIHJpbmcgKi8KQEAgLTEzNCw3ICsxMzQsNyBAQAogc3RhdGljIHZvaWQgcGMzMDBfc2V0X2lmYWNlKHBvcnRfdCAqcG9ydCkKIHsKIAljYXJkX3QgKmNhcmQgPSBwb3J0LT5jYXJkOwotCXUzMiogaW5pdF9jdHJsID0gJmNhcmQtPnBseGJhc2UtPmluaXRfY3RybDsKKwl1MzIgX19pb21lbSAqIGluaXRfY3RybCA9ICZjYXJkLT5wbHhiYXNlLT5pbml0X2N0cmw7CiAJdTE2IG1zY2kgPSBnZXRfbXNjaShwb3J0KTsKIAl1OCByeHMgPSBwb3J0LT5yeHMgJiBDTEtfQlJHX01BU0s7CiAJdTggdHhzID0gcG9ydC0+dHhzICYgQ0xLX0JSR19NQVNLOwpAQCAtMzkzLDcgKzM5Myw3IEBACiAKIAkvKiBQTFggUENJIDkwNTAgd29ya2Fyb3VuZCBmb3IgbG9jYWwgY29uZmlndXJhdGlvbiByZWdpc3RlciByZWFkIGJ1ZyAqLwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wLCBzY2FwaHlzKTsKLQljYXJkLT5pbml0X2N0cmxfdmFsdWUgPSByZWFkbCgmKChwbHg5MDUwKiljYXJkLT5zY2FiYXNlKS0+aW5pdF9jdHJsKTsKKwljYXJkLT5pbml0X2N0cmxfdmFsdWUgPSByZWFkbCgmKChwbHg5MDUwIF9faW9tZW0gKiljYXJkLT5zY2FiYXNlKS0+aW5pdF9jdHJsKTsKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgcGx4cGh5cyk7CiAKIAkvKiBSZXNldCBQTFggKi8KQEAgLTUxOSwxMCArNTE5LDEwIEBACiAKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBjMzAwX3BjaV9kcml2ZXIgPSB7Ci0JbmFtZTogICAgICAgICAgICJQQzMwMCIsCi0JaWRfdGFibGU6ICAgICAgIHBjMzAwX3BjaV90YmwsCi0JcHJvYmU6ICAgICAgICAgIHBjMzAwX3BjaV9pbml0X29uZSwKLQlyZW1vdmU6ICAgICAgICAgcGMzMDBfcGNpX3JlbW92ZV9vbmUsCisJLm5hbWUgPSAgICAgICAgICAiUEMzMDAiLAorCS5pZF90YWJsZSA9ICAgICAgcGMzMDBfcGNpX3RibCwKKwkucHJvYmUgPSAgICAgICAgIHBjMzAwX3BjaV9pbml0X29uZSwKKwkucmVtb3ZlID0gICAgICAgIHBjMzAwX3BjaV9yZW1vdmVfb25lLAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93ZC5jIGIvZHJpdmVycy9uZXQvd2QuYwppbmRleCA3ZjM4MDEyLi5hMDMyNjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93ZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dkLmMKQEAgLTQzMyw3ICs0MzMsNyBAQAogCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsIGVpX3N0YXR1cy5tZW0gKyBUWF9QQUdFUyAqIDI1NiwgY291bnQpOwogCX0gZWxzZSB7CiAJCS8qIFBhY2tldCBpcyBpbiBvbmUgY2h1bmsgLS0gd2UgY2FuIGNvcHkgKyBja3N1bS4gKi8KLQkJZXRoX2lvX2NvcHlfYW5kX3N1bShza2IsIHhmZXJfc3RhcnQsIGNvdW50LCAwKTsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHhmZXJfc3RhcnQsIGNvdW50KTsKIAl9CiAKIAkvKiBUdXJuIG9mZiAxNiBiaXQgYWNjZXNzIHNvIHRoYXQgcmVib290IHdvcmtzLgkgSVNBIGJyYWluLWRhbWFnZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvbTMycl9wY2MuYyBiL2RyaXZlcnMvcGNtY2lhL20zMnJfcGNjLmMKaW5kZXggYmJmMDI1OC4uNGRiZWYwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvbTMycl9wY2MuYworKysgYi9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jCkBAIC03MjIsNyArNzIyLDcgQEAKIAkvKiBTZXQgdXAgaW50ZXJydXB0IGhhbmRsZXIocykgKi8KIAogCWZvciAoaSA9IDAgOyBpIDwgcGNjX3NvY2tldHMgOyBpKyspIHsKLQkJc29ja2V0W2ldLnNvY2tldC5kZXYuZGV2ID0gJnBjY19kZXZpY2UuZGV2OworCQlzb2NrZXRbaV0uc29ja2V0LmRldi5wYXJlbnQgPSAmcGNjX2RldmljZS5kZXY7CiAJCXNvY2tldFtpXS5zb2NrZXQub3BzID0gJnBjY19vcGVyYXRpb25zOwogCQlzb2NrZXRbaV0uc29ja2V0LnJlc291cmNlX29wcyA9ICZwY2NhcmRfc3RhdGljX29wczsKIAkJc29ja2V0W2ldLnNvY2tldC5vd25lciA9IFRISVNfTU9EVUxFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRldi5jIGIvZHJpdmVycy9ydGMvcnRjLWRldi5jCmluZGV4IDk0ZDNkZjYuLjgyZjJhYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKQEAgLTMwNSw3ICszMDUsNyBAQAogCiAJY2FzZSBSVENfSVJRUF9SRUFEOgogCQlpZiAob3BzLT5pcnFfc2V0X2ZyZXEpCi0JCQllcnIgPSBwdXRfdXNlcihydGMtPmlycV9mcmVxLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpOworCQkJZXJyID0gcHV0X3VzZXIocnRjLT5pcnFfZnJlcSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopdWFyZyk7CiAJCWJyZWFrOwogCiAJY2FzZSBSVENfSVJRUF9TRVQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcGNmODU2My5jIGIvZHJpdmVycy9ydGMvcnRjLXBjZjg1NjMuYwppbmRleCA0YjcyYjhlLi4wMzgxMThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtcGNmODU2My5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1wY2Y4NTYzLmMKQEAgLTUzLDYgKzUzLDI1IEBACiAjZGVmaW5lIFBDRjg1NjNfU0NfTFYJCTB4ODAgLyogbG93IHZvbHRhZ2UgKi8KICNkZWZpbmUgUENGODU2M19NT19DCQkweDgwIC8qIGNlbnR1cnkgKi8KIAorc3RydWN0IHBjZjg1NjMgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwkvKgorCSAqIFRoZSBtZWFuaW5nIG9mIE1PX0MgYml0IHZhcmllcyBieSB0aGUgY2hpcCB0eXBlLgorCSAqIEZyb20gUENGODU2MyBkYXRhc2hlZXQ6IHRoaXMgYml0IGlzIHRvZ2dsZWQgd2hlbiB0aGUgeWVhcnMKKwkgKiByZWdpc3RlciBvdmVyZmxvd3MgZnJvbSA5OSB0byAwMAorCSAqICAgMCBpbmRpY2F0ZXMgdGhlIGNlbnR1cnkgaXMgMjB4eAorCSAqICAgMSBpbmRpY2F0ZXMgdGhlIGNlbnR1cnkgaXMgMTl4eAorCSAqIEZyb20gUlRDODU2NCBkYXRhc2hlZXQ6IHRoaXMgYml0IGluZGljYXRlcyBjaGFuZ2Ugb2YKKwkgKiBjZW50dXJ5LiBXaGVuIHRoZSB5ZWFyIGRpZ2l0IGRhdGEgb3ZlcmZsb3dzIGZyb20gOTkgdG8gMDAsCisJICogdGhpcyBiaXQgaXMgc2V0LiBCeSBwcmVzZXR0aW5nIGl0IHRvIDAgd2hpbGUgc3RpbGwgaW4gdGhlCisJICogMjB0aCBjZW50dXJ5LCBpdCB3aWxsIGJlIHNldCBpbiB5ZWFyIDIwMDAsIC4uLgorCSAqIFRoZXJlIHNlZW1zIG5vIHJlbGlhYmxlIHdheSB0byBrbm93IGhvdyB0aGUgc3lzdGVtIHVzZSB0aGlzCisJICogYml0LiAgU28gbGV0J3MgZG8gaXQgaGV1cmlzdGljYWxseSwgYXNzdW1pbmcgd2UgYXJlIGxpdmUgaW4KKwkgKiAxOTcwLi4uMjA2OS4KKwkgKi8KKwlpbnQgY19wb2xhcml0eTsJLyogMDogTU9fQz0xIG1lYW5zIDE5eHgsIG90aGVyd2lzZSBNT19DPTEgbWVhbnMgMjB4eCAqLworfTsKKwogc3RhdGljIGludCBwY2Y4NTYzX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKIHN0YXRpYyBpbnQgcGNmODU2M19kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CiAKQEAgLTYyLDYgKzgxLDcgQEAKICAqLwogc3RhdGljIGludCBwY2Y4NTYzX2dldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQogeworCXN0cnVjdCBwY2Y4NTYzICpwY2Y4NTYzID0gY29udGFpbmVyX29mKGNsaWVudCwgc3RydWN0IHBjZjg1NjMsIGNsaWVudCk7CiAJdW5zaWduZWQgY2hhciBidWZbMTNdID0geyBQQ0Y4NTYzX1JFR19TVDEgfTsKIAogCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKQEAgLTk0LDggKzExNCwxMiBAQAogCXRtLT50bV9tZGF5ID0gQkNEMkJJTihidWZbUENGODU2M19SRUdfRE1dICYgMHgzRik7CiAJdG0tPnRtX3dkYXkgPSBidWZbUENGODU2M19SRUdfRFddICYgMHgwNzsKIAl0bS0+dG1fbW9uID0gQkNEMkJJTihidWZbUENGODU2M19SRUdfTU9dICYgMHgxRikgLSAxOyAvKiBydGMgbW4gMS0xMiAqLwotCXRtLT50bV95ZWFyID0gQkNEMkJJTihidWZbUENGODU2M19SRUdfWVJdKQotCQkrIChidWZbUENGODU2M19SRUdfTU9dICYgUENGODU2M19NT19DID8gMCA6IDEwMCk7CisJdG0tPnRtX3llYXIgPSBCQ0QyQklOKGJ1ZltQQ0Y4NTYzX1JFR19ZUl0pOworCWlmICh0bS0+dG1feWVhciA8IDcwKQorCQl0bS0+dG1feWVhciArPSAxMDA7CS8qIGFzc3VtZSB3ZSBhcmUgaW4gMTk3MC4uLjIwNjkgKi8KKwkvKiBkZXRlY3QgdGhlIHBvbGFyaXR5IGhldXJpc3RpY2FsbHkuIHNlZSBub3RlIGFib3ZlLiAqLworCXBjZjg1NjMtPmNfcG9sYXJpdHkgPSAoYnVmW1BDRjg1NjNfUkVHX01PXSAmIFBDRjg1NjNfTU9fQykgPworCQkodG0tPnRtX3llYXIgPj0gMTAwKSA6ICh0bS0+dG1feWVhciA8IDEwMCk7CiAKIAlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiB0bSBpcyBzZWNzPSVkLCBtaW5zPSVkLCBob3Vycz0lZCwgIgogCQkibWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLApAQCAtMTE0LDYgKzEzOCw3IEBACiAKIHN0YXRpYyBpbnQgcGNmODU2M19zZXRfZGF0ZXRpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y190aW1lICp0bSkKIHsKKwlzdHJ1Y3QgcGNmODU2MyAqcGNmODU2MyA9IGNvbnRhaW5lcl9vZihjbGllbnQsIHN0cnVjdCBwY2Y4NTYzLCBjbGllbnQpOwogCWludCBpLCBlcnI7CiAJdW5zaWduZWQgY2hhciBidWZbOV07CiAKQEAgLTEzNSw3ICsxNjAsNyBAQAogCiAJLyogeWVhciBhbmQgY2VudHVyeSAqLwogCWJ1ZltQQ0Y4NTYzX1JFR19ZUl0gPSBCSU4yQkNEKHRtLT50bV95ZWFyICUgMTAwKTsKLQlpZiAodG0tPnRtX3llYXIgPCAxMDApCisJaWYgKHBjZjg1NjMtPmNfcG9sYXJpdHkgPyAodG0tPnRtX3llYXIgPj0gMTAwKSA6ICh0bS0+dG1feWVhciA8IDEwMCkpCiAJCWJ1ZltQQ0Y4NTYzX1JFR19NT10gfD0gUENGODU2M19NT19DOwogCiAJYnVmW1BDRjg1NjNfUkVHX0RXXSA9IHRtLT50bV93ZGF5ICYgMHgwNzsKQEAgLTI0OCw2ICsyNzMsNyBAQAogCiBzdGF0aWMgaW50IHBjZjg1NjNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCiB7CisJc3RydWN0IHBjZjg1NjMgKnBjZjg1NjM7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOwogCkBAIC0yNjAsMTEgKzI4NiwxMiBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JaWYgKCEoY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShwY2Y4NTYzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjZjg1NjMpLCBHRlBfS0VSTkVMKSkpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0OwogCX0KIAorCWNsaWVudCA9ICZwY2Y4NTYzLT5jbGllbnQ7CiAJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKIAljbGllbnQtPmRyaXZlciA9ICZwY2Y4NTYzX2RyaXZlcjsKIAljbGllbnQtPmFkYXB0ZXIJPSBhZGFwdGVyOwpAQCAtMzAxLDcgKzMyOCw3IEBACiAJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKIAogZXhpdF9rZnJlZToKLQlrZnJlZShjbGllbnQpOworCWtmcmVlKHBjZjg1NjMpOwogCiBleGl0OgogCXJldHVybiBlcnI7CkBAIC0zMDksNiArMzM2LDcgQEAKIAogc3RhdGljIGludCBwY2Y4NTYzX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogeworCXN0cnVjdCBwY2Y4NTYzICpwY2Y4NTYzID0gY29udGFpbmVyX29mKGNsaWVudCwgc3RydWN0IHBjZjg1NjMsIGNsaWVudCk7CiAJaW50IGVycjsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKQEAgLTMxOCw3ICszNDYsNyBAQAogCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCiAJCXJldHVybiBlcnI7CiAKLQlrZnJlZShjbGllbnQpOworCWtmcmVlKHBjZjg1NjMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9tb25yZWFkZXIuYyBiL2RyaXZlcnMvczM5MC9jaGFyL21vbnJlYWRlci5jCmluZGV4IGExMzhiMTUuLjNhMWE5NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL21vbnJlYWRlci5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL21vbnJlYWRlci5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENoYXJhY3RlciBkZXZpY2UgZHJpdmVyIGZvciByZWFkaW5nIHovVk0gKk1PTklUT1Igc2VydmljZSByZWNvcmRzLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBJQk0gQ29ycG9yYXRpb24sIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILgorICogQ29weXJpZ2h0IDIwMDQgSUJNIENvcnBvcmF0aW9uLCBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSC4KICAqCiAgKiBBdXRob3I6IEdlcmFsZCBTY2hhZWZlciA8Z2VyYWxkc2NAZGUuaWJtLmNvbT4KICAqLwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KICNpbmNsdWRlIDxhc20vZXh0bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgIi4uL25ldC9pdWN2LmgiCisjaW5jbHVkZSA8bmV0L2l1Y3YvaXVjdi5oPgogCiAKIC8vI2RlZmluZSBNT05fREVCVUcJCQkvKiBEZWJ1ZyBtZXNzYWdlcyBvbi9vZmYgKi8KQEAgLTUwLDE0ICs1MCwxMyBAQAogc3RydWN0IG1vbl9tc2cgewogCXUzMiBwb3M7CiAJdTMyIG1jYV9vZmZzZXQ7Ci0JaXVjdl9NZXNzYWdlUGVuZGluZyBsb2NhbF9laWI7CisJc3RydWN0IGl1Y3ZfbWVzc2FnZSBtc2c7CiAJY2hhciBtc2dsaW1fcmVhY2hlZDsKIAljaGFyIHJlcGxpZWRfbXNnbGltOwogfTsKIAogc3RydWN0IG1vbl9wcml2YXRlIHsKLQl1MTYgcGF0aGlkOwotCWl1Y3ZfaGFuZGxlX3QgaXVjdl9oYW5kbGU7CisJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aDsKIAlzdHJ1Y3QgbW9uX21zZyAqbXNnX2FycmF5W01PTl9NU0dMSU1dOwogCXVuc2lnbmVkIGludCAgIHdyaXRlX2luZGV4OwogCXVuc2lnbmVkIGludCAgIHJlYWRfaW5kZXg7CkBAIC03NSw4ICs3NCw2IEBACiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobW9uX3JlYWRfd2FpdF9xdWV1ZSk7CiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobW9uX2Nvbm5fd2FpdF9xdWV1ZSk7CiAKLXN0YXRpYyB1OCBpdWN2X2hvc3RbOF0gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0KIHN0YXRpYyB1OCB1c2VyX2RhdGFfY29ubmVjdFsxNl0gPSB7CiAJLyogVmVyc2lvbiBjb2RlLCBtdXN0IGJlIDB4MDEgZm9yIHNoYXJlZCBtb2RlICovCiAJMHgwMSwKQEAgLTEwMCw4ICs5Nyw3IEBACiAgKiBDcmVhdGUgdGhlIDggYnl0ZXMgRUJDRElDIERDU1Mgc2VnbWVudCBuYW1lIGZyb20KICAqIGFuIEFTQ0lJIG5hbWUsIGluY2wuIHBhZGRpbmcKICAqLwotc3RhdGljIGlubGluZSB2b2lkCi1kY3NzX21rbmFtZShjaGFyICphc2NpaV9uYW1lLCBjaGFyICplYmNkaWNfbmFtZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY3NzX21rbmFtZShjaGFyICphc2NpaV9uYW1lLCBjaGFyICplYmNkaWNfbmFtZSkKIHsKIAlpbnQgaTsKIApAQCAtMTE5LDggKzExNSw3IEBACiAgKiBwcmludCBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlIGZvciBzZWdtZW50X2xvYWQoKS9zZWdtZW50X3R5cGUoKQogICogcmV0dXJuIGNvZGUKICAqLwotc3RhdGljIHZvaWQKLW1vbl9zZWdtZW50X3dhcm4oaW50IHJjLCBjaGFyKiBzZWdfbmFtZSkKK3N0YXRpYyB2b2lkIG1vbl9zZWdtZW50X3dhcm4oaW50IHJjLCBjaGFyKiBzZWdfbmFtZSkKIHsKIAlzd2l0Y2ggKHJjKSB7CiAJY2FzZSAtRU5PRU5UOgpAQCAtMTY2LDQ0ICsxNjEsMzcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotbW9uX21jYV9zdGFydChzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1vbl9tY2Ffc3RhcnQoc3RydWN0IG1vbl9tc2cgKm1vbm1zZykKIHsKLQlyZXR1cm4gbW9ubXNnLT5sb2NhbF9laWIubG4xbXNnMS5pcHJtbXNnMV91MzI7CisJcmV0dXJuICoodTMyICopICZtb25tc2ctPm1zZy5ybW1zZzsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1tb25fbWNhX2VuZChzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1vbl9tY2FfZW5kKHN0cnVjdCBtb25fbXNnICptb25tc2cpCiB7Ci0JcmV0dXJuIG1vbm1zZy0+bG9jYWxfZWliLmxuMW1zZzIuaXBiZmxuMWY7CisJcmV0dXJuICoodTMyICopICZtb25tc2ctPm1zZy5ybW1zZ1s0XTsKIH0KIAotc3RhdGljIGlubGluZSB1OAotbW9uX21jYV90eXBlKHN0cnVjdCBtb25fbXNnICptb25tc2csIHU4IGluZGV4KQorc3RhdGljIGlubGluZSB1OCBtb25fbWNhX3R5cGUoc3RydWN0IG1vbl9tc2cgKm1vbm1zZywgdTggaW5kZXgpCiB7CiAJcmV0dXJuICooKHU4ICopIG1vbl9tY2Ffc3RhcnQobW9ubXNnKSArIG1vbm1zZy0+bWNhX29mZnNldCArIGluZGV4KTsKIH0KIAotc3RhdGljIGlubGluZSB1MzIKLW1vbl9tY2Ffc2l6ZShzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnKQorc3RhdGljIGlubGluZSB1MzIgbW9uX21jYV9zaXplKHN0cnVjdCBtb25fbXNnICptb25tc2cpCiB7CiAJcmV0dXJuIG1vbl9tY2FfZW5kKG1vbm1zZykgLSBtb25fbWNhX3N0YXJ0KG1vbm1zZykgKyAxOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMgotbW9uX3JlY19zdGFydChzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnKQorc3RhdGljIGlubGluZSB1MzIgbW9uX3JlY19zdGFydChzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnKQogewogCXJldHVybiAqKCh1MzIgKikgKG1vbl9tY2Ffc3RhcnQobW9ubXNnKSArIG1vbm1zZy0+bWNhX29mZnNldCArIDQpKTsKIH0KIAotc3RhdGljIGlubGluZSB1MzIKLW1vbl9yZWNfZW5kKHN0cnVjdCBtb25fbXNnICptb25tc2cpCitzdGF0aWMgaW5saW5lIHUzMiBtb25fcmVjX2VuZChzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnKQogewogCXJldHVybiAqKCh1MzIgKikgKG1vbl9tY2Ffc3RhcnQobW9ubXNnKSArIG1vbm1zZy0+bWNhX29mZnNldCArIDgpKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLW1vbl9jaGVja19tY2Eoc3RydWN0IG1vbl9tc2cgKm1vbm1zZykKK3N0YXRpYyBpbmxpbmUgaW50IG1vbl9jaGVja19tY2Eoc3RydWN0IG1vbl9tc2cgKm1vbm1zZykKIHsKIAlpZiAoKG1vbl9yZWNfZW5kKG1vbm1zZykgPD0gbW9uX3JlY19zdGFydChtb25tc2cpKSB8fAogCSAgICAobW9uX3JlY19zdGFydChtb25tc2cpIDwgbW9uX2Rjc3Nfc3RhcnQpIHx8CkBAIC0yMjEsMjAgKzIwOSwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotbW9uX3NlbmRfcmVwbHkoc3RydWN0IG1vbl9tc2cgKm1vbm1zZywgc3RydWN0IG1vbl9wcml2YXRlICptb25wcml2KQorc3RhdGljIGlubGluZSBpbnQgbW9uX3NlbmRfcmVwbHkoc3RydWN0IG1vbl9tc2cgKm1vbm1zZywKKwkJCQkgc3RydWN0IG1vbl9wcml2YXRlICptb25wcml2KQogewotCXU4IHBybW1zZ1s4XTsKIAlpbnQgcmM7CiAKIAlQX0RFQlVHKCJyZWFkLCBSRVBMWTogcGF0aGlkID0gMHglMDRYLCBtc2dpZCA9IDB4JTA4WCwgdHJnY2xzID0gIgogCQkiMHglMDhYXG5cbiIsCi0JCW1vbm1zZy0+bG9jYWxfZWliLmlwcGF0aGlkLCBtb25tc2ctPmxvY2FsX2VpYi5pcG1zZ2lkLAotCQltb25tc2ctPmxvY2FsX2VpYi5pcHRyZ2Nscyk7Ci0JcmMgPSBpdWN2X3JlcGx5X3BybW1zZyhtb25tc2ctPmxvY2FsX2VpYi5pcHBhdGhpZCwKLQkJCQltb25tc2ctPmxvY2FsX2VpYi5pcG1zZ2lkLAotCQkJCW1vbm1zZy0+bG9jYWxfZWliLmlwdHJnY2xzLAotCQkJCTAsIHBybW1zZyk7CisJCW1vbnByaXYtPnBhdGgtPnBhdGhpZCwgbW9ubXNnLT5tc2cuaWQsIG1vbm1zZy0+bXNnLmNsYXNzKTsKKworCXJjID0gaXVjdl9tZXNzYWdlX3JlcGx5KG1vbnByaXYtPnBhdGgsICZtb25tc2ctPm1zZywKKwkJCQlJVUNWX0lQUk1EQVRBLCBOVUxMLCAwKTsKIAlhdG9taWNfZGVjKCZtb25wcml2LT5tc2dsaW1fY291bnQpOwogCWlmIChsaWtlbHkoIW1vbm1zZy0+bXNnbGltX3JlYWNoZWQpKSB7CiAJCW1vbm1zZy0+cG9zID0gMDsKQEAgLTI1MSwxMCArMjM2LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG1vbl9wcml2YXRlICoKLW1vbl9hbGxvY19tZW0odm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtb25fZnJlZV9tZW0oc3RydWN0IG1vbl9wcml2YXRlICptb25wcml2KQogewotCWludCBpLGo7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTU9OX01TR0xJTTsgaSsrKQorCQlpZiAobW9ucHJpdi0+bXNnX2FycmF5W2ldKQorCQkJa2ZyZWUobW9ucHJpdi0+bXNnX2FycmF5W2ldKTsKKwlrZnJlZShtb25wcml2KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbl9hbGxvY19tZW0odm9pZCkKK3sKKwlpbnQgaTsKIAlzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXY7CiAKIAltb25wcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1vbl9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CkBAIC0yNjcsMTYgKzI2MSwxNSBAQAogCQkJCQkJICAgIEdGUF9LRVJORUwpOwogCQlpZiAoIW1vbnByaXYtPm1zZ19hcnJheVtpXSkgewogCQkJUF9FUlJPUigib3Blbiwgbm8gbWVtb3J5IGZvciBtc2dfYXJyYXlcbiIpOwotCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKLQkJCQlrZnJlZShtb25wcml2LT5tc2dfYXJyYXlbal0pOworCQkJbW9uX2ZyZWVfbWVtKG1vbnByaXYpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9CiAJcmV0dXJuIG1vbnByaXY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotbW9uX3JlYWRfZGVidWcoc3RydWN0IG1vbl9tc2cgKm1vbm1zZywgc3RydWN0IG1vbl9wcml2YXRlICptb25wcml2KQorc3RhdGljIGlubGluZSB2b2lkIG1vbl9yZWFkX2RlYnVnKHN0cnVjdCBtb25fbXNnICptb25tc2csCisJCQkJICBzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYpCiB7CiAjaWZkZWYgTU9OX0RFQlVHCiAJdTggbXNnX3R5cGVbMl0sIG1jYV90eXBlOwpAQCAtMjg0LDcgKzI3Nyw3IEBACiAKIAlyZWNvcmRzX2xlbiA9IG1vbl9yZWNfZW5kKG1vbm1zZykgLSBtb25fcmVjX3N0YXJ0KG1vbm1zZykgKyAxOwogCi0JbWVtY3B5KG1zZ190eXBlLCAmbW9ubXNnLT5sb2NhbF9laWIuaXB0cmdjbHMsIDIpOworCW1lbWNweShtc2dfdHlwZSwgJm1vbm1zZy0+bXNnLmNsYXNzLCAyKTsKIAlFQkNBU0MobXNnX3R5cGUsIDIpOwogCW1jYV90eXBlID0gbW9uX21jYV90eXBlKG1vbm1zZywgMCk7CiAJRUJDQVNDKCZtY2FfdHlwZSwgMSk7CkBAIC0yOTIsOCArMjg1LDcgQEAKIAlQX0RFQlVHKCJyZWFkLCBtb25fcmVhZF9pbmRleCA9ICVpLCBtb25fd3JpdGVfaW5kZXggPSAlaVxuIiwKIAkJbW9ucHJpdi0+cmVhZF9pbmRleCwgbW9ucHJpdi0+d3JpdGVfaW5kZXgpOwogCVBfREVCVUcoInJlYWQsIHBhdGhpZCA9IDB4JTA0WCwgbXNnaWQgPSAweCUwOFgsIHRyZ2NscyA9IDB4JTA4WFxuIiwKLQkJbW9ubXNnLT5sb2NhbF9laWIuaXBwYXRoaWQsIG1vbm1zZy0+bG9jYWxfZWliLmlwbXNnaWQsCi0JCW1vbm1zZy0+bG9jYWxfZWliLmlwdHJnY2xzKTsKKwkJbW9ucHJpdi0+cGF0aC0+cGF0aGlkLCBtb25tc2ctPm1zZy5pZCwgbW9ubXNnLT5tc2cuY2xhc3MpOwogCVBfREVCVUcoInJlYWQsIG1zZ190eXBlID0gJyVjJWMnLCBtY2FfdHlwZSA9ICclYycgLyAweCVYIC8gMHglWFxuIiwKIAkJbXNnX3R5cGVbMF0sIG1zZ190eXBlWzFdLCBtY2FfdHlwZSA/IG1jYV90eXBlIDogJ1gnLAogCQltb25fbWNhX3R5cGUobW9ubXNnLCAxKSwgbW9uX21jYV90eXBlKG1vbm1zZywgMikpOwpAQCAtMzA2LDggKzI5OCw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1tb25fbmV4dF9tY2Eoc3RydWN0IG1vbl9tc2cgKm1vbm1zZykKK3N0YXRpYyBpbmxpbmUgdm9pZCBtb25fbmV4dF9tY2Eoc3RydWN0IG1vbl9tc2cgKm1vbm1zZykKIHsKIAlpZiAobGlrZWx5KChtb25fbWNhX3NpemUobW9ubXNnKSAtIG1vbm1zZy0+bWNhX29mZnNldCkgPT0gMTIpKQogCQlyZXR1cm47CkBAIC0zMTYsOCArMzA3LDcgQEAKIAltb25tc2ctPnBvcyA9IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG1vbl9tc2cgKgotbW9uX25leHRfbWVzc2FnZShzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtb25fbXNnICptb25fbmV4dF9tZXNzYWdlKHN0cnVjdCBtb25fcHJpdmF0ZSAqbW9ucHJpdikKIHsKIAlzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnOwogCkBAIC0zNDIsMzkgKzMzMiwzNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVDViBoYW5kbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLW1vbl9pdWN2X0Nvbm5lY3Rpb25Db21wbGV0ZShpdWN2X0Nvbm5lY3Rpb25Db21wbGV0ZSAqZWliLCB2b2lkICpwZ21fZGF0YSkKK3N0YXRpYyB2b2lkIG1vbl9pdWN2X3BhdGhfY29tcGxldGUoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgdTggaXB1c2VyWzE2XSkKIHsKLQlzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYgPSAoc3RydWN0IG1vbl9wcml2YXRlICopIHBnbV9kYXRhOworCXN0cnVjdCBtb25fcHJpdmF0ZSAqbW9ucHJpdiA9IHBhdGgtPnByaXZhdGU7CiAKIAlQX0RFQlVHKCJJVUNWIGNvbm5lY3Rpb24gY29tcGxldGVkXG4iKTsKIAlQX0RFQlVHKCJJVUNWIEFDQ0VQVCAoZnJvbSAqTU9OSVRPUik6IFZlcnNpb24gPSAweCUwMlgsIEV2ZW50ID0gIgogCQkiMHglMDJYLCBTYW1wbGUgPSAweCUwMlhcbiIsCi0JCWVpYi0+aXB1c2VyWzBdLCBlaWItPmlwdXNlclsxXSwgZWliLT5pcHVzZXJbMl0pOworCQlpcHVzZXJbMF0sIGlwdXNlclsxXSwgaXB1c2VyWzJdKTsKIAlhdG9taWNfc2V0KCZtb25wcml2LT5pdWN2X2Nvbm5lY3RlZCwgMSk7CiAJd2FrZV91cCgmbW9uX2Nvbm5fd2FpdF9xdWV1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1tb25faXVjdl9Db25uZWN0aW9uU2V2ZXJlZChpdWN2X0Nvbm5lY3Rpb25TZXZlcmVkICplaWIsIHZvaWQgKnBnbV9kYXRhKQorc3RhdGljIHZvaWQgbW9uX2l1Y3ZfcGF0aF9zZXZlcmVkKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IGlwdXNlclsxNl0pCiB7Ci0Jc3RydWN0IG1vbl9wcml2YXRlICptb25wcml2ID0gKHN0cnVjdCBtb25fcHJpdmF0ZSAqKSBwZ21fZGF0YTsKKwlzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYgPSBwYXRoLT5wcml2YXRlOwogCi0JUF9FUlJPUigiSVVDViBjb25uZWN0aW9uIHNldmVyZWQgd2l0aCByYyA9IDB4JVhcbiIsCi0JCSh1OCkgZWliLT5pcHVzZXJbMF0pOworCVBfRVJST1IoIklVQ1YgY29ubmVjdGlvbiBzZXZlcmVkIHdpdGggcmMgPSAweCVYXG4iLCBpcHVzZXJbMF0pOworCWl1Y3ZfcGF0aF9zZXZlcihwYXRoLCBOVUxMKTsKIAlhdG9taWNfc2V0KCZtb25wcml2LT5pdWN2X3NldmVyZWQsIDEpOwogCXdha2VfdXAoJm1vbl9jb25uX3dhaXRfcXVldWUpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbW9uX3JlYWRfd2FpdF9xdWV1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1tb25faXVjdl9NZXNzYWdlUGVuZGluZyhpdWN2X01lc3NhZ2VQZW5kaW5nICplaWIsIHZvaWQgKnBnbV9kYXRhKQorc3RhdGljIHZvaWQgbW9uX2l1Y3ZfbWVzc2FnZV9wZW5kaW5nKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsCisJCQkJICAgICBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2cpCiB7Ci0Jc3RydWN0IG1vbl9wcml2YXRlICptb25wcml2ID0gKHN0cnVjdCBtb25fcHJpdmF0ZSAqKSBwZ21fZGF0YTsKKwlzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYgPSBwYXRoLT5wcml2YXRlOwogCiAJUF9ERUJVRygiSVVDViBtZXNzYWdlIHBlbmRpbmdcbiIpOwotCW1lbWNweSgmbW9ucHJpdi0+bXNnX2FycmF5W21vbnByaXYtPndyaXRlX2luZGV4XS0+bG9jYWxfZWliLCBlaWIsCi0JICAgICAgIHNpemVvZihpdWN2X01lc3NhZ2VQZW5kaW5nKSk7CisJbWVtY3B5KCZtb25wcml2LT5tc2dfYXJyYXlbbW9ucHJpdi0+d3JpdGVfaW5kZXhdLT5tc2csCisJICAgICAgIG1zZywgc2l6ZW9mKCptc2cpKTsKIAlpZiAoYXRvbWljX2luY19yZXR1cm4oJm1vbnByaXYtPm1zZ2xpbV9jb3VudCkgPT0gTU9OX01TR0xJTSkgewogCQlQX1dBUk5JTkcoIklVQ1YgbWVzc2FnZSBwZW5kaW5nLCBtZXNzYWdlIGxpbWl0ICglaSkgcmVhY2hlZFxuIiwKIAkJCSAgTU9OX01TR0xJTSk7CkBAIC0zODUsNTQgKzM3Myw0NSBAQAogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbW9uX3JlYWRfd2FpdF9xdWV1ZSk7CiB9CiAKLXN0YXRpYyBpdWN2X2ludGVycnVwdF9vcHNfdCBtb25faXVjdm9wcyA9IHsKLQkuQ29ubmVjdGlvbkNvbXBsZXRlID0gbW9uX2l1Y3ZfQ29ubmVjdGlvbkNvbXBsZXRlLAotCS5Db25uZWN0aW9uU2V2ZXJlZCAgPSBtb25faXVjdl9Db25uZWN0aW9uU2V2ZXJlZCwKLQkuTWVzc2FnZVBlbmRpbmcgICAgID0gbW9uX2l1Y3ZfTWVzc2FnZVBlbmRpbmcsCitzdGF0aWMgc3RydWN0IGl1Y3ZfaGFuZGxlciBtb25yZWFkZXJfaXVjdl9oYW5kbGVyID0geworCS5wYXRoX2NvbXBsZXRlCSA9IG1vbl9pdWN2X3BhdGhfY29tcGxldGUsCisJLnBhdGhfc2V2ZXJlZAkgPSBtb25faXVjdl9wYXRoX3NldmVyZWQsCisJLm1lc3NhZ2VfcGVuZGluZyA9IG1vbl9pdWN2X21lc3NhZ2VfcGVuZGluZywKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQKLW1vbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIGludCBtb25fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlpbnQgcmMsIGk7CiAJc3RydWN0IG1vbl9wcml2YXRlICptb25wcml2OworCWludCByYzsKIAogCS8qCiAJICogb25seSBvbmUgdXNlciBhbGxvd2VkCiAJICovCisJcmMgPSAtRUJVU1k7CiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoTU9OX0lOX1VTRSwgJm1vbl9pbl91c2UpKQotCQlyZXR1cm4gLUVCVVNZOworCQlnb3RvIG91dDsKIAorCXJjID0gLUVOT01FTTsKIAltb25wcml2ID0gbW9uX2FsbG9jX21lbSgpOwogCWlmICghbW9ucHJpdikKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0X3VzZTsKIAogCS8qCi0JICogUmVnaXN0ZXIgd2l0aCBJVUNWIGFuZCBjb25uZWN0IHRvICpNT05JVE9SIHNlcnZpY2UKKwkgKiBDb25uZWN0IHRvICpNT05JVE9SIHNlcnZpY2UKIAkgKi8KLQltb25wcml2LT5pdWN2X2hhbmRsZSA9IGl1Y3ZfcmVnaXN0ZXJfcHJvZ3JhbSgibXlfbW9ucmVhZGVyICAgICIsCi0JCQkJCQkJTU9OX1NFUlZJQ0UsCi0JCQkJCQkJTlVMTCwKLQkJCQkJCQkmbW9uX2l1Y3ZvcHMsCi0JCQkJCQkJbW9ucHJpdik7Ci0JaWYgKCFtb25wcml2LT5pdWN2X2hhbmRsZSkgewotCQlQX0VSUk9SKCJmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBpdWN2IGRyaXZlclxuIik7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBvdXRfZXJyb3I7Ci0JfQotCVBfSU5GTygib3BlbiwgcmVnaXN0ZXJlZCB3aXRoIElVQ1ZcbiIpOwotCi0JcmMgPSBpdWN2X2Nvbm5lY3QoJm1vbnByaXYtPnBhdGhpZCwgTU9OX01TR0xJTSwgdXNlcl9kYXRhX2Nvbm5lY3QsCi0JCQkgIE1PTl9TRVJWSUNFLCBpdWN2X2hvc3QsIElQUk1EQVRBLCBOVUxMLCBOVUxMLAotCQkJICBtb25wcml2LT5pdWN2X2hhbmRsZSwgTlVMTCk7CisJbW9ucHJpdi0+cGF0aCA9IGl1Y3ZfcGF0aF9hbGxvYyhNT05fTVNHTElNLCBJVUNWX0lQUk1EQVRBLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1vbnByaXYtPnBhdGgpCisJCWdvdG8gb3V0X3ByaXY7CisJcmMgPSBpdWN2X3BhdGhfY29ubmVjdChtb25wcml2LT5wYXRoLCAmbW9ucmVhZGVyX2l1Y3ZfaGFuZGxlciwKKwkJCSAgICAgICBNT05fU0VSVklDRSwgTlVMTCwgdXNlcl9kYXRhX2Nvbm5lY3QsIG1vbnByaXYpOwogCWlmIChyYykgewogCQlQX0VSUk9SKCJpdWN2IGNvbm5lY3Rpb24gdG8gKk1PTklUT1IgZmFpbGVkIHdpdGggIgogCQkJIklQVVNFUiBTRVZFUiBjb2RlID0gJWlcbiIsIHJjKTsKIAkJcmMgPSAtRUlPOwotCQlnb3RvIG91dF91bnJlZ2lzdGVyOworCQlnb3RvIG91dF9wYXRoOwogCX0KIAkvKgogCSAqIFdhaXQgZm9yIGNvbm5lY3Rpb24gY29uZmlybWF0aW9uCkBAIC00NDQsMjQgKzQyMywyMyBAQAogCQlhdG9taWNfc2V0KCZtb25wcml2LT5pdWN2X3NldmVyZWQsIDApOwogCQlhdG9taWNfc2V0KCZtb25wcml2LT5pdWN2X2Nvbm5lY3RlZCwgMCk7CiAJCXJjID0gLUVJTzsKLQkJZ290byBvdXRfdW5yZWdpc3RlcjsKKwkJZ290byBvdXRfcGF0aDsKIAl9CiAJUF9JTkZPKCJvcGVuLCBlc3RhYmxpc2hlZCBjb25uZWN0aW9uIHRvICpNT05JVE9SIHNlcnZpY2VcblxuIik7CiAJZmlscC0+cHJpdmF0ZV9kYXRhID0gbW9ucHJpdjsKIAlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7CiAKLW91dF91bnJlZ2lzdGVyOgotCWl1Y3ZfdW5yZWdpc3Rlcl9wcm9ncmFtKG1vbnByaXYtPml1Y3ZfaGFuZGxlKTsKLW91dF9lcnJvcjoKLQlmb3IgKGkgPSAwOyBpIDwgTU9OX01TR0xJTTsgaSsrKQotCQlrZnJlZShtb25wcml2LT5tc2dfYXJyYXlbaV0pOwotCWtmcmVlKG1vbnByaXYpOworb3V0X3BhdGg6CisJa2ZyZWUobW9ucHJpdi0+cGF0aCk7CitvdXRfcHJpdjoKKwltb25fZnJlZV9tZW0obW9ucHJpdik7CitvdXRfdXNlOgogCWNsZWFyX2JpdChNT05fSU5fVVNFLCAmbW9uX2luX3VzZSk7CitvdXQ6CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50Ci1tb25fY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgaW50IG1vbl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpbnQgcmMsIGk7CiAJc3RydWN0IG1vbl9wcml2YXRlICptb25wcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwpAQCAtNDY5LDE4ICs0NDcsMTIgQEAKIAkvKgogCSAqIENsb3NlIElVQ1YgY29ubmVjdGlvbiBhbmQgdW5yZWdpc3RlcgogCSAqLwotCXJjID0gaXVjdl9zZXZlcihtb25wcml2LT5wYXRoaWQsIHVzZXJfZGF0YV9zZXZlcik7CisJcmMgPSBpdWN2X3BhdGhfc2V2ZXIobW9ucHJpdi0+cGF0aCwgdXNlcl9kYXRhX3NldmVyKTsKIAlpZiAocmMpCiAJCVBfRVJST1IoImNsb3NlLCBpdWN2X3NldmVyIGZhaWxlZCB3aXRoIHJjID0gJWlcbiIsIHJjKTsKIAllbHNlCiAJCVBfSU5GTygiY2xvc2UsIHRlcm1pbmF0ZWQgY29ubmVjdGlvbiB0byAqTU9OSVRPUiBzZXJ2aWNlXG4iKTsKIAotCXJjID0gaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW0obW9ucHJpdi0+aXVjdl9oYW5kbGUpOwotCWlmIChyYykKLQkJUF9FUlJPUigiY2xvc2UsIGl1Y3ZfdW5yZWdpc3RlciBmYWlsZWQgd2l0aCByYyA9ICVpXG4iLCByYyk7Ci0JZWxzZQotCQlQX0lORk8oImNsb3NlLCB1bnJlZ2lzdGVyZWQgd2l0aCBJVUNWXG4iKTsKLQogCWF0b21pY19zZXQoJm1vbnByaXYtPml1Y3Zfc2V2ZXJlZCwgMCk7CiAJYXRvbWljX3NldCgmbW9ucHJpdi0+aXVjdl9jb25uZWN0ZWQsIDApOwogCWF0b21pY19zZXQoJm1vbnByaXYtPnJlYWRfcmVhZHksIDApOwpAQCAtNDk1LDggKzQ2Nyw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci1tb25fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorc3RhdGljIHNzaXplX3QgbW9uX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpkYXRhLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IG1vbl9wcml2YXRlICptb25wcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBtb25fbXNnICptb25tc2c7CkBAIC01NjMsOCArNTM1LDcgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQKLW1vbl9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnApCitzdGF0aWMgdW5zaWduZWQgaW50IG1vbl9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnApCiB7CiAJc3RydWN0IG1vbl9wcml2YXRlICptb25wcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCkBAIC01OTMsOCArNTY0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGluaXQvZXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgX19pbml0Ci1tb25faW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgbW9uX2luaXQodm9pZCkKIHsKIAlpbnQgcmM7CiAKQEAgLTYwMywyMiArNTczLDM0IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCS8qCisJICogUmVnaXN0ZXIgd2l0aCBJVUNWIGFuZCBjb25uZWN0IHRvICpNT05JVE9SIHNlcnZpY2UKKwkgKi8KKwlyYyA9IGl1Y3ZfcmVnaXN0ZXIoJm1vbnJlYWRlcl9pdWN2X2hhbmRsZXIsIDEpOworCWlmIChyYykgeworCQlQX0VSUk9SKCJmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBpdWN2IGRyaXZlclxuIik7CisJCXJldHVybiByYzsKKwl9CisJUF9JTkZPKCJvcGVuLCByZWdpc3RlcmVkIHdpdGggSVVDVlxuIik7CisKIAlyYyA9IHNlZ21lbnRfdHlwZShtb25fZGNzc19uYW1lKTsKIAlpZiAocmMgPCAwKSB7CiAJCW1vbl9zZWdtZW50X3dhcm4ocmMsIG1vbl9kY3NzX25hbWUpOwotCQlyZXR1cm4gcmM7CisJCWdvdG8gb3V0X2l1Y3Y7CiAJfQogCWlmIChyYyAhPSBTRUdfVFlQRV9TQykgewogCQlQX0VSUk9SKCJzZWdtZW50ICVzIGhhcyB1bnN1cHBvcnRlZCB0eXBlLCBzaG91bGQgYmUgU0NcbiIsCiAJCQltb25fZGNzc19uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfaXVjdjsKIAl9CiAKIAlyYyA9IHNlZ21lbnRfbG9hZChtb25fZGNzc19uYW1lLCBTRUdNRU5UX1NIQVJFRCwKIAkJCSAgJm1vbl9kY3NzX3N0YXJ0LCAmbW9uX2Rjc3NfZW5kKTsKIAlpZiAocmMgPCAwKSB7CiAJCW1vbl9zZWdtZW50X3dhcm4ocmMsIG1vbl9kY3NzX25hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dF9pdWN2OwogCX0KIAlkY3NzX21rbmFtZShtb25fZGNzc19uYW1lLCAmdXNlcl9kYXRhX2Nvbm5lY3RbOF0pOwogCkBAIC02MzQsMTQgKzYxNiwxNiBAQAogCiBvdXQ6CiAJc2VnbWVudF91bmxvYWQobW9uX2Rjc3NfbmFtZSk7CitvdXRfaXVjdjoKKwlpdWN2X3VucmVnaXN0ZXIoJm1vbnJlYWRlcl9pdWN2X2hhbmRsZXIsIDEpOwogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0Ci1tb25fZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IG1vbl9leGl0KHZvaWQpCiB7CiAJc2VnbWVudF91bmxvYWQobW9uX2Rjc3NfbmFtZSk7CiAJV0FSTl9PTihtaXNjX2RlcmVnaXN0ZXIoJm1vbl9kZXYpICE9IDApOworCWl1Y3ZfdW5yZWdpc3RlcigmbW9ucmVhZGVyX2l1Y3ZfaGFuZGxlciwgMSk7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci92bWxvZ3Jkci5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYwppbmRleCA0Zjg5NGRjLi44NDMyYTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci92bWxvZ3Jkci5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMKQEAgLTMsNyArMyw3IEBACiAgKgljaGFyYWN0ZXIgZGV2aWNlIGRyaXZlciBmb3IgcmVhZGluZyB6L1ZNIHN5c3RlbSBzZXJ2aWNlIHJlY29yZHMKICAqCiAgKgotICoJQ29weXJpZ2h0IChDKSAyMDA0IElCTSBDb3Jwb3JhdGlvbgorICoJQ29weXJpZ2h0IDIwMDQgSUJNIENvcnBvcmF0aW9uCiAgKgljaGFyYWN0ZXIgZGV2aWNlIGRyaXZlciBmb3IgcmVhZGluZyB6L1ZNIHN5c3RlbSBzZXJ2aWNlIHJlY29yZHMsCiAgKglWZXJzaW9uIDEuMAogICoJQXV0aG9yKHMpOiBYZW5pYSBUa2F0c2Nob3cgPHhlbmlhQHVzLmlibS5jb20+CkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL2NwY21kLmg+CiAjaW5jbHVkZSA8YXNtL2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgotI2luY2x1ZGUgIi4uL25ldC9pdWN2LmgiCisjaW5jbHVkZSA8bmV0L2l1Y3YvaXVjdi5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC02MCwxMiArNjAsMTEgQEAKIAljaGFyIHN5c3RlbV9zZXJ2aWNlWzhdOwogCWNoYXIgaW50ZXJuYWxfbmFtZVs4XTsKIAljaGFyIHJlY29yZGluZ19uYW1lWzhdOwotCXUxNiBwYXRoaWQ7CisJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aDsKIAlpbnQgY29ubmVjdGlvbl9lc3RhYmxpc2hlZDsKIAlpbnQgaXVjdl9wYXRoX3NldmVyZWQ7Ci0JaXVjdl9NZXNzYWdlUGVuZGluZyBsb2NhbF9pbnRlcnJ1cHRfYnVmZmVyOworCXN0cnVjdCBpdWN2X21lc3NhZ2UgbG9jYWxfaW50ZXJydXB0X2J1ZmZlcjsKIAlhdG9taWNfdCByZWNlaXZlX3JlYWR5OwotCWl1Y3ZfaGFuZGxlX3QgaXVjdl9oYW5kbGU7CiAJaW50IG1pbm9yX251bTsKIAljaGFyICogYnVmZmVyOwogCWNoYXIgKiBjdXJyZW50X3Bvc2l0aW9uOwpAQCAtOTcsMzcgKzk2LDE5IEBACiB9OwogCiAKLXN0YXRpYyB1OCBpdWN2TWFnaWNbMTZdID0gewotCTB4RjAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsCi0JMHhGMCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MAorc3RhdGljIHZvaWQgdm1sb2dyZHJfaXVjdl9wYXRoX2NvbXBsZXRlKHN0cnVjdCBpdWN2X3BhdGggKiwgdTggaXB1c2VyWzE2XSk7CitzdGF0aWMgdm9pZCB2bWxvZ3Jkcl9pdWN2X3BhdGhfc2V2ZXJlZChzdHJ1Y3QgaXVjdl9wYXRoICosIHU4IGlwdXNlclsxNl0pOworc3RhdGljIHZvaWQgdm1sb2dyZHJfaXVjdl9tZXNzYWdlX3BlbmRpbmcoc3RydWN0IGl1Y3ZfcGF0aCAqLAorCQkJCQkgIHN0cnVjdCBpdWN2X21lc3NhZ2UgKik7CisKKworc3RhdGljIHN0cnVjdCBpdWN2X2hhbmRsZXIgdm1sb2dyZHJfaXVjdl9oYW5kbGVyID0geworCS5wYXRoX2NvbXBsZXRlCSA9IHZtbG9ncmRyX2l1Y3ZfcGF0aF9jb21wbGV0ZSwKKwkucGF0aF9zZXZlcmVkCSA9IHZtbG9ncmRyX2l1Y3ZfcGF0aF9zZXZlcmVkLAorCS5tZXNzYWdlX3BlbmRpbmcgPSB2bWxvZ3Jkcl9pdWN2X21lc3NhZ2VfcGVuZGluZywKIH07CiAKIAotc3RhdGljIHU4IG1hc2tbXSA9IHsKLQkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0JMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLQkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCi19OwotCi0KLXN0YXRpYyB1OCBpdWN2X2hvc3RbOF0gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLQotCi1zdGF0aWMgdm9pZAotdm1sb2dyZHJfaXVjdl9Db25uZWN0aW9uQ29tcGxldGUoaXVjdl9Db25uZWN0aW9uQ29tcGxldGUgKmVpYiwgdm9pZCAqcGdtX2RhdGEpOwotc3RhdGljIHZvaWQKLXZtbG9ncmRyX2l1Y3ZfQ29ubmVjdGlvblNldmVyZWQoaXVjdl9Db25uZWN0aW9uU2V2ZXJlZCAqZWliLCB2b2lkICpwZ21fZGF0YSk7Ci1zdGF0aWMgdm9pZAotdm1sb2dyZHJfaXVjdl9NZXNzYWdlUGVuZGluZyhpdWN2X01lc3NhZ2VQZW5kaW5nICplaWIsIHZvaWQgKnBnbV9kYXRhKTsKLQotCi1zdGF0aWMgaXVjdl9pbnRlcnJ1cHRfb3BzX3Qgdm1sb2dyZHJfaXVjdm9wcyA9IHsKLQkuQ29ubmVjdGlvbkNvbXBsZXRlID0gdm1sb2dyZHJfaXVjdl9Db25uZWN0aW9uQ29tcGxldGUsCi0JLkNvbm5lY3Rpb25TZXZlcmVkICA9IHZtbG9ncmRyX2l1Y3ZfQ29ubmVjdGlvblNldmVyZWQsCi0JLk1lc3NhZ2VQZW5kaW5nICAgICA9IHZtbG9ncmRyX2l1Y3ZfTWVzc2FnZVBlbmRpbmcsCi19OwotCiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoY29ubl93YWl0X3F1ZXVlKTsKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChyZWFkX3dhaXRfcXVldWUpOwogCkBAIC0xNzYsMjggKzE1NywyOSBAQAogc3RhdGljIGludCByZWNvcmRpbmdfY2xhc3NfQUI7CiAKIAotc3RhdGljIHZvaWQKLXZtbG9ncmRyX2l1Y3ZfQ29ubmVjdGlvbkNvbXBsZXRlIChpdWN2X0Nvbm5lY3Rpb25Db21wbGV0ZSAqIGVpYiwKLQkJCQkgICB2b2lkICogcGdtX2RhdGEpCitzdGF0aWMgdm9pZCB2bWxvZ3Jkcl9pdWN2X3BhdGhfY29tcGxldGUoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgdTggaXB1c2VyWzE2XSkKIHsKLQlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICogbG9ncHRyID0gcGdtX2RhdGE7CisJc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqIGxvZ3B0ciA9IHBhdGgtPnByaXZhdGU7CisKIAlzcGluX2xvY2soJmxvZ3B0ci0+cHJpdl9sb2NrKTsKIAlsb2dwdHItPmNvbm5lY3Rpb25fZXN0YWJsaXNoZWQgPSAxOwogCXNwaW5fdW5sb2NrKCZsb2dwdHItPnByaXZfbG9jayk7CiAJd2FrZV91cCgmY29ubl93YWl0X3F1ZXVlKTsKLQlyZXR1cm47CiB9CiAKIAotc3RhdGljIHZvaWQKLXZtbG9ncmRyX2l1Y3ZfQ29ubmVjdGlvblNldmVyZWQgKGl1Y3ZfQ29ubmVjdGlvblNldmVyZWQgKiBlaWIsIHZvaWQgKiBwZ21fZGF0YSkKK3N0YXRpYyB2b2lkIHZtbG9ncmRyX2l1Y3ZfcGF0aF9zZXZlcmVkKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IGlwdXNlclsxNl0pCiB7Ci0JdTggcmVhc29uID0gKHU4KSBlaWItPmlwdXNlcls4XTsKLQlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICogbG9ncHRyID0gcGdtX2RhdGE7CisJc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqIGxvZ3B0ciA9IHBhdGgtPnByaXZhdGU7CisJdTggcmVhc29uID0gKHU4KSBpcHVzZXJbOF07CiAKIAlwcmludGsgKEtFUk5fRVJSICJ2bWxvZ3JkcjogY29ubmVjdGlvbiBzZXZlcmVkIHdpdGgiCiAJCSIgcmVhc29uICVpXG4iLCByZWFzb24pOwogCisJaXVjdl9wYXRoX3NldmVyKHBhdGgsIE5VTEwpOworCWtmcmVlKHBhdGgpOworCWxvZ3B0ci0+cGF0aCA9IE5VTEw7CisKIAlzcGluX2xvY2soJmxvZ3B0ci0+cHJpdl9sb2NrKTsKIAlsb2dwdHItPmNvbm5lY3Rpb25fZXN0YWJsaXNoZWQgPSAwOwogCWxvZ3B0ci0+aXVjdl9wYXRoX3NldmVyZWQgPSAxOwpAQCAtMjA5LDEwICsxOTEsMTAgQEAKIH0KIAogCi1zdGF0aWMgdm9pZAotdm1sb2dyZHJfaXVjdl9NZXNzYWdlUGVuZGluZyAoaXVjdl9NZXNzYWdlUGVuZGluZyAqIGVpYiwgdm9pZCAqIHBnbV9kYXRhKQorc3RhdGljIHZvaWQgdm1sb2dyZHJfaXVjdl9tZXNzYWdlX3BlbmRpbmcoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwKKwkJCQkJICBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2cpCiB7Ci0Jc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqIGxvZ3B0ciA9IHBnbV9kYXRhOworCXN0cnVjdCB2bWxvZ3Jkcl9wcml2X3QgKiBsb2dwdHIgPSBwYXRoLT5wcml2YXRlOwogCiAJLyoKIAkgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBib3R0b20gaGFsZiBzbyBpdCBzaG91bGQgYmUgcXVpY2suCkBAIC0yMjAsMTUgKzIwMiwxNSBAQAogCSAqIHRoZSB1c2FnZSBjb3VudAogCSAqLwogCXNwaW5fbG9jaygmbG9ncHRyLT5wcml2X2xvY2spOwotCW1lbWNweSgmKGxvZ3B0ci0+bG9jYWxfaW50ZXJydXB0X2J1ZmZlciksIGVpYiwgc2l6ZW9mKCplaWIpKTsKKwltZW1jcHkoJmxvZ3B0ci0+bG9jYWxfaW50ZXJydXB0X2J1ZmZlciwgbXNnLCBzaXplb2YoKm1zZykpOwogCWF0b21pY19pbmMoJmxvZ3B0ci0+cmVjZWl2ZV9yZWFkeSk7CiAJc3Bpbl91bmxvY2soJmxvZ3B0ci0+cHJpdl9sb2NrKTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJlYWRfd2FpdF9xdWV1ZSk7CiB9CiAKIAotc3RhdGljIGludAotdm1sb2dyZHJfZ2V0X3JlY29yZGluZ19jbGFzc19BQih2b2lkKSB7CitzdGF0aWMgaW50IHZtbG9ncmRyX2dldF9yZWNvcmRpbmdfY2xhc3NfQUIodm9pZCkKK3sKIAljaGFyIGNwX2NvbW1hbmRbXT0iUVVFUlkgQ09NTUFORCBSRUNPUkRJTkcgIjsKIAljaGFyIGNwX3Jlc3BvbnNlWzgwXTsKIAljaGFyICp0YWlsOwpAQCAtMjU4LDggKzI0MCw5IEBACiB9CiAKIAotc3RhdGljIGludAotdm1sb2dyZHJfcmVjb3JkaW5nKHN0cnVjdCB2bWxvZ3Jkcl9wcml2X3QgKiBsb2dwdHIsIGludCBhY3Rpb24sIGludCBwdXJnZSkgeworc3RhdGljIGludCB2bWxvZ3Jkcl9yZWNvcmRpbmcoc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqIGxvZ3B0ciwKKwkJCSAgICAgIGludCBhY3Rpb24sIGludCBwdXJnZSkKK3sKIAogCWNoYXIgY3BfY29tbWFuZFs4MF07CiAJY2hhciBjcF9yZXNwb25zZVsxNjBdOwpAQCAtMzE3LDggKzMwMCw3IEBACiB9CiAKIAotc3RhdGljIGludAotdm1sb2dyZHJfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgaW50IHZtbG9ncmRyX29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWludCBkZXZfbnVtID0gMDsKIAlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICogbG9ncHRyID0gTlVMTDsKQEAgLTMyOCwxMCArMzEwLDcgQEAKIAlkZXZfbnVtID0gaW1pbm9yKGlub2RlKTsKIAlpZiAoZGV2X251bSA+IE1BWE1JTk9SKQogCQlyZXR1cm4gLUVOT0RFVjsKLQogCWxvZ3B0ciA9ICZzeXNfc2VyW2Rldl9udW1dOwotCWlmIChsb2dwdHIgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKgogCSAqIG9ubHkgYWxsb3cgZm9yIGJsb2NraW5nIHJlYWRzIHRvIGJlIG9wZW4KQEAgLTM0NCw1MiArMzIzLDM4IEBACiAJaWYgKGxvZ3B0ci0+ZGV2X2luX3VzZSkJewogCQlzcGluX3VubG9ja19iaCgmbG9ncHRyLT5wcml2X2xvY2spOwogCQlyZXR1cm4gLUVCVVNZOwotCX0gZWxzZSB7Ci0JCWxvZ3B0ci0+ZGV2X2luX3VzZSA9IDE7Ci0JCXNwaW5fdW5sb2NrX2JoKCZsb2dwdHItPnByaXZfbG9jayk7CiAJfQotCisJbG9ncHRyLT5kZXZfaW5fdXNlID0gMTsKKwlsb2dwdHItPmNvbm5lY3Rpb25fZXN0YWJsaXNoZWQgPSAwOworCWxvZ3B0ci0+aXVjdl9wYXRoX3NldmVyZWQgPSAwOwogCWF0b21pY19zZXQoJmxvZ3B0ci0+cmVjZWl2ZV9yZWFkeSwgMCk7CiAJbG9ncHRyLT5idWZmZXJfZnJlZSA9IDE7CisJc3Bpbl91bmxvY2tfYmgoJmxvZ3B0ci0+cHJpdl9sb2NrKTsKIAogCS8qIHNldCB0aGUgZmlsZSBvcHRpb25zICovCiAJZmlscC0+cHJpdmF0ZV9kYXRhID0gbG9ncHRyOwogCWZpbHAtPmZfb3AgPSAmdm1sb2dyZHJfZm9wczsKIAogCS8qIHN0YXJ0IHJlY29yZGluZyBmb3IgdGhpcyBzZXJ2aWNlKi8KLQlyZXQ9MDsKLQlpZiAobG9ncHRyLT5hdXRvcmVjb3JkaW5nKQorCWlmIChsb2dwdHItPmF1dG9yZWNvcmRpbmcpIHsKIAkJcmV0ID0gdm1sb2dyZHJfcmVjb3JkaW5nKGxvZ3B0ciwxLGxvZ3B0ci0+YXV0b3B1cmdlKTsKLQlpZiAocmV0KQotCQlwcmludGsgKEtFUk5fV0FSTklORyAidm1sb2dyZHI6IGZhaWxlZCB0byBzdGFydCAiCi0JCQkicmVjb3JkaW5nIGF1dG9tYXRpY2FsbHlcbiIpOwotCi0JLyogUmVnaXN0ZXIgd2l0aCBpdWN2IGRyaXZlciAqLwotCWxvZ3B0ci0+aXVjdl9oYW5kbGUgPSBpdWN2X3JlZ2lzdGVyX3Byb2dyYW0oaXVjdk1hZ2ljLAotCQkJbG9ncHRyLT5zeXN0ZW1fc2VydmljZSwgbWFzaywgJnZtbG9ncmRyX2l1Y3ZvcHMsCi0JCQlsb2dwdHIpOwotCi0JaWYgKGxvZ3B0ci0+aXVjdl9oYW5kbGUgPT0gTlVMTCkgewotCQlwcmludGsgKEtFUk5fRVJSICJ2bWxvZ3JkcjogZmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGgiCi0JCQkiaXVjdiBkcml2ZXJcbiIpOwotCQlnb3RvIG5vdF9yZWdpc3RlcmVkOworCQlpZiAocmV0KQorCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgInZtbG9ncmRyOiBmYWlsZWQgdG8gc3RhcnQgIgorCQkJCSJyZWNvcmRpbmcgYXV0b21hdGljYWxseVxuIik7CiAJfQogCiAJLyogY3JlYXRlIGNvbm5lY3Rpb24gdG8gdGhlIHN5c3RlbSBzZXJ2aWNlICovCi0Jc3Bpbl9sb2NrX2JoKCZsb2dwdHItPnByaXZfbG9jayk7Ci0JbG9ncHRyLT5jb25uZWN0aW9uX2VzdGFibGlzaGVkID0gMDsKLQlsb2dwdHItPml1Y3ZfcGF0aF9zZXZlcmVkID0gMDsKLQlzcGluX3VubG9ja19iaCgmbG9ncHRyLT5wcml2X2xvY2spOwotCi0JY29ubmVjdF9yYyA9IGl1Y3ZfY29ubmVjdCAoJihsb2dwdHItPnBhdGhpZCksIDEwLCBpdWN2TWFnaWMsCi0JCQkJCWxvZ3B0ci0+c3lzdGVtX3NlcnZpY2UsIGl1Y3ZfaG9zdCwgMCwKLQkJCQkJTlVMTCwgTlVMTCwKLQkJCQkJbG9ncHRyLT5pdWN2X2hhbmRsZSwgTlVMTCk7CisJbG9ncHRyLT5wYXRoID0gaXVjdl9wYXRoX2FsbG9jKDEwLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxvZ3B0ci0+cGF0aCkKKwkJZ290byBvdXRfZGV2OworCWNvbm5lY3RfcmMgPSBpdWN2X3BhdGhfY29ubmVjdChsb2dwdHItPnBhdGgsICZ2bWxvZ3Jkcl9pdWN2X2hhbmRsZXIsCisJCQkJICAgICAgIGxvZ3B0ci0+c3lzdGVtX3NlcnZpY2UsIE5VTEwsIE5VTEwsCisJCQkJICAgICAgIGxvZ3B0cik7CiAJaWYgKGNvbm5lY3RfcmMpIHsKIAkJcHJpbnRrIChLRVJOX0VSUiAidm1sb2dyZHI6IGl1Y3YgY29ubmVjdGlvbiB0byAlcyAiCiAJCQkiZmFpbGVkIHdpdGggcmMgJWkgXG4iLCBsb2dwdHItPnN5c3RlbV9zZXJ2aWNlLAogCQkJY29ubmVjdF9yYyk7Ci0JCWdvdG8gbm90X2Nvbm5lY3RlZDsKKwkJZ290byBvdXRfcGF0aDsKIAl9CiAKIAkvKiBXZSd2ZSBpc3N1ZWQgdGhlIGNvbm5lY3QgYW5kIG5vdyB3ZSBtdXN0IHdhaXQgZm9yIGEKQEAgLTM5OCwzNSArMzYzLDI4IEBACiAJICovCiAJd2FpdF9ldmVudChjb25uX3dhaXRfcXVldWUsIChsb2dwdHItPmNvbm5lY3Rpb25fZXN0YWJsaXNoZWQpCiAJCSAgIHx8IChsb2dwdHItPml1Y3ZfcGF0aF9zZXZlcmVkKSk7Ci0JaWYgKGxvZ3B0ci0+aXVjdl9wYXRoX3NldmVyZWQpIHsKLQkJZ290byBub3RfY29ubmVjdGVkOwotCX0KLQorCWlmIChsb2dwdHItPml1Y3ZfcGF0aF9zZXZlcmVkKQorCQlnb3RvIG91dF9yZWNvcmQ7CiAgCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKIAotbm90X2Nvbm5lY3RlZDoKLQlpdWN2X3VucmVnaXN0ZXJfcHJvZ3JhbShsb2dwdHItPml1Y3ZfaGFuZGxlKTsKLQlsb2dwdHItPml1Y3ZfaGFuZGxlID0gTlVMTDsKLW5vdF9yZWdpc3RlcmVkOgorb3V0X3JlY29yZDoKIAlpZiAobG9ncHRyLT5hdXRvcmVjb3JkaW5nKQogCQl2bWxvZ3Jkcl9yZWNvcmRpbmcobG9ncHRyLDAsbG9ncHRyLT5hdXRvcHVyZ2UpOworb3V0X3BhdGg6CisJa2ZyZWUobG9ncHRyLT5wYXRoKTsJLyoga2ZyZWUoTlVMTCkgaXMgb2suICovCisJbG9ncHRyLT5wYXRoID0gTlVMTDsKK291dF9kZXY6CiAJbG9ncHRyLT5kZXZfaW5fdXNlID0gMDsKIAlyZXR1cm4gLUVJTzsKLQotCiB9CiAKIAotc3RhdGljIGludAotdm1sb2dyZHJfcmVsZWFzZSAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgaW50IHZtbG9ncmRyX3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWludCByZXQ7CiAKIAlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICogbG9ncHRyID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCi0JaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW0obG9ncHRyLT5pdWN2X2hhbmRsZSk7Ci0JbG9ncHRyLT5pdWN2X2hhbmRsZSA9IE5VTEw7Ci0KIAlpZiAobG9ncHRyLT5hdXRvcmVjb3JkaW5nKSB7CiAJCXJldCA9IHZtbG9ncmRyX3JlY29yZGluZyhsb2dwdHIsMCxsb2dwdHItPmF1dG9wdXJnZSk7CiAJCWlmIChyZXQpCkBAIC00MzksOCArMzk3LDggQEAKIH0KIAogCi1zdGF0aWMgaW50Ci12bWxvZ3Jkcl9yZWNlaXZlX2RhdGEoc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqcHJpdikgeworc3RhdGljIGludCB2bWxvZ3Jkcl9yZWNlaXZlX2RhdGEoc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqcHJpdikKK3sKIAlpbnQgcmMsICp0ZW1wOwogCS8qIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0d28gZGF0YSBzaXplcyBoZXJlOgogCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgbmVlZCB0byByZWNlaXZlIGZyb20gaXVjdiBhbmQKQEAgLTQ2MSw4ICs0MTksNyBAQAogCQkJICogV2UgbmVlZCB0byByZXR1cm4gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgcmVjb3JkCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiArIHNpemUgb2YgRkVOQ0UgaW4gdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIGJ1ZmZlci4KIAkJICAgICAgICAgKi8KLQkJCWl1Y3ZfZGF0YV9jb3VudCA9Ci0JCQkJcHJpdi0+bG9jYWxfaW50ZXJydXB0X2J1ZmZlci5sbjFtc2cyLmlwYmZsbjFmOworCQkJaXVjdl9kYXRhX2NvdW50ID0gcHJpdi0+bG9jYWxfaW50ZXJydXB0X2J1ZmZlci5sZW5ndGg7CiAJCQl1c2VyX2RhdGFfY291bnQgPSBzaXplb2YoaW50KTsKIAkJCXRlbXAgPSAoaW50Kilwcml2LT5idWZmZXI7CiAJCQkqdGVtcD0gaXVjdl9kYXRhX2NvdW50ICsgc2l6ZW9mKEZFTkNFKTsKQEAgLTQ3NCwxNCArNDMxLDEwIEBACiAJCSAqLwogCQlpZiAoaXVjdl9kYXRhX2NvdW50ID4gTkVUX0JVRkZFUl9TSVpFKQogCQkJaXVjdl9kYXRhX2NvdW50ID0gTkVUX0JVRkZFUl9TSVpFOwotCQlyYyA9IGl1Y3ZfcmVjZWl2ZShwcml2LT5wYXRoaWQsCi0JCQkJICBwcml2LT5sb2NhbF9pbnRlcnJ1cHRfYnVmZmVyLmlwbXNnaWQsCi0JCQkJICBwcml2LT5sb2NhbF9pbnRlcnJ1cHRfYnVmZmVyLmlwdHJnY2xzLAotCQkJCSAgYnVmZmVyLAotCQkJCSAgaXVjdl9kYXRhX2NvdW50LAotCQkJCSAgTlVMTCwKLQkJCQkgIE5VTEwsCi0JCQkJICAmcHJpdi0+cmVzaWR1YWxfbGVuZ3RoKTsKKwkJcmMgPSBpdWN2X21lc3NhZ2VfcmVjZWl2ZShwcml2LT5wYXRoLAorCQkJCQkgICZwcml2LT5sb2NhbF9pbnRlcnJ1cHRfYnVmZmVyLAorCQkJCQkgIDAsIGJ1ZmZlciwgaXVjdl9kYXRhX2NvdW50LAorCQkJCQkgICZwcml2LT5yZXNpZHVhbF9sZW5ndGgpOwogCQlzcGluX3VubG9ja19iaCgmcHJpdi0+cHJpdl9sb2NrKTsKIAkJLyogQW4gcmMgb2YgNSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVjb3JkIHdhcyBiaWdnZXIgdGhlbgogCQkgKiB0aGUgYnVmZmVyLCB3aGljaCBpcyBPSyBmb3IgdXMuIEEgOSBpbmRpY2F0ZXMgdGhhdCB0aGUKQEAgLTUxMyw4ICs0NjYsOCBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90Ci12bWxvZ3Jkcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqZGF0YSwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQorc3RhdGljIHNzaXplX3Qgdm1sb2dyZHJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmRhdGEsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKIHsKIAlpbnQgcmM7CiAJc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqIHByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CkBAIC01NDYsOCArNDk5LDEwIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdAotdm1sb2dyZHJfYXV0b3B1cmdlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpIHsKK3N0YXRpYyBzc2l6ZV90IHZtbG9ncmRyX2F1dG9wdXJnZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICogZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY29uc3QgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQorewogCXN0cnVjdCB2bWxvZ3Jkcl9wcml2X3QgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCXNzaXplX3QgcmV0ID0gY291bnQ7CiAKQEAgLTU2NSw4ICs1MjAsMTAgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdAotdm1sb2dyZHJfYXV0b3B1cmdlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSB7CitzdGF0aWMgc3NpemVfdCB2bWxvZ3Jkcl9hdXRvcHVyZ2Vfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgICBjaGFyICpidWYpCit7CiAJc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHByaXYtPmF1dG9wdXJnZSk7CiB9CkBAIC01NzYsOCArNTMzLDEwIEBACiAJCSAgIHZtbG9ncmRyX2F1dG9wdXJnZV9zdG9yZSk7CiAKIAotc3RhdGljIHNzaXplX3QKLXZtbG9ncmRyX3B1cmdlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpIHsKK3N0YXRpYyBzc2l6ZV90IHZtbG9ncmRyX3B1cmdlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKiBkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCit7CiAKIAljaGFyIGNwX2NvbW1hbmRbODBdOwogCWNoYXIgY3BfcmVzcG9uc2VbODBdOwpAQCAtNjE3LDkgKzU3NiwxMCBAQAogc3RhdGljIERFVklDRV9BVFRSKHB1cmdlLCAwMjAwLCBOVUxMLCB2bWxvZ3Jkcl9wdXJnZV9zdG9yZSk7CiAKIAotc3RhdGljIHNzaXplX3QKLXZtbG9ncmRyX2F1dG9yZWNvcmRpbmdfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAotCQkJICAgICBzaXplX3QgY291bnQpIHsKK3N0YXRpYyBzc2l6ZV90IHZtbG9ncmRyX2F1dG9yZWNvcmRpbmdfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKIAlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIAlzc2l6ZV90IHJldCA9IGNvdW50OwogCkBAIC02MzcsOCArNTk3LDEwIEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QKLXZtbG9ncmRyX2F1dG9yZWNvcmRpbmdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIHsKK3N0YXRpYyBzc2l6ZV90IHZtbG9ncmRyX2F1dG9yZWNvcmRpbmdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjaGFyICpidWYpCit7CiAJc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHByaXYtPmF1dG9yZWNvcmRpbmcpOwogfQpAQCAtNjQ4LDkgKzYxMCwxMCBAQAogCQkgICB2bWxvZ3Jkcl9hdXRvcmVjb3JkaW5nX3N0b3JlKTsKIAogCi1zdGF0aWMgc3NpemVfdAotdm1sb2dyZHJfcmVjb3JkaW5nX3N0b3JlKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpIHsKLQorc3RhdGljIHNzaXplX3Qgdm1sb2dyZHJfcmVjb3JkaW5nX3N0b3JlKHN0cnVjdCBkZXZpY2UgKiBkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCit7CiAJc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAJc3NpemVfdCByZXQ7CiAKQEAgLTY3NSw4ICs2MzgsOSBAQAogc3RhdGljIERFVklDRV9BVFRSKHJlY29yZGluZywgMDIwMCwgTlVMTCwgdm1sb2dyZHJfcmVjb3JkaW5nX3N0b3JlKTsKIAogCi1zdGF0aWMgc3NpemVfdAotdm1sb2dyZHJfcmVjb3JkaW5nX3N0YXR1c19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXIsIGNoYXIgKmJ1Zikgeworc3RhdGljIHNzaXplX3Qgdm1sb2dyZHJfcmVjb3JkaW5nX3N0YXR1c19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXIsCisJCQkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKIAogCWNoYXIgY3BfY29tbWFuZFtdID0gIlFVRVJZIFJFQ09SRElORyAiOwogCWludCBsZW47CkBAIC03MDksNTIgKzY3Myw2MyBAQAogfTsKIAogCi1zdGF0aWMgaW50Ci12bWxvZ3Jkcl9yZWdpc3Rlcl9kcml2ZXIodm9pZCkgeworc3RhdGljIGludCB2bWxvZ3Jkcl9yZWdpc3Rlcl9kcml2ZXIodm9pZCkKK3sKIAlpbnQgcmV0OwogCisJLyogUmVnaXN0ZXIgd2l0aCBpdWN2IGRyaXZlciAqLworCXJldCA9IGl1Y3ZfcmVnaXN0ZXIoJnZtbG9ncmRyX2l1Y3ZfaGFuZGxlciwgMSk7CisJaWYgKHJldCkgeworCQlwcmludGsgKEtFUk5fRVJSICJ2bWxvZ3JkcjogZmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGgiCisJCQkiaXVjdiBkcml2ZXJcbiIpOworCQlnb3RvIG91dDsKKwl9CisKIAlyZXQgPSBkcml2ZXJfcmVnaXN0ZXIoJnZtbG9ncmRyX2RyaXZlcik7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgInZtbG9ncmRyOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZHJpdmVyLlxuIik7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X2l1Y3Y7CiAJfQogCiAJcmV0ID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZ2bWxvZ3Jkcl9kcml2ZXIsCiAJCQkJICZkcml2ZXJfYXR0cl9yZWNvcmRpbmdfc3RhdHVzKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAidm1sb2dyZHI6IGZhaWxlZCB0byBhZGQgZHJpdmVyIGF0dHJpYnV0ZS5cbiIpOwotCQlnb3RvIHVucmVnZHJpdmVyOworCQlnb3RvIG91dF9kcml2ZXI7CiAJfQogCiAJdm1sb2dyZHJfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJ2bWxvZ3JkciIpOwogCWlmIChJU19FUlIodm1sb2dyZHJfY2xhc3MpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidm1sb2dyZHI6IGZhaWxlZCB0byBjcmVhdGUgY2xhc3MuXG4iKTsKLQkJcmV0PVBUUl9FUlIodm1sb2dyZHJfY2xhc3MpOwotCQl2bWxvZ3Jkcl9jbGFzcz1OVUxMOwotCQlnb3RvIHVucmVnYXR0cjsKKwkJcmV0ID0gUFRSX0VSUih2bWxvZ3Jkcl9jbGFzcyk7CisJCXZtbG9ncmRyX2NsYXNzID0gTlVMTDsKKwkJZ290byBvdXRfYXR0cjsKIAl9CiAJcmV0dXJuIDA7CiAKLXVucmVnYXR0cjoKK291dF9hdHRyOgogCWRyaXZlcl9yZW1vdmVfZmlsZSgmdm1sb2dyZHJfZHJpdmVyLCAmZHJpdmVyX2F0dHJfcmVjb3JkaW5nX3N0YXR1cyk7Ci11bnJlZ2RyaXZlcjoKK291dF9kcml2ZXI6CiAJZHJpdmVyX3VucmVnaXN0ZXIoJnZtbG9ncmRyX2RyaXZlcik7CitvdXRfaXVjdjoKKwlpdWN2X3VucmVnaXN0ZXIoJnZtbG9ncmRyX2l1Y3ZfaGFuZGxlciwgMSk7CitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIAogCi1zdGF0aWMgdm9pZAotdm1sb2dyZHJfdW5yZWdpc3Rlcl9kcml2ZXIodm9pZCkgeworc3RhdGljIHZvaWQgdm1sb2dyZHJfdW5yZWdpc3Rlcl9kcml2ZXIodm9pZCkKK3sKIAljbGFzc19kZXN0cm95KHZtbG9ncmRyX2NsYXNzKTsKIAl2bWxvZ3Jkcl9jbGFzcyA9IE5VTEw7CiAJZHJpdmVyX3JlbW92ZV9maWxlKCZ2bWxvZ3Jkcl9kcml2ZXIsICZkcml2ZXJfYXR0cl9yZWNvcmRpbmdfc3RhdHVzKTsKIAlkcml2ZXJfdW5yZWdpc3Rlcigmdm1sb2dyZHJfZHJpdmVyKTsKLQlyZXR1cm47CisJaXVjdl91bnJlZ2lzdGVyKCZ2bWxvZ3Jkcl9pdWN2X2hhbmRsZXIsIDEpOwogfQogCiAKLXN0YXRpYyBpbnQKLXZtbG9ncmRyX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICpwcml2KSB7CitzdGF0aWMgaW50IHZtbG9ncmRyX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICpwcml2KQorewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlpbnQgcmV0OwogCkBAIC04MDMsOSArNzc4LDEwIEBACiB9CiAKIAotc3RhdGljIGludAotdm1sb2dyZHJfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqcHJpdiApIHsKLQljbGFzc19kZXZpY2VfZGVzdHJveSh2bWxvZ3Jkcl9jbGFzcywgTUtERVYodm1sb2dyZHJfbWFqb3IsIHByaXYtPm1pbm9yX251bSkpOworc3RhdGljIGludCB2bWxvZ3Jkcl91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICpwcml2KQoreworCWNsYXNzX2RldmljZV9kZXN0cm95KHZtbG9ncmRyX2NsYXNzLAorCQkJICAgICBNS0RFVih2bWxvZ3Jkcl9tYWpvciwgcHJpdi0+bWlub3JfbnVtKSk7CiAJaWYgKHByaXYtPmRldmljZSAhPSBOVUxMKSB7CiAJCXN5c2ZzX3JlbW92ZV9ncm91cCgmcHJpdi0+ZGV2aWNlLT5rb2JqLCAmdm1sb2dyZHJfYXR0cl9ncm91cCk7CiAJCWRldmljZV91bnJlZ2lzdGVyKHByaXYtPmRldmljZSk7CkBAIC04MTUsOCArNzkxLDggQEAKIH0KIAogCi1zdGF0aWMgaW50Ci12bWxvZ3Jkcl9yZWdpc3Rlcl9jZGV2KGRldl90IGRldikgeworc3RhdGljIGludCB2bWxvZ3Jkcl9yZWdpc3Rlcl9jZGV2KGRldl90IGRldikKK3sKIAlpbnQgcmMgPSAwOwogCXZtbG9ncmRyX2NkZXYgPSBjZGV2X2FsbG9jKCk7CiAJaWYgKCF2bWxvZ3Jkcl9jZGV2KSB7CkBAIC04MzYsOSArODEyLDEwIEBACiB9CiAKIAotc3RhdGljIHZvaWQKLXZtbG9ncmRyX2NsZWFudXAodm9pZCkgeworc3RhdGljIHZvaWQgdm1sb2dyZHJfY2xlYW51cCh2b2lkKQorewogICAgICAgICBpbnQgaTsKKwogCWlmICh2bWxvZ3Jkcl9jZGV2KSB7CiAJCWNkZXZfZGVsKHZtbG9ncmRyX2NkZXYpOwogCQl2bWxvZ3Jkcl9jZGV2PU5VTEw7CkBAIC04NTUsOCArODMyLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50Ci12bWxvZ3Jkcl9pbml0KHZvaWQpCitzdGF0aWMgaW50IHZtbG9ncmRyX2luaXQodm9pZCkKIHsKIAlpbnQgcmM7CiAJaW50IGk7CkBAIC05MDYsOCArODgyLDcgQEAKIH0KIAogCi1zdGF0aWMgdm9pZAotdm1sb2dyZHJfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgdm1sb2dyZHJfZXhpdCh2b2lkKQogewogCXZtbG9ncmRyX2NsZWFudXAoKTsKIAlwcmludGsgKEtFUk5fSU5GTyAidm1sb2dyZHI6IGRyaXZlciB1bmxvYWRlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L0tjb25maWcgYi9kcml2ZXJzL3MzOTAvbmV0L0tjb25maWcKaW5kZXggNTI2MjUxNS4uZjk4ZmE0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvS2NvbmZpZwpAQCAtMjIsMTMgKzIyLDYgQEAKIAkgIGF2YWlsYWJsZS4gIFRoaXMgb3B0aW9uIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlIHdoaWNoIHdpbGwgYmUKIAkgIGNhbGxlZCBjdGMua28uICBJZiB5b3UgZG8gbm90IGtub3cgd2hhdCBpdCBpcywgaXQncyBzYWZlIHRvIHNheSAiWSIuCiAKLWNvbmZpZyBJVUNWCi0JdHJpc3RhdGUgIklVQ1Ygc3VwcG9ydCAoVk0gb25seSkiCi0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBpbnRlci11c2VyIGNvbW11bmljYXRpb24KLQkgIHVuZGVyIFZNIG9yIFZJRi4gSWYgdW5zdXJlLCBzYXkgIlkiIHRvIGVuYWJsZSBhIGZhc3QgY29tbXVuaWNhdGlvbgotCSAgbGluayBiZXR3ZWVuIFZNIGd1ZXN0cy4KLQogY29uZmlnIE5FVElVQ1YKIAl0cmlzdGF0ZSAiSVVDViBuZXR3b3JrIGRldmljZSBzdXBwb3J0IChWTSBvbmx5KSIKIAlkZXBlbmRzIG9uIElVQ1YgJiYgTkVUREVWSUNFUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvczM5MC9uZXQvTWFrZWZpbGUKaW5kZXggNDc3N2UzNi4uYmJlM2FiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3MzOTAvbmV0L01ha2VmaWxlCkBAIC00LDcgKzQsNiBAQAogCiBjdGMtb2JqcyA6PSBjdGNtYWluLm8gY3RjZGJ1Zy5vCiAKLW9iai0kKENPTkZJR19JVUNWKSArPSBpdWN2Lm8KIG9iai0kKENPTkZJR19ORVRJVUNWKSArPSBuZXRpdWN2Lm8gZnNtLm8KIG9iai0kKENPTkZJR19TTVNHSVVDVikgKz0gc21zZ2l1Y3Yubwogb2JqLSQoQ09ORklHX0NUQykgKz0gY3RjLm8gZnNtLm8gY3UzMDg4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvaXVjdi5jIGIvZHJpdmVycy9zMzkwL25ldC9pdWN2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOWFlYjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9pdWN2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQwICswLDAgQEAKLS8qCi0gKiBJVUNWIG5ldHdvcmsgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KLSAqIEF1dGhvcihzKToKLSAqICAgIE9yaWdpbmFsIHNvdXJjZToKLSAqICAgICAgQWxhbiBBbHRtYXJrIChBbGFuX0FsdG1hcmtAdXMuaWJtLmNvbSkgIFNlcHQuIDIwMDAKLSAqICAgICAgWGVuaWEgVGthdHNjaG93ICh4ZW5pYUB1cy5pYm0uY29tKQotICogICAgMkdiIGF3YXJlbmVzcyBhbmQgZ2VuZXJhbCBjbGVhbnVwOgotICogICAgICBGcml0eiBFbGZlcnQgKGVsZmVydEBkZS5pYm0uY29tLCBmZWxmZXJ0QG1pbGxlbnV4LmNvbSkKLSAqCi0gKiBEb2N1bWVudGF0aW9uIHVzZWQ6Ci0gKiAgICBUaGUgb3JpZ2luYWwgc291cmNlCi0gKiAgICBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlLCBJQk0gZG9jdW1lbnQgIyBTQzI0LTU3NjAKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKi8KLQotLyogI2RlZmluZSBERUJVRyAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSAiaXVjdi5oIgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zMzkwX2V4dC5oPgotI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KLSNpbmNsdWRlIDxhc20vc21wLmg+Ci0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgotCi0vKiBGTEFHUzoKLSAqIEFsbCBmbGFncyBhcmUgZGVmaW5lZCBpbiB0aGUgZmllbGQgSVBGTEFHUzEgb2YgZWFjaCBmdW5jdGlvbgotICogYW5kIGNhbiBiZSBmb3VuZCBpbiBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlcy4KLSAqIElQU1JDQ0xTIC0gSW5kaWNhdGVzIHlvdSBoYXZlIHNwZWNpZmllZCBhIHNvdXJjZSBjbGFzcwotICogSVBGR01DTCAgLSBJbmRpY2F0ZXMgeW91IGhhdmUgc3BlY2lmaWVkIGEgdGFyZ2V0IGNsYXNzCi0gKiBJUEZHUElEICAtIEluZGljYXRlcyB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwYXRoaWQKLSAqIElQRkdNSUQgIC0gSW5kaWNhdGVzIHlvdSBoYXZlIHNwZWNpZmllZCBhIG1lc3NhZ2UgSUQKLSAqIElQQU5TTFNUIC0gSW5kaWNhdGVzIHRoYXQgeW91IGFyZSB1c2luZyBhbiBhZGRyZXNzIGxpc3QgZm9yCi0gKiAgICAgICAgICAgIHJlcGx5IGRhdGEKLSAqIElQQlVGTFNUIC0gSW5kaWNhdGVzIHRoYXQgeW91IGFyZSB1c2luZyBhbiBhZGRyZXNzIGxpc3QgZm9yCi0gKiAgICAgICAgICAgIG1lc3NhZ2UgZGF0YQotICovCi0KLSNkZWZpbmUgSVBTUkNDTFMgCTB4MDEKLSNkZWZpbmUgSVBGR01DTCAgICAgICAgIDB4MDEKLSNkZWZpbmUgSVBGR1BJRCAgICAgICAgIDB4MDIKLSNkZWZpbmUgSVBGR01JRCAgICAgICAgIDB4MDQKLSNkZWZpbmUgSVBBTlNMU1QgICAgICAgIDB4MDgKLSNkZWZpbmUgSVBCVUZMU1QgICAgICAgIDB4NDAKLQotc3RhdGljIGludAotaXVjdl9idXNfbWF0Y2ggKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGJ1c190eXBlIGl1Y3ZfYnVzID0gewotCS5uYW1lID0gIml1Y3YiLAotCS5tYXRjaCA9IGl1Y3ZfYnVzX21hdGNoLAotfTsKLQotc3RydWN0IGRldmljZSAqaXVjdl9yb290OwotCi0vKiBHZW5lcmFsIElVQ1YgaW50ZXJydXB0IHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCV9fdTE2IGlwcGF0aGlkOwotCV9fdTggIHJlczE7Ci0JX191OCAgaXB0eXBlOwotCV9fdTMyIHJlczI7Ci0JX191OCAgaXB2bWlkWzhdOwotCV9fdTggIHJlczNbMjRdOwotfSBpdWN2X0dlbmVyYWxJbnRlcnJ1cHQ7Ci0KLXN0YXRpYyBpdWN2X0dlbmVyYWxJbnRlcnJ1cHQgKml1Y3ZfZXh0ZXJuYWxfaW50X2J1ZmZlciA9IE5VTEw7Ci0KLS8qIFNwaW4gTG9jayBkZWNsYXJhdGlvbiAqLwotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGl1Y3ZfbG9jayk7Ci0KLXN0YXRpYyBpbnQgbWVzc2FnZXNEaXNhYmxlZCA9IDA7Ci0KLS8qKioqKioqKioqKioqKipJTlRFUlJVUFQgSEFORExJTkcgKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKLQlpdWN2X0dlbmVyYWxJbnRlcnJ1cHQgZGF0YTsKLX0gaXVjdl9pcnFkYXRhOwotCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAgaXVjdl9pcnFfcXVldWU7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGl1Y3ZfaXJxX3F1ZXVlX2xvY2spOwotCi0vKgotICpJbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gKi8KLXN0YXRpYyB2b2lkIGl1Y3ZfdGFza2xldF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcpOwotc3RhdGljIHZvaWQgaXVjdl9pcnFfaGFuZGxlcihfX3UxNik7Ci0KLXN0YXRpYyBERUNMQVJFX1RBU0tMRVQoaXVjdl90YXNrbGV0LGl1Y3ZfdGFza2xldF9oYW5kbGVyLDApOwotCi0vKioqKioqKioqKioqIEZVTkNUSU9OIElEJ1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBBQ0NFUFQgICAgICAgICAgMTAKLSNkZWZpbmUgQ09OTkVDVCAgICAgICAgIDExCi0jZGVmaW5lIERFQ0xBUkVfQlVGRkVSICAxMgotI2RlZmluZSBQVVJHRSAgICAgICAgICAgOQotI2RlZmluZSBRVUVSWSAgICAgICAgICAgMAotI2RlZmluZSBRVUlFU0NFICAgICAgICAgMTMKLSNkZWZpbmUgUkVDRUlWRSAgICAgICAgIDUKLSNkZWZpbmUgUkVKRUNUICAgICAgICAgIDgKLSNkZWZpbmUgUkVQTFkgICAgICAgICAgIDYKLSNkZWZpbmUgUkVTVU1FICAgICAgICAgIDE0Ci0jZGVmaW5lIFJFVFJJRVZFX0JVRkZFUiAyCi0jZGVmaW5lIFNFTkQgICAgICAgICAgICA0Ci0jZGVmaW5lIFNFVE1BU0sgICAgICAgICAxNgotI2RlZmluZSBTRVZFUiAgICAgICAgICAgMTUKLQotLyoqCi0gKiBTdHJ1Y3R1cmU6IGhhbmRsZXIKLSAqIG1lbWJlcnM6IGxpc3QgLSBsaXN0IG1hbmFnZW1lbnQuCi0gKiAgICAgICAgICBzdHJ1Y3R1cmU6IGlkCi0gKiAgICAgICAgICAgICB1c2VyaWQgLSA4IGNoYXIgYXJyYXkgb2YgbWFjaGluZSBpZGVudGlmaWNhdGlvbgotICogICAgICAgICAgICAgdXNlcl9kYXRhIC0gMTYgY2hhciBhcnJheSBmb3IgdXNlciBpZGVudGlmaWNhdGlvbgotICogICAgICAgICAgICAgbWFzayAtIDI0IGNoYXIgYXJyYXkgdXNlZCB0byBjb21wYXJlIHRoZSAyIHByZXZpb3VzCi0gKiAgICAgICAgICBpbnRlcnJ1cHRfdGFibGUgLSB2ZWN0b3Igb2YgaW50ZXJydXB0IGZ1bmN0aW9ucy4KLSAqICAgICAgICAgIHBnbV9kYXRhIC0gIHVsb25nLCBhcHBsaWNhdGlvbiBkYXRhIHRoYXQgaXMgcGFzc2VkCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgaW50ZXJydXB0IGhhbmRsZXJzCi0qLwotdHlwZWRlZiBzdHJ1Y3QgaGFuZGxlcl90IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IHsKLQkJX191OCB1c2VyaWRbOF07Ci0JCV9fdTggdXNlcl9kYXRhWzE2XTsKLQkJX191OCBtYXNrWzI0XTsKLQl9ICAgICAgICAgICAgICAgICAgICBpZDsKLQlpdWN2X2ludGVycnVwdF9vcHNfdCAqaW50ZXJydXB0X3RhYmxlOwotCXZvaWQgICAgICAgICAgICAgICAgICpwZ21fZGF0YTsKLX0gaGFuZGxlcjsKLQotLyoqCi0gKiBpdWN2X2hhbmRsZXJfdGFibGU6IExpc3Qgb2YgcmVnaXN0ZXJlZCBoYW5kbGVycy4KLSAqLwotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaXVjdl9oYW5kbGVyX3RhYmxlOwotCi0vKioKLSAqIGl1Y3ZfcGF0aGlkX3RhYmxlOiBhbiBhcnJheSBvZiAqaGFuZGxlciBwb2ludGluZyBpbnRvCi0gKiAgICAgICAgICAgICAgICAgICAgaXVjdl9oYW5kbGVyX3RhYmxlIGZvciBmYXN0IGluZGV4aW5nIGJ5IHBhdGhpZDsKLSAqLwotc3RhdGljIGhhbmRsZXIgKippdWN2X3BhdGhpZF90YWJsZTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4X2Nvbm5lY3Rpb25zOwotCi0vKioKLSAqIGl1Y3ZfY3B1aWQ6IGNvbnRhaW5zIHRoZSBsb2dpY2FsIGNwdSBudW1iZXIgb2YgdGhlIGNwdSB3aGljaAotICogaGFzIGRlY2xhcmVkIHRoZSBpdWN2IGJ1ZmZlciBieSBpc3N1aW5nIERFQ0xBUkVfQlVGRkVSLgotICogSWYgbm8gY3B1IGhhcyBkb25lIHRoZSBpbml0aWFsaXphdGlvbiBpdWN2X2NwdWlkIGNvbnRhaW5zIC0xLgotICovCi1zdGF0aWMgaW50IGl1Y3ZfY3B1aWQgPSAtMTsKLS8qKgotICogcmVnaXN0ZXJfZmxhZzogaXMgMCB3aGVuIGV4dGVybmFsIGludGVycnVwdCBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZAotICovCi1zdGF0aWMgaW50IHJlZ2lzdGVyX2ZsYWc7Ci0KLS8qKioqKioqKioqKioqKioqRklWRSA0MC1CWVRFIFBBUkFNRVRFUiBTVFJVQ1RVUkVTKioqKioqKioqKioqKioqKioqLwotLyogRGF0YSBzdHJ1Y3QgMTogaXBhcm1sX2NvbnRyb2wKLSAqIFVzZWQgZm9yIGl1Y3ZfYWNjZXB0Ci0gKiAgICAgICAgICBpdWN2X2Nvbm5lY3QKLSAqICAgICAgICAgIGl1Y3ZfcXVpZXNjZQotICogICAgICAgICAgaXVjdl9yZXN1bWUKLSAqICAgICAgICAgIGl1Y3Zfc2V2ZXIKLSAqICAgICAgICAgIGl1Y3ZfcmV0cmlldmVfYnVmZmVyCi0gKiBEYXRhIHN0cnVjdCAyOiBpcGFybWxfZHBsICAgICAoZGF0YSBpbiBwYXJhbWV0ZXIgbGlzdCkKLSAqIFVzZWQgZm9yIGl1Y3Zfc2VuZF9wcm1tc2cKLSAqICAgICAgICAgIGl1Y3Zfc2VuZDJ3YXlfcHJtbXNnCi0gKiAgICAgICAgICBpdWN2X3NlbmQyd2F5X3BybW1zZ19hcnJheQotICogICAgICAgICAgaXVjdl9yZXBseV9wcm1tc2cKLSAqIERhdGEgc3RydWN0IDM6IGlwYXJtbF9kYiAgICAgICAoZGF0YSBpbiBhIGJ1ZmZlcikKLSAqIFVzZWQgZm9yIGl1Y3ZfcmVjZWl2ZQotICogICAgICAgICAgaXVjdl9yZWNlaXZlX2FycmF5Ci0gKiAgICAgICAgICBpdWN2X3JlamVjdAotICogICAgICAgICAgaXVjdl9yZXBseQotICogICAgICAgICAgaXVjdl9yZXBseV9hcnJheQotICogICAgICAgICAgaXVjdl9zZW5kCi0gKiAgICAgICAgICBpdWN2X3NlbmRfYXJyYXkKLSAqICAgICAgICAgIGl1Y3Zfc2VuZDJ3YXkKLSAqICAgICAgICAgIGl1Y3Zfc2VuZDJ3YXlfYXJyYXkKLSAqICAgICAgICAgIGl1Y3ZfZGVjbGFyZV9idWZmZXIKLSAqIERhdGEgc3RydWN0IDQ6IGlwYXJtbF9wdXJnZQotICogVXNlZCBmb3IgaXVjdl9wdXJnZQotICogICAgICAgICAgaXVjdl9xdWVyeQotICogRGF0YSBzdHJ1Y3QgNTogaXBhcm1sX3NldF9tYXNrCi0gKiBVc2VkIGZvciBpdWN2X3NldF9tYXNrCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCV9fdTE2IGlwcGF0aGlkOwotCV9fdTggIGlwZmxhZ3MxOwotCV9fdTggIGlwcmNvZGU7Ci0JX191MTYgaXBtc2dsaW07Ci0JX191MTYgcmVzMTsKLQlfX3U4ICBpcHZtaWRbOF07Ci0JX191OCAgaXB1c2VyWzE2XTsKLQlfX3U4ICBpcHRhcmdldFs4XTsKLX0gaXBhcm1sX2NvbnRyb2w7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlfX3UxNiBpcHBhdGhpZDsKLQlfX3U4ICBpcGZsYWdzMTsKLQlfX3U4ICBpcHJjb2RlOwotCV9fdTMyIGlwbXNnaWQ7Ci0JX191MzIgaXB0cmdjbHM7Ci0JX191OCAgaXBybW1zZ1s4XTsKLQlfX3UzMiBpcHNyY2NsczsKLQlfX3UzMiBpcG1zZ3RhZzsKLQlfX3UzMiBpcGJmYWRyMjsKLQlfX3UzMiBpcGJmbG4yZjsKLQlfX3UzMiByZXM7Ci19IGlwYXJtbF9kcGw7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlfX3UxNiBpcHBhdGhpZDsKLQlfX3U4ICBpcGZsYWdzMTsKLQlfX3U4ICBpcHJjb2RlOwotCV9fdTMyIGlwbXNnaWQ7Ci0JX191MzIgaXB0cmdjbHM7Ci0JX191MzIgaXBiZmFkcjE7Ci0JX191MzIgaXBiZmxuMWY7Ci0JX191MzIgaXBzcmNjbHM7Ci0JX191MzIgaXBtc2d0YWc7Ci0JX191MzIgaXBiZmFkcjI7Ci0JX191MzIgaXBiZmxuMmY7Ci0JX191MzIgcmVzOwotfSBpcGFybWxfZGI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlfX3UxNiBpcHBhdGhpZDsKLQlfX3U4ICBpcGZsYWdzMTsKLQlfX3U4ICBpcHJjb2RlOwotCV9fdTMyIGlwbXNnaWQ7Ci0JX191OCAgaXBhdWRpdFszXTsKLQlfX3U4ICByZXMxWzVdOwotCV9fdTMyIHJlczI7Ci0JX191MzIgaXBzcmNjbHM7Ci0JX191MzIgaXBtc2d0YWc7Ci0JX191MzIgcmVzM1szXTsKLX0gaXBhcm1sX3B1cmdlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JX191OCAgaXBtYXNrOwotCV9fdTggIHJlczFbMl07Ci0JX191OCAgaXByY29kZTsKLQlfX3UzMiByZXMyWzldOwotfSBpcGFybWxfc2V0X21hc2s7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bmlvbiB7Ci0JCWlwYXJtbF9jb250cm9sICBwX2N0cmw7Ci0JCWlwYXJtbF9kcGwgICAgICBwX2RwbDsKLQkJaXBhcm1sX2RiICAgICAgIHBfZGI7Ci0JCWlwYXJtbF9wdXJnZSAgICBwX3B1cmdlOwotCQlpcGFybWxfc2V0X21hc2sgcF9zZXRfbWFzazsKLQl9IHBhcmFtOwotCWF0b21pY190IGluX3VzZTsKLQlfX3UzMiAgICByZXM7Ci19ICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpIGl1Y3ZfcGFyYW07Ci0jZGVmaW5lIFBBUkFNX1BPT0xfU0laRSAoUEFHRV9TSVpFIC8gc2l6ZW9mKGl1Y3ZfcGFyYW0pKQotCi1zdGF0aWMgaXVjdl9wYXJhbSAqIGl1Y3ZfcGFyYW1fcG9vbDsKLQotTU9EVUxFX0FVVEhPUigiKEMpIDIwMDEgSUJNIENvcnAuIGJ5IEZyaXR6IEVsZmVydCAoZmVsZmVydEBtaWxsZW51eC5jb20pIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkxpbnV4IGZvciBTLzM5MCBJVUNWIGxvd2xldmVsIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0vKgotICogRGVidWdnaW5nIHN0dWZmCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZkZWYgREVCVUcKLXN0YXRpYyBpbnQgZGVidWdsZXZlbCA9IDA7Ci0KLW1vZHVsZV9wYXJhbShkZWJ1Z2xldmVsLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z2xldmVsLAotICJTcGVjaWZpZXMgdGhlIGRlYnVnIGxldmVsICgwPW9mZiAuLi4gMz1hbGwpIik7Ci0KLXN0YXRpYyB2b2lkCi1pdWN2X2R1bXBpdChjaGFyICp0aXRsZSwgdm9pZCAqYnVmLCBpbnQgbGVuKQotewotCWludCBpOwotCV9fdTggKnAgPSAoX191OCAqKWJ1ZjsKLQotCWlmIChkZWJ1Z2xldmVsIDwgMykKLQkJcmV0dXJuOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCB0aXRsZSk7Ci0JcHJpbnRrKCIgICIpOwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlpZiAoIShpICUgMTYpICYmIGkgIT0gMCkKLQkJCXByaW50ayAoIlxuICAiKTsKLQkJZWxzZSBpZiAoIShpICUgNCkgJiYgaSAhPSAwKQotCQkJcHJpbnRrKCIgIik7Ci0JCXByaW50aygiJTAyWCIsICpwKyspOwotCX0KLQlpZiAobGVuICUgMTYpCi0JCXByaW50ayAoIlxuIik7Ci0JcmV0dXJuOwotfQotI2RlZmluZSBpdWN2X2RlYnVnKGx2bCwgZm10LCBhcmdzLi4uKSBcCi1kbyB7IFwKLQlpZiAoZGVidWdsZXZlbCA+PSBsdmwpIFwKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZtdCAiXG4iLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKTsgXAotfSB3aGlsZSAoMCkKLQotI2Vsc2UKLQotI2RlZmluZSBpdWN2X2RlYnVnKGx2bCwgZm10LCBhcmdzLi4uKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGl1Y3ZfZHVtcGl0KHRpdGxlLCBidWYsIGxlbikJZG8geyB9IHdoaWxlICgwKQotCi0jZW5kaWYKLQotLyoKLSAqIEludGVybmFsIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogcHJpbnQgc3RhcnQgYmFubmVyCi0gKi8KLXN0YXRpYyB2b2lkCi1pdWN2X2Jhbm5lcih2b2lkKQotewotCXByaW50ayhLRVJOX0lORk8gIklVQ1YgbG93bGV2ZWwgZHJpdmVyIGluaXRpYWxpemVkXG4iKTsKLX0KLQotLyoqCi0gKiBpdWN2X2luaXQgLSBJbml0aWFsaXphdGlvbgotICoKLSAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdmFyaW91cyBkYXRhIHN0cnVjdHVyZXMuCi0gKi8KLXN0YXRpYyBpbnQKLWl1Y3ZfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlpZiAoaXVjdl9leHRlcm5hbF9pbnRfYnVmZmVyKQotCQlyZXR1cm4gMDsKLQotCWlmICghTUFDSElORV9JU19WTSkgewotCQlwcmludGsoS0VSTl9FUlIgIklVQ1Y6IElVQ1YgY29ubmVjdGlvbiBuZWVkcyBWTSBhcyBiYXNlXG4iKTsKLQkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7Ci0JfQotCi0JcmV0ID0gYnVzX3JlZ2lzdGVyKCZpdWN2X2J1cyk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIklVQ1Y6IGZhaWxlZCB0byByZWdpc3RlciBidXMuXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpdWN2X3Jvb3QgPSBzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKCJpdWN2Iik7Ci0JaWYgKElTX0VSUihpdWN2X3Jvb3QpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSVVDVjogZmFpbGVkIHRvIHJlZ2lzdGVyIGl1Y3Ygcm9vdC5cbiIpOwotCQlidXNfdW5yZWdpc3RlcigmaXVjdl9idXMpOwotCQlyZXR1cm4gUFRSX0VSUihpdWN2X3Jvb3QpOwotCX0KLQotCS8qIE5vdGU6IEdGUF9ETUEgdXNlZCB1c2VkIHRvIGdldCBtZW1vcnkgYmVsb3cgMkcgKi8KLQlpdWN2X2V4dGVybmFsX2ludF9idWZmZXIgPSBremFsbG9jKHNpemVvZihpdWN2X0dlbmVyYWxJbnRlcnJ1cHQpLAotCQkJCQkgICBHRlBfS0VSTkVMfEdGUF9ETUEpOwotCWlmICghaXVjdl9leHRlcm5hbF9pbnRfYnVmZmVyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICIlczogQ291bGQgbm90IGFsbG9jYXRlIGV4dGVybmFsIGludGVycnVwdCBidWZmZXJcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18pOwotCQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoaXVjdl9yb290KTsKLQkJYnVzX3VucmVnaXN0ZXIoJml1Y3ZfYnVzKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXIgcG9vbCAqLwotCWl1Y3ZfcGFyYW1fcG9vbCA9IGt6YWxsb2Moc2l6ZW9mKGl1Y3ZfcGFyYW0pICogUEFSQU1fUE9PTF9TSVpFLAotCQkJCSAgR0ZQX0tFUk5FTHxHRlBfRE1BKTsKLQlpZiAoIWl1Y3ZfcGFyYW1fcG9vbCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIHBhcmFtIHBvb2xcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18pOwotCQlrZnJlZShpdWN2X2V4dGVybmFsX2ludF9idWZmZXIpOwotCQlpdWN2X2V4dGVybmFsX2ludF9idWZmZXIgPSBOVUxMOwotCQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoaXVjdl9yb290KTsKLQkJYnVzX3VucmVnaXN0ZXIoJml1Y3ZfYnVzKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBpcnEgcXVldWUgKi8KLQlJTklUX0xJU1RfSEVBRCgmaXVjdl9pcnFfcXVldWUpOwotCi0JLyogSW5pdGlhbGl6ZSBoYW5kbGVyIHRhYmxlICovCi0JSU5JVF9MSVNUX0hFQUQoJml1Y3ZfaGFuZGxlcl90YWJsZSk7Ci0KLQlpdWN2X2Jhbm5lcigpOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl1Y3ZfZXhpdCAtIERlLUluaXRpYWxpemF0aW9uCi0gKgotICogRnJlZXMgZXZlcnl0aGluZyBhbGxvY2F0ZWQgZnJvbSBpdWN2X2luaXQuCi0gKi8KLXN0YXRpYyBpbnQgaXVjdl9yZXRyaWV2ZV9idWZmZXIgKHZvaWQpOwotCi1zdGF0aWMgdm9pZAotaXVjdl9leGl0KHZvaWQpCi17Ci0JaXVjdl9yZXRyaWV2ZV9idWZmZXIoKTsKLQlrZnJlZShpdWN2X2V4dGVybmFsX2ludF9idWZmZXIpOwotCWl1Y3ZfZXh0ZXJuYWxfaW50X2J1ZmZlciA9IE5VTEw7Ci0Ja2ZyZWUoaXVjdl9wYXJhbV9wb29sKTsKLQlpdWN2X3BhcmFtX3Bvb2wgPSBOVUxMOwotCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihpdWN2X3Jvb3QpOwotCWJ1c191bnJlZ2lzdGVyKCZpdWN2X2J1cyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiSVVDViBsb3dsZXZlbCBkcml2ZXIgdW5sb2FkZWRcbiIpOwotfQotCi0vKioKLSAqIGdyYWJfcGFyYW06IC0gR2V0IGEgcGFyYW1ldGVyIGJ1ZmZlciBmcm9tIHRoZSBwcmUtYWxsb2NhdGVkIHBvb2wuCi0gKgotICogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYW4gdW51c2VkIGVsZW1lbnQgaW4gdGhlIHByZS1hbGxvY2F0ZWQgcG9vbAotICogb2YgcGFyYW1ldGVyIGJ1ZmZlcnMuIElmIG9uZSBpcyBmb3VuZCwgaXQgbWFya3MgaXQgImluIHVzZSIgYW5kIHJldHVybnMKLSAqIGEgcG9pbnRlciB0byBpdC4gVGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyBpdAotICogd2hlbiBpdCBoYXMgZmluaXNoZWQgaXRzIHVzYWdlLgotICoKLSAqIFJldHVybnM6IEEgcG9pbnRlciB0byBpdWN2X3BhcmFtLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyBpdWN2X3BhcmFtICoKLWdyYWJfcGFyYW0odm9pZCkKLXsKLQlpdWN2X3BhcmFtICpwdHI7Ci0gICAgICAgIHN0YXRpYyBpbnQgaGludCA9IDA7Ci0KLQlwdHIgPSBpdWN2X3BhcmFtX3Bvb2wgKyBoaW50OwotCWRvIHsKLQkJcHRyKys7Ci0JCWlmIChwdHIgPj0gaXVjdl9wYXJhbV9wb29sICsgUEFSQU1fUE9PTF9TSVpFKQotCQkJcHRyID0gaXVjdl9wYXJhbV9wb29sOwotCX0gd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZwdHItPmluX3VzZSwgMCwgMSkgIT0gMCk7Ci0JaGludCA9IHB0ciAtIGl1Y3ZfcGFyYW1fcG9vbDsKLQotCW1lbXNldCgmcHRyLT5wYXJhbSwgMCwgc2l6ZW9mKHB0ci0+cGFyYW0pKTsKLQlyZXR1cm4gcHRyOwotfQotCi0vKioKLSAqIHJlbGVhc2VfcGFyYW0gLSBSZWxlYXNlIGEgcGFyYW1ldGVyIGJ1ZmZlci4KLSAqIEBwOiBBIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgaXVjdl9wYXJhbSwgcHJldmlvdXNseSBvYnRhaW5lZCBieSBjYWxsaW5nCi0gKiAgICAgZ3JhYl9wYXJhbSgpLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gbWFya3MgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgYnVmZmVyICJ1bnVzZWQiLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1yZWxlYXNlX3BhcmFtKHZvaWQgKnApCi17Ci0JYXRvbWljX3NldCgmKChpdWN2X3BhcmFtICopcCktPmluX3VzZSwgMCk7Ci19Ci0KLS8qKgotICogaXVjdl9hZGRfaGFuZGxlcjogLSBBZGQgYSBuZXcgaGFuZGxlcgotICogQG5ld19oYW5kbGVyOiBoYW5kbGUgdGhhdCBpcyBiZWluZyBlbnRlcmVkIGludG8gY2hhaW4uCi0gKgotICogUGxhY2VzIG5ldyBoYW5kbGUgb24gaXVjdl9oYW5kbGVyX3RhYmxlLCBpZiBpZGVudGljYWwgaGFuZGxlciBpcyBub3QKLSAqIGZvdW5kLgotICoKLSAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgITAgb24gZmFpbHVyZSAoaGFuZGxlciBhbHJlYWR5IGluIGNoYWluKS4KLSAqLwotc3RhdGljIGludAotaXVjdl9hZGRfaGFuZGxlciAoaGFuZGxlciAqbmV3KQotewotCXVsb25nIGZsYWdzOwotCi0JaXVjdl9kZWJ1ZygxLCAiZW50ZXJpbmciKTsKLQlpdWN2X2R1bXBpdCgiaGFuZGxlcjoiLCBuZXcsIHNpemVvZihoYW5kbGVyKSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmaXVjdl9oYW5kbGVyX3RhYmxlKSkgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaDsKLQotCQkvKioKLQkJICogU2VhcmNoIGxpc3QgZm9yIGhhbmRsZXIgd2l0aCBpZGVudGljYWwgaWQuIElmIG9uZQotCQkgKiBpcyBmb3VuZCwgdGhlIG5ldyBoYW5kbGVyIGlzIF9ub3RfIGFkZGVkLgotCQkgKi8KLQkJbGlzdF9mb3JfZWFjaChsaCwgJml1Y3ZfaGFuZGxlcl90YWJsZSkgewotCQkJaGFuZGxlciAqaCA9IGxpc3RfZW50cnkobGgsIGhhbmRsZXIsIGxpc3QpOwotCQkJaWYgKCFtZW1jbXAoJm5ldy0+aWQsICZoLT5pZCwgc2l6ZW9mKGgtPmlkKSkpIHsKLQkJCQlpdWN2X2RlYnVnKDEsICJyZXQgMSIpOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBJZiB3ZSBnZXQgaGVyZSwgbm8gaGFuZGxlciB3YXMgZm91bmQuCi0JICovCi0JSU5JVF9MSVNUX0hFQUQoJm5ldy0+bGlzdCk7Ci0JbGlzdF9hZGQoJm5ldy0+bGlzdCwgJml1Y3ZfaGFuZGxlcl90YWJsZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCi0JaXVjdl9kZWJ1ZygxLCAiZXhpdGluZyIpOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGIyZjA6Ci0gKiBAY29kZTogaWRlbnRpZmllciBvZiBJVUNWIGNhbGwgdG8gQ1AuCi0gKiBAcGFybTogcG9pbnRlciB0byA0MCBieXRlIGlwYXJtbCBhcmVhIHBhc3NlZCB0byBDUAotICoKLSAqIENhbGxzIENQIHRvIGV4ZWN1dGUgSVVDViBjb21tYW5kcy4KLSAqCi0gKiBSZXR1cm5zOiByZXR1cm4gY29kZSBmcm9tIENQJ3MgSVVDViBjYWxsCi0gKi8KLXN0YXRpYyBpbmxpbmUgdWxvbmcgYjJmMChfX3UzMiBjb2RlLCB2b2lkICpwYXJtKQotewotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMCBhc20gKCIwIik7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWcxIGFzbSAoIjEiKTsKLQlpdWN2X2R1bXBpdCgiaXBhcm1sIGJlZm9yZSBiMmYwIGNhbGw6IiwgcGFybSwgc2l6ZW9mKGl1Y3ZfcGFyYW0pKTsKLQotCXJlZzAgPSBjb2RlOwotCXJlZzEgPSB2aXJ0X3RvX3BoeXMocGFybSk7Ci0JYXNtIHZvbGF0aWxlKCIubG9uZyAweGIyZjAxMDAwIiA6IDogImQiIChyZWcwKSwgImEiIChyZWcxKSk7Ci0KLQlpdWN2X2R1bXBpdCgiaXBhcm1sIGFmdGVyIGIyZjAgY2FsbDoiLCBwYXJtLCBzaXplb2YoaXVjdl9wYXJhbSkpOwotCi0JcmV0dXJuICh1bnNpZ25lZCBsb25nKSooKF9fdTggKikocGFybSArIDMpKTsKLX0KLQotLyoKLSAqIE5hbWU6IGl1Y3ZfYWRkX3BhdGhpZAotICogUHVycG9zZTogQWRkcyBhIHBhdGggaWQgdG8gdGhlIHN5c3RlbS4KLSAqIElucHV0OiBwYXRoaWQgLSAgcGF0aGlkIHRoYXQgaXMgZ29pbmcgdG8gYmUgZW50ZXJlZCBpbnRvIHN5c3RlbQotICogICAgICAgIGhhbmRsZSAtICBhZGRyZXNzIG9mIGhhbmRsZXIgdGhhdCB0aGUgcGF0aGlkIHdpbGwgYmUgYXNzb2NpYXRlZAotICoJCSAgIHdpdGguCi0gKiAgICAgICAgcGdtX2RhdGEgLSB0b2tlbiBwYXNzZWQgaW4gYnkgYXBwbGljYXRpb24uCi0gKiBPdXRwdXQ6IDA6IHN1Y2Nlc3NmdWwgYWRkaXRpb24gb2YgcGF0aGlkCi0gKgkgICAtIEVJTlZBTCAtIHBhdGhpZCBlbnRyeSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgYXBwbGljYXRpb24KLSAqCSAgIC0gRU5PTUVNIC0gc3RvcmFnZSBhbGxvY2F0aW9uIGZvciBhIG5ldyBwYXRoaWQgdGFibGUgZmFpbGVkCi0qLwotc3RhdGljIGludAotX19pdWN2X2FkZF9wYXRoaWQoX191MTYgcGF0aGlkLCBoYW5kbGVyICpoYW5kbGVyKQotewotCi0JaXVjdl9kZWJ1ZygxLCAiZW50ZXJpbmciKTsKLQotCWl1Y3ZfZGVidWcoMSwgImhhbmRsZXIgaXMgcG9pbnRpbmcgdG8gJXAiLCBoYW5kbGVyKTsKLQotCWlmIChwYXRoaWQgPiAobWF4X2Nvbm5lY3Rpb25zIC0gMSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGl1Y3ZfcGF0aGlkX3RhYmxlW3BhdGhpZF0pIHsKLQkJaXVjdl9kZWJ1ZygxLCAicGF0aGlkIGVudHJ5IGlzICVwIiwgaXVjdl9wYXRoaWRfdGFibGVbcGF0aGlkXSk7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICIlczogUGF0aGlkIGJlaW5nIHVzZWQsIGVycm9yLlxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWl1Y3ZfcGF0aGlkX3RhYmxlW3BhdGhpZF0gPSBoYW5kbGVyOwotCi0JaXVjdl9kZWJ1ZygxLCAiZXhpdGluZyIpOwotCXJldHVybiAwOwotfQkJCQkvKiBlbmQgb2YgYWRkX3BhdGhpZCBmdW5jdGlvbiAqLwotCi1zdGF0aWMgaW50Ci1pdWN2X2FkZF9wYXRoaWQoX191MTYgcGF0aGlkLCBoYW5kbGVyICpoYW5kbGVyKQotewotCXVsb25nIGZsYWdzOwotCWludCByYzsKLQotCXNwaW5fbG9ja19pcnFzYXZlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0JcmMgPSBfX2l1Y3ZfYWRkX3BhdGhpZChwYXRoaWQsIGhhbmRsZXIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pdWN2X3JlbW92ZV9wYXRoaWQoX191MTYgcGF0aGlkKQotewotCXVsb25nIGZsYWdzOwotCi0JaWYgKHBhdGhpZCA+IChtYXhfY29ubmVjdGlvbnMgLSAxKSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQlpdWN2X3BhdGhpZF90YWJsZVtwYXRoaWRdID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qKgotICogaXVjdl9kZWNsYXJlX2J1ZmZlcl9jcHVpZAotICogUmVnaXN0ZXIgYXQgVk0gZm9yIHN1YnNlcXVlbnQgSVVDViBvcGVyYXRpb25zLiBUaGlzIGlzIGV4ZWN1dGVkCi0gKiBvbiB0aGUgcmVzZXJ2ZWQgQ1BVIGl1Y3ZfY3B1aWQuIENhbGxlZCBmcm9tIGl1Y3ZfZGVjbGFyZV9idWZmZXIoKS4KLSAqLwotc3RhdGljIHZvaWQKLWl1Y3ZfZGVjbGFyZV9idWZmZXJfY3B1aWQgKHZvaWQgKnJlc3VsdCkKLXsKLQlpcGFybWxfZGIgKnBhcm07Ci0KLQlwYXJtID0gKGlwYXJtbF9kYiAqKWdyYWJfcGFyYW0oKTsKLQlwYXJtLT5pcGJmYWRyMSA9IHZpcnRfdG9fcGh5cyhpdWN2X2V4dGVybmFsX2ludF9idWZmZXIpOwotCWlmICgoKigodWxvbmcgKilyZXN1bHQpID0gYjJmMChERUNMQVJFX0JVRkZFUiwgcGFybSkpID09IDEpCi0JCSooKHVsb25nICopcmVzdWx0KSA9IHBhcm0tPmlwcmNvZGU7Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLX0KLQotLyoqCi0gKiBpdWN2X3JldHJpZXZlX2J1ZmZlcl9jcHVpZDoKLSAqIFVucmVnaXN0ZXIgSVVDViB1c2FnZSBhdCBWTS4gVGhpcyBpcyBhbHdheXMgZXhlY3V0ZWQgb24gdGhlIHNhbWUKLSAqIGNwdSB0aGF0IHJlZ2lzdGVyZWQgdGhlIGJ1ZmZlciB0byBWTS4KLSAqIENhbGxlZCBmcm9tIGl1Y3ZfcmV0cmlldmVfYnVmZmVyKCkuCi0gKi8KLXN0YXRpYyB2b2lkCi1pdWN2X3JldHJpZXZlX2J1ZmZlcl9jcHVpZCAodm9pZCAqY3B1KQotewotCWlwYXJtbF9jb250cm9sICpwYXJtOwotCi0JcGFybSA9IChpcGFybWxfY29udHJvbCAqKWdyYWJfcGFyYW0oKTsKLQliMmYwKFJFVFJJRVZFX0JVRkZFUiwgcGFybSk7Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLX0KLQotLyoqCi0gKiBOYW1lOiBpdWN2X2RlY2xhcmVfYnVmZmVyCi0gKiBQdXJwb3NlOiBTcGVjaWZpZXMgdGhlIGd1ZXN0cyByZWFsIGFkZHJlc3Mgb2YgYW4gZXh0ZXJuYWwKLSAqICAgICAgICAgIGludGVycnVwdC4KLSAqIElucHV0OiB2b2lkCi0gKiBPdXRwdXQ6IGlwcmNvZGUgLSByZXR1cm4gY29kZSBmcm9tIGIyZjAgY2FsbAotICovCi1zdGF0aWMgaW50Ci1pdWN2X2RlY2xhcmVfYnVmZmVyICh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWxvbmcgYjJmMF9yZXN1bHQ7Ci0KLQlpdWN2X2RlYnVnKDEsICJlbnRlcmluZyIpOwotCWIyZjBfcmVzdWx0ID0gLUVOT0RFVjsKLQlzcGluX2xvY2tfaXJxc2F2ZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCWlmIChpdWN2X2NwdWlkID09IC0xKSB7Ci0JCS8qIFJlc2VydmUgYW55IGNwdSBmb3IgdXNlIGJ5IGl1Y3YuICovCi0JCWl1Y3ZfY3B1aWQgPSBzbXBfZ2V0X2NwdShDUFVfTUFTS19BTEwpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0JCXNtcF9jYWxsX2Z1bmN0aW9uX29uKGl1Y3ZfZGVjbGFyZV9idWZmZXJfY3B1aWQsCi0JCQkmYjJmMF9yZXN1bHQsIDAsIDEsIGl1Y3ZfY3B1aWQpOwotCQlpZiAoYjJmMF9yZXN1bHQpIHsKLQkJCXNtcF9wdXRfY3B1KGl1Y3ZfY3B1aWQpOwotCQkJaXVjdl9jcHVpZCA9IC0xOwotCQl9Ci0JCWl1Y3ZfZGVidWcoMSwgIkFkZHJlc3Mgb2YgRUlCID0gJXAiLCBpdWN2X2V4dGVybmFsX2ludF9idWZmZXIpOwotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQkJYjJmMF9yZXN1bHQgPSAwOwotCX0KLQlpdWN2X2RlYnVnKDEsICJleGl0aW5nIik7Ci0JcmV0dXJuIGIyZjBfcmVzdWx0OwotfQotCi0vKioKLSAqIGl1Y3ZfcmV0cmlldmVfYnVmZmVyOgotICoKLSAqIFRlcm1pbmF0ZXMgYWxsIHVzZSBvZiBJVUNWLgotICogUmV0dXJuczogcmV0dXJuIGNvZGUgZnJvbSBDUAotICovCi1zdGF0aWMgaW50Ci1pdWN2X3JldHJpZXZlX2J1ZmZlciAodm9pZCkKLXsKLQlpdWN2X2RlYnVnKDEsICJlbnRlcmluZyIpOwotCWlmIChpdWN2X2NwdWlkICE9IC0xKSB7Ci0JCXNtcF9jYWxsX2Z1bmN0aW9uX29uKGl1Y3ZfcmV0cmlldmVfYnVmZmVyX2NwdWlkLAotCQkJCSAgICAgTlVMTCwgMCwgMSwgaXVjdl9jcHVpZCk7Ci0JCS8qIFJlbGVhc2UgdGhlIGNwdSByZXNlcnZlZCBieSBpdWN2X2RlY2xhcmVfYnVmZmVyLiAqLwotCQlzbXBfcHV0X2NwdShpdWN2X2NwdWlkKTsKLQkJaXVjdl9jcHVpZCA9IC0xOwotCX0KLQlpdWN2X2RlYnVnKDEsICJleGl0aW5nIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXVjdl9yZW1vdmVfaGFuZGxlcjoKLSAqIEB1c2Vyc19oYW5kbGVyOiBoYW5kbGVyIHRvIGJlIHJlbW92ZWQKLSAqCi0gKiBSZW1vdmUgaGFuZGxlciB3aGVuIGFwcGxpY2F0aW9uIHVucmVnaXN0ZXJzLgotICovCi1zdGF0aWMgdm9pZAotaXVjdl9yZW1vdmVfaGFuZGxlcihoYW5kbGVyICpoYW5kbGVyKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoKCFpdWN2X3BhdGhpZF90YWJsZSkgfHwgKCFoYW5kbGVyKSkKLQkJcmV0dXJuOwotCi0JaXVjdl9kZWJ1ZygxLCAiZW50ZXJpbmciKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0JbGlzdF9kZWwoJmhhbmRsZXItPmxpc3QpOwotCWlmIChsaXN0X2VtcHR5KCZpdWN2X2hhbmRsZXJfdGFibGUpKSB7Ci0JCWlmIChyZWdpc3Rlcl9mbGFnKSB7Ci0JCQl1bnJlZ2lzdGVyX2V4dGVybmFsX2ludGVycnVwdCgweDQwMDAsIGl1Y3ZfaXJxX2hhbmRsZXIpOwotCQkJcmVnaXN0ZXJfZmxhZyA9IDA7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCi0JaXVjdl9kZWJ1ZygxLCAiZXhpdGluZyIpOwotCXJldHVybjsKLX0KLQotLyoqCi0gKiBpdWN2X3JlZ2lzdGVyX3Byb2dyYW06Ci0gKiBAcGdtbmFtZTogIHVzZXIgaWRlbnRpZmljYXRpb24KLSAqIEB1c2VyaWQ6ICAgbWFjaGluZSBpZGVudGlmaWNhdGlvbgotICogQHBnbW1hc2s6ICBJbmRpY2F0ZXMgd2hpY2ggYml0cyBpbiB0aGUgcGdtbmFtZSBhbmQgdXNlcmlkIGNvbWJpbmVkIHdpbGwgYmUKLSAqICAgICAgICAgICAgdXNlZCB0byBkZXRlcm1pbmUgd2hvIGlzIGdpdmVuIGNvbnRyb2wuCi0gKiBAb3BzOiAgICAgIEFkZHJlc3Mgb2YgaW50ZXJydXB0IGhhbmRsZXIgdGFibGUuCi0gKiBAcGdtX2RhdGE6IEFwcGxpY2F0aW9uIGRhdGEgdG8gYmUgcGFzc2VkIHRvIGludGVycnVwdCBoYW5kbGVycy4KLSAqCi0gKiBSZWdpc3RlcnMgYW4gYXBwbGljYXRpb24gd2l0aCBJVUNWLgotICogUmV0dXJuczoKLSAqICAgICAgICAgICBUaGUgYWRkcmVzcyBvZiBoYW5kbGVyLCBvciBOVUxMIG9uIGZhaWx1cmUuCi0gKiBOT1RFIG9uIHBnbW1hc2s6Ci0gKiAgIElmIHBnbW5hbWUsIHVzZXJpZCBhbmQgcGdtbWFzayBhcmUgcHJvdmlkZWQsIHBnbW1hc2sgaXMgZW50ZXJlZCBpbnRvIHRoZQotICogICBoYW5kbGVyIGFzIGlzLgotICogICBJZiBwZ21tYXNrIGlzIE5VTEwsIHRoZSBpbnRlcm5hbCBtYXNrIGlzIHNldCB0byBhbGwgMHhmZidzCi0gKiAgIFdoZW4gdXNlcmlkIGlzIE5VTEwsIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSBpbnRlcm5hbCBtYXNrIGFyZSBmb3JjZWQKLSAqICAgdG8gMHgwMC4KLSAqICAgSWYgcGdtbWFzayBhbmQgdXNlcmlkIGFyZSBOVUxMLCB0aGUgZmlyc3QgOCBieXRlcyBvZiB0aGUgaW50ZXJuYWwgbWFzawotICogICBhcmUgZm9yY2VkIHRvIDB4MDAgYW5kIHRoZSBsYXN0IDE2IGJ5dGVzIHRvIDB4ZmYuCi0gKi8KLQotaXVjdl9oYW5kbGVfdAotaXVjdl9yZWdpc3Rlcl9wcm9ncmFtIChfX3U4IHBnbW5hbWVbMTZdLAotCQkgICAgICAgX191OCB1c2VyaWRbOF0sCi0JCSAgICAgICBfX3U4IHBnbW1hc2tbMjRdLAotCQkgICAgICAgaXVjdl9pbnRlcnJ1cHRfb3BzX3QgKiBvcHMsIHZvaWQgKnBnbV9kYXRhKQotewotCXVsb25nIHJjID0gMDsJCS8qIHJldHVybiBjb2RlIGZyb20gZnVuY3Rpb24gY2FsbHMgKi8KLQloYW5kbGVyICpuZXdfaGFuZGxlcjsKLQotCWl1Y3ZfZGVidWcoMSwgImVudGVyaW5nIik7Ci0KLQlpZiAob3BzID09IE5VTEwpIHsKLQkJLyogaW50ZXJydXB0IHRhYmxlIGlzIG5vdCBkZWZpbmVkICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnRlcnJ1cHQgdGFibGUgaXMgbm90IGRlZmluZWQsICIKLQkJICAgICAgICJleGl0aW5nXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFwZ21uYW1lKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBwZ21uYW1lIG5vdCBwcm92aWRlZFxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogQWxsb2NhdGUgaGFuZGxlciBlbnRyeSAqLwotCW5ld19oYW5kbGVyID0ga21hbGxvYyhzaXplb2YoaGFuZGxlciksIEdGUF9BVE9NSUMpOwotCWlmIChuZXdfaGFuZGxlciA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzdG9yYWdlIGFsbG9jYXRpb24gZm9yIG5ldyBoYW5kbGVyICIKLQkJICAgICAgICJmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoIWl1Y3ZfcGF0aGlkX3RhYmxlKSB7Ci0JCWlmIChpdWN2X2luaXQoKSkgewotCQkJa2ZyZWUobmV3X2hhbmRsZXIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQltYXhfY29ubmVjdGlvbnMgPSBpdWN2X3F1ZXJ5X21heGNvbm4oKTsKLQkJaXVjdl9wYXRoaWRfdGFibGUgPSBrY2FsbG9jKG1heF9jb25uZWN0aW9ucywgc2l6ZW9mKGhhbmRsZXIgKiksCi0JCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoaXVjdl9wYXRoaWRfdGFibGUgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGl1Y3ZfcGF0aGlkX3RhYmxlIHN0b3JhZ2UgIgotCQkJICAgICAgICJhbGxvY2F0aW9uIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCWtmcmVlKG5ld19oYW5kbGVyKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCW1lbXNldChuZXdfaGFuZGxlciwgMCwgc2l6ZW9mIChoYW5kbGVyKSk7Ci0JbWVtY3B5KG5ld19oYW5kbGVyLT5pZC51c2VyX2RhdGEsIHBnbW5hbWUsCi0JCXNpemVvZiAobmV3X2hhbmRsZXItPmlkLnVzZXJfZGF0YSkpOwotCWlmICh1c2VyaWQpIHsKLQkJbWVtY3B5IChuZXdfaGFuZGxlci0+aWQudXNlcmlkLCB1c2VyaWQsCi0JCQlzaXplb2YgKG5ld19oYW5kbGVyLT5pZC51c2VyaWQpKTsKLQkJQVNDRUJDIChuZXdfaGFuZGxlci0+aWQudXNlcmlkLAotCQkJc2l6ZW9mIChuZXdfaGFuZGxlci0+aWQudXNlcmlkKSk7Ci0JCUVCQ19UT1VQUEVSIChuZXdfaGFuZGxlci0+aWQudXNlcmlkLAotCQkJICAgICBzaXplb2YgKG5ld19oYW5kbGVyLT5pZC51c2VyaWQpKTsKLQotCQlpZiAocGdtbWFzaykgewotCQkJbWVtY3B5IChuZXdfaGFuZGxlci0+aWQubWFzaywgcGdtbWFzaywKLQkJCQlzaXplb2YgKG5ld19oYW5kbGVyLT5pZC5tYXNrKSk7Ci0JCX0gZWxzZSB7Ci0JCQltZW1zZXQgKG5ld19oYW5kbGVyLT5pZC5tYXNrLCAweEZGLAotCQkJCXNpemVvZiAobmV3X2hhbmRsZXItPmlkLm1hc2spKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChwZ21tYXNrKSB7Ci0JCQltZW1jcHkgKG5ld19oYW5kbGVyLT5pZC5tYXNrLCBwZ21tYXNrLAotCQkJCXNpemVvZiAobmV3X2hhbmRsZXItPmlkLm1hc2spKTsKLQkJfSBlbHNlIHsKLQkJCW1lbXNldCAobmV3X2hhbmRsZXItPmlkLm1hc2ssIDB4RkYsCi0JCQkJc2l6ZW9mIChuZXdfaGFuZGxlci0+aWQubWFzaykpOwotCQl9Ci0JCW1lbXNldCAobmV3X2hhbmRsZXItPmlkLnVzZXJpZCwgMHgwMCwKLQkJCXNpemVvZiAobmV3X2hhbmRsZXItPmlkLnVzZXJpZCkpOwotCX0KLQkvKiBmaWxsIGluIHRoZSByZXN0IG9mIGhhbmRsZXIgKi8KLQluZXdfaGFuZGxlci0+cGdtX2RhdGEgPSBwZ21fZGF0YTsKLQluZXdfaGFuZGxlci0+aW50ZXJydXB0X3RhYmxlID0gb3BzOwotCi0JLyoKLQkgKiBDaGVjayBpZiBzb21lb25lIGVsc2UgaXMgcmVnaXN0ZXJlZCB3aXRoIHNhbWUgcGdtbmFtZSwgdXNlcmlkCi0JICogYW5kIG1hc2suIElmIHNvbWVvbmUgaXMgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggc2FtZSBwZ21uYW1lLAotCSAqIHVzZXJpZCBhbmQgbWFzaywgcmVnaXN0cmF0aW9uIHdpbGwgZmFpbCBhbmQgTlVMTCB3aWxsIGJlIHJldHVybmVkCi0JICogdG8gdGhlIGFwcGxpY2F0aW9uLgotCSAqIElmIGlkZW50aWNhbCBoYW5kbGVyIG5vdCBmb3VuZCwgdGhlbiBoYW5kbGVyIGlzIGFkZGVkIHRvIGxpc3QuCi0JICovCi0JcmMgPSBpdWN2X2FkZF9oYW5kbGVyKG5ld19oYW5kbGVyKTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNvbWVvbmUgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggc2FtZSAiCi0JCSAgICAgICAicGdtbmFtZSwgdXNlcmlkLCBwZ21tYXNrXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlrZnJlZSAobmV3X2hhbmRsZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyYyA9IGl1Y3ZfZGVjbGFyZV9idWZmZXIoKTsKLQlpZiAocmMpIHsKLQkJY2hhciAqZXJyID0gIlVua25vd24iOwotCQlpdWN2X3JlbW92ZV9oYW5kbGVyKG5ld19oYW5kbGVyKTsKLQkJa2ZyZWUobmV3X2hhbmRsZXIpOwotCQlzd2l0Y2gocmMpIHsKLQkJY2FzZSAweDAzOgotCQkJZXJyID0gIkRpcmVjdG9yeSBlcnJvciI7Ci0JCQlicmVhazsKLQkJY2FzZSAweDBhOgotCQkJZXJyID0gIkludmFsaWQgbGVuZ3RoIjsKLQkJCWJyZWFrOwotCQljYXNlIDB4MTM6Ci0JCQllcnIgPSAiQnVmZmVyIGFscmVhZHkgZXhpc3RzIjsKLQkJCWJyZWFrOwotCQljYXNlIDB4M2U6Ci0JCQllcnIgPSAiQnVmZmVyIG92ZXJsYXAiOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHg1YzoKLQkJCWVyciA9ICJQYWdpbmcgb3Igc3RvcmFnZSBlcnJvciI7Ci0JCQlicmVhazsKLQkJfQotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaXVjdl9kZWNsYXJlX2J1ZmZlciAiCi0JCSAgICAgICAicmV0dXJuZWQgZXJyb3IgMHglMDJseCAoJXMpXG4iLCBfX0ZVTkNUSU9OX18sIHJjLCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFyZWdpc3Rlcl9mbGFnKSB7Ci0JCS8qIHJlcXVlc3QgdGhlIDB4NDAwMCBleHRlcm5hbCBpbnRlcnJ1cHQgKi8KLQkJcmMgPSByZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQgKDB4NDAwMCwgaXVjdl9pcnFfaGFuZGxlcik7Ci0JCWlmIChyYykgewotCQkJaXVjdl9yZW1vdmVfaGFuZGxlcihuZXdfaGFuZGxlcik7Ci0JCQlrZnJlZSAobmV3X2hhbmRsZXIpOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICIKLQkJCSAgICAgICAicmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0IHJldHVybmVkICVsZFxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHJjKTsKLQkJCXJldHVybiBOVUxMOwotCi0JCX0KLQkJcmVnaXN0ZXJfZmxhZyA9IDE7Ci0JfQotCWl1Y3ZfZGVidWcoMSwgImV4aXRpbmciKTsKLQlyZXR1cm4gbmV3X2hhbmRsZXI7Ci19CQkJCS8qIGVuZCBvZiByZWdpc3RlciBmdW5jdGlvbiAqLwotCi0vKioKLSAqIGl1Y3ZfdW5yZWdpc3Rlcl9wcm9ncmFtOgotICogQGhhbmRsZTogYWRkcmVzcyBvZiBoYW5kbGVyCi0gKgotICogVW5yZWdpc3RlciBhcHBsaWNhdGlvbiB3aXRoIElVQ1YuCi0gKiBSZXR1cm5zOgotICogICAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwsIGlmIHNwZWNpZmllZCBoYW5kbGUgaXMgaW52YWxpZC4KLSAqLwotCi1pbnQKLWl1Y3ZfdW5yZWdpc3Rlcl9wcm9ncmFtIChpdWN2X2hhbmRsZV90IGhhbmRsZSkKLXsKLQloYW5kbGVyICpoID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaDsKLQlpbnQgaTsKLQl1bG9uZyBmbGFnczsKLQotCWl1Y3ZfZGVidWcoMSwgImVudGVyaW5nIik7Ci0JaXVjdl9kZWJ1ZygxLCAiYWRkcmVzcyBvZiBoYW5kbGVyIGlzICVwIiwgaCk7Ci0KLQkvKiBDaGVja2luZyBpZiBoYW5kbGUgaXMgdmFsaWQgICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoKGxoLCAmaXVjdl9oYW5kbGVyX3RhYmxlKSB7Ci0JCWlmICgoaGFuZGxlciAqKWhhbmRsZSA9PSBsaXN0X2VudHJ5KGxoLCBoYW5kbGVyLCBsaXN0KSkgewotCQkJaCA9IChoYW5kbGVyICopaGFuZGxlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKCFoKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQkJaWYgKGhhbmRsZSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiJXM6IEhhbmRsZXIgbm90IGZvdW5kIGluIGl1Y3ZfaGFuZGxlcl90YWJsZS5cbiIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fKTsKLQkJZWxzZQotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICIlczogTlVMTCBoYW5kbGUgcGFzc2VkIGJ5IGFwcGxpY2F0aW9uLlxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKioKLQkgKiBGaXJzdCwgd2FsayB0aHJ1IGl1Y3ZfcGF0aGlkX3RhYmxlIGFuZCBzZXZlciBhbnkgcGF0aGlkIHdoaWNoIGlzCi0JICogc3RpbGwgcG9pbnRpbmcgdG8gdGhlIGhhbmRsZXIgdG8gYmUgcmVtb3ZlZC4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbWF4X2Nvbm5lY3Rpb25zOyBpKyspCi0JCWlmIChpdWN2X3BhdGhpZF90YWJsZVtpXSA9PSBoKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0JCQlpdWN2X3NldmVyKGksIGgtPmlkLnVzZXJfZGF0YSk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXVjdl9sb2NrLCBmbGFncyk7Ci0JCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0KLQlpdWN2X3JlbW92ZV9oYW5kbGVyKGgpOwotCWtmcmVlKGgpOwotCi0JaXVjdl9kZWJ1ZygxLCAiZXhpdGluZyIpOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl1Y3ZfYWNjZXB0OgotICogQHBhdGhpZDogICAgICAgICAgICAgUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqIEBtc2dsaW1fcmVxc3RkOiAgICAgIFRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgbWVzc2FnZXMgcmVxdWVzdGVkLgotICogQHVzZXJfZGF0YTogICAgICAgICAgRGF0YSBzcGVjaWZpZWQgYnkgdGhlIGl1Y3ZfY29ubmVjdCBmdW5jdGlvbi4KLSAqIEBmbGFnczE6ICAgICAgICAgICAgIENvbnRhaW5zIG9wdGlvbnMgZm9yIHRoaXMgcGF0aC4KLSAqICAgICAtIElQUFJUWSAoMHgyMCkgICBTcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlLgotICogICAgIC0gSVBSTURBVEEgKDB4ODApIFNwZWNpZmllcyB3aGV0aGVyIHlvdXIgcHJvZ3JhbSBjYW4gaGFuZGxlIGEgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwYXJhbWV0ZXIgbGlzdC4KLSAqICAgICAtIElQUVVTQ0UgKDB4NDApICBTcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0byBxdWllc2NlIHRoZSBwYXRoIGJlaW5nCi0gKgkJICAgICAgICAgZXN0YWJsaXNoZWQuCi0gKiBAaGFuZGxlOiAgICAgICAgICAgICBBZGRyZXNzIG9mIGhhbmRsZXIuCi0gKiBAcGdtX2RhdGE6ICAgICAgICAgICBBcHBsaWNhdGlvbiBkYXRhIHBhc3NlZCB0byBpbnRlcnJ1cHQgaGFuZGxlcnMuCi0gKiBAZmxhZ3MxX291dDogICAgICAgICBQb2ludGVyIHRvIGFuIGludC4gSWYgbm90IE5VTEwsIG9uIHJldHVybiB0aGUgb3B0aW9ucyBmb3IKLSAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYXRoIGFyZSBzdG9yZWQgYXQgdGhlIGdpdmVuIGxvY2F0aW9uOgotICogICAgIC0gSVBQUlRZICgweDIwKSAgSW5kaWNhdGVzIHlvdSBtYXkgc2VuZCBhIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiBAbXNnbGltOiAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIF9fdTE2LiBJZiBub3QgTlVMTCwgb24gcmV0dXJuIHRoZSBtYXhpbXVtCi0gKiAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgbWVzc2FnZXMgaXMgc3RvcmVkIGF0IHRoZSBnaXZlbgotICogICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpc3N1ZWQgYWZ0ZXIgdGhlIHVzZXIgcmVjZWl2ZXMgYSBDb25uZWN0aW9uIFBlbmRpbmcgZXh0ZXJuYWwKLSAqIGludGVycnVwdCBhbmQgbm93IHdpc2hlcyB0byBjb21wbGV0ZSB0aGUgSVVDViBjb21tdW5pY2F0aW9uIHBhdGguCi0gKiBSZXR1cm5zOgotICogICByZXR1cm4gY29kZSBmcm9tIENQCi0gKi8KLWludAotaXVjdl9hY2NlcHQoX191MTYgcGF0aGlkLCBfX3UxNiBtc2dsaW1fcmVxc3RkLAotCSAgICAgX191OCB1c2VyX2RhdGFbMTZdLCBpbnQgZmxhZ3MxLAotCSAgICAgaXVjdl9oYW5kbGVfdCBoYW5kbGUsIHZvaWQgKnBnbV9kYXRhLAotCSAgICAgaW50ICpmbGFnczFfb3V0LCBfX3UxNiAqIG1zZ2xpbSkKLXsKLQl1bG9uZyBiMmYwX3Jlc3VsdCA9IDA7Ci0JdWxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGg7Ci0JaGFuZGxlciAqaCA9IE5VTEw7Ci0JaXBhcm1sX2NvbnRyb2wgKnBhcm07Ci0KLQlpdWN2X2RlYnVnKDEsICJlbnRlcmluZyIpOwotCWl1Y3ZfZGVidWcoMSwgInBhdGhpZCA9ICVkIiwgcGF0aGlkKTsKLQotCS8qIENoZWNraW5nIGlmIGhhbmRsZSBpcyB2YWxpZCAgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2gobGgsICZpdWN2X2hhbmRsZXJfdGFibGUpIHsKLQkJaWYgKChoYW5kbGVyICopaGFuZGxlID09IGxpc3RfZW50cnkobGgsIGhhbmRsZXIsIGxpc3QpKSB7Ci0JCQloID0gKGhhbmRsZXIgKiloYW5kbGU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWgpIHsKLQkJaWYgKGhhbmRsZSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiJXM6IEhhbmRsZXIgbm90IGZvdW5kIGluIGl1Y3ZfaGFuZGxlcl90YWJsZS5cbiIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fKTsKLQkJZWxzZQotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICIlczogTlVMTCBoYW5kbGUgcGFzc2VkIGJ5IGFwcGxpY2F0aW9uLlxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwYXJtID0gKGlwYXJtbF9jb250cm9sICopZ3JhYl9wYXJhbSgpOwotCi0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0JcGFybS0+aXBtc2dsaW0gPSBtc2dsaW1fcmVxc3RkOwotCWlmICh1c2VyX2RhdGEpCi0JCW1lbWNweShwYXJtLT5pcHVzZXIsIHVzZXJfZGF0YSwgc2l6ZW9mKHBhcm0tPmlwdXNlcikpOwotCi0JcGFybS0+aXBmbGFnczEgPSAoX191OClmbGFnczE7Ci0JYjJmMF9yZXN1bHQgPSBiMmYwKEFDQ0VQVCwgcGFybSk7Ci0KLQlpZiAoIWIyZjBfcmVzdWx0KSB7Ci0JCWlmIChtc2dsaW0pCi0JCQkqbXNnbGltID0gcGFybS0+aXBtc2dsaW07Ci0JCWlmIChwZ21fZGF0YSkKLQkJCWgtPnBnbV9kYXRhID0gcGdtX2RhdGE7Ci0JCWlmIChmbGFnczFfb3V0KQotCQkJKmZsYWdzMV9vdXQgPSAocGFybS0+aXBmbGFnczEgJiBJUFBSVFkpID8gSVBQUlRZIDogMDsKLQl9Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotCWl1Y3ZfZGVidWcoMSwgImV4aXRpbmciKTsKLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qKgotICogaXVjdl9jb25uZWN0OgotICogQHBhdGhpZDogICAgICAgIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiBAbXNnbGltX3JlcXN0ZDogTnVtYmVyIG9mIG91dHN0YW5kaW5nIG1lc3NhZ2VzIHJlcXVlc3RlZAotICogQHVzZXJfZGF0YTogICAgIDE2LWJ5dGUgdXNlciBkYXRhCi0gKiBAdXNlcmlkOiAgICAgICAgOC1ieXRlIG9mIHVzZXIgaWRlbnRpZmljYXRpb24KLSAqIEBzeXN0ZW1fbmFtZTogICA4LWJ5dGUgaWRlbnRpZnlpbmcgdGhlIHN5c3RlbSBuYW1lCi0gKiBAZmxhZ3MxOiAgICAgICAgU3BlY2lmaWVzIG9wdGlvbnMgZm9yIHRoaXMgcGF0aDoKLSAqICAgICAtIElQUFJUWSAoMHgyMCkgICBTcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlLgotICogICAgIC0gSVBSTURBVEEgKDB4ODApIFNwZWNpZmllcyB3aGV0aGVyIHlvdXIgcHJvZ3JhbSBjYW4gaGFuZGxlIGEgbWVzc2FnZQotICogICAgICAgICAgICAgICAgICAgICAgIGluICB0aGUgcGFyYW1ldGVyIGxpc3QuCi0gKiAgICAgLSBJUFFVU0NFICgweDQwKSAgU3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgdG8gcXVpZXNjZSB0aGUgcGF0aCBiZWluZwotICogICAgICAgICAgICAgICAgICAgICAgIGVzdGFibGlzaGVkLgotICogICAgIC0gSVBMT0NBTCAoMHgwMSkgIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBmb3JjZSB0aGUgcGFydG5lciB0byBiZSBvbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCBzeXN0ZW0uIElmIGxvY2FsIGlzIHNwZWNpZmllZCB0aGVuIHRhcmdldCBjbGFzcwotICogICAgICAgICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBzcGVjaWZpZWQuCi0gKiBAZmxhZ3MxX291dDogICAgUG9pbnRlciB0byBhbiBpbnQuIElmIG5vdCBOVUxMLCBvbiByZXR1cm4gdGhlIG9wdGlvbnMgZm9yCi0gKiAgICAgICAgICAgICAgICAgdGhlIHBhdGggYXJlIHN0b3JlZCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb246Ci0gKiAgICAgLSBJUFBSVFkgKDB4MjApICAgSW5kaWNhdGVzIHlvdSBtYXkgc2VuZCBhIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiBAbXNnbGltOiAgICAgICAgUG9pbnRlciB0byBhbiBfX3UxNi4gSWYgbm90IE5VTEwsIG9uIHJldHVybiB0aGUgbWF4aW11bQotICogICAgICAgICAgICAgICAgIG51bWJlciBvZiBvdXRzdGFuZGluZyBtZXNzYWdlcyBpcyBzdG9yZWQgYXQgdGhlIGdpdmVuCi0gKiAgICAgICAgICAgICAgICAgbG9jYXRpb24uCi0gKiBAaGFuZGxlOiAgICAgICAgQWRkcmVzcyBvZiBoYW5kbGVyLgotICogQHBnbV9kYXRhOiAgICAgIEFwcGxpY2F0aW9uIGRhdGEgdG8gYmUgcGFzc2VkIHRvIGludGVycnVwdCBoYW5kbGVycy4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGVzdGFibGlzaGVzIGFuIElVQ1YgcGF0aC4gQWx0aG91Z2ggdGhlIGNvbm5lY3QgbWF5IGNvbXBsZXRlCi0gKiBzdWNjZXNzZnVsbHksIHlvdSBhcmUgbm90IGFibGUgdG8gdXNlIHRoZSBwYXRoIHVudGlsIHlvdSByZWNlaXZlIGFuIElVQ1YKLSAqIENvbm5lY3Rpb24gQ29tcGxldGUgZXh0ZXJuYWwgaW50ZXJydXB0LgotICogUmV0dXJuczogcmV0dXJuIGNvZGUgZnJvbSBDUCwgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcKLSAqICAgICAtIEVOT01FTQotICogICAgIC0gcmV0dXJuIGNvZGUgZnJvbSBpdWN2X2RlY2xhcmVfYnVmZmVyCi0gKiAgICAgLSBFSU5WQUwgLSBpbnZhbGlkIGhhbmRsZSBwYXNzZWQgYnkgYXBwbGljYXRpb24KLSAqICAgICAtIEVJTlZBTCAtIHBhdGhpZCBhZGRyZXNzIGlzIE5VTEwKLSAqICAgICAtIEVOT01FTSAtIHBhdGhpZCB0YWJsZSBzdG9yYWdlIGFsbG9jYXRpb24gZmFpbGVkCi0gKiAgICAgLSByZXR1cm4gY29kZSBmcm9tIGludGVybmFsIGZ1bmN0aW9uIGFkZF9wYXRoaWQKLSAqLwotaW50Ci1pdWN2X2Nvbm5lY3QgKF9fdTE2ICpwYXRoaWQsIF9fdTE2IG1zZ2xpbV9yZXFzdGQsCi0JICAgICAgX191OCB1c2VyX2RhdGFbMTZdLCBfX3U4IHVzZXJpZFs4XSwKLQkgICAgICBfX3U4IHN5c3RlbV9uYW1lWzhdLCBpbnQgZmxhZ3MxLAotCSAgICAgIGludCAqZmxhZ3MxX291dCwgX191MTYgKiBtc2dsaW0sCi0JICAgICAgaXVjdl9oYW5kbGVfdCBoYW5kbGUsIHZvaWQgKnBnbV9kYXRhKQotewotCWlwYXJtbF9jb250cm9sICpwYXJtOwotCWlwYXJtbF9jb250cm9sIGxvY2FsX3Bhcm07Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGg7Ci0JdWxvbmcgYjJmMF9yZXN1bHQgPSAwOwotCXVsb25nIGZsYWdzOwotCWludCBhZGRfcGF0aGlkX3Jlc3VsdCA9IDA7Ci0JaGFuZGxlciAqaCA9IE5VTEw7Ci0JX191OCBub19tZW1vcnlbMTZdID0gIk5PIE1FTU9SWSI7Ci0KLQlpdWN2X2RlYnVnKDEsICJlbnRlcmluZyIpOwotCi0JLyogQ2hlY2tpbmcgaWYgaGFuZGxlIGlzIHZhbGlkICAqLwotCXNwaW5fbG9ja19pcnFzYXZlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaChsaCwgJml1Y3ZfaGFuZGxlcl90YWJsZSkgewotCQlpZiAoKGhhbmRsZXIgKiloYW5kbGUgPT0gbGlzdF9lbnRyeShsaCwgaGFuZGxlciwgbGlzdCkpIHsKLQkJCWggPSAoaGFuZGxlciAqKWhhbmRsZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQotCWlmICghaCkgewotCQlpZiAoaGFuZGxlKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICIlczogSGFuZGxlciBub3QgZm91bmQgaW4gaXVjdl9oYW5kbGVyX3RhYmxlLlxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIiVzOiBOVUxMIGhhbmRsZSBwYXNzZWQgYnkgYXBwbGljYXRpb24uXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChwYXRoaWQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTlVMTCBwYXRoaWQgcG9pbnRlclxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXBhcm0gPSAoaXBhcm1sX2NvbnRyb2wgKilncmFiX3BhcmFtKCk7Ci0KLQlwYXJtLT5pcG1zZ2xpbSA9IG1zZ2xpbV9yZXFzdGQ7Ci0KLQlpZiAodXNlcl9kYXRhKQotCQltZW1jcHkocGFybS0+aXB1c2VyLCB1c2VyX2RhdGEsIHNpemVvZihwYXJtLT5pcHVzZXIpKTsKLQotCWlmICh1c2VyaWQpIHsKLQkJbWVtY3B5KHBhcm0tPmlwdm1pZCwgdXNlcmlkLCBzaXplb2YocGFybS0+aXB2bWlkKSk7Ci0JCUFTQ0VCQyhwYXJtLT5pcHZtaWQsIHNpemVvZihwYXJtLT5pcHZtaWQpKTsKLQkJRUJDX1RPVVBQRVIocGFybS0+aXB2bWlkLCBzaXplb2YocGFybS0+aXB2bWlkKSk7Ci0JfQotCi0JaWYgKHN5c3RlbV9uYW1lKSB7Ci0JCW1lbWNweShwYXJtLT5pcHRhcmdldCwgc3lzdGVtX25hbWUsIHNpemVvZihwYXJtLT5pcHRhcmdldCkpOwotCQlBU0NFQkMocGFybS0+aXB0YXJnZXQsIHNpemVvZihwYXJtLT5pcHRhcmdldCkpOwotCQlFQkNfVE9VUFBFUihwYXJtLT5pcHRhcmdldCwgc2l6ZW9mKHBhcm0tPmlwdGFyZ2V0KSk7Ci0JfQotCi0JLyogSW4gb3JkZXIgdG8gZXN0YWJsaXNoIGFuIElVQ1YgY29ubmVjdGlvbiwgdGhlIHByb2NlZHVyZSBpczoKLSAgICAgICAgICoKLSAgICAgICAgICogYjJmMChDT05ORUNUKQotICAgICAgICAgKiB0YWtlIHRoZSBpcHBhdGhpZCBmcm9tIHRoZSBiMmYwIGNhbGwKLSAgICAgICAgICogcmVnaXN0ZXIgdGhlIGhhbmRsZXIgdG8gdGhlIGlwcGF0aGlkCi0gICAgICAgICAqCi0gICAgICAgICAqIFVuZm9ydHVuYXRlbHksIHRoZSBDb25uZWN0aW9uRXN0YWJsaXNoZWQgbWVzc2FnZSBnZXRzIHNlbnQgYWZ0ZXIgdGhlCi0gICAgICAgICAqIGIyZjAoQ09OTkVDVCkgY2FsbCBidXQgYmVmb3JlIHRoZSByZWdpc3RlciBpcyBoYW5kbGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBJbiBvcmRlciBmb3IgdGhpcyByYWNlIGNvbmRpdGlvbiB0byBiZSBlbGltaW5hdGVkLCB0aGUgSVVDViBDb250cm9sCi0gICAgICAgICAqIEludGVycnVwdHMgbXVzdCBiZSBkaXNhYmxlZCBmb3IgdGhlIGFib3ZlIHByb2NlZHVyZS4KLSAgICAgICAgICoKLSAgICAgICAgICogRGF2aWQgS2VubmVkeSA8ZGtlbm5lZHlAbGludXhjYXJlLmNvbT4KLSAgICAgICAgICovCi0KLQkvKiBFbmFibGUgZXZlcnl0aGluZyBidXQgSVVDViBDb250cm9sIG1lc3NhZ2VzICovCi0JaXVjdl9zZXRtYXNrKH4oQWxsSW50ZXJydXB0cykpOwotCW1lc3NhZ2VzRGlzYWJsZWQgPSAxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQlwYXJtLT5pcGZsYWdzMSA9IChfX3U4KWZsYWdzMTsKLQliMmYwX3Jlc3VsdCA9IGIyZjAoQ09OTkVDVCwgcGFybSk7Ci0JbWVtY3B5KCZsb2NhbF9wYXJtLCBwYXJtLCBzaXplb2YobG9jYWxfcGFybSkpOwotCXJlbGVhc2VfcGFyYW0ocGFybSk7Ci0JcGFybSA9ICZsb2NhbF9wYXJtOwotCWlmICghYjJmMF9yZXN1bHQpCi0JCWFkZF9wYXRoaWRfcmVzdWx0ID0gX19pdWN2X2FkZF9wYXRoaWQocGFybS0+aXBwYXRoaWQsIGgpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQotCWlmIChiMmYwX3Jlc3VsdCkgewotCQlpdWN2X3NldG1hc2sofjApOwotCQltZXNzYWdlc0Rpc2FibGVkID0gMDsKLQkJcmV0dXJuIGIyZjBfcmVzdWx0OwotCX0KLQotCSpwYXRoaWQgPSBwYXJtLT5pcHBhdGhpZDsKLQotCS8qIEVuYWJsZSBldmVyeXRoaW5nIGFnYWluICovCi0JaXVjdl9zZXRtYXNrKElVQ1ZDb250cm9sSW50ZXJydXB0c0ZsYWcpOwotCi0JaWYgKG1zZ2xpbSkKLQkJKm1zZ2xpbSA9IHBhcm0tPmlwbXNnbGltOwotCWlmIChmbGFnczFfb3V0KQotCQkqZmxhZ3MxX291dCA9IChwYXJtLT5pcGZsYWdzMSAmIElQUFJUWSkgPyBJUFBSVFkgOiAwOwotCi0JaWYgKGFkZF9wYXRoaWRfcmVzdWx0KSB7Ci0JCWl1Y3Zfc2V2ZXIoKnBhdGhpZCwgbm9fbWVtb3J5KTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGFkZF9wYXRoaWQgZmFpbGVkIHdpdGggcmMgPSIKLQkJCSIgJWRcbiIsIF9fRlVOQ1RJT05fXywgYWRkX3BhdGhpZF9yZXN1bHQpOwotCQlyZXR1cm4oYWRkX3BhdGhpZF9yZXN1bHQpOwotCX0KLQotCWl1Y3ZfZGVidWcoMSwgImV4aXRpbmciKTsKLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qKgotICogaXVjdl9wdXJnZToKLSAqIEBwYXRoaWQ6IFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiBAbXNnaWQ6ICBNZXNzYWdlIElEIG9mIG1lc3NhZ2UgdG8gcHVyZ2UuCi0gKiBAc3JjY2xzOiBNZXNzYWdlIGNsYXNzIG9mIHRoZSBtZXNzYWdlIHRvIHB1cmdlLgotICogQGF1ZGl0OiAgUG9pbnRlciB0byBhbiBfX3UzMi4gSWYgbm90IE5VTEwsIG9uIHJldHVybiwgaW5mb3JtYXRpb24gYWJvdXQKLSAqICAgICAgICAgIGFzeW5jaHJvbm91cyBlcnJvcnMgdGhhdCBtYXkgaGF2ZSBhZmZlY3RlZCB0aGUgbm9ybWFsIGNvbXBsZXRpb24KLSAqICAgICAgICAgIG9mIHRoaXMgbWVzc2FnZSBpc3Qgc3RvcmVkIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4KLSAqCi0gKiBDYW5jZWxzIGEgbWVzc2FnZSB5b3UgaGF2ZSBzZW50LgotICogUmV0dXJuczogcmV0dXJuIGNvZGUgZnJvbSBDUAotICovCi1pbnQKLWl1Y3ZfcHVyZ2UgKF9fdTE2IHBhdGhpZCwgX191MzIgbXNnaWQsIF9fdTMyIHNyY2NscywgX191MzIgKmF1ZGl0KQotewotCWlwYXJtbF9wdXJnZSAqcGFybTsKLQl1bG9uZyBiMmYwX3Jlc3VsdCA9IDA7Ci0KLQlpdWN2X2RlYnVnKDEsICJlbnRlcmluZyIpOwotCWl1Y3ZfZGVidWcoMSwgInBhdGhpZCA9ICVkIiwgcGF0aGlkKTsKLQotCXBhcm0gPSAoaXBhcm1sX3B1cmdlICopZ3JhYl9wYXJhbSgpOwotCi0JcGFybS0+aXBtc2dpZCA9IG1zZ2lkOwotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCXBhcm0tPmlwc3JjY2xzID0gc3JjY2xzOwotCXBhcm0tPmlwZmxhZ3MxIHw9IChJUFNSQ0NMUyB8IElQRkdNSUQgfCBJUEZHUElEKTsKLQliMmYwX3Jlc3VsdCA9IGIyZjAoUFVSR0UsIHBhcm0pOwotCi0JaWYgKCFiMmYwX3Jlc3VsdCAmJiBhdWRpdCkgewotCQltZW1jcHkoYXVkaXQsIHBhcm0tPmlwYXVkaXQsIHNpemVvZihwYXJtLT5pcGF1ZGl0KSk7Ci0JCS8qIHBhcm0tPmlwYXVkaXQgaGFzIG9ubHkgMyBieXRlcyAqLwotCQkqYXVkaXQgPj49IDg7Ci0JfQotCi0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotCWl1Y3ZfZGVidWcoMSwgImIyZjBfcmVzdWx0ID0gJWxkIiwgYjJmMF9yZXN1bHQpOwotCWl1Y3ZfZGVidWcoMSwgImV4aXRpbmciKTsKLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qKgotICogaXVjdl9xdWVyeV9nZW5lcmljOgotICogQHdhbnRfbWF4Y29ubjogRmxhZywgZGVzY3JpYmluZyB3aGljaCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZC4KLSAqCi0gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGl1Y3ZfcXVlcnlfbWF4Y29ubigpIGFuZCBpdWN2X3F1ZXJ5X2J1ZnNpemUoKS4KLSAqCi0gKiBSZXR1cm5zOiBUaGUgYnVmZmVyc2l6ZSwgaWYgd2FudF9tYXhjb25uIGlzIDA7IHRoZSBtYXhpbXVtIG51bWJlciBvZgotICogICAgICAgICAgIGNvbm5lY3Rpb25zLCBpZiB3YW50X21heGNvbm4gaXMgMSBvciBhbiBlcnJvci1jb2RlIDwgMCBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50Ci1pdWN2X3F1ZXJ5X2dlbmVyaWMoaW50IHdhbnRfbWF4Y29ubikKLXsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzAgYXNtICgiMCIpOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMSBhc20gKCIxIik7Ci0JaXBhcm1sX3B1cmdlICpwYXJtID0gKGlwYXJtbF9wdXJnZSAqKWdyYWJfcGFyYW0oKTsKLQlpbnQgYnVmc2l6ZSwgbWF4Y29ubjsKLQlpbnQgY2NvZGU7Ci0KLQkvKioKLQkgKiBDYWxsIGIyZjAgYW5kIHN0b3JlIFIwIChtYXggYnVmZmVyIHNpemUpLAotCSAqIFIxIChtYXggY29ubmVjdGlvbnMpIGFuZCBDQy4KLQkgKi8KLQlyZWcwID0gUVVFUlk7Ci0JcmVnMSA9IHZpcnRfdG9fcGh5cyhwYXJtKTsKLQlhc20gdm9sYXRpbGUoCi0JCSIJLmxvbmcJMHhiMmYwMTAwMFxuIgotCQkiCWlwbQklMFxuIgotCQkiCXNybAklMCwyOFxuIgotCQk6ICI9ZCIgKGNjb2RlKSwgIitkIiAocmVnMCksICIrZCIgKHJlZzEpIDogOiAiY2MiKTsKLQlidWZzaXplID0gcmVnMDsKLQltYXhjb25uID0gcmVnMTsKLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaWYgKGNjb2RlKQotCQlyZXR1cm4gLUVQRVJNOwotCWlmICh3YW50X21heGNvbm4pCi0JCXJldHVybiBtYXhjb25uOwotCXJldHVybiBidWZzaXplOwotfQotCi0vKioKLSAqIGl1Y3ZfcXVlcnlfbWF4Y29ubjoKLSAqCi0gKiBEZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF5IG1heSBiZSBlc3RhYmxpc2hlZC4KLSAqCi0gKiBSZXR1cm5zOiBNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IGNhbiBiZS4KLSAqLwotdWxvbmcKLWl1Y3ZfcXVlcnlfbWF4Y29ubih2b2lkKQotewotCXJldHVybiBpdWN2X3F1ZXJ5X2dlbmVyaWMoMSk7Ci19Ci0KLS8qKgotICogaXVjdl9xdWVyeV9idWZzaXplOgotICoKLSAqIERldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGV4dGVybmFsIGludGVycnVwdCBidWZmZXIuCi0gKgotICogUmV0dXJuczogU2l6ZSBvZiBleHRlcm5hbCBpbnRlcnJ1cHQgYnVmZmVyLgotICovCi11bG9uZwotaXVjdl9xdWVyeV9idWZzaXplICh2b2lkKQotewotCXJldHVybiBpdWN2X3F1ZXJ5X2dlbmVyaWMoMCk7Ci19Ci0KLS8qKgotICogaXVjdl9xdWllc2NlOgotICogQHBhdGhpZDogICAgUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqIEB1c2VyX2RhdGE6IDE2LWJ5dGUgdXNlciBkYXRhCi0gKgotICogVGVtcG9yYXJpbHkgc3VzcGVuZHMgaW5jb21pbmcgbWVzc2FnZXMgb24gYW4gSVVDViBwYXRoLgotICogWW91IGNhbiBsYXRlciByZWFjdGl2YXRlIHRoZSBwYXRoIGJ5IGludm9raW5nIHRoZSBpdWN2X3Jlc3VtZSBmdW5jdGlvbi4KLSAqIFJldHVybnM6IHJldHVybiBjb2RlIGZyb20gQ1AKLSAqLwotaW50Ci1pdWN2X3F1aWVzY2UgKF9fdTE2IHBhdGhpZCwgX191OCB1c2VyX2RhdGFbMTZdKQotewotCWlwYXJtbF9jb250cm9sICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0ID0gMDsKLQotCWl1Y3ZfZGVidWcoMSwgImVudGVyaW5nIik7Ci0JaXVjdl9kZWJ1ZygxLCAicGF0aGlkID0gJWQiLCBwYXRoaWQpOwotCi0JcGFybSA9IChpcGFybWxfY29udHJvbCAqKWdyYWJfcGFyYW0oKTsKLQotCW1lbWNweShwYXJtLT5pcHVzZXIsIHVzZXJfZGF0YSwgc2l6ZW9mKHBhcm0tPmlwdXNlcikpOwotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCi0JYjJmMF9yZXN1bHQgPSBiMmYwKFFVSUVTQ0UsIHBhcm0pOwotCXJlbGVhc2VfcGFyYW0ocGFybSk7Ci0KLQlpdWN2X2RlYnVnKDEsICJiMmYwX3Jlc3VsdCA9ICVsZCIsIGIyZjBfcmVzdWx0KTsKLQlpdWN2X2RlYnVnKDEsICJleGl0aW5nIik7Ci0KLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qKgotICogaXVjdl9yZWNlaXZlOgotICogQHBhdGhpZDogUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIuCi0gKiBAYnVmZmVyOiBBZGRyZXNzIG9mIGJ1ZmZlciB0byByZWNlaXZlLiBNdXN0IGJlIGJlbG93IDJHLgotICogQGJ1ZmxlbjogTGVuZ3RoIG9mIGJ1ZmZlciB0byByZWNlaXZlLgotICogQG1zZ2lkOiAgU3BlY2lmaWVzIHRoZSBtZXNzYWdlIElELgotICogQHRyZ2NsczogU3BlY2lmaWVzIHRhcmdldCBjbGFzcy4KLSAqIEBmbGFnczFfb3V0OiBSZWNlaXZlcyBvcHRpb25zIGZvciBwYXRoIG9uIHJldHVybi4KLSAqICAgIC0gSVBOT1JQWSAoMHgxMCkgIFNwZWNpZmllcyB3aGV0aGVyIGEgcmVwbHkgaXMgcmVxdWlyZWQKLSAqICAgIC0gSVBQUlRZICgweDIwKSAgIFNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UKLSAqICAgIC0gSVBSTURBVEEgKDB4ODApIFNwZWNpZmllcyB0aGUgZGF0YSBpcyBjb250YWluZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0Ci0gKiBAcmVzaWR1YWxfYnVmZmVyOiBSZWNlaXZlcyB0aGUgYWRkcmVzcyBvZiBidWZmZXIgdXBkYXRlZCBieSB0aGUgbnVtYmVyCi0gKiAgICAgICAgICAgICAgICAgICBvZiBieXRlcyB5b3UgaGF2ZSByZWNlaXZlZCBvbiByZXR1cm4uCi0gKiBAcmVzaWR1YWxfbGVuZ3RoOiBPbiByZXR1cm4sIHJlY2VpdmVzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgIC0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHJlY2VpdmUgYnVmZmVyIGlzIHRoZSBzYW1lIGxlbmd0aCBhcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVzc2FnZS4KLSAqICAgIC0gUmVtYWluaW5nIGJ5dGVzIGluIGJ1ZmZlciAgSWYgdGhlIHJlY2VpdmUgYnVmZmVyIGlzIGxvbmdlciB0aGFuIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLgotICogICAgLSBSZW1haW5pbmcgYnl0ZXMgaW4gbWVzc2FnZSBJZiB0aGUgcmVjZWl2ZSBidWZmZXIgaXMgc2hvcnRlciB0aGFuIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgbWVzc2FnZXMgdGhhdCBhcmUgYmVpbmcgc2VudCB0byB5b3Ugb3ZlciBlc3RhYmxpc2hlZAotICogcGF0aHMuCi0gKiBSZXR1cm5zOiByZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbDsgSWYgdGhlIHJlY2VpdmUgYnVmZmVyIGlzIHNob3J0ZXIKLSAqICAgdGhhbiB0aGUgbWVzc2FnZSwgYWx3YXlzIDUKLSAqICAgLUVJTlZBTCAtIGJ1ZmZlciBhZGRyZXNzIGlzIHBvaW50aW5nIHRvIE5VTEwKLSAqLwotaW50Ci1pdWN2X3JlY2VpdmUgKF9fdTE2IHBhdGhpZCwgX191MzIgbXNnaWQsIF9fdTMyIHRyZ2NscywKLQkgICAgICB2b2lkICpidWZmZXIsIHVsb25nIGJ1ZmxlbiwKLQkgICAgICBpbnQgKmZsYWdzMV9vdXQsIHVsb25nICogcmVzaWR1YWxfYnVmZmVyLCB1bG9uZyAqIHJlc2lkdWFsX2xlbmd0aCkKLXsKLQlpcGFybWxfZGIgKnBhcm07Ci0JdWxvbmcgYjJmMF9yZXN1bHQ7Ci0JaW50IG1vdmVkID0gMDsJLyogbnVtYmVyIG9mIGJ5dGVzIG1vdmVkIGZyb20gcGFybWxpc3QgdG8gYnVmZmVyICovCi0KLQlpdWN2X2RlYnVnKDIsICJlbnRlcmluZyIpOwotCi0JaWYgKCFidWZmZXIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGFybSA9IChpcGFybWxfZGIgKilncmFiX3BhcmFtKCk7Ci0KLQlwYXJtLT5pcGJmYWRyMSA9IChfX3UzMikgKGFkZHJfdCkgYnVmZmVyOwotCXBhcm0tPmlwYmZsbjFmID0gKF9fdTMyKSAoKHVsb25nKSBidWZsZW4pOwotCXBhcm0tPmlwbXNnaWQgPSBtc2dpZDsKLQlwYXJtLT5pcHBhdGhpZCA9IHBhdGhpZDsKLQlwYXJtLT5pcHRyZ2NscyA9IHRyZ2NsczsKLQlwYXJtLT5pcGZsYWdzMSA9IChJUEZHUElEIHwgSVBGR01JRCB8IElQRkdNQ0wpOwotCi0JYjJmMF9yZXN1bHQgPSBiMmYwKFJFQ0VJVkUsIHBhcm0pOwotCi0JaWYgKCFiMmYwX3Jlc3VsdCB8fCBiMmYwX3Jlc3VsdCA9PSA1KSB7Ci0JCWlmIChmbGFnczFfb3V0KSB7Ci0JCQlpdWN2X2RlYnVnKDIsICIqZmxhZ3MxX291dCA9ICVkIiwgKmZsYWdzMV9vdXQpOwotCQkJKmZsYWdzMV9vdXQgPSAocGFybS0+aXBmbGFnczEgJiAofjB4MDcpKTsKLQkJCWl1Y3ZfZGVidWcoMiwgIipmbGFnczFfb3V0ID0gJWQiLCAqZmxhZ3MxX291dCk7Ci0JCX0KLQotCQlpZiAoIShwYXJtLT5pcGZsYWdzMSAmIElQUk1EQVRBKSkgewkvKm1zZyBub3QgaW4gcGFybWxpc3QgKi8KLQkJCWlmIChyZXNpZHVhbF9sZW5ndGgpCi0JCQkJKnJlc2lkdWFsX2xlbmd0aCA9IHBhcm0tPmlwYmZsbjFmOwotCi0JCQlpZiAocmVzaWR1YWxfYnVmZmVyKQotCQkJCSpyZXNpZHVhbF9idWZmZXIgPSBwYXJtLT5pcGJmYWRyMTsKLQkJfSBlbHNlIHsKLQkJCW1vdmVkID0gbWluX3QgKHVuc2lnbmVkIGxvbmcsIGJ1ZmxlbiwgOCk7Ci0KLQkJCW1lbWNweSAoKGNoYXIgKikgYnVmZmVyLAotCQkJCShjaGFyICopICZwYXJtLT5pcGJmYWRyMSwgbW92ZWQpOwotCi0JCQlpZiAoYnVmbGVuIDwgOCkKLQkJCQliMmYwX3Jlc3VsdCA9IDU7Ci0KLQkJCWlmIChyZXNpZHVhbF9sZW5ndGgpCi0JCQkJKnJlc2lkdWFsX2xlbmd0aCA9IGFicyAoYnVmbGVuIC0gOCk7Ci0KLQkJCWlmIChyZXNpZHVhbF9idWZmZXIpCi0JCQkJKnJlc2lkdWFsX2J1ZmZlciA9ICh1bG9uZykgKGJ1ZmZlciArIG1vdmVkKTsKLQkJfQotCX0KLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygyLCAiZXhpdGluZyIpOwotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoKLSAqIE5hbWU6IGl1Y3ZfcmVjZWl2ZV9hcnJheQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiByZWNlaXZlcyBtZXNzYWdlcyB0aGF0IGFyZSBiZWluZyBzZW50IHRvIHlvdQotICogICAgICAgICAgb3ZlciBlc3RhYmxpc2hlZCBwYXRocy4KLSAqIElucHV0OiBwYXRoaWQgLSBwYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlcgotICogICAgICAgIGJ1ZmZlciAtIGFkZHJlc3Mgb2YgYXJyYXkgb2YgYnVmZmVycwotICogICAgICAgIGJ1ZmxlbiAtIHRvdGFsIGxlbmd0aCBvZiBidWZmZXJzCi0gKiAgICAgICAgbXNnaWQgLSBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiAgICAgICAgdHJnY2xzIC0gc3BlY2lmaWVzIHRhcmdldCBjbGFzcwotICogT3V0cHV0OgotICogICAgICAgIGZsYWdzMV9vdXQ6IE9wdGlvbnMgZm9yIHBhdGguCi0gKiAgICAgICAgICBJUE5PUlBZIC0gMHgxMCBzcGVjaWZpZXMgd2hldGhlciBhIHJlcGx5IGlzIHJlcXVpcmVkCi0gKiAgICAgICAgICBJUFBSVFkgLSAweDIwIHNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UKLSAqICAgICAgICAgSVBSTURBVEEgLSAweDgwIHNwZWNpZmllcyB0aGUgZGF0YSBpcyBjb250YWluZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0Ci0gKiAgICAgICByZXNpZHVhbF9idWZmZXIgLSBhZGRyZXNzIHBvaW50cyB0byB0aGUgY3VycmVudCBsaXN0IGVudHJ5IElVQ1YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHdvcmtpbmcgb24uCi0gKiAgICAgICByZXNpZHVhbF9sZW5ndGggLQotICogICAgICAgICAgICAgIENvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcywgaWYgdGhlIHJlY2VpdmUgYnVmZmVyIGlzOgotICogICAgICAgICAgICAgICBUaGUgc2FtZSBsZW5ndGggYXMgdGhlIG1lc3NhZ2UsIHRoaXMgZmllbGQgaXMgemVyby4KLSAqICAgICAgICAgICAgICAgTG9uZ2VyIHRoYW4gdGhlIG1lc3NhZ2UsIHRoaXMgZmllbGQgY29udGFpbnMgdGhlIG51bWJlciBvZgotICogICAgICAgICAgICAgICAgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBidWZmZXIuCi0gKiAgICAgICAgICAgICAgIFNob3J0ZXIgdGhhbiB0aGUgbWVzc2FnZSwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgcmVzaWR1YWwKLSAqICAgICAgICAgICAgICAgIGNvdW50ICh0aGF0IGlzLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUKLSAqICAgICAgICAgICAgICAgIG1lc3NhZ2UgdGhhdCBkb2VzIG5vdCBmaXQgaW50byB0aGUgYnVmZmVyLiBJbiB0aGlzIGNhc2UKLSAqCQkgIGIyZjBfcmVzdWx0ID0gNS4KLSAqIFJldHVybjogYjJmMF9yZXN1bHQgLSByZXR1cm4gY29kZSBmcm9tIENQCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIGJ1ZmZlciBhZGRyZXNzIGlzIE5VTEwKLSAqLwotaW50Ci1pdWN2X3JlY2VpdmVfYXJyYXkgKF9fdTE2IHBhdGhpZCwKLQkJICAgIF9fdTMyIG1zZ2lkLCBfX3UzMiB0cmdjbHMsCi0JCSAgICBpdWN2X2FycmF5X3QgKiBidWZmZXIsIHVsb25nIGJ1ZmxlbiwKLQkJICAgIGludCAqZmxhZ3MxX291dCwKLQkJICAgIHVsb25nICogcmVzaWR1YWxfYnVmZmVyLCB1bG9uZyAqIHJlc2lkdWFsX2xlbmd0aCkKLXsKLQlpcGFybWxfZGIgKnBhcm07Ci0JdWxvbmcgYjJmMF9yZXN1bHQ7Ci0JaW50IGkgPSAwLCBtb3ZlZCA9IDAsIG5lZWRfdG9fbW92ZSA9IDgsIGR5bl9sZW47Ci0KLQlpdWN2X2RlYnVnKDIsICJlbnRlcmluZyIpOwotCi0JaWYgKCFidWZmZXIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGFybSA9IChpcGFybWxfZGIgKilncmFiX3BhcmFtKCk7Ci0KLQlwYXJtLT5pcGJmYWRyMSA9IChfX3UzMikgKCh1bG9uZykgYnVmZmVyKTsKLQlwYXJtLT5pcGJmbG4xZiA9IChfX3UzMikgYnVmbGVuOwotCXBhcm0tPmlwbXNnaWQgPSBtc2dpZDsKLQlwYXJtLT5pcHBhdGhpZCA9IHBhdGhpZDsKLQlwYXJtLT5pcHRyZ2NscyA9IHRyZ2NsczsKLQlwYXJtLT5pcGZsYWdzMSA9IChJUEJVRkxTVCB8IElQRkdQSUQgfCBJUEZHTUlEIHwgSVBGR01DTCk7Ci0KLQliMmYwX3Jlc3VsdCA9IGIyZjAoUkVDRUlWRSwgcGFybSk7Ci0KLQlpZiAoIWIyZjBfcmVzdWx0IHx8IGIyZjBfcmVzdWx0ID09IDUpIHsKLQotCQlpZiAoZmxhZ3MxX291dCkgewotCQkJaXVjdl9kZWJ1ZygyLCAiKmZsYWdzMV9vdXQgPSAlZCIsICpmbGFnczFfb3V0KTsKLQkJCSpmbGFnczFfb3V0ID0gKHBhcm0tPmlwZmxhZ3MxICYgKH4weDA3KSk7Ci0JCQlpdWN2X2RlYnVnKDIsICIqZmxhZ3MxX291dCA9ICVkIiwgKmZsYWdzMV9vdXQpOwotCQl9Ci0KLQkJaWYgKCEocGFybS0+aXBmbGFnczEgJiBJUFJNREFUQSkpIHsJLyptc2cgbm90IGluIHBhcm1saXN0ICovCi0KLQkJCWlmIChyZXNpZHVhbF9sZW5ndGgpCi0JCQkJKnJlc2lkdWFsX2xlbmd0aCA9IHBhcm0tPmlwYmZsbjFmOwotCi0JCQlpZiAocmVzaWR1YWxfYnVmZmVyKQotCQkJCSpyZXNpZHVhbF9idWZmZXIgPSBwYXJtLT5pcGJmYWRyMTsKLQotCQl9IGVsc2UgewotCQkJLyogY29weSBtc2cgZnJvbSBwYXJtbGlzdCB0byB1c2VycyBhcnJheS4gKi8KLQotCQkJd2hpbGUgKChtb3ZlZCA8IDgpICYmIChtb3ZlZCA8IGJ1ZmxlbikpIHsKLQkJCQlkeW5fbGVuID0KLQkJCQkgICAgbWluX3QgKHVuc2lnbmVkIGludCwKLQkJCQkJIChidWZmZXIgKyBpKS0+bGVuZ3RoLCBuZWVkX3RvX21vdmUpOwotCi0JCQkJbWVtY3B5ICgoY2hhciAqKSgodWxvbmcpKChidWZmZXIgKyBpKS0+YWRkcmVzcykpLAotCQkJCQkoKGNoYXIgKikgJnBhcm0tPmlwYmZhZHIxKSArIG1vdmVkLAotCQkJCQlkeW5fbGVuKTsKLQotCQkJCW1vdmVkICs9IGR5bl9sZW47Ci0JCQkJbmVlZF90b19tb3ZlIC09IGR5bl9sZW47Ci0KLQkJCQkoYnVmZmVyICsgaSktPmFkZHJlc3MgPQotCQkJCSAgICAJKF9fdTMyKQotCQkJCSgodWxvbmcpKF9fdTggKikgKCh1bG9uZykoYnVmZmVyICsgaSktPmFkZHJlc3MpCi0JCQkJCQkrIGR5bl9sZW4pOwotCi0JCQkJKGJ1ZmZlciArIGkpLT5sZW5ndGggLT0gZHluX2xlbjsKLQkJCQlpKys7Ci0JCQl9Ci0KLQkJCWlmIChuZWVkX3RvX21vdmUpCS8qIGJ1ZmxlbiA8IDggYnl0ZXMgKi8KLQkJCQliMmYwX3Jlc3VsdCA9IDU7Ci0KLQkJCWlmIChyZXNpZHVhbF9sZW5ndGgpCi0JCQkJKnJlc2lkdWFsX2xlbmd0aCA9IGFicyAoYnVmbGVuIC0gOCk7Ci0KLQkJCWlmIChyZXNpZHVhbF9idWZmZXIpIHsKLQkJCQlpZiAoIW1vdmVkKQotCQkJCQkqcmVzaWR1YWxfYnVmZmVyID0gKHVsb25nKSBidWZmZXI7Ci0JCQkJZWxzZQotCQkJCQkqcmVzaWR1YWxfYnVmZmVyID0KLQkJCQkJICAgICh1bG9uZykgKGJ1ZmZlciArIChpIC0gMSkpOwotCQkJfQotCi0JCX0KLQl9Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotCWl1Y3ZfZGVidWcoMiwgImV4aXRpbmciKTsKLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qKgotICogaXVjdl9yZWplY3Q6Ci0gKiBAcGF0aGlkOiBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqIEBtc2dpZDogIE1lc3NhZ2UgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gcmVqZWN0LgotICogQHRyZ2NsczogVGFyZ2V0IGNsYXNzIG9mIHRoZSBtZXNzYWdlIHRvIHJlamVjdC4KLSAqIFJldHVybnM6IHJldHVybiBjb2RlIGZyb20gQ1AKLSAqCi0gKiBSZWZ1c2VzIGEgc3BlY2lmaWVkIG1lc3NhZ2UuIEJldHdlZW4gdGhlIHRpbWUgeW91IGFyZSBub3RpZmllZCBvZiBhCi0gKiBtZXNzYWdlIGFuZCB0aGUgdGltZSB0aGF0IHlvdSBjb21wbGV0ZSB0aGUgbWVzc2FnZSwgdGhlIG1lc3NhZ2UgbWF5Ci0gKiBiZSByZWplY3RlZC4KLSAqLwotaW50Ci1pdWN2X3JlamVjdCAoX191MTYgcGF0aGlkLCBfX3UzMiBtc2dpZCwgX191MzIgdHJnY2xzKQotewotCWlwYXJtbF9kYiAqcGFybTsKLQl1bG9uZyBiMmYwX3Jlc3VsdCA9IDA7Ci0KLQlpdWN2X2RlYnVnKDEsICJlbnRlcmluZyIpOwotCWl1Y3ZfZGVidWcoMSwgInBhdGhpZCA9ICVkIiwgcGF0aGlkKTsKLQotCXBhcm0gPSAoaXBhcm1sX2RiICopZ3JhYl9wYXJhbSgpOwotCi0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0JcGFybS0+aXBtc2dpZCA9IG1zZ2lkOwotCXBhcm0tPmlwdHJnY2xzID0gdHJnY2xzOwotCXBhcm0tPmlwZmxhZ3MxID0gKElQRkdNQ0wgfCBJUEZHTUlEIHwgSVBGR1BJRCk7Ci0KLQliMmYwX3Jlc3VsdCA9IGIyZjAoUkVKRUNULCBwYXJtKTsKLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygxLCAiYjJmMF9yZXN1bHQgPSAlbGQiLCBiMmYwX3Jlc3VsdCk7Ci0JaXVjdl9kZWJ1ZygxLCAiZXhpdGluZyIpOwotCi0JcmV0dXJuIGIyZjBfcmVzdWx0OwotfQotCi0vKgotICogTmFtZTogaXVjdl9yZXBseQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiByZXNwb25kcyB0byB0aGUgdHdvLXdheSBtZXNzYWdlcyB0aGF0IHlvdQotICogICAgICAgICAgcmVjZWl2ZS4gWW91IG11c3QgaWRlbnRpZnkgY29tcGxldGVseSB0aGUgbWVzc2FnZSB0bwotICogICAgICAgICAgd2hpY2ggeW91IHdpc2ggdG8gcmVwbHkuIGllLCBwYXRoaWQsIG1zZ2lkLCBhbmQgdHJnY2xzLgotICogSW5wdXQ6IHBhdGhpZCAtIHBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiAgICAgICAgbXNnaWQgLSBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiAgICAgICAgdHJnY2xzIC0gc3BlY2lmaWVzIHRhcmdldCBjbGFzcwotICogICAgICAgIGZsYWdzMSAtIG9wdGlvbiBmb3IgcGF0aAotICogICAgICAgICAgICAgICAgIElQUFJUWS0gMHgyMCAtIHNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UKLSAqICAgICAgICBidWZmZXIgLSBhZGRyZXNzIG9mIHJlcGx5IGJ1ZmZlcgotICogICAgICAgIGJ1ZmxlbiAtIGxlbmd0aCBvZiByZXBseSBidWZmZXIKLSAqIE91dHB1dDogaXBiZmFkcjIgLSBBZGRyZXNzIG9mIGJ1ZmZlciB1cGRhdGVkIGJ5IHRoZSBudW1iZXIKLSAqICAgICAgICAgICAgICAgICAgICBvZiBieXRlcyB5b3UgaGF2ZSBtb3ZlZC4KLSAqICAgICAgICAgaXBiZmxuMmYgLSBDb250YWlucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgSWYgdGhlIGFuc3dlciBidWZmZXIgaXMgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSByZXBseSwgdGhpcyBmaWVsZAotICogICAgICAgICAgICAgICBjb250YWlucyB6ZXJvLgotICogICAgICAgICAgICAgIElmIHRoZSBhbnN3ZXIgYnVmZmVyIGlzIGxvbmdlciB0aGFuIHRoZSByZXBseSwgdGhpcyBmaWVsZCBjb250YWlucwotICogICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyLgotICogICAgICAgICAgICAgIElmIHRoZSBhbnN3ZXIgYnVmZmVyIGlzIHNob3J0ZXIgdGhhbiB0aGUgcmVwbHksIHRoaXMgZmllbGQgY29udGFpbnMKLSAqICAgICAgICAgICAgICAgYSByZXNpZHVhbCBjb3VudCAodGhhdCBpcywgdGhlIG51bWJlciBvZiBieXRlcyByZW1pYW5pbmcgaW4gdGhlCi0gKiAgICAgICAgICAgICAgIHJlcGx5IHRoYXQgZG9lcyBub3QgZml0IGludG8gdGhlIGJ1ZmZlci4gSW4gdGhpcwotICogICAgICAgICAgICAgICAgY2FzZSBiMmYwX3Jlc3VsdCA9IDUuCi0gKiBSZXR1cm46IGIyZjBfcmVzdWx0IC0gcmV0dXJuIGNvZGUgZnJvbSBDUAotICogICAgICAgICAoLUVJTlZBTCkgLSBidWZmZXIgYWRkcmVzcyBpcyBOVUxMCi0gKi8KLWludAotaXVjdl9yZXBseSAoX191MTYgcGF0aGlkLAotCSAgICBfX3UzMiBtc2dpZCwgX191MzIgdHJnY2xzLAotCSAgICBpbnQgZmxhZ3MxLAotCSAgICB2b2lkICpidWZmZXIsIHVsb25nIGJ1ZmxlbiwgdWxvbmcgKiBpcGJmYWRyMiwgdWxvbmcgKiBpcGJmbG4yZikKLXsKLQlpcGFybWxfZGIgKnBhcm07Ci0JdWxvbmcgYjJmMF9yZXN1bHQ7Ci0KLQlpdWN2X2RlYnVnKDIsICJlbnRlcmluZyIpOwotCi0JaWYgKCFidWZmZXIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGFybSA9IChpcGFybWxfZGIgKilncmFiX3BhcmFtKCk7Ci0KLQlwYXJtLT5pcGJmYWRyMiA9IChfX3UzMikgKCh1bG9uZykgYnVmZmVyKTsKLQlwYXJtLT5pcGJmbG4yZiA9IChfX3UzMikgYnVmbGVuOwkvKiBsZW5ndGggb2YgbWVzc2FnZSAqLwotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCXBhcm0tPmlwbXNnaWQgPSBtc2dpZDsKLQlwYXJtLT5pcHRyZ2NscyA9IHRyZ2NsczsKLQlwYXJtLT5pcGZsYWdzMSA9IChfX3U4KSBmbGFnczE7CS8qIHByaW9yaXR5IG1lc3NhZ2UgKi8KLQotCWIyZjBfcmVzdWx0ID0gYjJmMChSRVBMWSwgcGFybSk7Ci0KLQlpZiAoKCFiMmYwX3Jlc3VsdCkgfHwgKGIyZjBfcmVzdWx0ID09IDUpKSB7Ci0JCWlmIChpcGJmYWRyMikKLQkJCSppcGJmYWRyMiA9IHBhcm0tPmlwYmZhZHIyOwotCQlpZiAoaXBiZmxuMmYpCi0JCQkqaXBiZmxuMmYgPSBwYXJtLT5pcGJmbG4yZjsKLQl9Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotCWl1Y3ZfZGVidWcoMiwgImV4aXRpbmciKTsKLQotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoKLSAqIE5hbWU6IGl1Y3ZfcmVwbHlfYXJyYXkKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gcmVzcG9uZHMgdG8gdGhlIHR3by13YXkgbWVzc2FnZXMgdGhhdCB5b3UKLSAqICAgICAgICAgIHJlY2VpdmUuIFlvdSBtdXN0IGlkZW50aWZ5IGNvbXBsZXRlbHkgdGhlIG1lc3NhZ2UgdG8KLSAqICAgICAgICAgIHdoaWNoIHlvdSB3aXNoIHRvIHJlcGx5LiBpZSwgcGF0aGlkLCBtc2dpZCwgYW5kIHRyZ2Nscy4KLSAqICAgICAgICAgIFRoZSBhcnJheSBpZGVudGlmaWVzIGEgbGlzdCBvZiBhZGRyZXNzZXMgYW5kIGxlbmd0aHMgb2YKLSAqICAgICAgICAgIGRpc2NvbnRpZ3VvdXMgYnVmZmVycyB0aGF0IGNvbnRhaW5zIHRoZSByZXBseSBkYXRhLgotICogSW5wdXQ6IHBhdGhpZCAtIHBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiAgICAgICAgbXNnaWQgLSBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiAgICAgICAgdHJnY2xzIC0gc3BlY2lmaWVzIHRhcmdldCBjbGFzcwotICogICAgICAgIGZsYWdzMSAtIG9wdGlvbiBmb3IgcGF0aAotICogICAgICAgICAgICAgICAgIElQUFJUWS0gc3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZQotICogICAgICAgIGJ1ZmZlciAtIGFkZHJlc3Mgb2YgYXJyYXkgb2YgcmVwbHkgYnVmZmVycwotICogICAgICAgIGJ1ZmxlbiAtIHRvdGFsIGxlbmd0aCBvZiByZXBseSBidWZmZXJzCi0gKiBPdXRwdXQ6IGlwYmZhZHIyIC0gQWRkcmVzcyBvZiBidWZmZXIgd2hpY2ggSVVDViBpcyBjdXJyZW50bHkgd29ya2luZyBvbi4KLSAqICAgICAgICAgaXBiZmxuMmYgLSBDb250YWlucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgSWYgdGhlIGFuc3dlciBidWZmZXIgaXMgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSByZXBseSwgdGhpcyBmaWVsZAotICogICAgICAgICAgICAgICBjb250YWlucyB6ZXJvLgotICogICAgICAgICAgICAgIElmIHRoZSBhbnN3ZXIgYnVmZmVyIGlzIGxvbmdlciB0aGFuIHRoZSByZXBseSwgdGhpcyBmaWVsZCBjb250YWlucwotICogICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyLgotICogICAgICAgICAgICAgIElmIHRoZSBhbnN3ZXIgYnVmZmVyIGlzIHNob3J0ZXIgdGhhbiB0aGUgcmVwbHksIHRoaXMgZmllbGQgY29udGFpbnMKLSAqICAgICAgICAgICAgICAgYSByZXNpZHVhbCBjb3VudCAodGhhdCBpcywgdGhlIG51bWJlciBvZiBieXRlcyByZW1pYW5pbmcgaW4gdGhlCi0gKiAgICAgICAgICAgICAgIHJlcGx5IHRoYXQgZG9lcyBub3QgZml0IGludG8gdGhlIGJ1ZmZlci4gSW4gdGhpcwotICogICAgICAgICAgICAgICBjYXNlIGIyZjBfcmVzdWx0ID0gNS4KLSAqIFJldHVybjogYjJmMF9yZXN1bHQgLSByZXR1cm4gY29kZSBmcm9tIENQCi0gKiAgICAgICAgICAgICAoLUVJTlZBTCkgLSBidWZmZXIgYWRkcmVzcyBpcyBOVUxMCi0qLwotaW50Ci1pdWN2X3JlcGx5X2FycmF5IChfX3UxNiBwYXRoaWQsCi0JCSAgX191MzIgbXNnaWQsIF9fdTMyIHRyZ2NscywKLQkJICBpbnQgZmxhZ3MxLAotCQkgIGl1Y3ZfYXJyYXlfdCAqIGJ1ZmZlciwKLQkJICB1bG9uZyBidWZsZW4sIHVsb25nICogaXBiZmFkcjIsIHVsb25nICogaXBiZmxuMmYpCi17Ci0JaXBhcm1sX2RiICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0OwotCi0JaXVjdl9kZWJ1ZygyLCAiZW50ZXJpbmciKTsKLQotCWlmICghYnVmZmVyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcm0gPSAoaXBhcm1sX2RiICopZ3JhYl9wYXJhbSgpOwotCi0JcGFybS0+aXBiZmFkcjIgPSAoX191MzIpICgodWxvbmcpIGJ1ZmZlcik7Ci0JcGFybS0+aXBiZmxuMmYgPSBidWZsZW47CS8qIGxlbmd0aCBvZiBtZXNzYWdlICovCi0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0JcGFybS0+aXBtc2dpZCA9IG1zZ2lkOwotCXBhcm0tPmlwdHJnY2xzID0gdHJnY2xzOwotCXBhcm0tPmlwZmxhZ3MxID0gKElQQU5TTFNUIHwgZmxhZ3MxKTsKLQotCWIyZjBfcmVzdWx0ID0gYjJmMChSRVBMWSwgcGFybSk7Ci0KLQlpZiAoKCFiMmYwX3Jlc3VsdCkgfHwgKGIyZjBfcmVzdWx0ID09IDUpKSB7Ci0KLQkJaWYgKGlwYmZhZHIyKQotCQkJKmlwYmZhZHIyID0gcGFybS0+aXBiZmFkcjI7Ci0JCWlmIChpcGJmbG4yZikKLQkJCSppcGJmbG4yZiA9IHBhcm0tPmlwYmZsbjJmOwotCX0KLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygyLCAiZXhpdGluZyIpOwotCi0JcmV0dXJuIGIyZjBfcmVzdWx0OwotfQotCi0vKgotICogTmFtZTogaXVjdl9yZXBseV9wcm1tc2cKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gcmVzcG9uZHMgdG8gdGhlIHR3by13YXkgbWVzc2FnZXMgdGhhdCB5b3UKLSAqICAgICAgICAgIHJlY2VpdmUuIFlvdSBtdXN0IGlkZW50aWZ5IGNvbXBsZXRlbHkgdGhlIG1lc3NhZ2UgdG8KLSAqICAgICAgICAgIHdoaWNoIHlvdSB3aXNoIHRvIHJlcGx5LiBpZSwgcGF0aGlkLCBtc2dpZCwgYW5kIHRyZ2Nscy4KLSAqICAgICAgICAgIFBybW1zZyBzaWduaWZpZXMgdGhlIGRhdGEgaXMgbW92ZWQgaW50byB0aGUKLSAqICAgICAgICAgIHBhcmFtZXRlciBsaXN0LgotICogSW5wdXQ6IHBhdGhpZCAtIHBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiAgICAgICAgbXNnaWQgLSBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiAgICAgICAgdHJnY2xzIC0gc3BlY2lmaWVzIHRhcmdldCBjbGFzcwotICogICAgICAgIGZsYWdzMSAtIG9wdGlvbiBmb3IgcGF0aAotICogICAgICAgICAgICAgICAgIElQUFJUWS0gc3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZQotICogICAgICAgIHBybW1zZyAtIDgtYnl0ZXMgb2YgZGF0YSB0byBiZSBwbGFjZWQgaW50byB0aGUgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgbGlzdC4KLSAqIE91dHB1dDogTkEKLSAqIFJldHVybjogYjJmMF9yZXN1bHQgLSByZXR1cm4gY29kZSBmcm9tIENQCi0qLwotaW50Ci1pdWN2X3JlcGx5X3BybW1zZyAoX191MTYgcGF0aGlkLAotCQkgICBfX3UzMiBtc2dpZCwgX191MzIgdHJnY2xzLCBpbnQgZmxhZ3MxLCBfX3U4IHBybW1zZ1s4XSkKLXsKLQlpcGFybWxfZHBsICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0OwotCi0JaXVjdl9kZWJ1ZygyLCAiZW50ZXJpbmciKTsKLQotCXBhcm0gPSAoaXBhcm1sX2RwbCAqKWdyYWJfcGFyYW0oKTsKLQotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCXBhcm0tPmlwbXNnaWQgPSBtc2dpZDsKLQlwYXJtLT5pcHRyZ2NscyA9IHRyZ2NsczsKLQltZW1jcHkocGFybS0+aXBybW1zZywgcHJtbXNnLCBzaXplb2YgKHBhcm0tPmlwcm1tc2cpKTsKLQlwYXJtLT5pcGZsYWdzMSA9IChJUFJNREFUQSB8IGZsYWdzMSk7Ci0KLQliMmYwX3Jlc3VsdCA9IGIyZjAoUkVQTFksIHBhcm0pOwotCXJlbGVhc2VfcGFyYW0ocGFybSk7Ci0KLQlpdWN2X2RlYnVnKDIsICJleGl0aW5nIik7Ci0KLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qKgotICogaXVjdl9yZXN1bWU6Ci0gKiBAcGF0aGlkOiAgICBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlcgotICogQHVzZXJfZGF0YTogMTYtYnl0ZSBvZiB1c2VyIGRhdGEKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlc3RvcmVzIGNvbW11bmljYXRpb24gb3ZlciBhIHF1aWVzY2VkIHBhdGguCi0gKiBSZXR1cm5zOiByZXR1cm4gY29kZSBmcm9tIENQCi0gKi8KLWludAotaXVjdl9yZXN1bWUgKF9fdTE2IHBhdGhpZCwgX191OCB1c2VyX2RhdGFbMTZdKQotewotCWlwYXJtbF9jb250cm9sICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0ID0gMDsKLQotCWl1Y3ZfZGVidWcoMSwgImVudGVyaW5nIik7Ci0JaXVjdl9kZWJ1ZygxLCAicGF0aGlkID0gJWQiLCBwYXRoaWQpOwotCi0JcGFybSA9IChpcGFybWxfY29udHJvbCAqKWdyYWJfcGFyYW0oKTsKLQotCW1lbWNweSAocGFybS0+aXB1c2VyLCB1c2VyX2RhdGEsIHNpemVvZiAoKnVzZXJfZGF0YSkpOwotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCi0JYjJmMF9yZXN1bHQgPSBiMmYwKFJFU1VNRSwgcGFybSk7Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotCWl1Y3ZfZGVidWcoMSwgImV4aXRpbmciKTsKLQotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoKLSAqIE5hbWU6IGl1Y3Zfc2VuZAotICogUHVycG9zZTogc2VuZHMgbWVzc2FnZXMKLSAqIElucHV0OiBwYXRoaWQgLSB1c2hvcnQsIHBhdGhpZAotICogICAgICAgIG1zZ2lkICAtIHVsb25nICosIGlkIG9mIG1lc3NhZ2UgcmV0dXJuZWQgdG8gY2FsbGVyCi0gKiAgICAgICAgdHJnY2xzIC0gdWxvbmcsIHRhcmdldCBtZXNzYWdlIGNsYXNzCi0gKiAgICAgICAgc3JjY2xzIC0gdWxvbmcsIHNvdXJjZSBtZXNzYWdlIGNsYXNzCi0gKiAgICAgICAgbXNndGFnIC0gdWxvbmcsIG1lc3NhZ2UgdGFnCi0gKgkgIGZsYWdzMSAgLSBDb250YWlucyBvcHRpb25zIGZvciB0aGlzIHBhdGguCi0gKgkJSVBQUlRZIC0gT3gyMCAtIHNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIGEgcHJpb3JpdHkgbWVzc2FnZS4KLSAqICAgICAgICBidWZmZXIgLSBwb2ludGVyIHRvIGJ1ZmZlcgotICogICAgICAgIGJ1ZmxlbiAtIHVsb25nLCBsZW5ndGggb2YgYnVmZmVyCi0gKiBPdXRwdXQ6IGIyZjBfcmVzdWx0IC0gcmV0dXJuIGNvZGUgZnJvbSBiMmYwIGNhbGwKLSAqICAgICAgICAgbXNnaWQgLSByZXR1cm5zIG1lc3NhZ2UgaWQKLSAqLwotaW50Ci1pdWN2X3NlbmQgKF9fdTE2IHBhdGhpZCwgX191MzIgKiBtc2dpZCwKLQkgICBfX3UzMiB0cmdjbHMsIF9fdTMyIHNyY2NscywKLQkgICBfX3UzMiBtc2d0YWcsIGludCBmbGFnczEsIHZvaWQgKmJ1ZmZlciwgdWxvbmcgYnVmbGVuKQotewotCWlwYXJtbF9kYiAqcGFybTsKLQl1bG9uZyBiMmYwX3Jlc3VsdDsKLQotCWl1Y3ZfZGVidWcoMiwgImVudGVyaW5nIik7Ci0KLQlpZiAoIWJ1ZmZlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYXJtID0gKGlwYXJtbF9kYiAqKWdyYWJfcGFyYW0oKTsKLQotCXBhcm0tPmlwYmZhZHIxID0gKF9fdTMyKSAoKHVsb25nKSBidWZmZXIpOwotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCXBhcm0tPmlwdHJnY2xzID0gdHJnY2xzOwotCXBhcm0tPmlwYmZsbjFmID0gKF9fdTMyKSBidWZsZW47CS8qIGxlbmd0aCBvZiBtZXNzYWdlICovCi0JcGFybS0+aXBzcmNjbHMgPSBzcmNjbHM7Ci0JcGFybS0+aXBtc2d0YWcgPSBtc2d0YWc7Ci0JcGFybS0+aXBmbGFnczEgPSAoSVBOT1JQWSB8IGZsYWdzMSk7CS8qIG9uZSB3YXkgcHJpb3JpdHkgbWVzc2FnZSAqLwotCi0JYjJmMF9yZXN1bHQgPSBiMmYwKFNFTkQsIHBhcm0pOwotCi0JaWYgKCghYjJmMF9yZXN1bHQpICYmIChtc2dpZCkpCi0JCSptc2dpZCA9IHBhcm0tPmlwbXNnaWQ7Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotCWl1Y3ZfZGVidWcoMiwgImV4aXRpbmciKTsKLQotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoKLSAqIE5hbWU6IGl1Y3Zfc2VuZF9hcnJheQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiB0cmFuc21pdHMgZGF0YSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLgotICogICAgICAgICAgVGhlIGNvbnRlbnRzIG9mIGJ1ZmZlciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgYXJyYXkgb2YKLSAqICAgICAgICAgIGFkZHJlc3NlcyBhbmQgbGVuZ3RocyBvZiBkaXNjb250aWd1b3VzIGJ1ZmZlcnMgdGhhdCBob2xkCi0gKiAgICAgICAgICB0aGUgbWVzc2FnZSB0ZXh0LiBUaGlzIGlzIGEgb25lLXdheSBtZXNzYWdlIGFuZCB0aGUKLSAqICAgICAgICAgIHJlY2VpdmVyIHdpbGwgbm90IHJlcGx5IHRvIHRoZSBtZXNzYWdlLgotICogSW5wdXQ6IHBhdGhpZCAtIHBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiAgICAgICAgdHJnY2xzIC0gc3BlY2lmaWVzIHRhcmdldCBjbGFzcwotICogICAgICAgIHNyY2NscyAtIHNwZWNpZmllcyB0aGUgc291cmNlIG1lc3NhZ2UgY2xhc3MKLSAqICAgICAgICBtc2d0YWcgLSBzcGVjaWZpZXMgYSB0YWcgdG8gYmUgYXNzb2NpYXRlZCB3aXRodCB0aGUgbWVzc2FnZQotICogICAgICAgIGZsYWdzMSAtIG9wdGlvbiBmb3IgcGF0aAotICogICAgICAgICAgICAgICAgIElQUFJUWS0gc3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZQotICogICAgICAgIGJ1ZmZlciAtIGFkZHJlc3Mgb2YgYXJyYXkgb2Ygc2VuZCBidWZmZXJzCi0gKiAgICAgICAgYnVmbGVuIC0gdG90YWwgbGVuZ3RoIG9mIHNlbmQgYnVmZmVycwotICogT3V0cHV0OiBtc2dpZCAtIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqIFJldHVybjogYjJmMF9yZXN1bHQgLSByZXR1cm4gY29kZSBmcm9tIENQCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIGJ1ZmZlciBhZGRyZXNzIGlzIE5VTEwKLSAqLwotaW50Ci1pdWN2X3NlbmRfYXJyYXkgKF9fdTE2IHBhdGhpZCwKLQkJIF9fdTMyICogbXNnaWQsCi0JCSBfX3UzMiB0cmdjbHMsCi0JCSBfX3UzMiBzcmNjbHMsCi0JCSBfX3UzMiBtc2d0YWcsIGludCBmbGFnczEsIGl1Y3ZfYXJyYXlfdCAqIGJ1ZmZlciwgdWxvbmcgYnVmbGVuKQotewotCWlwYXJtbF9kYiAqcGFybTsKLQl1bG9uZyBiMmYwX3Jlc3VsdDsKLQotCWl1Y3ZfZGVidWcoMiwgImVudGVyaW5nIik7Ci0KLQlpZiAoIWJ1ZmZlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYXJtID0gKGlwYXJtbF9kYiAqKWdyYWJfcGFyYW0oKTsKLQotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCXBhcm0tPmlwdHJnY2xzID0gdHJnY2xzOwotCXBhcm0tPmlwYmZhZHIxID0gKF9fdTMyKSAoKHVsb25nKSBidWZmZXIpOwotCXBhcm0tPmlwYmZsbjFmID0gKF9fdTMyKSBidWZsZW47CS8qIGxlbmd0aCBvZiBtZXNzYWdlICovCi0JcGFybS0+aXBzcmNjbHMgPSBzcmNjbHM7Ci0JcGFybS0+aXBtc2d0YWcgPSBtc2d0YWc7Ci0JcGFybS0+aXBmbGFnczEgPSAoSVBOT1JQWSB8IElQQlVGTFNUIHwgZmxhZ3MxKTsKLQliMmYwX3Jlc3VsdCA9IGIyZjAoU0VORCwgcGFybSk7Ci0KLQlpZiAoKCFiMmYwX3Jlc3VsdCkgJiYgKG1zZ2lkKSkKLQkJKm1zZ2lkID0gcGFybS0+aXBtc2dpZDsKLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygyLCAiZXhpdGluZyIpOwotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoKLSAqIE5hbWU6IGl1Y3Zfc2VuZF9wcm1tc2cKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gdHJhbnNtaXRzIGRhdGEgdG8gYW5vdGhlciBhcHBsaWNhdGlvbi4KLSAqICAgICAgICAgIFBybW1zZyBzcGVjaWZpZXMgdGhhdCB0aGUgOC1ieXRlcyBvZiBkYXRhIGFyZSB0byBiZSBtb3ZlZAotICogICAgICAgICAgaW50byB0aGUgcGFyYW1ldGVyIGxpc3QuIFRoaXMgaXMgYSBvbmUtd2F5IG1lc3NhZ2UgYW5kIHRoZQotICogICAgICAgICAgcmVjZWl2ZXIgd2lsbCBub3QgcmVwbHkgdG8gdGhlIG1lc3NhZ2UuCi0gKiBJbnB1dDogcGF0aGlkIC0gcGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqICAgICAgICB0cmdjbHMgLSBzcGVjaWZpZXMgdGFyZ2V0IGNsYXNzCi0gKiAgICAgICAgc3JjY2xzIC0gc3BlY2lmaWVzIHRoZSBzb3VyY2UgbWVzc2FnZSBjbGFzcwotICogICAgICAgIG1zZ3RhZyAtIHNwZWNpZmllcyBhIHRhZyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UKLSAqICAgICAgICBmbGFnczEgLSBvcHRpb24gZm9yIHBhdGgKLSAqICAgICAgICAgICAgICAgICBJUFBSVFktIHNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UKLSAqICAgICAgICBwcm1tc2cgLSA4LWJ5dGVzIG9mIGRhdGEgdG8gYmUgcGxhY2VkIGludG8gcGFyYW1ldGVyIGxpc3QKLSAqIE91dHB1dDogbXNnaWQgLSBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiBSZXR1cm46IGIyZjBfcmVzdWx0IC0gcmV0dXJuIGNvZGUgZnJvbSBDUAotKi8KLWludAotaXVjdl9zZW5kX3BybW1zZyAoX191MTYgcGF0aGlkLAotCQkgIF9fdTMyICogbXNnaWQsCi0JCSAgX191MzIgdHJnY2xzLAotCQkgIF9fdTMyIHNyY2NscywgX191MzIgbXNndGFnLCBpbnQgZmxhZ3MxLCBfX3U4IHBybW1zZ1s4XSkKLXsKLQlpcGFybWxfZHBsICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0OwotCi0JaXVjdl9kZWJ1ZygyLCAiZW50ZXJpbmciKTsKLQotCXBhcm0gPSAoaXBhcm1sX2RwbCAqKWdyYWJfcGFyYW0oKTsKLQotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCXBhcm0tPmlwdHJnY2xzID0gdHJnY2xzOwotCXBhcm0tPmlwc3JjY2xzID0gc3JjY2xzOwotCXBhcm0tPmlwbXNndGFnID0gbXNndGFnOwotCXBhcm0tPmlwZmxhZ3MxID0gKElQUk1EQVRBIHwgSVBOT1JQWSB8IGZsYWdzMSk7Ci0JbWVtY3B5KHBhcm0tPmlwcm1tc2csIHBybW1zZywgc2l6ZW9mKHBhcm0tPmlwcm1tc2cpKTsKLQotCWIyZjBfcmVzdWx0ID0gYjJmMChTRU5ELCBwYXJtKTsKLQotCWlmICgoIWIyZjBfcmVzdWx0KSAmJiAobXNnaWQpKQotCQkqbXNnaWQgPSBwYXJtLT5pcG1zZ2lkOwotCXJlbGVhc2VfcGFyYW0ocGFybSk7Ci0KLQlpdWN2X2RlYnVnKDIsICJleGl0aW5nIik7Ci0KLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NlbmQyd2F5Ci0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbWl0cyBkYXRhIHRvIGFub3RoZXIgYXBwbGljYXRpb24uCi0gKiAgICAgICAgICBEYXRhIHRvIGJlIHRyYW5zbWl0dGVkIGlzIGluIGEgYnVmZmVyLiBUaGUgcmVjZWl2ZXIKLSAqICAgICAgICAgIG9mIHRoZSBzZW5kIGlzIGV4cGVjdGVkIHRvIHJlcGx5IHRvIHRoZSBtZXNzYWdlIGFuZAotICogICAgICAgICAgYSBidWZmZXIgaXMgcHJvdmlkZWQgaW50byB3aGljaCBJVUNWIG1vdmVzIHRoZSByZXBseQotICogICAgICAgICAgdG8gdGhpcyBtZXNzYWdlLgotICogSW5wdXQ6IHBhdGhpZCAtIHBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiAgICAgICAgdHJnY2xzIC0gc3BlY2lmaWVzIHRhcmdldCBjbGFzcwotICogICAgICAgIHNyY2NscyAtIHNwZWNpZmllcyB0aGUgc291cmNlIG1lc3NhZ2UgY2xhc3MKLSAqICAgICAgICBtc2d0YWcgLSBzcGVjaWZpZXMgYSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlCi0gKiAgICAgICAgZmxhZ3MxIC0gb3B0aW9uIGZvciBwYXRoCi0gKiAgICAgICAgICAgICAgICAgSVBQUlRZLSBzcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlCi0gKiAgICAgICAgYnVmZmVyIC0gYWRkcmVzcyBvZiBzZW5kIGJ1ZmZlcgotICogICAgICAgIGJ1ZmxlbiAtIGxlbmd0aCBvZiBzZW5kIGJ1ZmZlcgotICogICAgICAgIGFuc2J1ZiAtIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIHJlcGx5IHdpdGgKLSAqICAgICAgICBhbnNsZW4gLSBsZW5ndGggb2YgYnVmZmVyIHRvIHJlcGx5IHdpdGgKLSAqIE91dHB1dDogbXNnaWQgLSBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiBSZXR1cm46IGIyZjBfcmVzdWx0IC0gcmV0dXJuIGNvZGUgZnJvbSBDUAotICogICAgICAgICAoLUVJTlZBTCkgLSBidWZmZXIgb3IgYW5zYnVmIGFkZHJlc3MgaXMgTlVMTAotICovCi1pbnQKLWl1Y3Zfc2VuZDJ3YXkgKF9fdTE2IHBhdGhpZCwKLQkgICAgICAgX191MzIgKiBtc2dpZCwKLQkgICAgICAgX191MzIgdHJnY2xzLAotCSAgICAgICBfX3UzMiBzcmNjbHMsCi0JICAgICAgIF9fdTMyIG1zZ3RhZywKLQkgICAgICAgaW50IGZsYWdzMSwKLQkgICAgICAgdm9pZCAqYnVmZmVyLCB1bG9uZyBidWZsZW4sIHZvaWQgKmFuc2J1ZiwgdWxvbmcgYW5zbGVuKQotewotCWlwYXJtbF9kYiAqcGFybTsKLQl1bG9uZyBiMmYwX3Jlc3VsdDsKLQotCWl1Y3ZfZGVidWcoMiwgImVudGVyaW5nIik7Ci0KLQlpZiAoIWJ1ZmZlciB8fCAhYW5zYnVmKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcm0gPSAoaXBhcm1sX2RiICopZ3JhYl9wYXJhbSgpOwotCi0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0JcGFybS0+aXB0cmdjbHMgPSB0cmdjbHM7Ci0JcGFybS0+aXBiZmFkcjEgPSAoX191MzIpICgodWxvbmcpIGJ1ZmZlcik7Ci0JcGFybS0+aXBiZmxuMWYgPSAoX191MzIpIGJ1ZmxlbjsJLyogbGVuZ3RoIG9mIG1lc3NhZ2UgKi8KLQlwYXJtLT5pcGJmYWRyMiA9IChfX3UzMikgKCh1bG9uZykgYW5zYnVmKTsKLQlwYXJtLT5pcGJmbG4yZiA9IChfX3UzMikgYW5zbGVuOwotCXBhcm0tPmlwc3JjY2xzID0gc3JjY2xzOwotCXBhcm0tPmlwbXNndGFnID0gbXNndGFnOwotCXBhcm0tPmlwZmxhZ3MxID0gZmxhZ3MxOwkvKiBwcmlvcml0eSBtZXNzYWdlICovCi0KLQliMmYwX3Jlc3VsdCA9IGIyZjAoU0VORCwgcGFybSk7Ci0KLQlpZiAoKCFiMmYwX3Jlc3VsdCkgJiYgKG1zZ2lkKSkKLQkJKm1zZ2lkID0gcGFybS0+aXBtc2dpZDsKLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygyLCAiZXhpdGluZyIpOwotCi0JcmV0dXJuIGIyZjBfcmVzdWx0OwotfQotCi0vKgotICogTmFtZTogaXVjdl9zZW5kMndheV9hcnJheQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiB0cmFuc21pdHMgZGF0YSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLgotICogICAgICAgICAgVGhlIGNvbnRlbnRzIG9mIGJ1ZmZlciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgYXJyYXkgb2YKLSAqICAgICAgICAgIGFkZHJlc3NlcyBhbmQgbGVuZ3RocyBvZiBkaXNjb250aWd1b3VzIGJ1ZmZlcnMgdGhhdCBob2xkCi0gKiAgICAgICAgICB0aGUgbWVzc2FnZSB0ZXh0LiBUaGUgcmVjZWl2ZXIgb2YgdGhlIHNlbmQgaXMgZXhwZWN0ZWQgdG8KLSAqICAgICAgICAgIHJlcGx5IHRvIHRoZSBtZXNzYWdlIGFuZCBhIGJ1ZmZlciBpcyBwcm92aWRlZCBpbnRvIHdoaWNoCi0gKiAgICAgICAgICBJVUNWIG1vdmVzIHRoZSByZXBseSB0byB0aGlzIG1lc3NhZ2UuCi0gKiBJbnB1dDogcGF0aGlkIC0gcGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqICAgICAgICB0cmdjbHMgLSBzcGVjaWZpZXMgdGFyZ2V0IGNsYXNzCi0gKiAgICAgICAgc3JjY2xzIC0gc3BlY2lmaWVzIHRoZSBzb3VyY2UgbWVzc2FnZSBjbGFzcwotICogICAgICAgIG1zZ3RhZyAtIHNwY2lmaWVzIGEgdGFnIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZQotICogICAgICAgIGZsYWdzMSAtIG9wdGlvbiBmb3IgcGF0aAotICogICAgICAgICAgICAgICAgIElQUFJUWS0gc3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZQotICogICAgICAgIGJ1ZmZlciAtIGFkZHJlc3Mgb2YgYXJyYXkgb2Ygc2VuZCBidWZmZXJzCi0gKiAgICAgICAgYnVmbGVuIC0gdG90YWwgbGVuZ3RoIG9mIHNlbmQgYnVmZmVycwotICogICAgICAgIGFuc2J1ZiAtIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIHJlcGx5IHdpdGgKLSAqICAgICAgICBhbnNsZW4gLSBsZW5ndGggb2YgYnVmZmVyIHRvIHJlcGx5IHdpdGgKLSAqIE91dHB1dDogbXNnaWQgLSBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiBSZXR1cm46IGIyZjBfcmVzdWx0IC0gcmV0dXJuIGNvZGUgZnJvbSBDUAotICogICAgICAgICAoLUVJTlZBTCkgLSBidWZmZXIgYWRkcmVzcyBpcyBOVUxMCi0gKi8KLWludAotaXVjdl9zZW5kMndheV9hcnJheSAoX191MTYgcGF0aGlkLAotCQkgICAgIF9fdTMyICogbXNnaWQsCi0JCSAgICAgX191MzIgdHJnY2xzLAotCQkgICAgIF9fdTMyIHNyY2NscywKLQkJICAgICBfX3UzMiBtc2d0YWcsCi0JCSAgICAgaW50IGZsYWdzMSwKLQkJICAgICBpdWN2X2FycmF5X3QgKiBidWZmZXIsCi0JCSAgICAgdWxvbmcgYnVmbGVuLCBpdWN2X2FycmF5X3QgKiBhbnNidWYsIHVsb25nIGFuc2xlbikKLXsKLQlpcGFybWxfZGIgKnBhcm07Ci0JdWxvbmcgYjJmMF9yZXN1bHQ7Ci0KLQlpdWN2X2RlYnVnKDIsICJlbnRlcmluZyIpOwotCi0JaWYgKCFidWZmZXIgfHwgIWFuc2J1ZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYXJtID0gKGlwYXJtbF9kYiAqKWdyYWJfcGFyYW0oKTsKLQotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCXBhcm0tPmlwdHJnY2xzID0gdHJnY2xzOwotCXBhcm0tPmlwYmZhZHIxID0gKF9fdTMyKSAoKHVsb25nKSBidWZmZXIpOwotCXBhcm0tPmlwYmZsbjFmID0gKF9fdTMyKSBidWZsZW47CS8qIGxlbmd0aCBvZiBtZXNzYWdlICovCi0JcGFybS0+aXBiZmFkcjIgPSAoX191MzIpICgodWxvbmcpIGFuc2J1Zik7Ci0JcGFybS0+aXBiZmxuMmYgPSAoX191MzIpIGFuc2xlbjsKLQlwYXJtLT5pcHNyY2NscyA9IHNyY2NsczsKLQlwYXJtLT5pcG1zZ3RhZyA9IG1zZ3RhZzsKLQlwYXJtLT5pcGZsYWdzMSA9IChJUEJVRkxTVCB8IElQQU5TTFNUIHwgZmxhZ3MxKTsKLQliMmYwX3Jlc3VsdCA9IGIyZjAoU0VORCwgcGFybSk7Ci0JaWYgKCghYjJmMF9yZXN1bHQpICYmIChtc2dpZCkpCi0JCSptc2dpZCA9IHBhcm0tPmlwbXNnaWQ7Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotCWl1Y3ZfZGVidWcoMiwgImV4aXRpbmciKTsKLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NlbmQyd2F5X3BybW1zZwotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiB0cmFuc21pdHMgZGF0YSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLgotICogICAgICAgICAgUHJtbXNnIHNwZWNpZmllcyB0aGF0IHRoZSA4LWJ5dGVzIG9mIGRhdGEgYXJlIHRvIGJlIG1vdmVkCi0gKiAgICAgICAgICBpbnRvIHRoZSBwYXJhbWV0ZXIgbGlzdC4gVGhpcyBpcyBhIHR3by13YXkgbWVzc2FnZSBhbmQgdGhlCi0gKiAgICAgICAgICByZWNlaXZlciBvZiB0aGUgbWVzc2FnZSBpcyBleHBlY3RlZCB0byByZXBseS4gQSBidWZmZXIKLSAqICAgICAgICAgIGlzIHByb3ZpZGVkIGludG8gd2hpY2ggSVVDViBtb3ZlcyB0aGUgcmVwbHkgdG8gdGhpcwotICogICAgICAgICAgbWVzc2FnZS4KLSAqIElucHV0OiBwYXRoaWQgLSBwYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlcgotICogICAgICAgIHRyZ2NscyAtIHNwZWNpZmllcyB0YXJnZXQgY2xhc3MKLSAqICAgICAgICBzcmNjbHMgLSBzcGVjaWZpZXMgdGhlIHNvdXJjZSBtZXNzYWdlIGNsYXNzCi0gKiAgICAgICAgbXNndGFnIC0gc3BlY2lmaWVzIGEgdGFnIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZQotICogICAgICAgIGZsYWdzMSAtIG9wdGlvbiBmb3IgcGF0aAotICogICAgICAgICAgICAgICAgIElQUFJUWS0gc3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZQotICogICAgICAgIHBybW1zZyAtIDgtYnl0ZXMgb2YgZGF0YSB0byBiZSBwbGFjZWQgaW4gcGFyYW1ldGVyIGxpc3QKLSAqICAgICAgICBhbnNidWYgLSBhZGRyZXNzIG9mIGJ1ZmZlciB0byByZXBseSB3aXRoCi0gKiAgICAgICAgYW5zbGVuIC0gbGVuZ3RoIG9mIGJ1ZmZlciB0byByZXBseSB3aXRoCi0gKiBPdXRwdXQ6IG1zZ2lkIC0gc3BlY2lmaWVzIHRoZSBtZXNzYWdlIElELgotICogUmV0dXJuOiBiMmYwX3Jlc3VsdCAtIHJldHVybiBjb2RlIGZyb20gQ1AKLSAqICAgICAgICAgKC1FSU5WQUwpIC0gYnVmZmVyIGFkZHJlc3MgaXMgTlVMTAotKi8KLWludAotaXVjdl9zZW5kMndheV9wcm1tc2cgKF9fdTE2IHBhdGhpZCwKLQkJICAgICAgX191MzIgKiBtc2dpZCwKLQkJICAgICAgX191MzIgdHJnY2xzLAotCQkgICAgICBfX3UzMiBzcmNjbHMsCi0JCSAgICAgIF9fdTMyIG1zZ3RhZywKLQkJICAgICAgdWxvbmcgZmxhZ3MxLCBfX3U4IHBybW1zZ1s4XSwgdm9pZCAqYW5zYnVmLCB1bG9uZyBhbnNsZW4pCi17Ci0JaXBhcm1sX2RwbCAqcGFybTsKLQl1bG9uZyBiMmYwX3Jlc3VsdDsKLQotCWl1Y3ZfZGVidWcoMiwgImVudGVyaW5nIik7Ci0KLQlpZiAoIWFuc2J1ZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYXJtID0gKGlwYXJtbF9kcGwgKilncmFiX3BhcmFtKCk7Ci0KLQlwYXJtLT5pcHBhdGhpZCA9IHBhdGhpZDsKLQlwYXJtLT5pcHRyZ2NscyA9IHRyZ2NsczsKLQlwYXJtLT5pcHNyY2NscyA9IHNyY2NsczsKLQlwYXJtLT5pcG1zZ3RhZyA9IG1zZ3RhZzsKLQlwYXJtLT5pcGJmYWRyMiA9IChfX3UzMikgKCh1bG9uZykgYW5zYnVmKTsKLQlwYXJtLT5pcGJmbG4yZiA9IChfX3UzMikgYW5zbGVuOwotCXBhcm0tPmlwZmxhZ3MxID0gKElQUk1EQVRBIHwgZmxhZ3MxKTsJLyogbWVzc2FnZSBpbiBwcm1saXN0ICovCi0JbWVtY3B5KHBhcm0tPmlwcm1tc2csIHBybW1zZywgc2l6ZW9mKHBhcm0tPmlwcm1tc2cpKTsKLQotCWIyZjBfcmVzdWx0ID0gYjJmMChTRU5ELCBwYXJtKTsKLQotCWlmICgoIWIyZjBfcmVzdWx0KSAmJiAobXNnaWQpKQotCQkqbXNnaWQgPSBwYXJtLT5pcG1zZ2lkOwotCXJlbGVhc2VfcGFyYW0ocGFybSk7Ci0KLQlpdWN2X2RlYnVnKDIsICJleGl0aW5nIik7Ci0KLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NlbmQyd2F5X3BybW1zZ19hcnJheQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiB0cmFuc21pdHMgZGF0YSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLgotICogICAgICAgICAgUHJtbXNnIHNwZWNpZmllcyB0aGF0IHRoZSA4LWJ5dGVzIG9mIGRhdGEgYXJlIHRvIGJlIG1vdmVkCi0gKiAgICAgICAgICBpbnRvIHRoZSBwYXJhbWV0ZXIgbGlzdC4gVGhpcyBpcyBhIHR3by13YXkgbWVzc2FnZSBhbmQgdGhlCi0gKiAgICAgICAgICByZWNlaXZlciBvZiB0aGUgbWVzc2FnZSBpcyBleHBlY3RlZCB0byByZXBseS4gQSBidWZmZXIKLSAqICAgICAgICAgIGlzIHByb3ZpZGVkIGludG8gd2hpY2ggSVVDViBtb3ZlcyB0aGUgcmVwbHkgdG8gdGhpcwotICogICAgICAgICAgbWVzc2FnZS4gVGhlIGNvbnRlbnRzIG9mIGFuc2J1ZiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAqICAgICAgICAgIGFycmF5IG9mIGFkZHJlc3NlcyBhbmQgbGVuZ3RocyBvZiBkaXNjb250aWd1b3VzIGJ1ZmZlcnMKLSAqICAgICAgICAgIHRoYXQgY29udGFpbiB0aGUgcmVwbHkuCi0gKiBJbnB1dDogcGF0aGlkIC0gcGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqICAgICAgICB0cmdjbHMgLSBzcGVjaWZpZXMgdGFyZ2V0IGNsYXNzCi0gKiAgICAgICAgc3JjY2xzIC0gc3BlY2lmaWVzIHRoZSBzb3VyY2UgbWVzc2FnZSBjbGFzcwotICogICAgICAgIG1zZ3RhZyAtIHNwZWNpZmllcyBhIHRhZyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UKLSAqICAgICAgICBmbGFnczEgLSBvcHRpb24gZm9yIHBhdGgKLSAqICAgICAgICAgICAgICAgICBJUFBSVFktIHNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UKLSAqICAgICAgICBwcm1tc2cgLSA4LWJ5dGVzIG9mIGRhdGEgdG8gYmUgcGxhY2VkIGludG8gdGhlIHBhcmFtZXRlciBsaXN0Ci0gKiAgICAgICAgYW5zYnVmIC0gYWRkcmVzcyBvZiBidWZmZXIgdG8gcmVwbHkgd2l0aAotICogICAgICAgIGFuc2xlbiAtIGxlbmd0aCBvZiBidWZmZXIgdG8gcmVwbHkgd2l0aAotICogT3V0cHV0OiBtc2dpZCAtIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqIFJldHVybjogYjJmMF9yZXN1bHQgLSByZXR1cm4gY29kZSBmcm9tIENQCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIGFuc2J1ZiBhZGRyZXNzIGlzIE5VTEwKLSAqLwotaW50Ci1pdWN2X3NlbmQyd2F5X3BybW1zZ19hcnJheSAoX191MTYgcGF0aGlkLAotCQkJICAgIF9fdTMyICogbXNnaWQsCi0JCQkgICAgX191MzIgdHJnY2xzLAotCQkJICAgIF9fdTMyIHNyY2NscywKLQkJCSAgICBfX3UzMiBtc2d0YWcsCi0JCQkgICAgaW50IGZsYWdzMSwKLQkJCSAgICBfX3U4IHBybW1zZ1s4XSwKLQkJCSAgICBpdWN2X2FycmF5X3QgKiBhbnNidWYsIHVsb25nIGFuc2xlbikKLXsKLQlpcGFybWxfZHBsICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0OwotCi0JaXVjdl9kZWJ1ZygyLCAiZW50ZXJpbmciKTsKLQotCWlmICghYW5zYnVmKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcm0gPSAoaXBhcm1sX2RwbCAqKWdyYWJfcGFyYW0oKTsKLQotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCXBhcm0tPmlwdHJnY2xzID0gdHJnY2xzOwotCXBhcm0tPmlwc3JjY2xzID0gc3JjY2xzOwotCXBhcm0tPmlwbXNndGFnID0gbXNndGFnOwotCXBhcm0tPmlwYmZhZHIyID0gKF9fdTMyKSAoKHVsb25nKSBhbnNidWYpOwotCXBhcm0tPmlwYmZsbjJmID0gKF9fdTMyKSBhbnNsZW47Ci0JcGFybS0+aXBmbGFnczEgPSAoSVBSTURBVEEgfCBJUEFOU0xTVCB8IGZsYWdzMSk7Ci0JbWVtY3B5KHBhcm0tPmlwcm1tc2csIHBybW1zZywgc2l6ZW9mKHBhcm0tPmlwcm1tc2cpKTsKLQliMmYwX3Jlc3VsdCA9IGIyZjAoU0VORCwgcGFybSk7Ci0JaWYgKCghYjJmMF9yZXN1bHQpICYmIChtc2dpZCkpCi0JCSptc2dpZCA9IHBhcm0tPmlwbXNnaWQ7Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotCWl1Y3ZfZGVidWcoMiwgImV4aXRpbmciKTsKLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLXZvaWQKLWl1Y3Zfc2V0bWFza19jcHVpZCAodm9pZCAqcmVzdWx0KQotewotICAgICAgICBpcGFybWxfc2V0X21hc2sgKnBhcm07Ci0KLSAgICAgICAgaXVjdl9kZWJ1ZygxLCAiZW50ZXJpbmciKTsKLSAgICAgICAgcGFybSA9IChpcGFybWxfc2V0X21hc2sgKilncmFiX3BhcmFtKCk7Ci0gICAgICAgIHBhcm0tPmlwbWFzayA9ICooKF9fdTgqKXJlc3VsdCk7Ci0gICAgICAgICooKHVsb25nICopcmVzdWx0KSA9IGIyZjAoU0VUTUFTSywgcGFybSk7Ci0gICAgICAgIHJlbGVhc2VfcGFyYW0ocGFybSk7Ci0KLSAgICAgICAgaXVjdl9kZWJ1ZygxLCAiYjJmMF9yZXN1bHQgPSAlbGQiLCAqKCh1bG9uZyAqKXJlc3VsdCkpOwotICAgICAgICBpdWN2X2RlYnVnKDEsICJleGl0aW5nIik7Ci19Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NldG1hc2sKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZm9sbG93aW5nIElVQ1YKLSAqICAgICAgICAgIGV4dGVybmFsIGludGVycnVwdGlvbnM6IE5vbnByaW9yaXR5IGFuZCBwcmlvcml0eSBtZXNzYWdlCi0gKiAgICAgICAgICBpbnRlcnJ1cHRzLCBub25wcmlvcml0eSBhbmQgcHJpb3JpdHkgcmVwbHkgaW50ZXJydXB0cy4KLSAqIElucHV0OiBTZXRNYXNrRmxhZyAtIG9wdGlvbnMgZm9yIGludGVycnVwdHMKLSAqICAgICAgICAgICAweDgwIC0gTm9ucHJpb3JpdHlfTWVzc2FnZVBlbmRpbmdJbnRlcnJ1cHRzRmxhZwotICogICAgICAgICAgIDB4NDAgLSBQcmlvcml0eV9NZXNzYWdlUGVuZGluZ0ludGVycnVwdHNGbGFnCi0gKiAgICAgICAgICAgMHgyMCAtIE5vbnByaW9yaXR5X01lc3NhZ2VDb21wbGV0aW9uSW50ZXJydXB0c0ZsYWcKLSAqICAgICAgICAgICAweDEwIC0gUHJpb3JpdHlfTWVzc2FnZUNvbXBsZXRpb25JbnRlcnJ1cHRzRmxhZwotICogICAgICAgICAgIDB4MDggLSBJVUNWQ29udHJvbEludGVycnVwdHNGbGFnCi0gKiBPdXRwdXQ6IE5BCi0gKiBSZXR1cm46IGIyZjBfcmVzdWx0IC0gcmV0dXJuIGNvZGUgZnJvbSBDUAotKi8KLWludAotaXVjdl9zZXRtYXNrIChpbnQgU2V0TWFza0ZsYWcpCi17Ci0JdW5pb24gewotCQl1bG9uZyByZXN1bHQ7Ci0JCV9fdTggIHBhcmFtOwotCX0gdTsKLQlpbnQgY3B1OwotCi0JdS5wYXJhbSA9IFNldE1hc2tGbGFnOwotCWNwdSA9IGdldF9jcHUoKTsKLQlzbXBfY2FsbF9mdW5jdGlvbl9vbihpdWN2X3NldG1hc2tfY3B1aWQsICZ1LCAwLCAxLCBpdWN2X2NwdWlkKTsKLQlwdXRfY3B1KCk7Ci0KLQlyZXR1cm4gdS5yZXN1bHQ7Ci19Ci0KLS8qKgotICogaXVjdl9zZXZlcjoKLSAqIEBwYXRoaWQ6ICAgIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiBAdXNlcl9kYXRhOiAxNi1ieXRlIG9mIHVzZXIgZGF0YQotICoKLSAqIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyBhbiBpdWN2IHBhdGguCi0gKiBSZXR1cm5zOiByZXR1cm4gY29kZSBmcm9tIENQCi0gKi8KLWludAotaXVjdl9zZXZlcihfX3UxNiBwYXRoaWQsIF9fdTggdXNlcl9kYXRhWzE2XSkKLXsKLQlpcGFybWxfY29udHJvbCAqcGFybTsKLQl1bG9uZyBiMmYwX3Jlc3VsdCA9IDA7Ci0KLQlpdWN2X2RlYnVnKDEsICJlbnRlcmluZyIpOwotCXBhcm0gPSAoaXBhcm1sX2NvbnRyb2wgKilncmFiX3BhcmFtKCk7Ci0KLQltZW1jcHkocGFybS0+aXB1c2VyLCB1c2VyX2RhdGEsIHNpemVvZihwYXJtLT5pcHVzZXIpKTsKLQlwYXJtLT5pcHBhdGhpZCA9IHBhdGhpZDsKLQotCWIyZjBfcmVzdWx0ID0gYjJmMChTRVZFUiwgcGFybSk7Ci0KLQlpZiAoIWIyZjBfcmVzdWx0KQotCQlpdWN2X3JlbW92ZV9wYXRoaWQocGF0aGlkKTsKLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygxLCAiZXhpdGluZyIpOwotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoKLSAqIEludGVycnVwdCBIYW5kbGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogaXVjdl9pcnFfaGFuZGxlcjoKLSAqIEByZWdzOiBDdXJyZW50IHJlZ2lzdGVycwotICogQGNvZGU6IGlycSBjb2RlCi0gKgotICogSGFuZGxlcyBleHRlcm5hbCBpbnRlcnJ1cHRzIGNvbWluZyBpbiBmcm9tIENQLgotICogUGxhY2VzIHRoZSBpbnRlcnJ1cHQgYnVmZmVyIG9uIGEgcXVldWUgYW5kIHNjaGVkdWxlcyBpdWN2X3Rhc2tsZXRfaGFuZGxlcigpLgotICovCi1zdGF0aWMgdm9pZAotaXVjdl9pcnFfaGFuZGxlcihfX3UxNiBjb2RlKQotewotCWl1Y3ZfaXJxZGF0YSAqaXJxZGF0YTsKLQotCWlycWRhdGEgPSBrbWFsbG9jKHNpemVvZihpdWN2X2lycWRhdGEpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWlycWRhdGEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQltZW1jcHkoJmlycWRhdGEtPmRhdGEsIGl1Y3ZfZXh0ZXJuYWxfaW50X2J1ZmZlciwKLQkgICAgICAgc2l6ZW9mKGl1Y3ZfR2VuZXJhbEludGVycnVwdCkpOwotCi0Jc3Bpbl9sb2NrKCZpdWN2X2lycV9xdWV1ZV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZpcnFkYXRhLT5xdWV1ZSwgJml1Y3ZfaXJxX3F1ZXVlKTsKLQlzcGluX3VubG9jaygmaXVjdl9pcnFfcXVldWVfbG9jayk7Ci0KLQl0YXNrbGV0X3NjaGVkdWxlKCZpdWN2X3Rhc2tsZXQpOwotfQotCi0vKioKLSAqIGl1Y3ZfZG9faW50OgotICogQGludF9idWY6IFBvaW50ZXIgdG8gY29weSBvZiBleHRlcm5hbCBpbnRlcnJ1cHQgYnVmZmVyCi0gKgotICogVGhlIHdvcmtob3JzZSBmb3IgaGFuZGxpbmcgaW50ZXJydXB0cyBxdWV1ZWQgYnkgaXVjdl9pcnFfaGFuZGxlcigpLgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgYm90dG9tIGhhbGYgaXVjdl90YXNrbGV0X2hhbmRsZXIoKS4KLSAqLwotc3RhdGljIHZvaWQKLWl1Y3ZfZG9faW50KGl1Y3ZfR2VuZXJhbEludGVycnVwdCAqIGludF9idWYpCi17Ci0JaGFuZGxlciAqaCA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGg7Ci0JdWxvbmcgZmxhZ3M7Ci0JaXVjdl9pbnRlcnJ1cHRfb3BzX3QgKmludGVycnVwdCA9IE5VTEw7CS8qIGludGVycnVwdCBhZGRyZXNzZXMgKi8KLQlfX3U4IHRlbXBfYnVmZjFbMjRdLCB0ZW1wX2J1ZmYyWzI0XTsJLyogbWFza2VkIGhhbmRsZXIgaWQuICovCi0JaW50IHJjID0gMCwgaiA9IDA7Ci0JX191OCBub19saXN0ZW5lclsxNl0gPSAiTk8gTElTVEVORVIiOwotCi0JaXVjdl9kZWJ1ZygyLCAiZW50ZXJpbmcsIHBhdGhpZCAlZCwgdHlwZSAlMDJYIiwKLQkJIGludF9idWYtPmlwcGF0aGlkLCBpbnRfYnVmLT5pcHR5cGUpOwotCWl1Y3ZfZHVtcGl0KCJFeHRlcm5hbCBJbnRlcnJ1cHQgQnVmZmVyOiIsCi0JCSAgICBpbnRfYnVmLCBzaXplb2YoaXVjdl9HZW5lcmFsSW50ZXJydXB0KSk7Ci0KLQlBU0NFQkMgKG5vX2xpc3RlbmVyLCAxNik7Ci0KLQlpZiAoaW50X2J1Zi0+aXB0eXBlICE9IDAxKSB7Ci0JCWlmICgoaW50X2J1Zi0+aXBwYXRoaWQpID4gKG1heF9jb25uZWN0aW9ucyAtIDEpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogR290IGludGVycnVwdCB3aXRoIHBhdGhpZCAlZCIKLQkJCSAgICAgICAiID4gbWF4X2Nvbm5lY3Rpb25zICglbGQpXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkgICAgICAgaW50X2J1Zi0+aXBwYXRoaWQsIG1heF9jb25uZWN0aW9ucyAtIDEpOwotCQl9IGVsc2UgewotCQkJaCA9IGl1Y3ZfcGF0aGlkX3RhYmxlW2ludF9idWYtPmlwcGF0aGlkXTsKLQkJCWludGVycnVwdCA9IGgtPmludGVycnVwdF90YWJsZTsKLQkJCWl1Y3ZfZHVtcGl0KCJIYW5kbGVyOiIsIGgsIHNpemVvZihoYW5kbGVyKSk7Ci0JCX0KLQl9Ci0KLQkvKiBlbmQgb2YgaWYgc3RhdGVtZW50ICovCi0Jc3dpdGNoIChpbnRfYnVmLT5pcHR5cGUpIHsKLQkJY2FzZSAweDAxOgkJLyogY29ubmVjdGlvbiBwZW5kaW5nICovCi0JCQlpZiAobWVzc2FnZXNEaXNhYmxlZCkgewotCQkJICAgIGl1Y3Zfc2V0bWFzayh+MCk7Ci0JCQkgICAgbWVzc2FnZXNEaXNhYmxlZCA9IDA7Ci0JCQl9Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXVjdl9sb2NrLCBmbGFncyk7Ci0JCQlsaXN0X2Zvcl9lYWNoKGxoLCAmaXVjdl9oYW5kbGVyX3RhYmxlKSB7Ci0JCQkJaCA9IGxpc3RfZW50cnkobGgsIGhhbmRsZXIsIGxpc3QpOwotCQkJCW1lbWNweSh0ZW1wX2J1ZmYxLCAmKGludF9idWYtPmlwdm1pZCksIDI0KTsKLQkJCQltZW1jcHkodGVtcF9idWZmMiwgJihoLT5pZC51c2VyaWQpLCAyNCk7Ci0JCQkJZm9yIChqID0gMDsgaiA8IDI0OyBqKyspIHsKLQkJCQkJdGVtcF9idWZmMVtqXSAmPSAoaC0+aWQubWFzaylbal07Ci0JCQkJCXRlbXBfYnVmZjJbal0gJj0gKGgtPmlkLm1hc2spW2pdOwotCQkJCX0KLQotCQkJCWl1Y3ZfZHVtcGl0KCJ0ZW1wX2J1ZmYxOiIsCi0JCQkJCSAgICB0ZW1wX2J1ZmYxLCBzaXplb2YodGVtcF9idWZmMSkpOwotCQkJCWl1Y3ZfZHVtcGl0KCJ0ZW1wX2J1ZmYyIiwKLQkJCQkJICAgIHRlbXBfYnVmZjIsIHNpemVvZih0ZW1wX2J1ZmYyKSk7Ci0KLQkJCQlpZiAoIW1lbWNtcCAodGVtcF9idWZmMSwgdGVtcF9idWZmMiwgMjQpKSB7Ci0KLQkJCQkJaXVjdl9kZWJ1ZygyLAotCQkJCQkJICAgImZvdW5kIGEgbWF0Y2hpbmcgaGFuZGxlciIpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UKLQkJCQkJaCA9IE5VTEw7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0JCQlpZiAoaCkgewotCQkJCS8qIEFERCBQQVRIIFRPIFBBVEhJRCBUQUJMRSAqLwotCQkJCXJjID0gaXVjdl9hZGRfcGF0aGlkKGludF9idWYtPmlwcGF0aGlkLCBoKTsKLQkJCQlpZiAocmMpIHsKLQkJCQkJaXVjdl9zZXZlciAoaW50X2J1Zi0+aXBwYXRoaWQsCi0JCQkJCQkgICAgbm9fbGlzdGVuZXIpOwotCQkJCQlpdWN2X2RlYnVnKDEsCi0JCQkJCQkgICAiYWRkX3BhdGhpZCBmYWlsZWQsIHJjID0gJWQiLAotCQkJCQkJICAgcmMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludGVycnVwdCA9IGgtPmludGVycnVwdF90YWJsZTsKLQkJCQkJaWYgKGludGVycnVwdC0+Q29ubmVjdGlvblBlbmRpbmcpIHsKLQkJCQkJCUVCQ0FTQyAoaW50X2J1Zi0+aXB2bWlkLCA4KTsKLQkJCQkJCWludGVycnVwdC0+Q29ubmVjdGlvblBlbmRpbmcoCi0JCQkJCQkJKGl1Y3ZfQ29ubmVjdGlvblBlbmRpbmcgKilpbnRfYnVmLAotCQkJCQkJCWgtPnBnbV9kYXRhKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlpdWN2X3NldmVyKGludF9idWYtPmlwcGF0aGlkLAotCQkJCQkJCSAgIG5vX2xpc3RlbmVyKTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlpdWN2X3NldmVyKGludF9idWYtPmlwcGF0aGlkLCBub19saXN0ZW5lcik7Ci0JCQlicmVhazsKLQotCQljYXNlIDB4MDI6CQkvKmNvbm5lY3Rpb24gY29tcGxldGUgKi8KLQkJCWlmIChtZXNzYWdlc0Rpc2FibGVkKSB7Ci0JCQkgICAgaXVjdl9zZXRtYXNrKH4wKTsKLQkJCSAgICBtZXNzYWdlc0Rpc2FibGVkID0gMDsKLQkJCX0KLQkJCWlmIChoKSB7Ci0JCQkJaWYgKGludGVycnVwdC0+Q29ubmVjdGlvbkNvbXBsZXRlKQotCQkJCXsKLQkJCQkJaW50ZXJydXB0LT5Db25uZWN0aW9uQ29tcGxldGUoCi0JCQkJCQkoaXVjdl9Db25uZWN0aW9uQ29tcGxldGUgKilpbnRfYnVmLAotCQkJCQkJaC0+cGdtX2RhdGEpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWl1Y3ZfZGVidWcoMSwKLQkJCQkJCSAgICJDb25uZWN0aW9uQ29tcGxldGUgbm90IGNhbGxlZCIpOwotCQkJfSBlbHNlCi0JCQkJaXVjdl9zZXZlcihpbnRfYnVmLT5pcHBhdGhpZCwgbm9fbGlzdGVuZXIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAweDAzOgkJLyogY29ubmVjdGlvbiBzZXZlcmVkICovCi0JCQlpZiAobWVzc2FnZXNEaXNhYmxlZCkgewotCQkJICAgIGl1Y3Zfc2V0bWFzayh+MCk7Ci0JCQkgICAgbWVzc2FnZXNEaXNhYmxlZCA9IDA7Ci0JCQl9Ci0JCQlpZiAoaCkgewotCQkJCWlmIChpbnRlcnJ1cHQtPkNvbm5lY3Rpb25TZXZlcmVkKQotCQkJCQlpbnRlcnJ1cHQtPkNvbm5lY3Rpb25TZXZlcmVkKAotCQkJCQkJKGl1Y3ZfQ29ubmVjdGlvblNldmVyZWQgKilpbnRfYnVmLAotCQkJCQkJaC0+cGdtX2RhdGEpOwotCi0JCQkJZWxzZQotCQkJCQlpdWN2X3NldmVyIChpbnRfYnVmLT5pcHBhdGhpZCwgbm9fbGlzdGVuZXIpOwotCQkJfSBlbHNlCi0JCQkJaXVjdl9zZXZlcihpbnRfYnVmLT5pcHBhdGhpZCwgbm9fbGlzdGVuZXIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAweDA0OgkJLyogY29ubmVjdGlvbiBxdWllc2NlZCAqLwotCQkJaWYgKG1lc3NhZ2VzRGlzYWJsZWQpIHsKLQkJCSAgICBpdWN2X3NldG1hc2sofjApOwotCQkJICAgIG1lc3NhZ2VzRGlzYWJsZWQgPSAwOwotCQkJfQotCQkJaWYgKGgpIHsKLQkJCQlpZiAoaW50ZXJydXB0LT5Db25uZWN0aW9uUXVpZXNjZWQpCi0JCQkJCWludGVycnVwdC0+Q29ubmVjdGlvblF1aWVzY2VkKAotCQkJCQkJKGl1Y3ZfQ29ubmVjdGlvblF1aWVzY2VkICopaW50X2J1ZiwKLQkJCQkJCWgtPnBnbV9kYXRhKTsKLQkJCQllbHNlCi0JCQkJCWl1Y3ZfZGVidWcoMSwKLQkJCQkJCSAgICJDb25uZWN0aW9uUXVpZXNjZWQgbm90IGNhbGxlZCIpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAweDA1OgkJLyogY29ubmVjdGlvbiByZXN1bWVkICovCi0JCQlpZiAobWVzc2FnZXNEaXNhYmxlZCkgewotCQkJICAgIGl1Y3Zfc2V0bWFzayh+MCk7Ci0JCQkgICAgbWVzc2FnZXNEaXNhYmxlZCA9IDA7Ci0JCQl9Ci0JCQlpZiAoaCkgewotCQkJCWlmIChpbnRlcnJ1cHQtPkNvbm5lY3Rpb25SZXN1bWVkKQotCQkJCQlpbnRlcnJ1cHQtPkNvbm5lY3Rpb25SZXN1bWVkKAotCQkJCQkJKGl1Y3ZfQ29ubmVjdGlvblJlc3VtZWQgKilpbnRfYnVmLAotCQkJCQkJaC0+cGdtX2RhdGEpOwotCQkJCWVsc2UKLQkJCQkJaXVjdl9kZWJ1ZygxLAotCQkJCQkJICAgIkNvbm5lY3Rpb25SZXN1bWVkIG5vdCBjYWxsZWQiKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgMHgwNjoJCS8qIHByaW9yaXR5IG1lc3NhZ2UgY29tcGxldGUgKi8KLQkJY2FzZSAweDA3OgkJLyogbm9ucHJpb3JpdHkgbWVzc2FnZSBjb21wbGV0ZSAqLwotCQkJaWYgKGgpIHsKLQkJCQlpZiAoaW50ZXJydXB0LT5NZXNzYWdlQ29tcGxldGUpCi0JCQkJCWludGVycnVwdC0+TWVzc2FnZUNvbXBsZXRlKAotCQkJCQkJKGl1Y3ZfTWVzc2FnZUNvbXBsZXRlICopaW50X2J1ZiwKLQkJCQkJCWgtPnBnbV9kYXRhKTsKLQkJCQllbHNlCi0JCQkJCWl1Y3ZfZGVidWcoMiwKLQkJCQkJCSAgICJNZXNzYWdlQ29tcGxldGUgbm90IGNhbGxlZCIpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAweDA4OgkJLyogcHJpb3JpdHkgbWVzc2FnZSBwZW5kaW5nICAqLwotCQljYXNlIDB4MDk6CQkvKiBub25wcmlvcml0eSBtZXNzYWdlIHBlbmRpbmcgICovCi0JCQlpZiAoaCkgewotCQkJCWlmIChpbnRlcnJ1cHQtPk1lc3NhZ2VQZW5kaW5nKQotCQkJCQlpbnRlcnJ1cHQtPk1lc3NhZ2VQZW5kaW5nKAotCQkJCQkJKGl1Y3ZfTWVzc2FnZVBlbmRpbmcgKikgaW50X2J1ZiwKLQkJCQkJCWgtPnBnbV9kYXRhKTsKLQkJCQllbHNlCi0JCQkJCWl1Y3ZfZGVidWcoMiwKLQkJCQkJCSAgICJNZXNzYWdlUGVuZGluZyBub3QgY2FsbGVkIik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoJCS8qIHVua25vd24gaXVjdiB0eXBlICovCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5rbm93biBpdWN2IGludGVycnVwdFxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOwotCQkJYnJlYWs7Ci0JfQkJCS8qIGVuZCBzd2l0Y2ggKi8KLQotCWl1Y3ZfZGVidWcoMiwgImV4aXRpbmcgcGF0aGlkICVkLCB0eXBlICUwMlgiLAotCQkgaW50X2J1Zi0+aXBwYXRoaWQsIGludF9idWYtPmlwdHlwZSk7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qKgotICogaXVjdl90YXNrbGV0X2hhbmRsZXI6Ci0gKgotICogVGhpcyBmdW5jdGlvbiBsb29wcyBvdmVyIHRoZSBxdWV1ZSBvZiBpcnEgYnVmZmVycyBhbmQgcnVucyBpdWN2X2RvX2ludCgpCi0gKiBvbiBldmVyeSBxdWV1ZSBlbGVtZW50LgotICovCi1zdGF0aWMgdm9pZAotaXVjdl90YXNrbGV0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBpZ25vcmVkKQotewotCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OwotCXVsb25nICBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpdWN2X2lycV9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGQoJmhlYWQsICZpdWN2X2lycV9xdWV1ZSk7Ci0JbGlzdF9kZWxfaW5pdCgmaXVjdl9pcnFfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2lycV9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQluZXh0ID0gaGVhZC5uZXh0OwotCXdoaWxlIChuZXh0ICE9ICZoZWFkKSB7Ci0JCWl1Y3ZfaXJxZGF0YSAqcCA9IGxpc3RfZW50cnkobmV4dCwgaXVjdl9pcnFkYXRhLCBxdWV1ZSk7Ci0KLQkJbmV4dCA9IG5leHQtPm5leHQ7Ci0JCWl1Y3ZfZG9faW50KCZwLT5kYXRhKTsKLQkJa2ZyZWUocCk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi1zdWJzeXNfaW5pdGNhbGwoaXVjdl9pbml0KTsKLW1vZHVsZV9leGl0KGl1Y3ZfZXhpdCk7Ci0KLS8qKgotICogRXhwb3J0IGFsbCBwdWJsaWMgc3R1ZmYKLSAqLwotRVhQT1JUX1NZTUJPTCAoaXVjdl9idXMpOwotRVhQT1JUX1NZTUJPTCAoaXVjdl9yb290KTsKLUVYUE9SVF9TWU1CT0wgKGl1Y3ZfYWNjZXB0KTsKLUVYUE9SVF9TWU1CT0wgKGl1Y3ZfY29ubmVjdCk7Ci0jaWYgMAotRVhQT1JUX1NZTUJPTCAoaXVjdl9wdXJnZSk7Ci1FWFBPUlRfU1lNQk9MIChpdWN2X3F1ZXJ5X21heGNvbm4pOwotRVhQT1JUX1NZTUJPTCAoaXVjdl9xdWVyeV9idWZzaXplKTsKLUVYUE9SVF9TWU1CT0wgKGl1Y3ZfcXVpZXNjZSk7Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0wgKGl1Y3ZfcmVjZWl2ZSk7Ci0jaWYgMAotRVhQT1JUX1NZTUJPTCAoaXVjdl9yZWNlaXZlX2FycmF5KTsKLSNlbmRpZgotRVhQT1JUX1NZTUJPTCAoaXVjdl9yZWplY3QpOwotI2lmIDAKLUVYUE9SVF9TWU1CT0wgKGl1Y3ZfcmVwbHkpOwotRVhQT1JUX1NZTUJPTCAoaXVjdl9yZXBseV9hcnJheSk7Ci1FWFBPUlRfU1lNQk9MIChpdWN2X3Jlc3VtZSk7Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0wgKGl1Y3ZfcmVwbHlfcHJtbXNnKTsKLUVYUE9SVF9TWU1CT0wgKGl1Y3Zfc2VuZCk7Ci1FWFBPUlRfU1lNQk9MIChpdWN2X3NlbmQyd2F5KTsKLUVYUE9SVF9TWU1CT0wgKGl1Y3Zfc2VuZDJ3YXlfYXJyYXkpOwotRVhQT1JUX1NZTUJPTCAoaXVjdl9zZW5kMndheV9wcm1tc2cpOwotRVhQT1JUX1NZTUJPTCAoaXVjdl9zZW5kMndheV9wcm1tc2dfYXJyYXkpOwotI2lmIDAKLUVYUE9SVF9TWU1CT0wgKGl1Y3Zfc2VuZF9hcnJheSk7Ci1FWFBPUlRfU1lNQk9MIChpdWN2X3NlbmRfcHJtbXNnKTsKLUVYUE9SVF9TWU1CT0wgKGl1Y3Zfc2V0bWFzayk7Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0wgKGl1Y3Zfc2V2ZXIpOwotRVhQT1JUX1NZTUJPTCAoaXVjdl9yZWdpc3Rlcl9wcm9ncmFtKTsKLUVYUE9SVF9TWU1CT0wgKGl1Y3ZfdW5yZWdpc3Rlcl9wcm9ncmFtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvaXVjdi5oIGIvZHJpdmVycy9zMzkwL25ldC9pdWN2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmIxYjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9pdWN2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NDkgKzAsMCBAQAotLyoKLSAqICBkcml2ZXJzL3MzOTAvbmV0L2l1Y3YuaAotICogICAgSVVDViBiYXNlIHN1cHBvcnQuCi0gKgotICogIFMzOTAgdmVyc2lvbgotICogICAgQ29weXJpZ2h0IChDKSAyMDAwIElCTSBDb3Jwb3JhdGlvbgotICogICAgQXV0aG9yKHMpOkFsYW4gQWx0bWFyayAoQWxhbl9BbHRtYXJrQHVzLmlibS5jb20pCi0gKgkJWGVuaWEgVGthdHNjaG93ICh4ZW5pYUB1cy5pYm0uY29tKQotICoKLSAqCi0gKiBGdW5jdGlvbmFsaXR5OgotICogVG8gZXhwbG9yZSBhbnkgb2YgdGhlIElVQ1YgZnVuY3Rpb25zLCBvbmUgbXVzdCBmaXJzdCByZWdpc3RlcgotICogdGhlaXIgcHJvZ3JhbSB1c2luZyBpdWN2X3JlZ2lzdGVyX3Byb2dyYW0oKS4gT25jZSB5b3VyIHByb2dyYW0gaGFzCi0gKiBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGEgcmVnaXN0ZXIsIGl0IGNhbiBleHBsb2l0IHRoZSBvdGhlciBmdW5jdGlvbnMuCi0gKiBGb3IgZnVydGh1ciByZWZlcmVuY2Ugb24gYWxsIElVQ1YgZnVuY3Rpb25hbGl0eSwgcmVmZXIgdG8gdGhlCi0gKiBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlcyBib29rLCBhbHNvIGF2YWlsYWJsZSBvbiB0aGUgd2ViCi0gKiB0aHJ1IHd3dy5pYm0uY29tL3MzOTAvdm0vcHVicywgbWFudWFsICMgU0MyNC01NzYwCi0gKgotICogICAgICBEZWZpbml0aW9uIG9mIFJldHVybiBDb2RlcwotICogICAgICAtQWxsIHBvc2l0aXZlIHJldHVybiBjb2RlcyBpbmNsdWRpbmcgemVybyBhcmUgcmVmbGVjdGVkIGJhY2sKLSAqICAgICAgIGZyb20gQ1AgZXhjZXB0IGZvciBpdWN2X3JlZ2lzdGVyX3Byb2dyYW0uIFRoZSBkZWZpbml0aW9uIG9mIGVhY2gKLSAqICAgICAgIHJldHVybiBjb2RlIGNhbiBiZSBmb3VuZCBpbiBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlcyBib29rLgotICogICAgICAgQWxzbyBhdmFpbGFibGUgb24gdGhlIHdlYiB0aHJ1IHd3dy5pYm0uY29tL3MzOTAvdm0vcHVicywgbWFudWFsICMgU0MyNC01NzYwCi0gKiAgICAgIC0gUmV0dXJuIENvZGUgb2Y6Ci0gKiAgICAgICAgICAgICAoLUVJTlZBTCkgSW52YWxpZCB2YWx1ZQotICogICAgICAgICAgICAgKC1FTk9NRU0pIHN0b3JhZ2UgYWxsb2NhdGlvbiBmYWlsZWQKLSAqCXBnbWFzayBkZWZpbmVkIGluIGl1Y3ZfcmVnaXN0ZXJfcHJvZ3JhbSB3aWxsIGJlIHNldCBkZXBlbmRpbmcgb24gaW5wdXQKLSAqCXBhcmFtdGVycy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2RlYnVnLmg+Ci0KLS8qKgotICogRGVidWcgRmFjaWxpdHkgc3R1ZmYKLSAqLwotI2RlZmluZSBJVUNWX0RCRl9TRVRVUF9OQU1FICJpdWN2X3NldHVwIgotI2RlZmluZSBJVUNWX0RCRl9TRVRVUF9MRU4gMzIKLSNkZWZpbmUgSVVDVl9EQkZfU0VUVVBfUEFHRVMgMgotI2RlZmluZSBJVUNWX0RCRl9TRVRVUF9OUl9BUkVBUyAxCi0jZGVmaW5lIElVQ1ZfREJGX1NFVFVQX0xFVkVMIDMKLQotI2RlZmluZSBJVUNWX0RCRl9EQVRBX05BTUUgIml1Y3ZfZGF0YSIKLSNkZWZpbmUgSVVDVl9EQkZfREFUQV9MRU4gMTI4Ci0jZGVmaW5lIElVQ1ZfREJGX0RBVEFfUEFHRVMgMgotI2RlZmluZSBJVUNWX0RCRl9EQVRBX05SX0FSRUFTIDEKLSNkZWZpbmUgSVVDVl9EQkZfREFUQV9MRVZFTCAyCi0KLSNkZWZpbmUgSVVDVl9EQkZfVFJBQ0VfTkFNRSAiaXVjdl90cmFjZSIKLSNkZWZpbmUgSVVDVl9EQkZfVFJBQ0VfTEVOIDE2Ci0jZGVmaW5lIElVQ1ZfREJGX1RSQUNFX1BBR0VTIDQKLSNkZWZpbmUgSVVDVl9EQkZfVFJBQ0VfTlJfQVJFQVMgMQotI2RlZmluZSBJVUNWX0RCRl9UUkFDRV9MRVZFTCAzCi0KLSNkZWZpbmUgSVVDVl9EQkZfVEVYVChuYW1lLGxldmVsLHRleHQpIFwKLQlkbyB7IFwKLQkJZGVidWdfdGV4dF9ldmVudChpdWN2X2RiZl8jI25hbWUsbGV2ZWwsdGV4dCk7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIElVQ1ZfREJGX0hFWChuYW1lLGxldmVsLGFkZHIsbGVuKSBcCi0JZG8geyBcCi0JCWRlYnVnX2V2ZW50KGl1Y3ZfZGJmXyMjbmFtZSxsZXZlbCwodm9pZCopKGFkZHIpLGxlbik7IFwKLQl9IHdoaWxlICgwKQotCi1ERUNMQVJFX1BFUl9DUFUoY2hhclsyNTZdLCBpdWN2X2RiZl90eHRfYnVmKTsKLQotI2RlZmluZSBJVUNWX0RCRl9URVhUXyhuYW1lLGxldmVsLHRleHQuLi4pCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWNoYXIqIGl1Y3ZfZGJmX3R4dF9idWYgPSBnZXRfY3B1X3ZhcihpdWN2X2RiZl90eHRfYnVmKTsJXAotCQlzcHJpbnRmKGl1Y3ZfZGJmX3R4dF9idWYsIHRleHQpOwkJICAJXAotCQlkZWJ1Z190ZXh0X2V2ZW50KGl1Y3ZfZGJmXyMjbmFtZSxsZXZlbCxpdWN2X2RiZl90eHRfYnVmKTsgXAotCQlwdXRfY3B1X3ZhcihpdWN2X2RiZl90eHRfYnVmKTsJCQkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgSVVDVl9EQkZfU1BSSU5URihuYW1lLGxldmVsLHRleHQuLi4pIFwKLQlkbyB7IFwKLQkJZGVidWdfc3ByaW50Zl9ldmVudChpdWN2X2RiZl90cmFjZSwgbGV2ZWwsICMjdGV4dCApOyBcCi0JCWRlYnVnX3NwcmludGZfZXZlbnQoaXVjdl9kYmZfdHJhY2UsIGxldmVsLCB0ZXh0ICk7IFwKLQl9IHdoaWxlICgwKQotCi0vKioKLSAqIHNvbWUgbW9yZSBkZWJ1ZyBzdHVmZgotICovCi0jZGVmaW5lIElVQ1ZfSEVYRFVNUDE2KGltcG9ydGFuY2UsaGVhZGVyLHB0cikgXAotUFJJTlRfIyNpbXBvcnRhbmNlKGhlYWRlciAiJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgIiBcCi0JCSAgICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBcCi0JCSAgICooKChjaGFyKilwdHIpKSwqKCgoY2hhciopcHRyKSsxKSwqKCgoY2hhciopcHRyKSsyKSwgXAotCQkgICAqKCgoY2hhciopcHRyKSszKSwqKCgoY2hhciopcHRyKSs0KSwqKCgoY2hhciopcHRyKSs1KSwgXAotCQkgICAqKCgoY2hhciopcHRyKSs2KSwqKCgoY2hhciopcHRyKSs3KSwqKCgoY2hhciopcHRyKSs4KSwgXAotCQkgICAqKCgoY2hhciopcHRyKSs5KSwqKCgoY2hhciopcHRyKSsxMCksKigoKGNoYXIqKXB0cikrMTEpLCBcCi0JCSAgICooKChjaGFyKilwdHIpKzEyKSwqKCgoY2hhciopcHRyKSsxMyksIFwKLQkJICAgKigoKGNoYXIqKXB0cikrMTQpLCooKChjaGFyKilwdHIpKzE1KSk7IFwKLVBSSU5UXyMjaW1wb3J0YW5jZShoZWFkZXIgIiUwMnggJTAyeCAlMDJ4ICUwMnggICUwMnggJTAyeCAlMDJ4ICUwMnggICIgXAotCQkgICAiJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgXAotCQkgICAqKCgoY2hhciopcHRyKSsxNiksKigoKGNoYXIqKXB0cikrMTcpLCBcCi0JCSAgICooKChjaGFyKilwdHIpKzE4KSwqKCgoY2hhciopcHRyKSsxOSksIFwKLQkJICAgKigoKGNoYXIqKXB0cikrMjApLCooKChjaGFyKilwdHIpKzIxKSwgXAotCQkgICAqKCgoY2hhciopcHRyKSsyMiksKigoKGNoYXIqKXB0cikrMjMpLCBcCi0JCSAgICooKChjaGFyKilwdHIpKzI0KSwqKCgoY2hhciopcHRyKSsyNSksIFwKLQkJICAgKigoKGNoYXIqKXB0cikrMjYpLCooKChjaGFyKilwdHIpKzI3KSwgXAotCQkgICAqKCgoY2hhciopcHRyKSsyOCksKigoKGNoYXIqKXB0cikrMjkpLCBcCi0JCSAgICooKChjaGFyKilwdHIpKzMwKSwqKCgoY2hhciopcHRyKSszMSkpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWl1Y3ZfaGV4X2R1bXAodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotCXNpemVfdCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmIChpICYmICEoaSAlIDE2KSkKLQkJCXByaW50aygiXG4iKTsKLQkJcHJpbnRrKCIlMDJ4ICIsICooYnVmICsgaSkpOwotCX0KLQlwcmludGsoIlxuIik7Ci19Ci0vKioKLSAqIGVuZCBvZiBkZWJ1ZyBzdHVmZgotICovCi0KLSNkZWZpbmUgdWNoYXIgIHVuc2lnbmVkIGNoYXIKLSNkZWZpbmUgdXNob3J0IHVuc2lnbmVkIHNob3J0Ci0jZGVmaW5lIHVsb25nICB1bnNpZ25lZCBsb25nCi0jZGVmaW5lIGl1Y3ZfaGFuZGxlX3Qgdm9pZCAqCi0KLS8qIGZsYWdzMToKLSAqIEFsbCBmbGFncyBhcmUgZGVmaW5lZCBpbiB0aGUgZmllbGQgSVBGTEFHUzEgb2YgZWFjaCBmdW5jdGlvbgotICogYW5kIGNhbiBiZSBmb3VuZCBpbiBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlcy4KLSAqIElQTE9DQUwgIC0gSW5kaWNhdGVzIHRoZSBjb25uZWN0IGNhbiBvbmx5IGJlIHNhdGlzZmllZCBvbiB0aGUKLSAqICAgICAgICAgICAgbG9jYWwgc3lzdGVtCi0gKiBJUFBSVFkgICAtIEluZGljYXRlcyBhIHByaW9yaXR5IG1lc3NhZ2UKLSAqIElQUVVTQ0UgIC0gSW5kaWNhdGVzIHlvdSBkbyBub3Qgd2FudCB0byByZWNlaXZlIG1lc3NhZ2VzIG9uIGEKLSAqICAgICAgICAgICAgcGF0aCB1bnRpbCBhbiBpdWN2X3Jlc3VtZSBpcyBpc3N1ZWQKLSAqIElQUk1EQVRBIC0gSW5kaWNhdGVzIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4gdGhlIHBhcmFtZXRlciBsaXN0Ci0gKi8KLSNkZWZpbmUgSVBMT0NBTCAgIAkweDAxCi0jZGVmaW5lIElQUFJUWSAgICAgICAgIAkweDIwCi0jZGVmaW5lIElQUVVTQ0UgICAgICAgIAkweDQwCi0jZGVmaW5lIElQUk1EQVRBICAgICAgIAkweDgwCi0KLS8qIGZsYWdzMV9vdXQ6Ci0gKiBBbGwgZmxhZ3MgYXJlIGRlZmluZWQgaW4gdGhlIG91dHB1dCBmaWVsZCBvZiBJUEZMQUdTMSBmb3IgZWFjaCBmdW5jdGlvbgotICogYW5kIGNhbiBiZSBmb3VuZCBpbiBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlcy4KLSAqIElQTk9SUFkgLSBTcGVjaWZpZXMgdGhpcyBpcyBhIG9uZS13YXkgbWVzc2FnZSBhbmQgbm8gcmVwbHkgaXMgZXhwZWN0ZWQuCi0gKiBJUFBSVFkgICAtIEluZGljYXRlcyBhIHByaW9yaXR5IG1lc3NhZ2UgaXMgcGVybWl0dGVkLiBEZWZpbmVkIGluIGZsYWdzMS4KLSAqLwotI2RlZmluZSBJUE5PUlBZICAgICAgICAgMHgxMAotCi0jZGVmaW5lIE5vbnByaW9yaXR5X01lc3NhZ2VQZW5kaW5nSW50ZXJydXB0c0ZsYWcgICAgICAgICAweDgwCi0jZGVmaW5lIFByaW9yaXR5X01lc3NhZ2VQZW5kaW5nSW50ZXJydXB0c0ZsYWcgICAgICAgICAgICAweDQwCi0jZGVmaW5lIE5vbnByaW9yaXR5X01lc3NhZ2VDb21wbGV0aW9uSW50ZXJydXB0c0ZsYWcgICAgICAweDIwCi0jZGVmaW5lIFByaW9yaXR5X01lc3NhZ2VDb21wbGV0aW9uSW50ZXJydXB0c0ZsYWcgICAgICAgICAweDEwCi0jZGVmaW5lIElVQ1ZDb250cm9sSW50ZXJydXB0c0ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIEFsbEludGVycnVwdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGY4Ci0vKgotICogTWFwcGluZyBvZiBleHRlcm5hbCBpbnRlcnJ1cHQgYnVmZmVycyBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCi0gKiBpbnRlcnJ1cHQgdHlwZXMuCi0gKiBOYW1lczogaXVjdl9Db25uZWN0aW9uUGVuZGluZyAgICAtPiAgY29ubmVjdGlvbiBwZW5kaW5nCi0gKiAgICAgICAgaXVjdl9Db25uZWN0aW9uQ29tcGxldGUgICAtPiAgY29ubmVjdGlvbiBjb21wbGV0ZQotICogICAgICAgIGl1Y3ZfQ29ubmVjdGlvblNldmVyZWQgICAgLT4gIGNvbm5lY3Rpb24gc2V2ZXJlZAotICogICAgICAgIGl1Y3ZfQ29ubmVjdGlvblF1aWVzY2VkICAgLT4gIGNvbm5lY3Rpb24gcXVpZXNjZWQKLSAqICAgICAgICBpdWN2X0Nvbm5lY3Rpb25SZXN1bWVkICAgIC0+ICBjb25uZWN0aW9uIHJlc3VtZWQKLSAqICAgICAgICBpdWN2X01lc3NhZ2VQZW5kaW5nICAgICAgIC0+ICBtZXNzYWdlIHBlbmRpbmcKLSAqICAgICAgICBpdWN2X01lc3NhZ2VDb21wbGV0ZSAgICAgIC0+ICBtZXNzYWdlIGNvbXBsZXRlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1MTYgaXBwYXRoaWQ7Ci0JdWNoYXIgaXBmbGFnczE7Ci0JdWNoYXIgaXB0eXBlOwotCXUxNiBpcG1zZ2xpbTsKLQl1MTYgcmVzMTsKLQl1Y2hhciBpcHZtaWRbOF07Ci0JdWNoYXIgaXB1c2VyWzE2XTsKLQl1MzIgcmVzMzsKLQl1Y2hhciBpcHBvbGxmZzsKLQl1Y2hhciByZXM0WzNdOwotfSBpdWN2X0Nvbm5lY3Rpb25QZW5kaW5nOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTE2IGlwcGF0aGlkOwotCXVjaGFyIGlwZmxhZ3MxOwotCXVjaGFyIGlwdHlwZTsKLQl1MTYgaXBtc2dsaW07Ci0JdTE2IHJlczE7Ci0JdWNoYXIgcmVzMls4XTsKLQl1Y2hhciBpcHVzZXJbMTZdOwotCXUzMiByZXMzOwotCXVjaGFyIGlwcG9sbGZnOwotCXVjaGFyIHJlczRbM107Ci19IGl1Y3ZfQ29ubmVjdGlvbkNvbXBsZXRlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTE2IGlwcGF0aGlkOwotCXVjaGFyIHJlczE7Ci0JdWNoYXIgaXB0eXBlOwotCXUzMiByZXMyOwotCXVjaGFyIHJlczNbOF07Ci0JdWNoYXIgaXB1c2VyWzE2XTsKLQl1MzIgcmVzNDsKLQl1Y2hhciBpcHBvbGxmZzsKLQl1Y2hhciByZXM1WzNdOwotfSBpdWN2X0Nvbm5lY3Rpb25TZXZlcmVkOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTE2IGlwcGF0aGlkOwotCXVjaGFyIHJlczE7Ci0JdWNoYXIgaXB0eXBlOwotCXUzMiByZXMyOwotCXVjaGFyIHJlczNbOF07Ci0JdWNoYXIgaXB1c2VyWzE2XTsKLQl1MzIgcmVzNDsKLQl1Y2hhciBpcHBvbGxmZzsKLQl1Y2hhciByZXM1WzNdOwotfSBpdWN2X0Nvbm5lY3Rpb25RdWllc2NlZDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXUxNiBpcHBhdGhpZDsKLQl1Y2hhciByZXMxOwotCXVjaGFyIGlwdHlwZTsKLQl1MzIgcmVzMjsKLQl1Y2hhciByZXMzWzhdOwotCXVjaGFyIGlwdXNlclsxNl07Ci0JdTMyIHJlczQ7Ci0JdWNoYXIgaXBwb2xsZmc7Ci0JdWNoYXIgcmVzNVszXTsKLX0gaXVjdl9Db25uZWN0aW9uUmVzdW1lZDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXUxNiBpcHBhdGhpZDsKLQl1Y2hhciBpcGZsYWdzMTsKLQl1Y2hhciBpcHR5cGU7Ci0JdTMyIGlwbXNnaWQ7Ci0JdTMyIGlwdHJnY2xzOwotCXVuaW9uIHUyIHsKLQkJdTMyIGlwcm1tc2cxX3UzMjsKLQkJdWNoYXIgaXBybW1zZzFbNF07Ci0JfSBsbjFtc2cxOwotCXVuaW9uIHUxIHsKLQkJdTMyIGlwYmZsbjFmOwotCQl1Y2hhciBpcHJtbXNnMls0XTsKLQl9IGxuMW1zZzI7Ci0JdTMyIHJlczFbM107Ci0JdTMyIGlwYmZsbjJmOwotCXVjaGFyIGlwcG9sbGZnOwotCXVjaGFyIHJlczJbM107Ci19IGl1Y3ZfTWVzc2FnZVBlbmRpbmc7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1MTYgaXBwYXRoaWQ7Ci0JdWNoYXIgaXBmbGFnczE7Ci0JdWNoYXIgaXB0eXBlOwotCXUzMiBpcG1zZ2lkOwotCXUzMiBpcGF1ZGl0OwotCXVjaGFyIGlwcm1tc2dbOF07Ci0JdTMyIGlwc3JjY2xzOwotCXUzMiBpcG1zZ3RhZzsKLQl1MzIgcmVzOwotCXUzMiBpcGJmbG4yZjsKLQl1Y2hhciBpcHBvbGxmZzsKLQl1Y2hhciByZXMyWzNdOwotfSBpdWN2X01lc3NhZ2VDb21wbGV0ZTsKLQotLyoKLSAqIGl1Y3ZfaW50ZXJydXB0X29wc190OiBJcyBhIHZlY3RvciBvZiBmdW5jdGlvbnMgdGhhdCBoYW5kbGUKLSAqIElVQ1YgaW50ZXJydXB0cy4KLSAqIFBhcmFtZXRlciBsaXN0OgotICogICAgICAgICBlaWIgLSBpcyBhIHBvaW50ZXIgdG8gYSA0MC1ieXRlIGFyZWEgZGVzY3JpYmVkCi0gKiAgICAgICAgICAgICAgIHdpdGggb25lIG9mIHRoZSBzdHJ1Y3R1cmVzIGFib3ZlLgotICogICAgICAgICBwZ21fZGF0YSAtIHRoaXMgZGF0YSBpcyBzdHJpY3RseSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGhhbmRsZXIgdGhhdCBpcyBwYXNzZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24uIFRoaXMgbWF5IGJlIGFuIGFkZHJlc3MKLSAqICAgICAgICAgICAgICAgICAgICBvciB0b2tlbi4KLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9pZCAoKkNvbm5lY3Rpb25QZW5kaW5nKSAoaXVjdl9Db25uZWN0aW9uUGVuZGluZyAqIGVpYiwKLQkJCQkgICB2b2lkICpwZ21fZGF0YSk7Ci0Jdm9pZCAoKkNvbm5lY3Rpb25Db21wbGV0ZSkgKGl1Y3ZfQ29ubmVjdGlvbkNvbXBsZXRlICogZWliLAotCQkJCSAgICB2b2lkICpwZ21fZGF0YSk7Ci0Jdm9pZCAoKkNvbm5lY3Rpb25TZXZlcmVkKSAoaXVjdl9Db25uZWN0aW9uU2V2ZXJlZCAqIGVpYiwKLQkJCQkgICB2b2lkICpwZ21fZGF0YSk7Ci0Jdm9pZCAoKkNvbm5lY3Rpb25RdWllc2NlZCkgKGl1Y3ZfQ29ubmVjdGlvblF1aWVzY2VkICogZWliLAotCQkJCSAgICB2b2lkICpwZ21fZGF0YSk7Ci0Jdm9pZCAoKkNvbm5lY3Rpb25SZXN1bWVkKSAoaXVjdl9Db25uZWN0aW9uUmVzdW1lZCAqIGVpYiwKLQkJCQkgICB2b2lkICpwZ21fZGF0YSk7Ci0Jdm9pZCAoKk1lc3NhZ2VQZW5kaW5nKSAoaXVjdl9NZXNzYWdlUGVuZGluZyAqIGVpYiwgdm9pZCAqcGdtX2RhdGEpOwotCXZvaWQgKCpNZXNzYWdlQ29tcGxldGUpIChpdWN2X01lc3NhZ2VDb21wbGV0ZSAqIGVpYiwgdm9pZCAqcGdtX2RhdGEpOwotfSBpdWN2X2ludGVycnVwdF9vcHNfdDsKLQotLyoKLSAqaXVjdl9hcnJheV90IDogRGVmaW5lcyBidWZmZXIgYXJyYXkuCi0gKiBJbnNpZGUgdGhlIGFycmF5IG1heSBiZSAzMS0gYml0IGFkZHJlc3NlcyBhbmQgMzEtYml0IGxlbmd0aHMuCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotCXUzMiBhZGRyZXNzOwotCXUzMiBsZW5ndGg7Ci19IGl1Y3ZfYXJyYXlfdCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKTsKLQotZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBpdWN2X2J1czsKLWV4dGVybiBzdHJ1Y3QgZGV2aWNlICppdWN2X3Jvb3Q7Ci0KLS8qICAgLXByb3RvdHlwZXMtICAgICovCi0vKgotICogTmFtZTogaXVjdl9yZWdpc3Rlcl9wcm9ncmFtCi0gKiBQdXJwb3NlOiBSZWdpc3RlcnMgYW4gYXBwbGljYXRpb24gd2l0aCBJVUNWCi0gKiBJbnB1dDogcHJtbmFtZSAtIHVzZXIgaWRlbnRpZmljYXRpb24KLSAqICAgICAgICB1c2VyaWQgIC0gbWFjaGluZSBpZGVudGlmaWNhdGlvbgotICogICAgICAgIHBnbW1hc2sgLSBpbmRpY2F0ZXMgd2hpY2ggYml0cyBpbiB0aGUgcHJtbmFtZSBhbmQgdXNlcmlkIGNvbWJpbmVkIHdpbGwgYmUKLSAqICAJCSAgICB1c2VkIHRvIGRldGVybWluZSB3aG8gaXMgZ2l2ZW4gY29udHJvbAotICogICAgICAgIG9wcyAgICAgLSBhZGRyZXNzIG9mIHZlY3RvciBvZiBpbnRlcnJ1cHQgaGFuZGxlcnMKLSAqICAgICAgICBwZ21fZGF0YS0gYXBwbGljYXRpb24gZGF0YSBwYXNzZWQgdG8gaW50ZXJydXB0IGhhbmRsZXJzCi0gKiBPdXRwdXQ6IE5BCi0gKiBSZXR1cm46IGFkZHJlc3Mgb2YgaGFuZGxlcgotICogICAgICAgICAoMCkgLSBFcnJvciBvY2N1cnJlZCwgcmVnaXN0cmF0aW9uIG5vdCBjb21wbGV0ZWQuCi0gKiBOT1RFOiBFeGFjdCBjYXVzZSBvZiBmYWlsdXJlIHdpbGwgYmUgcmVjb3JkZWQgaW4gc3lzbG9nLgotKi8KLWl1Y3ZfaGFuZGxlX3QgaXVjdl9yZWdpc3Rlcl9wcm9ncmFtICh1Y2hhciBwZ21uYW1lWzE2XSwKLQkJCQkgICAgIHVjaGFyIHVzZXJpZFs4XSwKLQkJCQkgICAgIHVjaGFyIHBnbW1hc2tbMjRdLAotCQkJCSAgICAgaXVjdl9pbnRlcnJ1cHRfb3BzX3QgKiBvcHMsCi0JCQkJICAgICB2b2lkICpwZ21fZGF0YSk7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3VucmVnaXN0ZXJfcHJvZ3JhbQotICogUHVycG9zZTogVW5yZWdpc3RlciBhcHBsaWNhdGlvbiB3aXRoIElVQ1YKLSAqIElucHV0OiBhZGRyZXNzIG9mIGhhbmRsZXIKLSAqIE91dHB1dDogTkEKLSAqIFJldHVybjogKDApIC0gTm9ybWFsIHJldHVybgotICogICAgICAgICAoLUVJTlZBTCkgLSBJbnRlcm5hbCBlcnJvciwgd2lsZCBwb2ludGVyCi0qLwotaW50IGl1Y3ZfdW5yZWdpc3Rlcl9wcm9ncmFtIChpdWN2X2hhbmRsZV90IGhhbmRsZSk7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X2FjY2VwdAotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiBpcyBpc3N1ZWQgYWZ0ZXIgdGhlIHVzZXIgcmVjZWl2ZXMgYSBDb25uZWN0aW9uIFBlbmRpbmcgZXh0ZXJuYWwKLSAqICAgICAgICAgIGludGVycnVwdCBhbmQgbm93IHdpc2hlcyB0byBjb21wbGV0ZSB0aGUgSVVDViBjb21tdW5pY2F0aW9uIHBhdGguCi0gKiBJbnB1dDogIHBhdGhpZCAtIHUxNiAsIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiAgICAgICAgIG1zZ2xpbV9yZXFzdGQgLSB1MTYsIFRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgbWVzc2FnZXMgcmVxdWVzdGVkLgotICogICAgICAgICB1c2VyX2RhdGEgLSB1Y2hhclsxNl0sIERhdGEgc3BlY2lmaWVkIGJ5IHRoZSBpdWN2X2Nvbm5lY3QgZnVuY3Rpb24uCi0gKgkgICBmbGFnczEgLSBpbnQsIENvbnRhaW5zIG9wdGlvbnMgZm9yIHRoaXMgcGF0aC4KLSAqICAgICAgICAgICAtSVBQUlRZICAgLSAweDIwLSBTcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlLgotICogICAgICAgICAgIC1JUFJNREFUQSAtIDB4ODAsIFNwZWNpZmllcyB3aGV0aGVyIHlvdXIgcHJvZ3JhbSBjYW4gaGFuZGxlIGEgbWVzc2FnZQotICogICAgICAgICAgICAJaW4gIHRoZSBwYXJhbWV0ZXIgbGlzdC4KLSAqICAgICAgICAgICAtSVBRVVNDRSAgLSAweDQwLCBTcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0byBxdWllc2NlIHRoZSBwYXRoIGJlaW5nCi0gKgkJZXN0YWJsaXNoZWQuCi0gKiAgICAgICAgIGhhbmRsZSAtIGl1Y3ZfaGFuZGxlX3QsIEFkZHJlc3Mgb2YgaGFuZGxlci4KLSAqICAgICAgICAgcGdtX2RhdGEgLSB2b2lkICosIEFwcGxpY2F0aW9uIGRhdGEgcGFzc2VkIHRvIGludGVycnVwdCBoYW5kbGVycy4KLSAqICAgICAgICAgZmxhZ3MxX291dCAtIGludCAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXRoCi0gKiAgICAgICAgICAgLSBJUFBSVFkgLSAweDIwLCBJbmRpY2F0ZXMgeW91IG1heSBzZW5kIHByaW9yaXR5IG1lc3NhZ2VzLgotICogICAgICAgICBtc2dsaW0gLSAqdTE2LCBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgbWVzc2FnZXMuCi0gKiBPdXRwdXQ6IHJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotKi8KLQotaW50IGl1Y3ZfYWNjZXB0ICh1MTYgcGF0aGlkLAotCQkgdTE2IG1zZ2xpbV9yZXFzdGQsCi0JCSB1Y2hhciB1c2VyX2RhdGFbMTZdLAotCQkgaW50IGZsYWdzMSwKLQkJIGl1Y3ZfaGFuZGxlX3QgaGFuZGxlLAotCQkgdm9pZCAqcGdtX2RhdGEsIGludCAqZmxhZ3MxX291dCwgdTE2ICogbXNnbGltKTsKLQotLyoKLSAqIE5hbWU6IGl1Y3ZfY29ubmVjdAotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiBlc3RhYmxpc2hlcyBhbiBJVUNWIHBhdGguIEFsdGhvdWdoIHRoZSBjb25uZWN0IG1heSBjb21wbGV0ZQotICoJICAgIHN1Y2Nlc3NmdWxseSwgeW91IGFyZSBub3QgYWJsZSB0byB1c2UgdGhlIHBhdGggdW50aWwgeW91IHJlY2VpdmUgYW4gSVVDVgotICogICAgICAgICAgQ29ubmVjdGlvbiBDb21wbGV0ZSBleHRlcm5hbCBpbnRlcnJ1cHQuCi0gKiBJbnB1dDogcGF0aGlkIC0gdTE2ICosIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiAgICAgICAgbXNnbGltX3JlcXN0ZCAtIHUxNiwgTnVtYmVyIG9mIG91dHN0YW5kaW5nIG1lc3NhZ2VzIHJlcXVlc3RlZAotICogICAgICAgIHVzZXJfZGF0YSAtIHVjaGFyWzE2XSwgMTYtYnl0ZSB1c2VyIGRhdGEKLSAqCSAgdXNlcmlkIC0gdWNoYXJbOF0sIFVzZXIgaWRlbnRpZmljYXRpb24KLSAqICAgICAgICBzeXN0ZW1fbmFtZSAtIHVjaGFyWzhdLCA4LWJ5dGUgaWRlbnRpZnlpbmcgdGhlIHN5c3RlbSBuYW1lCi0gKgkgIGZsYWdzMSAtIGludCwgQ29udGFpbnMgb3B0aW9ucyBmb3IgdGhpcyBwYXRoLgotICogICAgICAgICAgLUlQUFJUWSAtICAgMHgyMCwgU3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZS4KLSAqICAgICAgICAgIC1JUFJNREFUQSAtIDB4ODAsIFNwZWNpZmllcyB3aGV0aGVyIHlvdXIgcHJvZ3JhbSBjYW4gaGFuZGxlIGEgbWVzc2FnZQotICogICAgICAgICAgICAJIGluICB0aGUgcGFyYW1ldGVyIGxpc3QuCi0gKiAgICAgICAgICAtSVBRVVNDRSAtICAweDQwLCBTcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0byBxdWllc2NlIHRoZSBwYXRoIGJlaW5nCi0gKgkJZXN0YWJsaXNoZWQuCi0gKiAgICAgICAgICAtSVBMT0NBTCAtICAwWDAxLCBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gZm9yY2UgdGhlIHBhcnRuZXIgdG8gYmUgb24KLSAqCQl0aGUgbG9jYWwgc3lzdGVtLiBJZiBsb2NhbCBpcyBzcGVjaWZpZWQgdGhlbiB0YXJnZXQgY2xhc3MgY2Fubm90IGJlCi0gKgkJc3BlY2lmaWVkLgotICogICAgICAgIGZsYWdzMV9vdXQgLSBpbnQgKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGF0aAotICogICAgICAgICAgIC0gSVBQUlRZIC0gMHgyMCwgSW5kaWNhdGVzIHlvdSBtYXkgc2VuZCBwcmlvcml0eSBtZXNzYWdlcy4KLSAqICAgICAgICBtc2dsaW0gLSAqIHUxNiwgTnVtYmVyIG9mIG91dHN0YW5kaW5nIG1lc3NhZ2VzCi0gKiAgICAgICAgaGFuZGxlIC0gaXVjdl9oYW5kbGVfdCwgQWRkcmVzcyBvZiBoYW5kbGVyCi0gKiAgICAgICAgcGdtX2RhdGEgLSB2b2lkICosIEFwcGxpY2F0aW9uIGRhdGEgcGFzc2VkIHRvIGludGVycnVwdCBoYW5kbGVycwotICogT3V0cHV0OiByZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbAotICogICAgICAgICByYyAtIHJldHVybiBjb2RlIGZyb20gaXVjdl9kZWNsYXJlX2J1ZmZlcgotICogICAgICAgICAtRUlOVkFMIC0gSW52YWxpZCBoYW5kbGUgcGFzc2VkIGJ5IGFwcGxpY2F0aW9uCi0gKiAgICAgICAgIC1FSU5WQUwgLSBQYXRoaWQgYWRkcmVzcyBpcyBOVUxMCi0gKiAgICAgICAgIGFkZF9wYXRoaWRfcmVzdWx0IC0gUmV0dXJuIGNvZGUgZnJvbSBpbnRlcm5hbCBmdW5jdGlvbiBhZGRfcGF0aGlkCi0qLwotaW50Ci0gICAgaXVjdl9jb25uZWN0ICh1MTYgKiBwYXRoaWQsCi0JCSAgdTE2IG1zZ2xpbV9yZXFzdGQsCi0JCSAgdWNoYXIgdXNlcl9kYXRhWzE2XSwKLQkJICB1Y2hhciB1c2VyaWRbOF0sCi0JCSAgdWNoYXIgc3lzdGVtX25hbWVbOF0sCi0JCSAgaW50IGZsYWdzMSwKLQkJICBpbnQgKmZsYWdzMV9vdXQsCi0JCSAgdTE2ICogbXNnbGltLCBpdWN2X2hhbmRsZV90IGhhbmRsZSwgdm9pZCAqcGdtX2RhdGEpOwotCi0vKgotICogTmFtZTogaXVjdl9wdXJnZQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiBjYW5jZWxzIGEgbWVzc2FnZSB0aGF0IHlvdSBoYXZlIHNlbnQuCi0gKiBJbnB1dDogcGF0aGlkIC0gUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIuCi0gKiAgICAgICAgbXNnaWQgLSBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgcHVyZ2VkLgotICogICAgICAgIHNyY2NscyAtIFNwZWNpZmllcyB0aGUgc291cmNlIG1lc3NhZ2UgY2xhc3MuCi0gKiBPdXRwdXQ6IGF1ZGl0IC0gQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYXN5bmNocm9ub3VzIGVycm9yCi0gKiAgICAgICAgICAgICAgICAgdGhhdCBtYXkgaGF2ZSBhZmZlY3RlZCB0aGUgbm9ybWFsIGNvbXBsZXRpb24KLSAqICAgICAgICAgICAgICAgICBvZiB0aGlzIG1lc3NhZ2UuCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotKi8KLWludCBpdWN2X3B1cmdlICh1MTYgcGF0aGlkLCB1MzIgbXNnaWQsIHUzMiBzcmNjbHMsIF9fdTMyICphdWRpdCk7Ci0vKgotICogTmFtZTogaXVjdl9xdWVyeV9tYXhjb25uCi0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbW11bmljYXRpb24gcGF0aHMgeW91Ci0gKgkgICAgbWF5IGVzdGFibGlzaC4KLSAqIFJldHVybjogIG1heGNvbm4gLSB1bG9uZywgTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbiB0aGUgdmlydHVhbCBtYWNoaW5lIG1heQotICogICAgICAgICAgZXN0YWJsaXNoLgotKi8KLXVsb25nIGl1Y3ZfcXVlcnlfbWF4Y29ubiAodm9pZCk7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3F1ZXJ5X2J1ZnNpemUKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBob3cgbGFyZ2UgYW4gZXh0ZXJuYWwgaW50ZXJydXB0Ci0gKiAgICAgICAgICBidWZmZXIgSVVDViByZXF1aXJlcyB0byBzdG9yZSBpbmZvcm1hdGlvbi4KLSAqIFJldHVybjogIGJ1ZnNpemUgLSB1bG9uZywgU2l6ZSBvZiBleHRlcm5hbCBpbnRlcnJ1cHQgYnVmZmVyLgotICovCi11bG9uZyBpdWN2X3F1ZXJ5X2J1ZnNpemUgKHZvaWQpOwotCi0vKgotICogTmFtZTogaXVjdl9xdWllc2NlCi0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHRlbXBvcmFyaWx5IHN1c3BlbmRzIGluY29taW5nIG1lc3NhZ2VzIG9uIGFuCi0gKiAgICAgICAgICBJVUNWIHBhdGguIFlvdSBjYW4gbGF0ZXIgcmVhY3RpdmF0ZSB0aGUgcGF0aCBieSBpbnZva2luZwotICogICAgICAgICAgdGhlIGl1Y3ZfcmVzdW1lIGZ1bmN0aW9uLgotICogSW5wdXQ6IHBhdGhpZCAtIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiAgICAgICAgdXNlcl9kYXRhICAtIDE2LWJ5dGVzIG9mIHVzZXIgZGF0YQotICogT3V0cHV0OiBOQQotICogUmV0dXJuOiBSZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbC4KLSovCi1pbnQgaXVjdl9xdWllc2NlICh1MTYgcGF0aGlkLCB1Y2hhciB1c2VyX2RhdGFbMTZdKTsKLQotLyoKLSAqIE5hbWU6IGl1Y3ZfcmVjZWl2ZQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiByZWNlaXZlcyBtZXNzYWdlcyB0aGF0IGFyZSBiZWluZyBzZW50IHRvIHlvdQotICogICAgICAgICAgb3ZlciBlc3RhYmxpc2hlZCBwYXRocy4gRGF0YSB3aWxsIGJlIHJldHVybmVkIGluIGJ1ZmZlciBmb3IgbGVuZ3RoIG9mCi0gKiAgICAgICAgICBidWZsZW4uCi0gKiBJbnB1dDoKLSAqICAgICAgIHBhdGhpZCAtIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyLgotICogICAgICAgYnVmZmVyIC0gQWRkcmVzcyBvZiBidWZmZXIgdG8gcmVjZWl2ZS4KLSAqICAgICAgIGJ1ZmxlbiAtIExlbmd0aCBvZiBidWZmZXIgdG8gcmVjZWl2ZS4KLSAqICAgICAgIG1zZ2lkIC0gU3BlY2lmaWVzIHRoZSBtZXNzYWdlIElELgotICogICAgICAgdHJnY2xzIC0gU3BlY2lmaWVzIHRhcmdldCBjbGFzcy4KLSAqIE91dHB1dDoKLSAqCSBmbGFnczFfb3V0OiBpbnQgKiwgQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBwYXRoLgotICogICAgICAgICBJUE5PUlBZIC0gMHgxMCBTcGVjaWZpZXMgdGhpcyBpcyBhIG9uZS13YXkgbWVzc2FnZSBhbmQgbm8gcmVwbHkgaXMKLSAqCSAgIGV4cGVjdGVkLgotICogICAgICAgICBJUFBSVFkgIC0gMHgyMCBTcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlLgotICogICAgICAgICBJUFJNREFUQSAtIDB4ODAgc3BlY2lmaWVzIHRoZSBkYXRhIGlzIGNvbnRhaW5lZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QKLSAqICAgICAgIHJlc2lkdWFsX2J1ZmZlciAtIGFkZHJlc3Mgb2YgYnVmZmVyIHVwZGF0ZWQgYnkgdGhlIG51bWJlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgb2YgYnl0ZXMgeW91IGhhdmUgcmVjZWl2ZWQuCi0gKiAgICAgICByZXNpZHVhbF9sZW5ndGggLQotICogICAgICAgICAgICAgIENvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcywgaWYgdGhlIHJlY2VpdmUgYnVmZmVyIGlzOgotICogICAgICAgICAgICAgICBUaGUgc2FtZSBsZW5ndGggYXMgdGhlIG1lc3NhZ2UsIHRoaXMgZmllbGQgaXMgemVyby4KLSAqICAgICAgICAgICAgICAgTG9uZ2VyIHRoYW4gdGhlIG1lc3NhZ2UsIHRoaXMgZmllbGQgY29udGFpbnMgdGhlIG51bWJlciBvZgotICogICAgICAgICAgICAgICAgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBidWZmZXIuCi0gKiAgICAgICAgICAgICAgIFNob3J0ZXIgdGhhbiB0aGUgbWVzc2FnZSwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgcmVzaWR1YWwKLSAqICAgICAgICAgICAgICAgIGNvdW50ICh0aGF0IGlzLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUKLSAqICAgICAgICAgICAgICAgIG1lc3NhZ2UgdGhhdCBkb2VzIG5vdCBmaXQgaW50byB0aGUgYnVmZmVyLiBJbiB0aGlzCi0gKiAgICAgICAgICAgICAgICBjYXNlIGIyZjBfcmVzdWx0ID0gNS4KLSAqIFJldHVybjogUmV0dXJuIGNvZGUgZnJvbSBDUCBJVUNWIGNhbGwuCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIGJ1ZmZlciBhZGRyZXNzIGlzIHBvaW50aW5nIHRvIE5VTEwKLSovCi1pbnQgaXVjdl9yZWNlaXZlICh1MTYgcGF0aGlkLAotCQkgIHUzMiBtc2dpZCwKLQkJICB1MzIgdHJnY2xzLAotCQkgIHZvaWQgKmJ1ZmZlciwKLQkJICB1bG9uZyBidWZsZW4sCi0JCSAgaW50ICpmbGFnczFfb3V0LAotCQkgIHVsb25nICogcmVzaWR1YWxfYnVmZmVyLCB1bG9uZyAqIHJlc2lkdWFsX2xlbmd0aCk7Ci0KLSAvKgotICAqIE5hbWU6IGl1Y3ZfcmVjZWl2ZV9hcnJheQotICAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgbWVzc2FnZXMgdGhhdCBhcmUgYmVpbmcgc2VudCB0byB5b3UKLSAgKiAgICAgICAgICBvdmVyIGVzdGFibGlzaGVkIHBhdGhzLiBEYXRhIHdpbGwgYmUgcmV0dXJuZWQgaW4gZmlyc3QgYnVmZmVyIGZvcgotICAqICAgICAgICAgIGxlbmd0aCBvZiBmaXJzdCBidWZmZXIuCi0gICogSW5wdXQ6IHBhdGhpZCAtIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyLgotICAqICAgICAgICBtc2dpZCAtIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAgKiAgICAgICAgdHJnY2xzIC0gU3BlY2lmaWVzIHRhcmdldCBjbGFzcy4KLSAgKiAgICAgICAgYnVmZmVyIC0gQWRkcmVzcyBvZiBhcnJheSBvZiBidWZmZXJzLgotICAqICAgICAgICBidWZsZW4gLSBUb3RhbCBsZW5ndGggb2YgYnVmZmVycy4KLSAgKiBPdXRwdXQ6Ci0gICogICAgICAgIGZsYWdzMV9vdXQ6IGludCAqLCBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHBhdGguCi0gICogICAgICAgICAgSVBOT1JQWSAtIDB4MTAgU3BlY2lmaWVzIHRoaXMgaXMgYSBvbmUtd2F5IG1lc3NhZ2UgYW5kIG5vIHJlcGx5IGlzCi0gICogICAgICAgICAgZXhwZWN0ZWQuCi0gICogICAgICAgICAgSVBQUlRZICAtIDB4MjAgU3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZS4KLSAgKiAgICAgICAgICBJUFJNREFUQSAtIDB4ODAgc3BlY2lmaWVzIHRoZSBkYXRhIGlzIGNvbnRhaW5lZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QKLSAgKiAgICAgICByZXNpZHVhbF9idWZmZXIgLSBhZGRyZXNzIHBvaW50cyB0byB0aGUgY3VycmVudCBsaXN0IGVudHJ5IElVQ1YKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpcyB3b3JraW5nIG9uLgotICAqICAgICAgIHJlc2lkdWFsX2xlbmd0aCAtCi0gICogICAgICAgICAgICAgIENvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcywgaWYgdGhlIHJlY2VpdmUgYnVmZmVyIGlzOgotICAqICAgICAgICAgICAgICAgVGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBtZXNzYWdlLCB0aGlzIGZpZWxkIGlzIHplcm8uCi0gICogICAgICAgICAgICAgICBMb25nZXIgdGhhbiB0aGUgbWVzc2FnZSwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgbnVtYmVyIG9mCi0gICogICAgICAgICAgICAgICAgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBidWZmZXIuCi0gICogICAgICAgICAgICAgICBTaG9ydGVyIHRoYW4gdGhlIG1lc3NhZ2UsIHRoaXMgZmllbGQgY29udGFpbnMgdGhlIHJlc2lkdWFsCi0gICogICAgICAgICAgICAgICAgY291bnQgKHRoYXQgaXMsIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZQotICAqICAgICAgICAgICAgICAgIG1lc3NhZ2UgdGhhdCBkb2VzIG5vdCBmaXQgaW50byB0aGUgYnVmZmVyLiBJbiB0aGlzCi0gICogICAgICAgICAgICAgICAgY2FzZSBiMmYwX3Jlc3VsdCA9IDUuCi0gICogUmV0dXJuOiBSZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbC4KLSAgKiAgICAgICAgICgtRUlOVkFMKSAtIEJ1ZmZlciBhZGRyZXNzIGlzIE5VTEwuCi0gICovCi1pbnQgaXVjdl9yZWNlaXZlX2FycmF5ICh1MTYgcGF0aGlkLAotCQkJdTMyIG1zZ2lkLAotCQkJdTMyIHRyZ2NscywKLQkJCWl1Y3ZfYXJyYXlfdCAqIGJ1ZmZlciwKLQkJCXVsb25nIGJ1ZmxlbiwKLQkJCWludCAqZmxhZ3MxX291dCwKLQkJCXVsb25nICogcmVzaWR1YWxfYnVmZmVyLCB1bG9uZyAqIHJlc2lkdWFsX2xlbmd0aCk7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3JlamVjdAotICogUHVycG9zZTogVGhlIHJlamVjdCBmdW5jdGlvbiByZWZ1c2VzIGEgc3BlY2lmaWVkIG1lc3NhZ2UuIEJldHdlZW4gdGhlCi0gKiAgICAgICAgICB0aW1lIHlvdSBhcmUgbm90aWZpZWQgb2YgYSBtZXNzYWdlIGFuZCB0aGUgdGltZSB0aGF0IHlvdQotICogICAgICAgICAgY29tcGxldGUgdGhlIG1lc3NhZ2UsIHRoZSBtZXNzYWdlIG1heSBiZSByZWplY3RlZC4KLSAqIElucHV0OiBwYXRoaWQgLSBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqICAgICAgICBtc2dpZCAtIFNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqICAgICAgICB0cmdjbHMgLSBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICogT3V0cHV0OiBOQQotICogUmV0dXJuOiBSZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbC4KLSovCi1pbnQgaXVjdl9yZWplY3QgKHUxNiBwYXRoaWQsIHUzMiBtc2dpZCwgdTMyIHRyZ2Nscyk7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3JlcGx5Ci0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHJlc3BvbmRzIHRvIHRoZSB0d28td2F5IG1lc3NhZ2VzIHRoYXQgeW91Ci0gKiAgICAgICAgICByZWNlaXZlLiBZb3UgbXVzdCBpZGVudGlmeSBjb21wbGV0ZWx5IHRoZSBtZXNzYWdlIHRvCi0gKiAgICAgICAgICB3aGljaCB5b3Ugd2lzaCB0byByZXBseS4gaWUsIHBhdGhpZCwgbXNnaWQsIGFuZCB0cmdjbHMuCi0gKiBJbnB1dDogcGF0aGlkIC0gUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIuCi0gKiAgICAgICAgbXNnaWQgLSBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiAgICAgICAgdHJnY2xzIC0gU3BlY2lmaWVzIHRhcmdldCBjbGFzcy4KLSAqICAgICAgICBmbGFnczEgLSBPcHRpb24gZm9yIHBhdGguCi0gKiAgICAgICAgICBJUFBSVFktIDB4MjAsIFNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiAgICAgICAgYnVmZmVyIC0gQWRkcmVzcyBvZiByZXBseSBidWZmZXIuCi0gKiAgICAgICAgYnVmbGVuIC0gTGVuZ3RoIG9mIHJlcGx5IGJ1ZmZlci4KLSAqIE91dHB1dDogcmVzaWR1YWxfYnVmZmVyIC0gQWRkcmVzcyBvZiBidWZmZXIgdXBkYXRlZCBieSB0aGUgbnVtYmVyCi0gKiAgICAgICAgICAgICAgICAgICAgb2YgYnl0ZXMgeW91IGhhdmUgbW92ZWQuCi0gKiAgICAgICAgIHJlc2lkdWFsX2xlbmd0aCAtIENvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqCQlJZiB0aGUgYW5zd2VyIGJ1ZmZlciBpcyB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHJlcGx5LCB0aGlzIGZpZWxkCi0gKgkJIGNvbnRhaW5zIHplcm8uCi0gKgkJSWYgdGhlIGFuc3dlciBidWZmZXIgaXMgbG9uZ2VyIHRoYW4gdGhlIHJlcGx5LCB0aGlzIGZpZWxkIGNvbnRhaW5zCi0gKgkJIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBidWZmZXIuCi0gKgkJSWYgdGhlIGFuc3dlciBidWZmZXIgaXMgc2hvcnRlciB0aGFuIHRoZSByZXBseSwgdGhpcyBmaWVsZCBjb250YWlucwotICoJCSBhIHJlc2lkdWFsIGNvdW50ICh0aGF0IGlzLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWlhbmluZyBpbiB0aGUKLSAqCQkgcmVwbHkgdGhhdCBkb2VzIG5vdCBmaXQgaW50byB0aGUgYnVmZmVyLiBJbiB0aGlzCi0gKiAgICAgICAgICAgICAgIGNhc2UgYjJmMF9yZXN1bHQgPSA1LgotICogUmV0dXJuOiBSZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbC4KLSAqICAgICAgICAgKC1FSU5WQUwpIC0gQnVmZmVyIGFkZHJlc3MgaXMgTlVMTC4KLSovCi1pbnQgaXVjdl9yZXBseSAodTE2IHBhdGhpZCwKLQkJdTMyIG1zZ2lkLAotCQl1MzIgdHJnY2xzLAotCQlpbnQgZmxhZ3MxLAotCQl2b2lkICpidWZmZXIsIHVsb25nIGJ1ZmxlbiwgdWxvbmcgKiByZXNpZHVhbF9idWZmZXIsCi0JCXVsb25nICogcmVzaWR1YWxfbGVuZ3RoKTsKLQotLyoKLSAqIE5hbWU6IGl1Y3ZfcmVwbHlfYXJyYXkKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gcmVzcG9uZHMgdG8gdGhlIHR3by13YXkgbWVzc2FnZXMgdGhhdCB5b3UKLSAqICAgICAgICAgIHJlY2VpdmUuIFlvdSBtdXN0IGlkZW50aWZ5IGNvbXBsZXRlbHkgdGhlIG1lc3NhZ2UgdG8KLSAqICAgICAgICAgIHdoaWNoIHlvdSB3aXNoIHRvIHJlcGx5LiBpZSwgcGF0aGlkLCBtc2dpZCwgYW5kIHRyZ2Nscy4KLSAqICAgICAgICAgIFRoZSBhcnJheSBpZGVudGlmaWVzIGEgbGlzdCBvZiBhZGRyZXNzZXMgYW5kIGxlbmd0aHMgb2YKLSAqICAgICAgICAgIGRpc2NvbnRpZ3VvdXMgYnVmZmVycyB0aGF0IGNvbnRhaW5zIHRoZSByZXBseSBkYXRhLgotICogSW5wdXQ6IHBhdGhpZCAtIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiAgICAgICAgbXNnaWQgLSBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiAgICAgICAgdHJnY2xzIC0gU3BlY2lmaWVzIHRhcmdldCBjbGFzcy4KLSAqICAgICAgICBmbGFnczEgLSBPcHRpb24gZm9yIHBhdGguCi0gKiAgICAgICAgICBJUFBSVFktIDB4MjAsIFNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiAgICAgICAgYnVmZmVyIC0gQWRkcmVzcyBvZiBhcnJheSBvZiByZXBseSBidWZmZXJzLgotICogICAgICAgIGJ1ZmxlbiAtIFRvdGFsIGxlbmd0aCBvZiByZXBseSBidWZmZXJzLgotICogT3V0cHV0OiByZXNpZHVhbF9idWZmZXIgLSBBZGRyZXNzIG9mIGJ1ZmZlciB3aGljaCBJVUNWIGlzIGN1cnJlbnRseSB3b3JraW5nIG9uLgotICogICAgICAgICByZXNpZHVhbF9sZW5ndGggLSBDb250YWlucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgSWYgdGhlIGFuc3dlciBidWZmZXIgaXMgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSByZXBseSwgdGhpcyBmaWVsZAotICogICAgICAgICAgICAgICBjb250YWlucyB6ZXJvLgotICogICAgICAgICAgICAgIElmIHRoZSBhbnN3ZXIgYnVmZmVyIGlzIGxvbmdlciB0aGFuIHRoZSByZXBseSwgdGhpcyBmaWVsZCBjb250YWlucwotICogICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyLgotICogICAgICAgICAgICAgIElmIHRoZSBhbnN3ZXIgYnVmZmVyIGlzIHNob3J0ZXIgdGhhbiB0aGUgcmVwbHksIHRoaXMgZmllbGQgY29udGFpbnMKLSAqICAgICAgICAgICAgICAgYSByZXNpZHVhbCBjb3VudCAodGhhdCBpcywgdGhlIG51bWJlciBvZiBieXRlcyByZW1pYW5pbmcgaW4gdGhlCi0gKiAgICAgICAgICAgICAgIHJlcGx5IHRoYXQgZG9lcyBub3QgZml0IGludG8gdGhlIGJ1ZmZlci4gSW4gdGhpcwotICogICAgICAgICAgICAgICBjYXNlIGIyZjBfcmVzdWx0ID0gNS4KLSAqIFJldHVybjogUmV0dXJuIGNvZGUgZnJvbSBDUCBJVUNWIGNhbGwuCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIEJ1ZmZlciBhZGRyZXNzIGlzIE5VTEwuCi0qLwotaW50IGl1Y3ZfcmVwbHlfYXJyYXkgKHUxNiBwYXRoaWQsCi0JCSAgICAgIHUzMiBtc2dpZCwKLQkJICAgICAgdTMyIHRyZ2NscywKLQkJICAgICAgaW50IGZsYWdzMSwKLQkJICAgICAgaXVjdl9hcnJheV90ICogYnVmZmVyLAotCQkgICAgICB1bG9uZyBidWZsZW4sIHVsb25nICogcmVzaWR1YWxfYWRkcmVzcywKLQkJICAgICAgdWxvbmcgKiByZXNpZHVhbF9sZW5ndGgpOwotCi0vKgotICogTmFtZTogaXVjdl9yZXBseV9wcm1tc2cKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gcmVzcG9uZHMgdG8gdGhlIHR3by13YXkgbWVzc2FnZXMgdGhhdCB5b3UKLSAqICAgICAgICAgIHJlY2VpdmUuIFlvdSBtdXN0IGlkZW50aWZ5IGNvbXBsZXRlbHkgdGhlIG1lc3NhZ2UgdG8KLSAqICAgICAgICAgIHdoaWNoIHlvdSB3aXNoIHRvIHJlcGx5LiBpZSwgcGF0aGlkLCBtc2dpZCwgYW5kIHRyZ2Nscy4KLSAqICAgICAgICAgIFBybW1zZyBzaWduaWZpZXMgdGhlIGRhdGEgaXMgbW92ZWQgaW50byB0aGUKLSAqICAgICAgICAgIHBhcmFtZXRlciBsaXN0LgotICogSW5wdXQ6IHBhdGhpZCAtIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyLgotICogICAgICAgIG1zZ2lkIC0gU3BlY2lmaWVzIHRoZSBtZXNzYWdlIElELgotICogICAgICAgIHRyZ2NscyAtIFNwZWNpZmllcyB0YXJnZXQgY2xhc3MuCi0gKiAgICAgICAgZmxhZ3MxIC0gT3B0aW9uIGZvciBwYXRoLgotICogICAgICAgICAgSVBQUlRZLSAweDIwIFNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiAgICAgICAgcHJtbXNnIC0gOC1ieXRlcyBvZiBkYXRhIHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBwYXJhbWV0ZXIuCi0gKiAgICAgICAgICAgICAgICAgbGlzdC4KLSAqIE91dHB1dDogTkEKLSAqIFJldHVybjogUmV0dXJuIGNvZGUgZnJvbSBDUCBJVUNWIGNhbGwuCi0qLwotaW50IGl1Y3ZfcmVwbHlfcHJtbXNnICh1MTYgcGF0aGlkLAotCQkgICAgICAgdTMyIG1zZ2lkLCB1MzIgdHJnY2xzLCBpbnQgZmxhZ3MxLCB1Y2hhciBwcm1tc2dbOF0pOwotCi0vKgotICogTmFtZTogaXVjdl9yZXN1bWUKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gcmVzdG9yZXMgY29tbXVuaWNhdGlvbnMgb3ZlciBhIHF1aWVzY2VkIHBhdGgKLSAqIElucHV0OiBwYXRoaWQgLSBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqICAgICAgICB1c2VyX2RhdGEgIC0gMTYtYnl0ZXMgb2YgdXNlciBkYXRhLgotICogT3V0cHV0OiBOQQotICogUmV0dXJuOiBSZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbC4KLSovCi1pbnQgaXVjdl9yZXN1bWUgKHUxNiBwYXRoaWQsIHVjaGFyIHVzZXJfZGF0YVsxNl0pOwotCi0vKgotICogTmFtZTogaXVjdl9zZW5kCi0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbWl0cyBkYXRhIHRvIGFub3RoZXIgYXBwbGljYXRpb24uCi0gKiAgICAgICAgICBEYXRhIHRvIGJlIHRyYW5zbWl0dGVkIGlzIGluIGEgYnVmZmVyIGFuZCB0aGlzIGlzIGEKLSAqICAgICAgICAgIG9uZS13YXkgbWVzc2FnZSBhbmQgdGhlIHJlY2VpdmVyIHdpbGwgbm90IHJlcGx5IHRvIHRoZQotICogICAgICAgICAgbWVzc2FnZS4KLSAqIElucHV0OiBwYXRoaWQgLSBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqICAgICAgICB0cmdjbHMgLSBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICogICAgICAgIHNyY2NscyAtIFNwZWNpZmllcyB0aGUgc291cmNlIG1lc3NhZ2UgY2xhc3MuCi0gKiAgICAgICAgbXNndGFnIC0gU3BlY2lmaWVzIGEgdGFnIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZS4KLSAqICAgICAgICBmbGFnczEgLSBPcHRpb24gZm9yIHBhdGguCi0gKiAgICAgICAgICBJUFBSVFktIDB4MjAgU3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZS4KLSAqICAgICAgICBidWZmZXIgLSBBZGRyZXNzIG9mIHNlbmQgYnVmZmVyLgotICogICAgICAgIGJ1ZmxlbiAtIExlbmd0aCBvZiBzZW5kIGJ1ZmZlci4KLSAqIE91dHB1dDogbXNnaWQgLSBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotICogICAgICAgICAoLUVJTlZBTCkgLSBCdWZmZXIgYWRkcmVzcyBpcyBOVUxMLgotKi8KLWludCBpdWN2X3NlbmQgKHUxNiBwYXRoaWQsCi0JICAgICAgIHUzMiAqIG1zZ2lkLAotCSAgICAgICB1MzIgdHJnY2xzLAotCSAgICAgICB1MzIgc3JjY2xzLCB1MzIgbXNndGFnLCBpbnQgZmxhZ3MxLCB2b2lkICpidWZmZXIsIHVsb25nIGJ1Zmxlbik7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NlbmRfYXJyYXkKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gdHJhbnNtaXRzIGRhdGEgdG8gYW5vdGhlciBhcHBsaWNhdGlvbi4KLSAqICAgICAgICAgIFRoZSBjb250ZW50cyBvZiBidWZmZXIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGFycmF5IG9mCi0gKiAgICAgICAgICBhZGRyZXNzZXMgYW5kIGxlbmd0aHMgb2YgZGlzY29udGlndW91cyBidWZmZXJzIHRoYXQgaG9sZAotICogICAgICAgICAgdGhlIG1lc3NhZ2UgdGV4dC4gVGhpcyBpcyBhIG9uZS13YXkgbWVzc2FnZSBhbmQgdGhlCi0gKiAgICAgICAgICByZWNlaXZlciB3aWxsIG5vdCByZXBseSB0byB0aGUgbWVzc2FnZS4KLSAqIElucHV0OiBwYXRoaWQgLSBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqICAgICAgICB0cmdjbHMgLSBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICogICAgICAgIHNyY2NscyAtIFNwZWNpZmllcyB0aGUgc291cmNlIG1lc3NhZ2UgY2xhc3MuCi0gKiAgICAgICAgbXNndGFnIC0gU3BlY2lmaWVzIGEgdGFnIHRvIGJlIGFzc29jaWF0ZWQgd2l0aHQgdGhlIG1lc3NhZ2UuCi0gKiAgICAgICAgZmxhZ3MxIC0gT3B0aW9uIGZvciBwYXRoLgotICogICAgICAgICAgSVBQUlRZLSBzcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlLgotICogICAgICAgIGJ1ZmZlciAtIEFkZHJlc3Mgb2YgYXJyYXkgb2Ygc2VuZCBidWZmZXJzLgotICogICAgICAgIGJ1ZmxlbiAtIFRvdGFsIGxlbmd0aCBvZiBzZW5kIGJ1ZmZlcnMuCi0gKiBPdXRwdXQ6IG1zZ2lkIC0gU3BlY2lmaWVzIHRoZSBtZXNzYWdlIElELgotICogUmV0dXJuOiBSZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbC4KLSAqICAgICAgICAgKC1FSU5WQUwpIC0gQnVmZmVyIGFkZHJlc3MgaXMgTlVMTC4KLSovCi1pbnQgaXVjdl9zZW5kX2FycmF5ICh1MTYgcGF0aGlkLAotCQkgICAgIHUzMiAqIG1zZ2lkLAotCQkgICAgIHUzMiB0cmdjbHMsCi0JCSAgICAgdTMyIHNyY2NscywKLQkJICAgICB1MzIgbXNndGFnLAotCQkgICAgIGludCBmbGFnczEsIGl1Y3ZfYXJyYXlfdCAqIGJ1ZmZlciwgdWxvbmcgYnVmbGVuKTsKLQotLyoKLSAqIE5hbWU6IGl1Y3Zfc2VuZF9wcm1tc2cKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gdHJhbnNtaXRzIGRhdGEgdG8gYW5vdGhlciBhcHBsaWNhdGlvbi4KLSAqICAgICAgICAgIFBybW1zZyBzcGVjaWZpZXMgdGhhdCB0aGUgOC1ieXRlcyBvZiBkYXRhIGFyZSB0byBiZSBtb3ZlZAotICogICAgICAgICAgaW50byB0aGUgcGFyYW1ldGVyIGxpc3QuIFRoaXMgaXMgYSBvbmUtd2F5IG1lc3NhZ2UgYW5kIHRoZQotICogICAgICAgICAgcmVjZWl2ZXIgd2lsbCBub3QgcmVwbHkgdG8gdGhlIG1lc3NhZ2UuCi0gKiBJbnB1dDogcGF0aGlkIC0gUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIuCi0gKiAgICAgICAgdHJnY2xzIC0gU3BlY2lmaWVzIHRhcmdldCBjbGFzcy4KLSAqICAgICAgICBzcmNjbHMgLSBTcGVjaWZpZXMgdGhlIHNvdXJjZSBtZXNzYWdlIGNsYXNzLgotICogICAgICAgIG1zZ3RhZyAtIFNwZWNpZmllcyBhIHRhZyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UuCi0gKiAgICAgICAgZmxhZ3MxIC0gT3B0aW9uIGZvciBwYXRoLgotICogICAgICAgICAgSVBQUlRZLSAweDIwIHNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiAgICAgICAgcHJtbXNnIC0gOC1ieXRlcyBvZiBkYXRhIHRvIGJlIHBsYWNlZCBpbnRvIHBhcmFtZXRlciBsaXN0LgotICogT3V0cHV0OiBtc2dpZCAtIFNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqIFJldHVybjogUmV0dXJuIGNvZGUgZnJvbSBDUCBJVUNWIGNhbGwuCi0qLwotaW50IGl1Y3Zfc2VuZF9wcm1tc2cgKHUxNiBwYXRoaWQsCi0JCSAgICAgIHUzMiAqIG1zZ2lkLAotCQkgICAgICB1MzIgdHJnY2xzLAotCQkgICAgICB1MzIgc3JjY2xzLCB1MzIgbXNndGFnLCBpbnQgZmxhZ3MxLCB1Y2hhciBwcm1tc2dbOF0pOwotCi0vKgotICogTmFtZTogaXVjdl9zZW5kMndheQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiB0cmFuc21pdHMgZGF0YSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLgotICogICAgICAgICAgRGF0YSB0byBiZSB0cmFuc21pdHRlZCBpcyBpbiBhIGJ1ZmZlci4gVGhlIHJlY2VpdmVyCi0gKiAgICAgICAgICBvZiB0aGUgc2VuZCBpcyBleHBlY3RlZCB0byByZXBseSB0byB0aGUgbWVzc2FnZSBhbmQKLSAqICAgICAgICAgIGEgYnVmZmVyIGlzIHByb3ZpZGVkIGludG8gd2hpY2ggSVVDViBtb3ZlcyB0aGUgcmVwbHkKLSAqICAgICAgICAgIHRvIHRoaXMgbWVzc2FnZS4KLSAqIElucHV0OiBwYXRoaWQgLSBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqICAgICAgICB0cmdjbHMgLSBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICogICAgICAgIHNyY2NscyAtIFNwZWNpZmllcyB0aGUgc291cmNlIG1lc3NhZ2UgY2xhc3MuCi0gKiAgICAgICAgbXNndGFnIC0gU3BlY2lmaWVzIGEgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZS4KLSAqICAgICAgICBmbGFnczEgLSBPcHRpb24gZm9yIHBhdGguCi0gKiAgICAgICAgICBJUFBSVFktIDB4MjAgU3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZS4KLSAqICAgICAgICBidWZmZXIgLSBBZGRyZXNzIG9mIHNlbmQgYnVmZmVyLgotICogICAgICAgIGJ1ZmxlbiAtIExlbmd0aCBvZiBzZW5kIGJ1ZmZlci4KLSAqICAgICAgICBhbnNidWYgLSBBZGRyZXNzIG9mIGJ1ZmZlciBpbnRvIHdoaWNoIElVQ1YgbW92ZXMgdGhlIHJlcGx5IG9mCi0gKiAgICAgICAgICAgICAgICAgdGhpcyBtZXNzYWdlLgotICogICAgICAgIGFuc2xlbiAtIEFkZHJlc3Mgb2YgbGVuZ3RoIG9mIGJ1ZmZlci4KLSAqIE91dHB1dDogbXNnaWQgLSBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotICogICAgICAgICAoLUVJTlZBTCkgLSBCdWZmZXIgb3IgYW5zYnVmIGFkZHJlc3MgaXMgTlVMTC4KLSovCi1pbnQgaXVjdl9zZW5kMndheSAodTE2IHBhdGhpZCwKLQkJICAgdTMyICogbXNnaWQsCi0JCSAgIHUzMiB0cmdjbHMsCi0JCSAgIHUzMiBzcmNjbHMsCi0JCSAgIHUzMiBtc2d0YWcsCi0JCSAgIGludCBmbGFnczEsCi0JCSAgIHZvaWQgKmJ1ZmZlciwgdWxvbmcgYnVmbGVuLCB2b2lkICphbnNidWYsIHVsb25nIGFuc2xlbik7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NlbmQyd2F5X2FycmF5Ci0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbWl0cyBkYXRhIHRvIGFub3RoZXIgYXBwbGljYXRpb24uCi0gKiAgICAgICAgICBUaGUgY29udGVudHMgb2YgYnVmZmVyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheSBvZgotICogICAgICAgICAgYWRkcmVzc2VzIGFuZCBsZW5ndGhzIG9mIGRpc2NvbnRpZ3VvdXMgYnVmZmVycyB0aGF0IGhvbGQKLSAqICAgICAgICAgIHRoZSBtZXNzYWdlIHRleHQuIFRoZSByZWNlaXZlciBvZiB0aGUgc2VuZCBpcyBleHBlY3RlZCB0bwotICogICAgICAgICAgcmVwbHkgdG8gdGhlIG1lc3NhZ2UgYW5kIGEgYnVmZmVyIGlzIHByb3ZpZGVkIGludG8gd2hpY2gKLSAqICAgICAgICAgIElVQ1YgbW92ZXMgdGhlIHJlcGx5IHRvIHRoaXMgbWVzc2FnZS4KLSAqIElucHV0OiBwYXRoaWQgLSBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqICAgICAgICB0cmdjbHMgLSBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICogICAgICAgIHNyY2NscyAtIFNwZWNpZmllcyB0aGUgc291cmNlIG1lc3NhZ2UgY2xhc3MuCi0gKiAgICAgICAgbXNndGFnIC0gU3BlY2lmaWVzIGEgdGFnIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZS4KLSAqICAgICAgICBmbGFnczEgLSBPcHRpb24gZm9yIHBhdGguCi0gKiAgICAgICAgICBJUFBSVFktIDB4MjAgU3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZS4KLSAqICAgICAgICBidWZmZXIgLSBTZGRyZXNzIG9mIGFycmF5IG9mIHNlbmQgYnVmZmVycy4KLSAqICAgICAgICBidWZsZW4gLSBUb3RhbCBsZW5ndGggb2Ygc2VuZCBidWZmZXJzLgotICogICAgICAgIGFuc2J1ZiAtIEFkZHJlc3Mgb2YgYXJyYXkgb2YgYnVmZmVyIGludG8gd2hpY2ggSVVDViBtb3ZlcyB0aGUgcmVwbHkKLSAqICAgICAgICAgICAgICAgICBvZiB0aGlzIG1lc3NhZ2UuCi0gKiAgICAgICAgYW5zbGVuIC0gQWRkcmVzcyBvZiBsZW5ndGggcmVwbHkgYnVmZmVycy4KLSAqIE91dHB1dDogbXNnaWQgLSBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotICogICAgICAgICAoLUVJTlZBTCkgLSBCdWZmZXIgYWRkcmVzcyBpcyBOVUxMLgotKi8KLWludCBpdWN2X3NlbmQyd2F5X2FycmF5ICh1MTYgcGF0aGlkLAotCQkJIHUzMiAqIG1zZ2lkLAotCQkJIHUzMiB0cmdjbHMsCi0JCQkgdTMyIHNyY2NscywKLQkJCSB1MzIgbXNndGFnLAotCQkJIGludCBmbGFnczEsCi0JCQkgaXVjdl9hcnJheV90ICogYnVmZmVyLAotCQkJIHVsb25nIGJ1ZmxlbiwgaXVjdl9hcnJheV90ICogYW5zYnVmLCB1bG9uZyBhbnNsZW4pOwotCi0vKgotICogTmFtZTogaXVjdl9zZW5kMndheV9wcm1tc2cKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gdHJhbnNtaXRzIGRhdGEgdG8gYW5vdGhlciBhcHBsaWNhdGlvbi4KLSAqICAgICAgICAgIFBybW1zZyBzcGVjaWZpZXMgdGhhdCB0aGUgOC1ieXRlcyBvZiBkYXRhIGFyZSB0byBiZSBtb3ZlZAotICogICAgICAgICAgaW50byB0aGUgcGFyYW1ldGVyIGxpc3QuIFRoaXMgaXMgYSB0d28td2F5IG1lc3NhZ2UgYW5kIHRoZQotICogICAgICAgICAgcmVjZWl2ZXIgb2YgdGhlIG1lc3NhZ2UgaXMgZXhwZWN0ZWQgdG8gcmVwbHkuIEEgYnVmZmVyCi0gKiAgICAgICAgICBpcyBwcm92aWRlZCBpbnRvIHdoaWNoIElVQ1YgbW92ZXMgdGhlIHJlcGx5IHRvIHRoaXMKLSAqICAgICAgICAgIG1lc3NhZ2UuCi0gKiBJbnB1dDogcGF0aGlkIC0gUmF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIuCi0gKiAgICAgICAgdHJnY2xzIC0gU3BlY2lmaWVzIHRhcmdldCBjbGFzcy4KLSAqICAgICAgICBzcmNjbHMgLSBTcGVjaWZpZXMgdGhlIHNvdXJjZSBtZXNzYWdlIGNsYXNzLgotICogICAgICAgIG1zZ3RhZyAtIFNwZWNpZmllcyBhIHRhZyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UuCi0gKiAgICAgICAgZmxhZ3MxIC0gT3B0aW9uIGZvciBwYXRoLgotICogICAgICAgICAgSVBQUlRZLSAweDIwIFNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiAgICAgICAgcHJtbXNnIC0gOC1ieXRlcyBvZiBkYXRhIHRvIGJlIHBsYWNlZCBpbiBwYXJhbWV0ZXIgbGlzdC4KLSAqICAgICAgICBhbnNidWYgLSBBZGRyZXNzIG9mIGJ1ZmZlciBpbnRvIHdoaWNoIElVQ1YgbW92ZXMgdGhlIHJlcGx5IG9mCi0gKiAgICAgICAgICAgICAgICAgdGhpcyBtZXNzYWdlLgotICogICAgICAgIGFuc2xlbiAtIEFkZHJlc3Mgb2YgbGVuZ3RoIG9mIGJ1ZmZlci4KLSAqIE91dHB1dDogbXNnaWQgLSBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotICogICAgICAgICAoLUVJTlZBTCkgLSBCdWZmZXIgYWRkcmVzcyBpcyBOVUxMLgotKi8KLWludCBpdWN2X3NlbmQyd2F5X3BybW1zZyAodTE2IHBhdGhpZCwKLQkJCSAgdTMyICogbXNnaWQsCi0JCQkgIHUzMiB0cmdjbHMsCi0JCQkgIHUzMiBzcmNjbHMsCi0JCQkgIHUzMiBtc2d0YWcsCi0JCQkgIHVsb25nIGZsYWdzMSwKLQkJCSAgdWNoYXIgcHJtbXNnWzhdLCB2b2lkICphbnNidWYsIHVsb25nIGFuc2xlbik7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NlbmQyd2F5X3BybW1zZ19hcnJheQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiB0cmFuc21pdHMgZGF0YSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLgotICogICAgICAgICAgUHJtbXNnIHNwZWNpZmllcyB0aGF0IHRoZSA4LWJ5dGVzIG9mIGRhdGEgYXJlIHRvIGJlIG1vdmVkCi0gKiAgICAgICAgICBpbnRvIHRoZSBwYXJhbWV0ZXIgbGlzdC4gVGhpcyBpcyBhIHR3by13YXkgbWVzc2FnZSBhbmQgdGhlCi0gKiAgICAgICAgICByZWNlaXZlciBvZiB0aGUgbWVzc2FnZSBpcyBleHBlY3RlZCB0byByZXBseS4gQSBidWZmZXIKLSAqICAgICAgICAgIGlzIHByb3ZpZGVkIGludG8gd2hpY2ggSVVDViBtb3ZlcyB0aGUgcmVwbHkgdG8gdGhpcwotICogICAgICAgICAgbWVzc2FnZS4gVGhlIGNvbnRlbnRzIG9mIGFuc2J1ZiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAqICAgICAgICAgIGFycmF5IG9mIGFkZHJlc3NlcyBhbmQgbGVuZ3RocyBvZiBkaXNjb250aWd1b3VzIGJ1ZmZlcnMKLSAqICAgICAgICAgIHRoYXQgY29udGFpbiB0aGUgcmVwbHkuCi0gKiBJbnB1dDogcGF0aGlkIC0gUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIuCi0gKiAgICAgICAgdHJnY2xzIC0gU3BlY2lmaWVzIHRhcmdldCBjbGFzcy4KLSAqICAgICAgICBzcmNjbHMgLSBTcGVjaWZpZXMgdGhlIHNvdXJjZSBtZXNzYWdlIGNsYXNzLgotICogICAgICAgIG1zZ3RhZyAtIFNwZWNpZmllcyBhIHRhZyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UuCi0gKiAgICAgICAgZmxhZ3MxIC0gT3B0aW9uIGZvciBwYXRoLgotICogICAgICAgICAgSVBQUlRZLSAweDIwIHNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiAgICAgICAgcHJtbXNnIC0gOC1ieXRlcyBvZiBkYXRhIHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBwYXJhbWV0ZXIgbGlzdC4KLSAqICAgICAgICBhbnNidWYgLSBBZGRyZXNzIG9mIGFycmF5IG9mIGJ1ZmZlciBpbnRvIHdoaWNoIElVQ1YgbW92ZXMgdGhlIHJlcGx5Ci0gKiAgICAgICAgICAgICAgICAgb2YgdGhpcyBtZXNzYWdlLgotICogICAgICAgIGFuc2xlbiAtIEFkZHJlc3Mgb2YgbGVuZ3RoIG9mIHJlcGx5IGJ1ZmZlcnMuCi0gKiBPdXRwdXQ6IG1zZ2lkIC0gU3BlY2lmaWVzIHRoZSBtZXNzYWdlIElELgotICogUmV0dXJuOiBSZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbC4KLSAqICAgICAgICAgKC1FSU5WQUwpIC0gQW5zYnVmIGFkZHJlc3MgaXMgTlVMTC4KLSovCi1pbnQgaXVjdl9zZW5kMndheV9wcm1tc2dfYXJyYXkgKHUxNiBwYXRoaWQsCi0JCQkJdTMyICogbXNnaWQsCi0JCQkJdTMyIHRyZ2NscywKLQkJCQl1MzIgc3JjY2xzLAotCQkJCXUzMiBtc2d0YWcsCi0JCQkJaW50IGZsYWdzMSwKLQkJCQl1Y2hhciBwcm1tc2dbOF0sCi0JCQkJaXVjdl9hcnJheV90ICogYW5zYnVmLCB1bG9uZyBhbnNsZW4pOwotCi0vKgotICogTmFtZTogaXVjdl9zZXRtYXNrCi0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGZvbGxvd2luZyBJVUNWCi0gKiAgICAgICAgICBleHRlcm5hbCBpbnRlcnJ1cHRpb25zOiBOb25wcmlvcml0eSBhbmQgcHJpb3JpdHkgbWVzc2FnZQotICogICAgICAgICAgaW50ZXJydXB0cywgbm9ucHJpb3JpdHkgYW5kIHByaW9yaXR5IHJlcGx5IGludGVycnVwdHMuCi0gKiBJbnB1dDogU2V0TWFza0ZsYWcgLSBvcHRpb25zIGZvciBpbnRlcnJ1cHRzCi0gKiAgICAgICAgICAgMHg4MCAtIE5vbnByaW9yaXR5X01lc3NhZ2VQZW5kaW5nSW50ZXJydXB0c0ZsYWcKLSAqICAgICAgICAgICAweDQwIC0gUHJpb3JpdHlfTWVzc2FnZVBlbmRpbmdJbnRlcnJ1cHRzRmxhZwotICogICAgICAgICAgIDB4MjAgLSBOb25wcmlvcml0eV9NZXNzYWdlQ29tcGxldGlvbkludGVycnVwdHNGbGFnCi0gKiAgICAgICAgICAgMHgxMCAtIFByaW9yaXR5X01lc3NhZ2VDb21wbGV0aW9uSW50ZXJydXB0c0ZsYWcKLSAqICAgICAgICAgICAweDA4IC0gSVVDVkNvbnRyb2xJbnRlcnJ1cHRzRmxhZwotICogT3V0cHV0OiBOQQotICogUmV0dXJuOiBSZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbC4KLSovCi1pbnQgaXVjdl9zZXRtYXNrIChpbnQgU2V0TWFza0ZsYWcpOwotCi0vKgotICogTmFtZTogaXVjdl9zZXZlcgotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiB0ZXJtaW5hdGVzIGFuIElVQ1YgcGF0aC4KLSAqIElucHV0OiBwYXRoaWQgLSBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqICAgICAgICB1c2VyX2RhdGEgLSAxNi1ieXRlcyBvZiB1c2VyIGRhdGEuCi0gKiBPdXRwdXQ6IE5BCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotICogICAgICAgICAoLUVJTlZBTCkgLSBJbnRlcmFsIGVycm9yLCB3aWxkIHBvaW50ZXIuCi0qLwotaW50IGl1Y3Zfc2V2ZXIgKHUxNiBwYXRoaWQsIHVjaGFyIHVzZXJfZGF0YVsxNl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9uZXRpdWN2LmMgYi9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYwppbmRleCAzMzQ2MDg4Li42Mzg3YjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBJVUNWIG5ldHdvcmsgZHJpdmVyCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAyMDAxIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KICAqIEF1dGhvcihzKTogRnJpdHogRWxmZXJ0IChlbGZlcnRAZGUuaWJtLmNvbSwgZmVsZmVydEBtaWxsZW51eC5jb20pCiAgKgogICogU3lzZnMgaW50ZWdyYXRpb24gYW5kIGFsbCBidWdzIHRoZXJlaW4gYnkgQ29ybmVsaWEgSHVjawpAQCAtNTgsMTMgKzU4LDk0IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgIml1Y3YuaCIKKyNpbmNsdWRlIDxuZXQvaXVjdi9pdWN2Lmg+CiAjaW5jbHVkZSAiZnNtLmgiCiAKIE1PRFVMRV9BVVRIT1IKICAgICAoIihDKSAyMDAxIElCTSBDb3Jwb3JhdGlvbiBieSBGcml0eiBFbGZlcnQgKGZlbGZlcnRAbWlsbGVudXguY29tKSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OICgiTGludXggZm9yIFMvMzkwIElVQ1YgbmV0d29yayBkcml2ZXIiKTsKIAorLyoqCisgKiBEZWJ1ZyBGYWNpbGl0eSBzdHVmZgorICovCisjZGVmaW5lIElVQ1ZfREJGX1NFVFVQX05BTUUgIml1Y3Zfc2V0dXAiCisjZGVmaW5lIElVQ1ZfREJGX1NFVFVQX0xFTiAzMgorI2RlZmluZSBJVUNWX0RCRl9TRVRVUF9QQUdFUyAyCisjZGVmaW5lIElVQ1ZfREJGX1NFVFVQX05SX0FSRUFTIDEKKyNkZWZpbmUgSVVDVl9EQkZfU0VUVVBfTEVWRUwgMworCisjZGVmaW5lIElVQ1ZfREJGX0RBVEFfTkFNRSAiaXVjdl9kYXRhIgorI2RlZmluZSBJVUNWX0RCRl9EQVRBX0xFTiAxMjgKKyNkZWZpbmUgSVVDVl9EQkZfREFUQV9QQUdFUyAyCisjZGVmaW5lIElVQ1ZfREJGX0RBVEFfTlJfQVJFQVMgMQorI2RlZmluZSBJVUNWX0RCRl9EQVRBX0xFVkVMIDIKKworI2RlZmluZSBJVUNWX0RCRl9UUkFDRV9OQU1FICJpdWN2X3RyYWNlIgorI2RlZmluZSBJVUNWX0RCRl9UUkFDRV9MRU4gMTYKKyNkZWZpbmUgSVVDVl9EQkZfVFJBQ0VfUEFHRVMgNAorI2RlZmluZSBJVUNWX0RCRl9UUkFDRV9OUl9BUkVBUyAxCisjZGVmaW5lIElVQ1ZfREJGX1RSQUNFX0xFVkVMIDMKKworI2RlZmluZSBJVUNWX0RCRl9URVhUKG5hbWUsbGV2ZWwsdGV4dCkgXAorCWRvIHsgXAorCQlkZWJ1Z190ZXh0X2V2ZW50KGl1Y3ZfZGJmXyMjbmFtZSxsZXZlbCx0ZXh0KTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSVVDVl9EQkZfSEVYKG5hbWUsbGV2ZWwsYWRkcixsZW4pIFwKKwlkbyB7IFwKKwkJZGVidWdfZXZlbnQoaXVjdl9kYmZfIyNuYW1lLGxldmVsLCh2b2lkKikoYWRkciksbGVuKTsgXAorCX0gd2hpbGUgKDApCisKK0RFQ0xBUkVfUEVSX0NQVShjaGFyWzI1Nl0sIGl1Y3ZfZGJmX3R4dF9idWYpOworCisjZGVmaW5lIElVQ1ZfREJGX1RFWFRfKG5hbWUsbGV2ZWwsdGV4dC4uLikJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJY2hhciogaXVjdl9kYmZfdHh0X2J1ZiA9IGdldF9jcHVfdmFyKGl1Y3ZfZGJmX3R4dF9idWYpOwlcCisJCXNwcmludGYoaXVjdl9kYmZfdHh0X2J1ZiwgdGV4dCk7CQkJXAorCQlkZWJ1Z190ZXh0X2V2ZW50KGl1Y3ZfZGJmXyMjbmFtZSxsZXZlbCxpdWN2X2RiZl90eHRfYnVmKTsgXAorCQlwdXRfY3B1X3ZhcihpdWN2X2RiZl90eHRfYnVmKTsJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSVVDVl9EQkZfU1BSSU5URihuYW1lLGxldmVsLHRleHQuLi4pIFwKKwlkbyB7IFwKKwkJZGVidWdfc3ByaW50Zl9ldmVudChpdWN2X2RiZl90cmFjZSwgbGV2ZWwsICMjdGV4dCApOyBcCisJCWRlYnVnX3NwcmludGZfZXZlbnQoaXVjdl9kYmZfdHJhY2UsIGxldmVsLCB0ZXh0ICk7IFwKKwl9IHdoaWxlICgwKQorCisvKioKKyAqIHNvbWUgbW9yZSBkZWJ1ZyBzdHVmZgorICovCisjZGVmaW5lIElVQ1ZfSEVYRFVNUDE2KGltcG9ydGFuY2UsaGVhZGVyLHB0cikgXAorUFJJTlRfIyNpbXBvcnRhbmNlKGhlYWRlciAiJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgIiBcCisJCSAgICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBcCisJCSAgICooKChjaGFyKilwdHIpKSwqKCgoY2hhciopcHRyKSsxKSwqKCgoY2hhciopcHRyKSsyKSwgXAorCQkgICAqKCgoY2hhciopcHRyKSszKSwqKCgoY2hhciopcHRyKSs0KSwqKCgoY2hhciopcHRyKSs1KSwgXAorCQkgICAqKCgoY2hhciopcHRyKSs2KSwqKCgoY2hhciopcHRyKSs3KSwqKCgoY2hhciopcHRyKSs4KSwgXAorCQkgICAqKCgoY2hhciopcHRyKSs5KSwqKCgoY2hhciopcHRyKSsxMCksKigoKGNoYXIqKXB0cikrMTEpLCBcCisJCSAgICooKChjaGFyKilwdHIpKzEyKSwqKCgoY2hhciopcHRyKSsxMyksIFwKKwkJICAgKigoKGNoYXIqKXB0cikrMTQpLCooKChjaGFyKilwdHIpKzE1KSk7IFwKK1BSSU5UXyMjaW1wb3J0YW5jZShoZWFkZXIgIiUwMnggJTAyeCAlMDJ4ICUwMnggICUwMnggJTAyeCAlMDJ4ICUwMnggICIgXAorCQkgICAiJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgXAorCQkgICAqKCgoY2hhciopcHRyKSsxNiksKigoKGNoYXIqKXB0cikrMTcpLCBcCisJCSAgICooKChjaGFyKilwdHIpKzE4KSwqKCgoY2hhciopcHRyKSsxOSksIFwKKwkJICAgKigoKGNoYXIqKXB0cikrMjApLCooKChjaGFyKilwdHIpKzIxKSwgXAorCQkgICAqKCgoY2hhciopcHRyKSsyMiksKigoKGNoYXIqKXB0cikrMjMpLCBcCisJCSAgICooKChjaGFyKilwdHIpKzI0KSwqKCgoY2hhciopcHRyKSsyNSksIFwKKwkJICAgKigoKGNoYXIqKXB0cikrMjYpLCooKChjaGFyKilwdHIpKzI3KSwgXAorCQkgICAqKCgoY2hhciopcHRyKSsyOCksKigoKGNoYXIqKXB0cikrMjkpLCBcCisJCSAgICooKChjaGFyKilwdHIpKzMwKSwqKCgoY2hhciopcHRyKSszMSkpOworCitzdGF0aWMgaW5saW5lIHZvaWQgaXVjdl9oZXhfZHVtcCh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKGkgJiYgIShpICUgMTYpKQorCQkJcHJpbnRrKCJcbiIpOworCQlwcmludGsoIiUwMnggIiwgKihidWYgKyBpKSk7CisJfQorCXByaW50aygiXG4iKTsKK30KIAogI2RlZmluZSBQUklOVEtfSEVBREVSICIgaXVjdjogIiAgICAgICAvKiBmb3IgZGVidWdnaW5nICovCiAKQEAgLTczLDYgKzE1NCwyNSBAQAogCS5idXMgID0gJml1Y3ZfYnVzLAogfTsKIAorc3RhdGljIGludCBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5yZXEoc3RydWN0IGl1Y3ZfcGF0aCAqLAorCQkJCSAgICB1OCBpcHZtaWRbOF0sIHU4IGlwdXNlclsxNl0pOworc3RhdGljIHZvaWQgbmV0aXVjdl9jYWxsYmFja19jb25uYWNrKHN0cnVjdCBpdWN2X3BhdGggKiwgdTggaXB1c2VyWzE2XSk7CitzdGF0aWMgdm9pZCBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5yZWooc3RydWN0IGl1Y3ZfcGF0aCAqLCB1OCBpcHVzZXJbMTZdKTsKK3N0YXRpYyB2b2lkIG5ldGl1Y3ZfY2FsbGJhY2tfY29ubnN1c3Aoc3RydWN0IGl1Y3ZfcGF0aCAqLCB1OCBpcHVzZXJbMTZdKTsKK3N0YXRpYyB2b2lkIG5ldGl1Y3ZfY2FsbGJhY2tfY29ubnJlcyhzdHJ1Y3QgaXVjdl9wYXRoICosIHU4IGlwdXNlclsxNl0pOworc3RhdGljIHZvaWQgbmV0aXVjdl9jYWxsYmFja19yeChzdHJ1Y3QgaXVjdl9wYXRoICosIHN0cnVjdCBpdWN2X21lc3NhZ2UgKik7CitzdGF0aWMgdm9pZCBuZXRpdWN2X2NhbGxiYWNrX3R4ZG9uZShzdHJ1Y3QgaXVjdl9wYXRoICosIHN0cnVjdCBpdWN2X21lc3NhZ2UgKik7CisKK3N0YXRpYyBzdHJ1Y3QgaXVjdl9oYW5kbGVyIG5ldGl1Y3ZfaGFuZGxlciA9IHsKKwkucGF0aF9wZW5kaW5nCSAgPSBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5yZXEsCisJLnBhdGhfY29tcGxldGUJICA9IG5ldGl1Y3ZfY2FsbGJhY2tfY29ubmFjaywKKwkucGF0aF9zZXZlcmVkCSAgPSBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5yZWosCisJLnBhdGhfcXVpZXNjZWQJICA9IG5ldGl1Y3ZfY2FsbGJhY2tfY29ubnN1c3AsCisJLnBhdGhfcmVzdW1lZAkgID0gbmV0aXVjdl9jYWxsYmFja19jb25ucmVzLAorCS5tZXNzYWdlX3BlbmRpbmcgID0gbmV0aXVjdl9jYWxsYmFja19yeCwKKwkubWVzc2FnZV9jb21wbGV0ZSA9IG5ldGl1Y3ZfY2FsbGJhY2tfdHhkb25lCit9OworCiAvKioKICAqIFBlciBjb25uZWN0aW9uIHByb2ZpbGluZyBkYXRhCiAgKi8KQEAgLTkyLDkgKzE5Miw4IEBACiAgKiBSZXByZXNlbnRhdGlvbiBvZiBvbmUgaXVjdiBjb25uZWN0aW9uCiAgKi8KIHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gewotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gICAgKm5leHQ7Ci0JaXVjdl9oYW5kbGVfdCAgICAgICAgICAgICBoYW5kbGU7Ci0JX191MTYgICAgICAgICAgICAgICAgICAgICBwYXRoaWQ7CisJc3RydWN0IGxpc3RfaGVhZAkgIGxpc3Q7CisJc3RydWN0IGl1Y3ZfcGF0aAkgICpwYXRoOwogCXN0cnVjdCBza19idWZmICAgICAgICAgICAgKnJ4X2J1ZmY7CiAJc3RydWN0IHNrX2J1ZmYgICAgICAgICAgICAqdHhfYnVmZjsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICAgICAgIGNvbGxlY3RfcXVldWU7CkBAIC0xMTIsMTIgKzIxMSw5IEBACiAvKioKICAqIExpbmtlZCBsaXN0IG9mIGFsbCBjb25uZWN0aW9uIHN0cnVjdHMuCiAgKi8KLXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb25fc3RydWN0IHsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICppdWN2X2Nvbm5lY3Rpb25zOwotCXJ3bG9ja190IGl1Y3Zfcndsb2NrOwotfTsKLQotc3RhdGljIHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb25fc3RydWN0IGl1Y3ZfY29ubnM7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBpdWN2X2Nvbm5lY3Rpb25fbGlzdCA9CisJTElTVF9IRUFEX0lOSVQoaXVjdl9jb25uZWN0aW9uX2xpc3QpOworc3RhdGljIHJ3bG9ja190IGl1Y3ZfY29ubmVjdGlvbl9yd2xvY2sgPSBSV19MT0NLX1VOTE9DS0VEOwogCiAvKioKICAqIFJlcHJlc2VudGF0aW9uIG9mIGV2ZW50LWRhdGEgZm9yIHRoZQpAQCAtMTQyLDExICsyMzgsMTEgQEAKIC8qKgogICogTGluayBsZXZlbCBoZWFkZXIgZm9yIGEgcGFja2V0LgogICovCi10eXBlZGVmIHN0cnVjdCBsbF9oZWFkZXJfdCB7Ci0JX191MTYgbmV4dDsKLX0gbGxfaGVhZGVyOworc3RydWN0IGxsX2hlYWRlciB7CisJdTE2IG5leHQ7Cit9OwogCi0jZGVmaW5lIE5FVElVQ1ZfSERSTEVOICAgICAgICAgICAoc2l6ZW9mKGxsX2hlYWRlcikpCisjZGVmaW5lIE5FVElVQ1ZfSERSTEVOCQkgKHNpemVvZihzdHJ1Y3QgbGxfaGVhZGVyKSkKICNkZWZpbmUgTkVUSVVDVl9CVUZTSVpFX01BWCAgICAgIDMyNzY4CiAjZGVmaW5lIE5FVElVQ1ZfQlVGU0laRV9ERUZBVUxUICBORVRJVUNWX0JVRlNJWkVfTUFYCiAjZGVmaW5lIE5FVElVQ1ZfTVRVX01BWCAgICAgICAgICAoTkVUSVVDVl9CVUZTSVpFX01BWCAtIE5FVElVQ1ZfSERSTEVOKQpAQCAtMTU4LDM2ICsyNTQsMjYgQEAKICAqIENvbXBhdGliaWxpdHkgbWFjcm9zIGZvciBidXN5IGhhbmRsaW5nCiAgKiBvZiBuZXR3b3JrIGRldmljZXMuCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgbmV0aXVjdl9jbGVhcl9idXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0aXVjdl9jbGVhcl9idXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JY2xlYXJfYml0KDAsICYoKChzdHJ1Y3QgbmV0aXVjdl9wcml2ICopZGV2LT5wcml2KS0+dGJ1c3kpKTsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljbGVhcl9iaXQoMCwgJnByaXYtPnRidXN5KTsKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBuZXRpdWN2X3Rlc3RfYW5kX3NldF9idXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIGludCBuZXRpdWN2X3Rlc3RfYW5kX3NldF9idXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KDAsICYoKHN0cnVjdCBuZXRpdWN2X3ByaXYgKilkZXYtPnByaXYpLT50YnVzeSk7CisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJnByaXYtPnRidXN5KTsKIH0KIAotc3RhdGljIF9fdTggaXVjdl9ob3N0WzhdID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07Ci1zdGF0aWMgX191OCBpdWN2TWFnaWNbMTZdID0geworc3RhdGljIHU4IGl1Y3ZNYWdpY1sxNl0gPSB7CiAJMHhGMCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwKIAkweEYwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwCiB9OwogCiAvKioKLSAqIFRoaXMgbWFzayBtZWFucyB0aGUgMTYtYnl0ZSBJVUNWICJtYWdpYyIgYW5kIHRoZSBvcmlnaW4gdXNlcmlkIG11c3QKLSAqIG1hdGNoIGV4YWN0bHkgYXMgc3BlY2lmaWVkIGluIG9yZGVyIHRvIGdpdmUgY29ubmVjdGlvbl9wZW5kaW5nKCkKLSAqIGNvbnRyb2wuCi0gKi8KLXN0YXRpYyBfX3U4IG5ldGl1Y3ZfbWFza1tdID0gewotCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0JMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLQkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCi19OwotCi0vKioKICAqIENvbnZlcnQgYW4gaXVjdiB1c2VySWQgdG8gaXRzIHByaW50YWJsZQogICogZm9ybSAoc3RyaXAgd2hpdGVzcGFjZSBhdCBlbmQpLgogICoKQEAgLTE5NSw4ICsyODEsNyBAQAogICoKICAqIEByZXR1cm5zIFRoZSBwcmludGFibGUgc3RyaW5nIChzdGF0aWMgZGF0YSEhKQogICovCi1zdGF0aWMgX19pbmxpbmVfXyBjaGFyICoKLW5ldGl1Y3ZfcHJpbnRuYW1lKGNoYXIgKm5hbWUpCitzdGF0aWMgaW5saW5lIGNoYXIgKm5ldGl1Y3ZfcHJpbnRuYW1lKGNoYXIgKm5hbWUpCiB7CiAJc3RhdGljIGNoYXIgdG1wWzldOwogCWNoYXIgKnAgPSB0bXA7CkBAIC0zNzksOCArNDY0LDcgQEAKIAogREVGSU5FX1BFUl9DUFUoY2hhclsyNTZdLCBpdWN2X2RiZl90eHRfYnVmKTsKIAotc3RhdGljIHZvaWQKLWl1Y3ZfdW5yZWdpc3Rlcl9kYmZfdmlld3Modm9pZCkKK3N0YXRpYyB2b2lkIGl1Y3ZfdW5yZWdpc3Rlcl9kYmZfdmlld3Modm9pZCkKIHsKIAlpZiAoaXVjdl9kYmZfc2V0dXApCiAJCWRlYnVnX3VucmVnaXN0ZXIoaXVjdl9kYmZfc2V0dXApOwpAQCAtMzg5LDggKzQ3Myw3IEBACiAJaWYgKGl1Y3ZfZGJmX3RyYWNlKQogCQlkZWJ1Z191bnJlZ2lzdGVyKGl1Y3ZfZGJmX3RyYWNlKTsKIH0KLXN0YXRpYyBpbnQKLWl1Y3ZfcmVnaXN0ZXJfZGJmX3ZpZXdzKHZvaWQpCitzdGF0aWMgaW50IGl1Y3ZfcmVnaXN0ZXJfZGJmX3ZpZXdzKHZvaWQpCiB7CiAJaXVjdl9kYmZfc2V0dXAgPSBkZWJ1Z19yZWdpc3RlcihJVUNWX0RCRl9TRVRVUF9OQU1FLAogCQkJCQlJVUNWX0RCRl9TRVRVUF9QQUdFUywKQEAgLTQyMiwxMjUgKzUwNSwxMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqCisvKgogICogQ2FsbGJhY2std3JhcHBlcnMsIGNhbGxlZCBmcm9tIGxvd2xldmVsIGl1Y3YgbGF5ZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIAotc3RhdGljIHZvaWQKLW5ldGl1Y3ZfY2FsbGJhY2tfcngoaXVjdl9NZXNzYWdlUGVuZGluZyAqZWliLCB2b2lkICpwZ21fZGF0YSkKK3N0YXRpYyB2b2lkIG5ldGl1Y3ZfY2FsbGJhY2tfcngoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwKKwkJCQlzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2cpCiB7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IChzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICopcGdtX2RhdGE7CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IHBhdGgtPnByaXZhdGU7CiAJc3RydWN0IGl1Y3ZfZXZlbnQgZXY7CiAKIAlldi5jb25uID0gY29ubjsKLQlldi5kYXRhID0gKHZvaWQgKillaWI7Ci0KKwlldi5kYXRhID0gbXNnOwogCWZzbV9ldmVudChjb25uLT5mc20sIENPTk5fRVZFTlRfUlgsICZldik7CiB9CiAKLXN0YXRpYyB2b2lkCi1uZXRpdWN2X2NhbGxiYWNrX3R4ZG9uZShpdWN2X01lc3NhZ2VDb21wbGV0ZSAqZWliLCB2b2lkICpwZ21fZGF0YSkKK3N0YXRpYyB2b2lkIG5ldGl1Y3ZfY2FsbGJhY2tfdHhkb25lKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsCisJCQkJICAgIHN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZykKIHsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gKHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKilwZ21fZGF0YTsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gcGF0aC0+cHJpdmF0ZTsKIAlzdHJ1Y3QgaXVjdl9ldmVudCBldjsKIAogCWV2LmNvbm4gPSBjb25uOwotCWV2LmRhdGEgPSAodm9pZCAqKWVpYjsKKwlldi5kYXRhID0gbXNnOwogCWZzbV9ldmVudChjb25uLT5mc20sIENPTk5fRVZFTlRfVFhET05FLCAmZXYpOwogfQogCi1zdGF0aWMgdm9pZAotbmV0aXVjdl9jYWxsYmFja19jb25uYWNrKGl1Y3ZfQ29ubmVjdGlvbkNvbXBsZXRlICplaWIsIHZvaWQgKnBnbV9kYXRhKQorc3RhdGljIHZvaWQgbmV0aXVjdl9jYWxsYmFja19jb25uYWNrKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IGlwdXNlclsxNl0pCiB7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IChzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICopcGdtX2RhdGE7Ci0Jc3RydWN0IGl1Y3ZfZXZlbnQgZXY7CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IHBhdGgtPnByaXZhdGU7CiAKLQlldi5jb25uID0gY29ubjsKLQlldi5kYXRhID0gKHZvaWQgKillaWI7Ci0JZnNtX2V2ZW50KGNvbm4tPmZzbSwgQ09OTl9FVkVOVF9DT05OX0FDSywgJmV2KTsKKwlmc21fZXZlbnQoY29ubi0+ZnNtLCBDT05OX0VWRU5UX0NPTk5fQUNLLCBjb25uKTsKIH0KIAotc3RhdGljIHZvaWQKLW5ldGl1Y3ZfY2FsbGJhY2tfY29ubnJlcShpdWN2X0Nvbm5lY3Rpb25QZW5kaW5nICplaWIsIHZvaWQgKnBnbV9kYXRhKQorc3RhdGljIGludCBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5yZXEoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwKKwkJCQkgICAgdTggaXB2bWlkWzhdLCB1OCBpcHVzZXJbMTZdKQogewotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPSAoc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqKXBnbV9kYXRhOworCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPSBwYXRoLT5wcml2YXRlOwogCXN0cnVjdCBpdWN2X2V2ZW50IGV2OworCWludCByYzsKIAotCWV2LmNvbm4gPSBjb25uOwotCWV2LmRhdGEgPSAodm9pZCAqKWVpYjsKLQlmc21fZXZlbnQoY29ubi0+ZnNtLCBDT05OX0VWRU5UX0NPTk5fUkVRLCAmZXYpOworCWlmIChtZW1jbXAoaXVjdk1hZ2ljLCBpcHVzZXIsIHNpemVvZihpcHVzZXIpKSkKKwkJLyogaXB1c2VyIG11c3QgbWF0Y2ggaXVjdk1hZ2ljLiAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwlyYyA9IC1FSU5WQUw7CisJcmVhZF9sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZpdWN2X2Nvbm5lY3Rpb25fbGlzdCwgbGlzdCkgeworCQlpZiAoc3RybmNtcChpcHZtaWQsIGNvbm4tPnVzZXJpZCwgOCkpCisJCQljb250aW51ZTsKKwkJLyogRm91bmQgYSBtYXRjaGluZyBjb25uZWN0aW9uIGZvciB0aGlzIHBhdGguICovCisJCWNvbm4tPnBhdGggPSBwYXRoOworCQlldi5jb25uID0gY29ubjsKKwkJZXYuZGF0YSA9IHBhdGg7CisJCWZzbV9ldmVudChjb25uLT5mc20sIENPTk5fRVZFTlRfQ09OTl9SRVEsICZldik7CisJCXJjID0gMDsKKwl9CisJcmVhZF91bmxvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOworCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQKLW5ldGl1Y3ZfY2FsbGJhY2tfY29ubnJlaihpdWN2X0Nvbm5lY3Rpb25TZXZlcmVkICplaWIsIHZvaWQgKnBnbV9kYXRhKQorc3RhdGljIHZvaWQgbmV0aXVjdl9jYWxsYmFja19jb25ucmVqKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IGlwdXNlclsxNl0pCiB7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IChzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICopcGdtX2RhdGE7Ci0Jc3RydWN0IGl1Y3ZfZXZlbnQgZXY7CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IHBhdGgtPnByaXZhdGU7CiAKLQlldi5jb25uID0gY29ubjsKLQlldi5kYXRhID0gKHZvaWQgKillaWI7Ci0JZnNtX2V2ZW50KGNvbm4tPmZzbSwgQ09OTl9FVkVOVF9DT05OX1JFSiwgJmV2KTsKKwlmc21fZXZlbnQoY29ubi0+ZnNtLCBDT05OX0VWRU5UX0NPTk5fUkVKLCBjb25uKTsKIH0KIAotc3RhdGljIHZvaWQKLW5ldGl1Y3ZfY2FsbGJhY2tfY29ubnN1c3AoaXVjdl9Db25uZWN0aW9uUXVpZXNjZWQgKmVpYiwgdm9pZCAqcGdtX2RhdGEpCitzdGF0aWMgdm9pZCBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5zdXNwKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IGlwdXNlclsxNl0pCiB7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IChzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICopcGdtX2RhdGE7Ci0Jc3RydWN0IGl1Y3ZfZXZlbnQgZXY7CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IHBhdGgtPnByaXZhdGU7CiAKLQlldi5jb25uID0gY29ubjsKLQlldi5kYXRhID0gKHZvaWQgKillaWI7Ci0JZnNtX2V2ZW50KGNvbm4tPmZzbSwgQ09OTl9FVkVOVF9DT05OX1NVUywgJmV2KTsKKwlmc21fZXZlbnQoY29ubi0+ZnNtLCBDT05OX0VWRU5UX0NPTk5fU1VTLCBjb25uKTsKIH0KIAotc3RhdGljIHZvaWQKLW5ldGl1Y3ZfY2FsbGJhY2tfY29ubnJlcyhpdWN2X0Nvbm5lY3Rpb25SZXN1bWVkICplaWIsIHZvaWQgKnBnbV9kYXRhKQorc3RhdGljIHZvaWQgbmV0aXVjdl9jYWxsYmFja19jb25ucmVzKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IGlwdXNlclsxNl0pCiB7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IChzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICopcGdtX2RhdGE7Ci0Jc3RydWN0IGl1Y3ZfZXZlbnQgZXY7CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IHBhdGgtPnByaXZhdGU7CiAKLQlldi5jb25uID0gY29ubjsKLQlldi5kYXRhID0gKHZvaWQgKillaWI7Ci0JZnNtX2V2ZW50KGNvbm4tPmZzbSwgQ09OTl9FVkVOVF9DT05OX1JFUywgJmV2KTsKKwlmc21fZXZlbnQoY29ubi0+ZnNtLCBDT05OX0VWRU5UX0NPTk5fUkVTLCBjb25uKTsKIH0KIAotc3RhdGljIGl1Y3ZfaW50ZXJydXB0X29wc190IG5ldGl1Y3Zfb3BzID0gewotCS5Db25uZWN0aW9uUGVuZGluZyAgPSBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5yZXEsCi0JLkNvbm5lY3Rpb25Db21wbGV0ZSA9IG5ldGl1Y3ZfY2FsbGJhY2tfY29ubmFjaywKLQkuQ29ubmVjdGlvblNldmVyZWQgID0gbmV0aXVjdl9jYWxsYmFja19jb25ucmVqLAotCS5Db25uZWN0aW9uUXVpZXNjZWQgPSBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5zdXNwLAotCS5Db25uZWN0aW9uUmVzdW1lZCAgPSBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5yZXMsCi0JLk1lc3NhZ2VQZW5kaW5nICAgICA9IG5ldGl1Y3ZfY2FsbGJhY2tfcngsCi0JLk1lc3NhZ2VDb21wbGV0ZSAgICA9IG5ldGl1Y3ZfY2FsbGJhY2tfdHhkb25lCi19OwotCiAvKioKICAqIER1bW15IE5PUCBhY3Rpb24gZm9yIGFsbCBzdGF0ZW1hY2hpbmVzCiAgKi8KLXN0YXRpYyB2b2lkCi1mc21fYWN0aW9uX25vcChmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIGZzbV9hY3Rpb25fbm9wKGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQogewogfQogCi0vKioKKy8qCiAgKiBBY3Rpb25zIG9mIHRoZSBjb25uZWN0aW9uIHN0YXRlbWFjaGluZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiAKIC8qKgotICogSGVscGVyIGZ1bmN0aW9uIGZvciBjb25uX2FjdGlvbl9yeCgpCi0gKiBVbnBhY2sgYSBqdXN0IHJlY2VpdmVkIHNrYiBhbmQgaGFuZCBpdCBvdmVyIHRvCi0gKiB1cHBlciBsYXllcnMuCisgKiBuZXRpdWN2X3VucGFja19za2IKKyAqIEBjb25uOiBUaGUgY29ubmVjdGlvbiB3aGVyZSB0aGlzIHNrYiBoYXMgYmVlbiByZWNlaXZlZC4KKyAqIEBwc2tiOiBUaGUgcmVjZWl2ZWQgc2tiLgogICoKLSAqIEBwYXJhbSBjb25uIFRoZSBjb25uZWN0aW9uIHdoZXJlIHRoaXMgc2tiIGhhcyBiZWVuIHJlY2VpdmVkLgotICogQHBhcmFtIHBza2IgVGhlIHJlY2VpdmVkIHNrYi4KKyAqIFVucGFjayBhIGp1c3QgcmVjZWl2ZWQgc2tiIGFuZCBoYW5kIGl0IG92ZXIgdG8gdXBwZXIgbGF5ZXJzLgorICogSGVscGVyIGZ1bmN0aW9uIGZvciBjb25uX2FjdGlvbl9yeC4KICAqLwotLy9zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1zdGF0aWMgdm9pZAotbmV0aXVjdl91bnBhY2tfc2tiKHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBza19idWZmICpwc2tiKQorc3RhdGljIHZvaWQgbmV0aXVjdl91bnBhY2tfc2tiKHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnBza2IpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgICAgICpkZXYgPSBjb25uLT5uZXRkZXY7Ci0Jc3RydWN0IG5ldGl1Y3ZfcHJpdiAgICpwcml2cHRyID0gZGV2LT5wcml2OwotCV9fdTE2ICAgICAgICAgIG9mZnNldCA9IDA7CisJc3RydWN0IG5ldGl1Y3ZfcHJpdiAgICpwcml2cHRyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgb2Zmc2V0ID0gMDsKIAogCXNrYl9wdXQocHNrYiwgTkVUSVVDVl9IRFJMRU4pOwogCXBza2ItPmRldiA9IGRldjsKQEAgLTU0OSw3ICs2MTgsNyBAQAogCiAJd2hpbGUgKDEpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJbGxfaGVhZGVyICpoZWFkZXIgPSAobGxfaGVhZGVyICopcHNrYi0+ZGF0YTsKKwkJc3RydWN0IGxsX2hlYWRlciAqaGVhZGVyID0gKHN0cnVjdCBsbF9oZWFkZXIgKikgcHNrYi0+ZGF0YTsKIAogCQlpZiAoIWhlYWRlci0+bmV4dCkKIAkJCWJyZWFrOwpAQCAtNTk1LDQwICs2NjQsMzcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1jb25uX2FjdGlvbl9yeChmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIGNvbm5fYWN0aW9uX3J4KGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBpdWN2X2V2ZW50ICpldiA9IChzdHJ1Y3QgaXVjdl9ldmVudCAqKWFyZzsKKwlzdHJ1Y3QgaXVjdl9ldmVudCAqZXYgPSBhcmc7CiAJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IGV2LT5jb25uOwotCWl1Y3ZfTWVzc2FnZVBlbmRpbmcgKmVpYiA9IChpdWN2X01lc3NhZ2VQZW5kaW5nICopZXYtPmRhdGE7Ci0Jc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9KHN0cnVjdCBuZXRpdWN2X3ByaXYgKiljb25uLT5uZXRkZXYtPnByaXY7Ci0KLQlfX3UzMiBtc2dsZW4gPSBlaWItPmxuMW1zZzIuaXBiZmxuMWY7CisJc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnID0gZXYtPmRhdGE7CisJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IG5ldGRldl9wcml2KGNvbm4tPm5ldGRldik7CiAJaW50IHJjOwogCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgNCwgX19GVU5DVElPTl9fKTsKIAogCWlmICghY29ubi0+bmV0ZGV2KSB7Ci0JCS8qIEZSSVRaOiBIb3cgdG8gdGVsbCBpdWN2IExMIHRvIGRyb3AgdGhlIG1zZz8gKi8KKwkJaXVjdl9tZXNzYWdlX3JlamVjdChjb25uLT5wYXRoLCBtc2cpOwogCQlQUklOVF9XQVJOKCJSZWNlaXZlZCBkYXRhIGZvciB1bmxpbmtlZCBjb25uZWN0aW9uXG4iKTsKIAkJSVVDVl9EQkZfVEVYVChkYXRhLCAyLAotCQkJIlJlY2VpdmVkIGRhdGEgZm9yIHVubGlua2VkIGNvbm5lY3Rpb25cbiIpOworCQkJICAgICAgIlJlY2VpdmVkIGRhdGEgZm9yIHVubGlua2VkIGNvbm5lY3Rpb25cbiIpOwogCQlyZXR1cm47CiAJfQotCWlmIChtc2dsZW4gPiBjb25uLT5tYXhfYnVmZnNpemUpIHsKLQkJLyogRlJJVFo6IEhvdyB0byB0ZWxsIGl1Y3YgTEwgdG8gZHJvcCB0aGUgbXNnPyAqLworCWlmIChtc2ctPmxlbmd0aCA+IGNvbm4tPm1heF9idWZmc2l6ZSkgeworCQlpdWN2X21lc3NhZ2VfcmVqZWN0KGNvbm4tPnBhdGgsIG1zZyk7CiAJCXByaXZwdHItPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJUFJJTlRfV0FSTigibXNnbGVuICVkID4gbWF4X2J1ZmZzaXplICVkXG4iLAotCQkJbXNnbGVuLCBjb25uLT5tYXhfYnVmZnNpemUpOworCQkJICAgbXNnLT5sZW5ndGgsIGNvbm4tPm1heF9idWZmc2l6ZSk7CiAJCUlVQ1ZfREJGX1RFWFRfKGRhdGEsIDIsICJtc2dsZW4gJWQgPiBtYXhfYnVmZnNpemUgJWRcbiIsCi0JCQltc2dsZW4sIGNvbm4tPm1heF9idWZmc2l6ZSk7CisJCQkgICAgICAgbXNnLT5sZW5ndGgsIGNvbm4tPm1heF9idWZmc2l6ZSk7CiAJCXJldHVybjsKIAl9CiAJY29ubi0+cnhfYnVmZi0+ZGF0YSA9IGNvbm4tPnJ4X2J1ZmYtPnRhaWwgPSBjb25uLT5yeF9idWZmLT5oZWFkOwogCWNvbm4tPnJ4X2J1ZmYtPmxlbiA9IDA7Ci0JcmMgPSBpdWN2X3JlY2VpdmUoY29ubi0+cGF0aGlkLCBlaWItPmlwbXNnaWQsIGVpYi0+aXB0cmdjbHMsCi0JCQkgIGNvbm4tPnJ4X2J1ZmYtPmRhdGEsIG1zZ2xlbiwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JaWYgKHJjIHx8IG1zZ2xlbiA8IDUpIHsKKwlyYyA9IGl1Y3ZfbWVzc2FnZV9yZWNlaXZlKGNvbm4tPnBhdGgsIG1zZywgMCwgY29ubi0+cnhfYnVmZi0+ZGF0YSwKKwkJCQkgIG1zZy0+bGVuZ3RoLCBOVUxMKTsKKwlpZiAocmMgfHwgbXNnLT5sZW5ndGggPCA1KSB7CiAJCXByaXZwdHItPnN0YXRzLnJ4X2Vycm9ycysrOwogCQlQUklOVF9XQVJOKCJpdWN2X3JlY2VpdmUgcmV0dXJuZWQgJTA4eFxuIiwgcmMpOwogCQlJVUNWX0RCRl9URVhUXyhkYXRhLCAyLCAicmMgJWQgZnJvbSBpdWN2X3JlY2VpdmVcbiIsIHJjKTsKQEAgLTYzNywyNiArNzAzLDI2IEBACiAJbmV0aXVjdl91bnBhY2tfc2tiKGNvbm4sIGNvbm4tPnJ4X2J1ZmYpOwogfQogCi1zdGF0aWMgdm9pZAotY29ubl9hY3Rpb25fdHhkb25lKGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgY29ubl9hY3Rpb25fdHhkb25lKGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBpdWN2X2V2ZW50ICpldiA9IChzdHJ1Y3QgaXVjdl9ldmVudCAqKWFyZzsKKwlzdHJ1Y3QgaXVjdl9ldmVudCAqZXYgPSBhcmc7CiAJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IGV2LT5jb25uOwotCWl1Y3ZfTWVzc2FnZUNvbXBsZXRlICplaWIgPSAoaXVjdl9NZXNzYWdlQ29tcGxldGUgKilldi0+ZGF0YTsKKwlzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2cgPSBldi0+ZGF0YTsKKwlzdHJ1Y3QgaXVjdl9tZXNzYWdlIHR4bXNnOwogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXZwdHIgPSBOVUxMOwotCQkJICAgICAgICAgLyogU2h1dCB1cCwgZ2NjISBza2IgaXMgYWx3YXlzIGJlbG93IDJHLiAqLwotCV9fdTMyIHNpbmdsZV9mbGFnID0gZWliLT5pcG1zZ3RhZzsKLQlfX3UzMiB0eGJ5dGVzID0gMDsKLQlfX3UzMiB0eHBhY2tldHMgPSAwOwotCV9fdTMyIHN0YXRfbWF4Y3EgPSAwOworCXUzMiBzaW5nbGVfZmxhZyA9IG1zZy0+dGFnOworCXUzMiB0eGJ5dGVzID0gMDsKKwl1MzIgdHhwYWNrZXRzID0gMDsKKwl1MzIgc3RhdF9tYXhjcSA9IDA7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBsb25nIHNhdmVmbGFnczsKLQlsbF9oZWFkZXIgaGVhZGVyOworCXN0cnVjdCBsbF9oZWFkZXIgaGVhZGVyOworCWludCByYzsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDQsIF9fRlVOQ1RJT05fXyk7CiAKLQlpZiAoY29ubiAmJiBjb25uLT5uZXRkZXYgJiYgY29ubi0+bmV0ZGV2LT5wcml2KQotCQlwcml2cHRyID0gKHN0cnVjdCBuZXRpdWN2X3ByaXYgKiljb25uLT5uZXRkZXYtPnByaXY7CisJaWYgKGNvbm4gJiYgY29ubi0+bmV0ZGV2KQorCQlwcml2cHRyID0gbmV0ZGV2X3ByaXYoY29ubi0+bmV0ZGV2KTsKIAljb25uLT5wcm9mLnR4X3BlbmRpbmctLTsKIAlpZiAoc2luZ2xlX2ZsYWcpIHsKIAkJaWYgKChza2IgPSBza2JfZGVxdWV1ZSgmY29ubi0+Y29tbWl0X3F1ZXVlKSkpIHsKQEAgLTY4OCw1NiArNzU0LDU1IEBACiAJCWNvbm4tPnByb2YubWF4bXVsdGkgPSBjb25uLT5jb2xsZWN0X2xlbjsKIAljb25uLT5jb2xsZWN0X2xlbiA9IDA7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29ubi0+Y29sbGVjdF9sb2NrLCBzYXZlZmxhZ3MpOwotCWlmIChjb25uLT50eF9idWZmLT5sZW4pIHsKLQkJaW50IHJjOwotCi0JCWhlYWRlci5uZXh0ID0gMDsKLQkJbWVtY3B5KHNrYl9wdXQoY29ubi0+dHhfYnVmZiwgTkVUSVVDVl9IRFJMRU4pLCAmaGVhZGVyLAotCQkgICAgICAgTkVUSVVDVl9IRFJMRU4pOwotCi0JCWNvbm4tPnByb2Yuc2VuZF9zdGFtcCA9IHh0aW1lOwotCQlyYyA9IGl1Y3Zfc2VuZChjb25uLT5wYXRoaWQsIE5VTEwsIDAsIDAsIDAsIDAsCi0JCQkgICAgICAgY29ubi0+dHhfYnVmZi0+ZGF0YSwgY29ubi0+dHhfYnVmZi0+bGVuKTsKLQkJY29ubi0+cHJvZi5kb2lvc19tdWx0aSsrOwotCQljb25uLT5wcm9mLnR4bGVuICs9IGNvbm4tPnR4X2J1ZmYtPmxlbjsKLQkJY29ubi0+cHJvZi50eF9wZW5kaW5nKys7Ci0JCWlmIChjb25uLT5wcm9mLnR4X3BlbmRpbmcgPiBjb25uLT5wcm9mLnR4X21heF9wZW5kaW5nKQotCQkJY29ubi0+cHJvZi50eF9tYXhfcGVuZGluZyA9IGNvbm4tPnByb2YudHhfcGVuZGluZzsKLQkJaWYgKHJjKSB7Ci0JCQljb25uLT5wcm9mLnR4X3BlbmRpbmctLTsKLQkJCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9JRExFKTsKLQkJCWlmIChwcml2cHRyKQotCQkJCXByaXZwdHItPnN0YXRzLnR4X2Vycm9ycyArPSB0eHBhY2tldHM7Ci0JCQlQUklOVF9XQVJOKCJpdWN2X3NlbmQgcmV0dXJuZWQgJTA4eFxuIiwJcmMpOwotCQkJSVVDVl9EQkZfVEVYVF8oZGF0YSwgMiwgInJjICVkIGZyb20gaXVjdl9zZW5kXG4iLCByYyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocHJpdnB0cikgewotCQkJCXByaXZwdHItPnN0YXRzLnR4X3BhY2tldHMgKz0gdHhwYWNrZXRzOwotCQkJCXByaXZwdHItPnN0YXRzLnR4X2J5dGVzICs9IHR4Ynl0ZXM7Ci0JCQl9Ci0JCQlpZiAoc3RhdF9tYXhjcSA+IGNvbm4tPnByb2YubWF4Y3F1ZXVlKQotCQkJCWNvbm4tPnByb2YubWF4Y3F1ZXVlID0gc3RhdF9tYXhjcTsKLQkJfQotCX0gZWxzZQorCWlmIChjb25uLT50eF9idWZmLT5sZW4gPT0gMCkgewogCQlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfSURMRSk7CisJCXJldHVybjsKKwl9CisKKwloZWFkZXIubmV4dCA9IDA7CisJbWVtY3B5KHNrYl9wdXQoY29ubi0+dHhfYnVmZiwgTkVUSVVDVl9IRFJMRU4pLCAmaGVhZGVyLCBORVRJVUNWX0hEUkxFTik7CisJY29ubi0+cHJvZi5zZW5kX3N0YW1wID0geHRpbWU7CisJdHhtc2cuY2xhc3MgPSAwOworCXR4bXNnLnRhZyA9IDA7CisJcmMgPSBpdWN2X21lc3NhZ2Vfc2VuZChjb25uLT5wYXRoLCAmdHhtc2csIDAsIDAsCisJCQkgICAgICAgY29ubi0+dHhfYnVmZi0+ZGF0YSwgY29ubi0+dHhfYnVmZi0+bGVuKTsKKwljb25uLT5wcm9mLmRvaW9zX211bHRpKys7CisJY29ubi0+cHJvZi50eGxlbiArPSBjb25uLT50eF9idWZmLT5sZW47CisJY29ubi0+cHJvZi50eF9wZW5kaW5nKys7CisJaWYgKGNvbm4tPnByb2YudHhfcGVuZGluZyA+IGNvbm4tPnByb2YudHhfbWF4X3BlbmRpbmcpCisJCWNvbm4tPnByb2YudHhfbWF4X3BlbmRpbmcgPSBjb25uLT5wcm9mLnR4X3BlbmRpbmc7CisJaWYgKHJjKSB7CisJCWNvbm4tPnByb2YudHhfcGVuZGluZy0tOworCQlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfSURMRSk7CisJCWlmIChwcml2cHRyKQorCQkJcHJpdnB0ci0+c3RhdHMudHhfZXJyb3JzICs9IHR4cGFja2V0czsKKwkJUFJJTlRfV0FSTigiaXVjdl9zZW5kIHJldHVybmVkICUwOHhcbiIsCXJjKTsKKwkJSVVDVl9EQkZfVEVYVF8oZGF0YSwgMiwgInJjICVkIGZyb20gaXVjdl9zZW5kXG4iLCByYyk7CisJfSBlbHNlIHsKKwkJaWYgKHByaXZwdHIpIHsKKwkJCXByaXZwdHItPnN0YXRzLnR4X3BhY2tldHMgKz0gdHhwYWNrZXRzOworCQkJcHJpdnB0ci0+c3RhdHMudHhfYnl0ZXMgKz0gdHhieXRlczsKKwkJfQorCQlpZiAoc3RhdF9tYXhjcSA+IGNvbm4tPnByb2YubWF4Y3F1ZXVlKQorCQkJY29ubi0+cHJvZi5tYXhjcXVldWUgPSBzdGF0X21heGNxOworCX0KIH0KIAotc3RhdGljIHZvaWQKLWNvbm5fYWN0aW9uX2Nvbm5hY2NlcHQoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCitzdGF0aWMgdm9pZCBjb25uX2FjdGlvbl9jb25uYWNjZXB0KGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBpdWN2X2V2ZW50ICpldiA9IChzdHJ1Y3QgaXVjdl9ldmVudCAqKWFyZzsKKwlzdHJ1Y3QgaXVjdl9ldmVudCAqZXYgPSBhcmc7CiAJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IGV2LT5jb25uOwotCWl1Y3ZfQ29ubmVjdGlvblBlbmRpbmcgKmVpYiA9IChpdWN2X0Nvbm5lY3Rpb25QZW5kaW5nICopZXYtPmRhdGE7CisJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCA9IGV2LT5kYXRhOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBjb25uLT5uZXRkZXY7Ci0Jc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IChzdHJ1Y3QgbmV0aXVjdl9wcml2ICopbmV0ZGV2LT5wcml2OworCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXZwdHIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCByYzsKLQlfX3UxNiBtc2dsaW1pdDsKLQlfX3U4IHVkYXRhWzE2XTsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7CiAKLQlyYyA9IGl1Y3ZfYWNjZXB0KGVpYi0+aXBwYXRoaWQsIE5FVElVQ1ZfUVVFVUVMRU5fREVGQVVMVCwgdWRhdGEsIDAsCi0JCQkgY29ubi0+aGFuZGxlLCBjb25uLCBOVUxMLCAmbXNnbGltaXQpOworCWNvbm4tPnBhdGggPSBwYXRoOworCXBhdGgtPm1zZ2xpbSA9IE5FVElVQ1ZfUVVFVUVMRU5fREVGQVVMVDsKKwlwYXRoLT5mbGFncyA9IDA7CisJcmMgPSBpdWN2X3BhdGhfYWNjZXB0KHBhdGgsICZuZXRpdWN2X2hhbmRsZXIsIE5VTEwsIGNvbm4pOwogCWlmIChyYykgewogCQlQUklOVF9XQVJOKCIlczogSVVDViBhY2NlcHQgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCiAJCSAgICAgICBuZXRkZXYtPm5hbWUsIHJjKTsKQEAgLTc0NSwxODMgKzgxMCwxMjYgQEAKIAkJcmV0dXJuOwogCX0KIAlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfSURMRSk7Ci0JY29ubi0+cGF0aGlkID0gZWliLT5pcHBhdGhpZDsKLQluZXRkZXYtPnR4X3F1ZXVlX2xlbiA9IG1zZ2xpbWl0OworCW5ldGRldi0+dHhfcXVldWVfbGVuID0gY29ubi0+cGF0aC0+bXNnbGltOwogCWZzbV9ldmVudChwcml2cHRyLT5mc20sIERFVl9FVkVOVF9DT05VUCwgbmV0ZGV2KTsKIH0KIAotc3RhdGljIHZvaWQKLWNvbm5fYWN0aW9uX2Nvbm5yZWplY3QoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCitzdGF0aWMgdm9pZCBjb25uX2FjdGlvbl9jb25ucmVqZWN0KGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBpdWN2X2V2ZW50ICpldiA9IChzdHJ1Y3QgaXVjdl9ldmVudCAqKWFyZzsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gZXYtPmNvbm47Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGNvbm4tPm5ldGRldjsKLQlpdWN2X0Nvbm5lY3Rpb25QZW5kaW5nICplaWIgPSAoaXVjdl9Db25uZWN0aW9uUGVuZGluZyAqKWV2LT5kYXRhOwotCV9fdTggdWRhdGFbMTZdOworCXN0cnVjdCBpdWN2X2V2ZW50ICpldiA9IGFyZzsKKwlzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoID0gZXYtPmRhdGE7CiAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwotCi0JaXVjdl9zZXZlcihlaWItPmlwcGF0aGlkLCB1ZGF0YSk7Ci0JaWYgKGVpYi0+aXBwYXRoaWQgIT0gY29ubi0+cGF0aGlkKSB7Ci0JCVBSSU5UX0lORk8oIiVzOiBJUiBDb25uZWN0aW9uIFBlbmRpbmc7ICIKLQkJCSJwYXRoaWQgJWQgZG9lcyBub3QgbWF0Y2ggb3JpZ2luYWwgcGF0aGlkICVkXG4iLAotCQkJbmV0ZGV2LT5uYW1lLCBlaWItPmlwcGF0aGlkLCBjb25uLT5wYXRoaWQpOwotCQlJVUNWX0RCRl9URVhUXyhkYXRhLCAyLAotCQkJImNvbm5yZWplY3Q6IElSIHBhdGhpZCAlZCwgY29ubi4gcGF0aGlkICVkXG4iLAotCQkJZWliLT5pcHBhdGhpZCwgY29ubi0+cGF0aGlkKTsKLQkJaXVjdl9zZXZlcihjb25uLT5wYXRoaWQsIHVkYXRhKTsKLQl9CisJaXVjdl9wYXRoX3NldmVyKHBhdGgsIE5VTEwpOwogfQogCi1zdGF0aWMgdm9pZAotY29ubl9hY3Rpb25fY29ubmFjayhmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIGNvbm5fYWN0aW9uX2Nvbm5hY2soZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IGl1Y3ZfZXZlbnQgKmV2ID0gKHN0cnVjdCBpdWN2X2V2ZW50ICopYXJnOwotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPSBldi0+Y29ubjsKLQlpdWN2X0Nvbm5lY3Rpb25Db21wbGV0ZSAqZWliID0gKGl1Y3ZfQ29ubmVjdGlvbkNvbXBsZXRlICopZXYtPmRhdGE7CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IGFyZzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gY29ubi0+bmV0ZGV2OwotCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXZwdHIgPSAoc3RydWN0IG5ldGl1Y3ZfcHJpdiAqKW5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7Ci0KIAlmc21fZGVsdGltZXIoJmNvbm4tPnRpbWVyKTsKIAlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfSURMRSk7Ci0JaWYgKGVpYi0+aXBwYXRoaWQgIT0gY29ubi0+cGF0aGlkKSB7Ci0JCVBSSU5UX0lORk8oIiVzOiBJUiBDb25uZWN0aW9uIENvbXBsZXRlOyAiCi0JCQkicGF0aGlkICVkIGRvZXMgbm90IG1hdGNoIG9yaWdpbmFsIHBhdGhpZCAlZFxuIiwKLQkJCW5ldGRldi0+bmFtZSwgZWliLT5pcHBhdGhpZCwgY29ubi0+cGF0aGlkKTsKLQkJSVVDVl9EQkZfVEVYVF8oZGF0YSwgMiwKLQkJCSJjb25uYWNrOiBJUiBwYXRoaWQgJWQsIGNvbm4uIHBhdGhpZCAlZFxuIiwKLQkJCWVpYi0+aXBwYXRoaWQsIGNvbm4tPnBhdGhpZCk7Ci0JCWNvbm4tPnBhdGhpZCA9IGVpYi0+aXBwYXRoaWQ7Ci0JfQotCW5ldGRldi0+dHhfcXVldWVfbGVuID0gZWliLT5pcG1zZ2xpbTsKKwluZXRkZXYtPnR4X3F1ZXVlX2xlbiA9IGNvbm4tPnBhdGgtPm1zZ2xpbTsKIAlmc21fZXZlbnQocHJpdnB0ci0+ZnNtLCBERVZfRVZFTlRfQ09OVVAsIG5ldGRldik7CiB9CiAKLXN0YXRpYyB2b2lkCi1jb25uX2FjdGlvbl9jb25udGltc2V2KGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgY29ubl9hY3Rpb25fY29ubnRpbXNldihmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gKHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKilhcmc7Ci0JX191OCB1ZGF0YVsxNl07CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IGFyZzsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7Ci0KIAlmc21fZGVsdGltZXIoJmNvbm4tPnRpbWVyKTsKLQlpdWN2X3NldmVyKGNvbm4tPnBhdGhpZCwgdWRhdGEpOworCWl1Y3ZfcGF0aF9zZXZlcihjb25uLT5wYXRoLCBOVUxMKTsKIAlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfU1RBUlRXQUlUKTsKIH0KIAotc3RhdGljIHZvaWQKLWNvbm5fYWN0aW9uX2Nvbm5zZXZlcihmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIGNvbm5fYWN0aW9uX2Nvbm5zZXZlcihmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgaXVjdl9ldmVudCAqZXYgPSAoc3RydWN0IGl1Y3ZfZXZlbnQgKilhcmc7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IGV2LT5jb25uOworCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPSBhcmc7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGNvbm4tPm5ldGRldjsKLQlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gKHN0cnVjdCBuZXRpdWN2X3ByaXYgKiluZXRkZXYtPnByaXY7Ci0JX191OCB1ZGF0YVsxNl07CisJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwogCiAJZnNtX2RlbHRpbWVyKCZjb25uLT50aW1lcik7Ci0JaXVjdl9zZXZlcihjb25uLT5wYXRoaWQsIHVkYXRhKTsKKwlpdWN2X3BhdGhfc2V2ZXIoY29ubi0+cGF0aCwgTlVMTCk7CiAJUFJJTlRfSU5GTygiJXM6IFJlbW90ZSBkcm9wcGVkIGNvbm5lY3Rpb25cbiIsIG5ldGRldi0+bmFtZSk7CiAJSVVDVl9EQkZfVEVYVChkYXRhLCAyLAotCQkiY29ubl9hY3Rpb25fY29ubnNldmVyOiBSZW1vdGUgZHJvcHBlZCBjb25uZWN0aW9uXG4iKTsKKwkJICAgICAgImNvbm5fYWN0aW9uX2Nvbm5zZXZlcjogUmVtb3RlIGRyb3BwZWQgY29ubmVjdGlvblxuIik7CiAJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX1NUQVJUV0FJVCk7CiAJZnNtX2V2ZW50KHByaXZwdHItPmZzbSwgREVWX0VWRU5UX0NPTkRPV04sIG5ldGRldik7CiB9CiAKLXN0YXRpYyB2b2lkCi1jb25uX2FjdGlvbl9zdGFydChmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIGNvbm5fYWN0aW9uX3N0YXJ0KGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBpdWN2X2V2ZW50ICpldiA9IChzdHJ1Y3QgaXVjdl9ldmVudCAqKWFyZzsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gZXYtPmNvbm47Ci0JX191MTYgbXNnbGltaXQ7CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IGFyZzsKIAlpbnQgcmM7CiAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwogCi0JaWYgKCFjb25uLT5oYW5kbGUpIHsKLQkJSVVDVl9EQkZfVEVYVCh0cmFjZSwgNSwgImNhbGxpbmcgaXVjdl9yZWdpc3Rlcl9wcm9ncmFtXG4iKTsKLQkJY29ubi0+aGFuZGxlID0KLQkJCWl1Y3ZfcmVnaXN0ZXJfcHJvZ3JhbShpdWN2TWFnaWMsIGNvbm4tPnVzZXJpZCwKLQkJCQkJICAgICAgbmV0aXVjdl9tYXNrLAotCQkJCQkgICAgICAmbmV0aXVjdl9vcHMsIGNvbm4pOwotCQlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfU1RBUlRXQUlUKTsKLQkJaWYgKCFjb25uLT5oYW5kbGUpIHsKLQkJCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9SRUdFUlIpOwotCQkJY29ubi0+aGFuZGxlID0gTlVMTDsKLQkJCUlVQ1ZfREJGX1RFWFQoc2V0dXAsIDIsCi0JCQkJIk5VTEwgZnJvbSBpdWN2X3JlZ2lzdGVyX3Byb2dyYW1cbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUFJJTlRfREVCVUcoIiVzKCclcycpOiByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseVxuIiwKLQkJCSBjb25uLT5uZXRkZXYtPm5hbWUsIGNvbm4tPnVzZXJpZCk7Ci0JfQotCisJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX1NUQVJUV0FJVCk7CiAJUFJJTlRfREVCVUcoIiVzKCclcycpOiBjb25uZWN0aW5nIC4uLlxuIiwKLQkJIGNvbm4tPm5ldGRldi0+bmFtZSwgY29ubi0+dXNlcmlkKTsKKwkJICAgIGNvbm4tPm5ldGRldi0+bmFtZSwgY29ubi0+dXNlcmlkKTsKIAotCS8qIFdlIG11c3Qgc2V0IHRoZSBzdGF0ZSBiZWZvcmUgY2FsbGluZyBpdWN2X2Nvbm5lY3QgYmVjYXVzZSB0aGUgY2FsbGJhY2sKLQkgKiBoYW5kbGVyIGNvdWxkIGJlIGNhbGxlZCBhdCBhbnkgcG9pbnQgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBpcwotCSAqIHNlbnQgKi8KKwkvKgorCSAqIFdlIG11c3Qgc2V0IHRoZSBzdGF0ZSBiZWZvcmUgY2FsbGluZyBpdWN2X2Nvbm5lY3QgYmVjYXVzZSB0aGUKKwkgKiBjYWxsYmFjayBoYW5kbGVyIGNvdWxkIGJlIGNhbGxlZCBhdCBhbnkgcG9pbnQgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24KKwkgKiByZXF1ZXN0IGlzIHNlbnQKKwkgKi8KIAogCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9TRVRVUFdBSVQpOwotCXJjID0gaXVjdl9jb25uZWN0KCYoY29ubi0+cGF0aGlkKSwgTkVUSVVDVl9RVUVVRUxFTl9ERUZBVUxULCBpdWN2TWFnaWMsCi0JCQkgIGNvbm4tPnVzZXJpZCwgaXVjdl9ob3N0LCAwLCBOVUxMLCAmbXNnbGltaXQsCi0JCQkgIGNvbm4tPmhhbmRsZSwgY29ubik7CisJY29ubi0+cGF0aCA9IGl1Y3ZfcGF0aF9hbGxvYyhORVRJVUNWX1FVRVVFTEVOX0RFRkFVTFQsIDAsIEdGUF9LRVJORUwpOworCXJjID0gaXVjdl9wYXRoX2Nvbm5lY3QoY29ubi0+cGF0aCwgJm5ldGl1Y3ZfaGFuZGxlciwgY29ubi0+dXNlcmlkLAorCQkJICAgICAgIE5VTEwsIGl1Y3ZNYWdpYywgY29ubik7CiAJc3dpdGNoIChyYykgewotCQljYXNlIDA6Ci0JCQljb25uLT5uZXRkZXYtPnR4X3F1ZXVlX2xlbiA9IG1zZ2xpbWl0OwotCQkJZnNtX2FkZHRpbWVyKCZjb25uLT50aW1lciwgTkVUSVVDVl9USU1FT1VUXzVTRUMsCi0JCQkJQ09OTl9FVkVOVF9USU1FUiwgY29ubik7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgMTE6Ci0JCQlQUklOVF9JTkZPKCIlczogVXNlciAlcyBpcyBjdXJyZW50bHkgbm90IGF2YWlsYWJsZS5cbiIsCi0JCQkgICAgICAgY29ubi0+bmV0ZGV2LT5uYW1lLAotCQkJICAgICAgIG5ldGl1Y3ZfcHJpbnRuYW1lKGNvbm4tPnVzZXJpZCkpOwotCQkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX1NUQVJUV0FJVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgMTI6Ci0JCQlQUklOVF9JTkZPKCIlczogVXNlciAlcyBpcyBjdXJyZW50bHkgbm90IHJlYWR5LlxuIiwKLQkJCSAgICAgICBjb25uLT5uZXRkZXYtPm5hbWUsCi0JCQkgICAgICAgbmV0aXVjdl9wcmludG5hbWUoY29ubi0+dXNlcmlkKSk7Ci0JCQlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfU1RBUlRXQUlUKTsKLQkJCXJldHVybjsKLQkJY2FzZSAxMzoKLQkJCVBSSU5UX1dBUk4oIiVzOiBUb28gbWFueSBJVUNWIGNvbm5lY3Rpb25zLlxuIiwKLQkJCSAgICAgICBjb25uLT5uZXRkZXYtPm5hbWUpOwotCQkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX0NPTk5FUlIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTQ6Ci0JCQlQUklOVF9XQVJOKAotCQkJICAgICAgICIlczogVXNlciAlcyBoYXMgdG9vIG1hbnkgSVVDViBjb25uZWN0aW9ucy5cbiIsCi0JCQkgICAgICAgY29ubi0+bmV0ZGV2LT5uYW1lLAotCQkJICAgICAgIG5ldGl1Y3ZfcHJpbnRuYW1lKGNvbm4tPnVzZXJpZCkpOwotCQkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX0NPTk5FUlIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTU6Ci0JCQlQUklOVF9XQVJOKAotCQkJICAgICAgICIlczogTm8gSVVDViBhdXRob3JpemF0aW9uIGluIENQIGRpcmVjdG9yeS5cbiIsCi0JCQkgICAgICAgY29ubi0+bmV0ZGV2LT5uYW1lKTsKLQkJCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9DT05ORVJSKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJUFJJTlRfV0FSTigiJXM6IGl1Y3ZfY29ubmVjdCByZXR1cm5lZCBlcnJvciAlZFxuIiwKLQkJCSAgICAgICBjb25uLT5uZXRkZXYtPm5hbWUsIHJjKTsKLQkJCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9DT05ORVJSKTsKLQkJCWJyZWFrOworCWNhc2UgMDoKKwkJY29ubi0+bmV0ZGV2LT50eF9xdWV1ZV9sZW4gPSBjb25uLT5wYXRoLT5tc2dsaW07CisJCWZzbV9hZGR0aW1lcigmY29ubi0+dGltZXIsIE5FVElVQ1ZfVElNRU9VVF81U0VDLAorCQkJICAgICBDT05OX0VWRU5UX1RJTUVSLCBjb25uKTsKKwkJcmV0dXJuOworCWNhc2UgMTE6CisJCVBSSU5UX0lORk8oIiVzOiBVc2VyICVzIGlzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlLlxuIiwKKwkJCSAgIGNvbm4tPm5ldGRldi0+bmFtZSwKKwkJCSAgIG5ldGl1Y3ZfcHJpbnRuYW1lKGNvbm4tPnVzZXJpZCkpOworCQlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfU1RBUlRXQUlUKTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJUFJJTlRfSU5GTygiJXM6IFVzZXIgJXMgaXMgY3VycmVudGx5IG5vdCByZWFkeS5cbiIsCisJCQkgICBjb25uLT5uZXRkZXYtPm5hbWUsCisJCQkgICBuZXRpdWN2X3ByaW50bmFtZShjb25uLT51c2VyaWQpKTsKKwkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX1NUQVJUV0FJVCk7CisJCWJyZWFrOworCWNhc2UgMTM6CisJCVBSSU5UX1dBUk4oIiVzOiBUb28gbWFueSBJVUNWIGNvbm5lY3Rpb25zLlxuIiwKKwkJCSAgIGNvbm4tPm5ldGRldi0+bmFtZSk7CisJCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9DT05ORVJSKTsKKwkJYnJlYWs7CisJY2FzZSAxNDoKKwkJUFJJTlRfV0FSTigiJXM6IFVzZXIgJXMgaGFzIHRvbyBtYW55IElVQ1YgY29ubmVjdGlvbnMuXG4iLAorCQkJICAgY29ubi0+bmV0ZGV2LT5uYW1lLAorCQkJICAgbmV0aXVjdl9wcmludG5hbWUoY29ubi0+dXNlcmlkKSk7CisJCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9DT05ORVJSKTsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJUFJJTlRfV0FSTigiJXM6IE5vIElVQ1YgYXV0aG9yaXphdGlvbiBpbiBDUCBkaXJlY3RvcnkuXG4iLAorCQkJICAgY29ubi0+bmV0ZGV2LT5uYW1lKTsKKwkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX0NPTk5FUlIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQUklOVF9XQVJOKCIlczogaXVjdl9jb25uZWN0IHJldHVybmVkIGVycm9yICVkXG4iLAorCQkJICAgY29ubi0+bmV0ZGV2LT5uYW1lLCByYyk7CisJCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9DT05ORVJSKTsKKwkJYnJlYWs7CiAJfQogCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCA1LCAiaXVjdl9jb25uZWN0IHJjIGlzICVkXG4iLCByYyk7Ci0JSVVDVl9EQkZfVEVYVCh0cmFjZSwgNSwgImNhbGxpbmcgaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW1cbiIpOwotCWl1Y3ZfdW5yZWdpc3Rlcl9wcm9ncmFtKGNvbm4tPmhhbmRsZSk7Ci0JY29ubi0+aGFuZGxlID0gTlVMTDsKKwlrZnJlZShjb25uLT5wYXRoKTsKKwljb25uLT5wYXRoID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQKLW5ldGl1Y3ZfcHVyZ2Vfc2tiX3F1ZXVlKHN0cnVjdCBza19idWZmX2hlYWQgKnEpCitzdGF0aWMgdm9pZCBuZXRpdWN2X3B1cmdlX3NrYl9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTkzMSwzNiArOTM5LDM0IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAotY29ubl9hY3Rpb25fc3RvcChmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIGNvbm5fYWN0aW9uX3N0b3AoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IGl1Y3ZfZXZlbnQgKmV2ID0gKHN0cnVjdCBpdWN2X2V2ZW50ICopYXJnOworCXN0cnVjdCBpdWN2X2V2ZW50ICpldiA9IGFyZzsKIAlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gZXYtPmNvbm47CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGNvbm4tPm5ldGRldjsKLQlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gKHN0cnVjdCBuZXRpdWN2X3ByaXYgKiluZXRkZXYtPnByaXY7CisJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwogCiAJZnNtX2RlbHRpbWVyKCZjb25uLT50aW1lcik7CiAJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX1NUT1BQRUQpOwogCW5ldGl1Y3ZfcHVyZ2Vfc2tiX3F1ZXVlKCZjb25uLT5jb2xsZWN0X3F1ZXVlKTsKLQlpZiAoY29ubi0+aGFuZGxlKQotCQlJVUNWX0RCRl9URVhUKHRyYWNlLCA1LCAiY2FsbGluZyBpdWN2X3VucmVnaXN0ZXJfcHJvZ3JhbVxuIik7Ci0JCWl1Y3ZfdW5yZWdpc3Rlcl9wcm9ncmFtKGNvbm4tPmhhbmRsZSk7Ci0JY29ubi0+aGFuZGxlID0gTlVMTDsKKwlpZiAoY29ubi0+cGF0aCkgeworCQlJVUNWX0RCRl9URVhUKHRyYWNlLCA1LCAiY2FsbGluZyBpdWN2X3BhdGhfc2V2ZXJcbiIpOworCQlpdWN2X3BhdGhfc2V2ZXIoY29ubi0+cGF0aCwgaXVjdk1hZ2ljKTsKKwkJa2ZyZWUoY29ubi0+cGF0aCk7CisJCWNvbm4tPnBhdGggPSBOVUxMOworCX0KIAluZXRpdWN2X3B1cmdlX3NrYl9xdWV1ZSgmY29ubi0+Y29tbWl0X3F1ZXVlKTsKIAlmc21fZXZlbnQocHJpdnB0ci0+ZnNtLCBERVZfRVZFTlRfQ09ORE9XTiwgbmV0ZGV2KTsKIH0KIAotc3RhdGljIHZvaWQKLWNvbm5fYWN0aW9uX2ludmFsKGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgY29ubl9hY3Rpb25faW52YWwoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IGl1Y3ZfZXZlbnQgKmV2ID0gKHN0cnVjdCBpdWN2X2V2ZW50ICopYXJnOwotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPSBldi0+Y29ubjsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gYXJnOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBjb25uLT5uZXRkZXY7CiAKLQlQUklOVF9XQVJOKCIlczogQ2Fubm90IGNvbm5lY3Qgd2l0aG91dCB1c2VybmFtZVxuIiwKLQkgICAgICAgbmV0ZGV2LT5uYW1lKTsKKwlQUklOVF9XQVJOKCIlczogQ2Fubm90IGNvbm5lY3Qgd2l0aG91dCB1c2VybmFtZVxuIiwgbmV0ZGV2LT5uYW1lKTsKIAlJVUNWX0RCRl9URVhUKGRhdGEsIDIsICJjb25uX2FjdGlvbl9pbnZhbCBjYWxsZWRcbiIpOwogfQogCkBAIC05OTksMjkgKzEwMDUsMjcgQEAKIHN0YXRpYyBjb25zdCBpbnQgQ09OTl9GU01fTEVOID0gc2l6ZW9mKGNvbm5fZnNtKSAvIHNpemVvZihmc21fbm9kZSk7CiAKIAotLyoqCisvKgogICogQWN0aW9ucyBmb3IgaW50ZXJmYWNlIC0gc3RhdGVtYWNoaW5lLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICovCiAKIC8qKgotICogU3RhcnR1cCBjb25uZWN0aW9uIGJ5IHNlbmRpbmcgQ09OTl9FVkVOVF9TVEFSVCB0byBpdC4KKyAqIGRldl9hY3Rpb25fc3RhcnQKKyAqIEBmaTogQW4gaW5zdGFuY2Ugb2YgYW4gaW50ZXJmYWNlIHN0YXRlbWFjaGluZS4KKyAqIEBldmVudDogVGhlIGV2ZW50LCBqdXN0IGhhcHBlbmVkLgorICogQGFyZzogR2VuZXJpYyBwb2ludGVyLCBjYXN0ZWQgZnJvbSBzdHJ1Y3QgbmV0X2RldmljZSAqIHVwb24gY2FsbC4KICAqCi0gKiBAcGFyYW0gZmkgICAgQW4gaW5zdGFuY2Ugb2YgYW4gaW50ZXJmYWNlIHN0YXRlbWFjaGluZS4KLSAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGp1c3QgaGFwcGVuZWQuCi0gKiBAcGFyYW0gYXJnICAgR2VuZXJpYyBwb2ludGVyLCBjYXN0ZWQgZnJvbSBzdHJ1Y3QgbmV0X2RldmljZSAqIHVwb24gY2FsbC4KKyAqIFN0YXJ0dXAgY29ubmVjdGlvbiBieSBzZW5kaW5nIENPTk5fRVZFTlRfU1RBUlQgdG8gaXQuCiAgKi8KLXN0YXRpYyB2b2lkCi1kZXZfYWN0aW9uX3N0YXJ0KGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgZGV2X2FjdGlvbl9zdGFydChmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilhcmc7Ci0Jc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IGRldi0+cHJpdjsKLQlzdHJ1Y3QgaXVjdl9ldmVudCAgIGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiA9IGFyZzsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7CiAKLQlldi5jb25uID0gcHJpdnB0ci0+Y29ubjsKIAlmc21fbmV3c3RhdGUoZmksIERFVl9TVEFURV9TVEFSVFdBSVQpOwotCWZzbV9ldmVudChwcml2cHRyLT5jb25uLT5mc20sIENPTk5fRVZFTlRfU1RBUlQsICZldik7CisJZnNtX2V2ZW50KHByaXZwdHItPmNvbm4tPmZzbSwgQ09OTl9FVkVOVF9TVEFSVCwgcHJpdnB0ci0+Y29ubik7CiB9CiAKIC8qKgpAQCAtMTAzNCw4ICsxMDM4LDggQEAKIHN0YXRpYyB2b2lkCiBkZXZfYWN0aW9uX3N0b3AoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopYXJnOwotCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXZwdHIgPSBkZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2ID0gYXJnOworCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXZwdHIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpdWN2X2V2ZW50ICAgZXY7CiAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTA1Nyw4ICsxMDYxLDggQEAKIHN0YXRpYyB2b2lkCiBkZXZfYWN0aW9uX2Nvbm51cChmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilhcmc7Ci0Jc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSBhcmc7CisJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IG5ldGRldl9wcml2KGRldik7CiAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0xMTMxLDExICsxMTM1LDEzIEBACiAgKgogICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIC1FUlJOTyBvbiBmYWlsdXJlLiAoTmV2ZXIgZmFpbHMuKQogICovCi1zdGF0aWMgaW50Ci1uZXRpdWN2X3RyYW5zbWl0X3NrYihzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7CitzdGF0aWMgaW50IG5ldGl1Y3ZfdHJhbnNtaXRfc2tiKHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXVjdl9tZXNzYWdlIG1zZzsKIAl1bnNpZ25lZCBsb25nIHNhdmVmbGFnczsKLQlsbF9oZWFkZXIgaGVhZGVyOwotCWludCAgICAgICByYyA9IDA7CisJc3RydWN0IGxsX2hlYWRlciBoZWFkZXI7CisJaW50IHJjOwogCiAJaWYgKGZzbV9nZXRzdGF0ZShjb25uLT5mc20pICE9IENPTk5fU1RBVEVfSURMRSkgewogCQlpbnQgbCA9IHNrYi0+bGVuICsgTkVUSVVDVl9IRFJMRU47CkBAIC0xMTQ1LDExICsxMTUxLDEyIEBACiAJCSAgICAoY29ubi0+bWF4X2J1ZmZzaXplIC0gTkVUSVVDVl9IRFJMRU4pKSB7CiAJCQlyYyA9IC1FQlVTWTsKIAkJCUlVQ1ZfREJGX1RFWFQoZGF0YSwgMiwKLQkJCQkiRUJVU1kgZnJvbSBuZXRpdWN2X3RyYW5zbWl0X3NrYlxuIik7CisJCQkJICAgICAgIkVCVVNZIGZyb20gbmV0aXVjdl90cmFuc21pdF9za2JcbiIpOwogCQl9IGVsc2UgewogCQkJYXRvbWljX2luYygmc2tiLT51c2Vycyk7CiAJCQlza2JfcXVldWVfdGFpbCgmY29ubi0+Y29sbGVjdF9xdWV1ZSwgc2tiKTsKIAkJCWNvbm4tPmNvbGxlY3RfbGVuICs9IGw7CisJCQlyYyA9IDA7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29ubi0+Y29sbGVjdF9sb2NrLCBzYXZlZmxhZ3MpOwogCX0gZWxzZSB7CkBAIC0xMTg4LDkgKzExOTUsMTAgQEAKIAkJZnNtX25ld3N0YXRlKGNvbm4tPmZzbSwgQ09OTl9TVEFURV9UWCk7CiAJCWNvbm4tPnByb2Yuc2VuZF9zdGFtcCA9IHh0aW1lOwogCi0JCXJjID0gaXVjdl9zZW5kKGNvbm4tPnBhdGhpZCwgTlVMTCwgMCwgMCwgMSAvKiBzaW5nbGVfZmxhZyAqLywKLQkJCTAsIG5za2ItPmRhdGEsIG5za2ItPmxlbik7Ci0JCQkgICAgICAgLyogU2h1dCB1cCwgZ2NjISBuc2tiIGlzIGFsd2F5cyBiZWxvdyAyRy4gKi8KKwkJbXNnLnRhZyA9IDE7CisJCW1zZy5jbGFzcyA9IDA7CisJCXJjID0gaXVjdl9tZXNzYWdlX3NlbmQoY29ubi0+cGF0aCwgJm1zZywgMCwgMCwKKwkJCQkgICAgICAgbnNrYi0+ZGF0YSwgbnNrYi0+bGVuKTsKIAkJY29ubi0+cHJvZi5kb2lvc19zaW5nbGUrKzsKIAkJY29ubi0+cHJvZi50eGxlbiArPSBza2ItPmxlbjsKIAkJY29ubi0+cHJvZi50eF9wZW5kaW5nKys7CkBAIC0xMjAwLDcgKzEyMDgsNyBAQAogCQkJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0cjsKIAkJCWZzbV9uZXdzdGF0ZShjb25uLT5mc20sIENPTk5fU1RBVEVfSURMRSk7CiAJCQljb25uLT5wcm9mLnR4X3BlbmRpbmctLTsKLQkJCXByaXZwdHIgPSAoc3RydWN0IG5ldGl1Y3ZfcHJpdiAqKWNvbm4tPm5ldGRldi0+cHJpdjsKKwkJCXByaXZwdHIgPSBuZXRkZXZfcHJpdihjb25uLT5uZXRkZXYpOwogCQkJaWYgKHByaXZwdHIpCiAJCQkJcHJpdnB0ci0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQlpZiAoY29waWVkKQpAQCAtMTIyNiw5ICsxMjM0LDkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLS8qKgorLyoKICAqIEludGVyZmFjZSBBUEkgZm9yIHVwcGVyIG5ldHdvcmsgbGF5ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIAogLyoqCiAgKiBPcGVuIGFuIGludGVyZmFjZS4KQEAgLTEyMzgsOSArMTI0NiwxMSBAQAogICoKICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAtRVJSTk8gb24gZmFpbHVyZS4gKE5ldmVyIGZhaWxzLikKICAqLwotc3RhdGljIGludAotbmV0aXVjdl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKLQlmc21fZXZlbnQoKChzdHJ1Y3QgbmV0aXVjdl9wcml2ICopZGV2LT5wcml2KS0+ZnNtLCBERVZfRVZFTlRfU1RBUlQsZGV2KTsKK3N0YXRpYyBpbnQgbmV0aXVjdl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlmc21fZXZlbnQocHJpdi0+ZnNtLCBERVZfRVZFTlRfU1RBUlQsIGRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyNTIsOSArMTI2MiwxMSBAQAogICoKICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAtRVJSTk8gb24gZmFpbHVyZS4gKE5ldmVyIGZhaWxzLikKICAqLwotc3RhdGljIGludAotbmV0aXVjdl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7Ci0JZnNtX2V2ZW50KCgoc3RydWN0IG5ldGl1Y3ZfcHJpdiAqKWRldi0+cHJpdiktPmZzbSwgREVWX0VWRU5UX1NUT1AsIGRldik7CitzdGF0aWMgaW50IG5ldGl1Y3ZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWZzbV9ldmVudChwcml2LT5mc20sIERFVl9FVkVOVF9TVE9QLCBkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xMjcxLDggKzEyODMsOCBAQAogICovCiBzdGF0aWMgaW50IG5ldGl1Y3ZfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlpbnQgICAgICAgICAgcmMgPSAwOwotCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXZwdHIgPSBkZXYtPnByaXY7CisJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOwogCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgNCwgX19GVU5DVElPTl9fKTsKIAkvKioKQEAgLTEzMTIsNDAgKzEzMjQsNDEgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JaWYgKG5ldGl1Y3ZfdHJhbnNtaXRfc2tiKHByaXZwdHItPmNvbm4sIHNrYikpCi0JCXJjID0gMTsKKwlyYyA9IG5ldGl1Y3ZfdHJhbnNtaXRfc2tiKHByaXZwdHItPmNvbm4sIHNrYikgIT0gMDsKIAluZXRpdWN2X2NsZWFyX2J1c3koZGV2KTsKIAlyZXR1cm4gcmM7CiB9CiAKIC8qKgorICogbmV0aXVjdl9zdGF0cworICogQGRldjogUG9pbnRlciB0byBpbnRlcmZhY2Ugc3RydWN0LgorICoKICAqIFJldHVybnMgaW50ZXJmYWNlIHN0YXRpc3RpY3Mgb2YgYSBkZXZpY2UuCiAgKgotICogQHBhcmFtIGRldiBQb2ludGVyIHRvIGludGVyZmFjZSBzdHJ1Y3QuCi0gKgotICogQHJldHVybiBQb2ludGVyIHRvIHN0YXRzIHN0cnVjdCBvZiB0aGlzIGludGVyZmFjZS4KKyAqIFJldHVybnMgcG9pbnRlciB0byBzdGF0cyBzdHJ1Y3Qgb2YgdGhpcyBpbnRlcmZhY2UuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCi1uZXRpdWN2X3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0aXVjdl9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCiB7CisJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCA1LCBfX0ZVTkNUSU9OX18pOwotCXJldHVybiAmKChzdHJ1Y3QgbmV0aXVjdl9wcml2ICopZGV2LT5wcml2KS0+c3RhdHM7CisJcmV0dXJuICZwcml2LT5zdGF0czsKIH0KIAogLyoqCisgKiBuZXRpdWN2X2NoYW5nZV9tdHUKKyAqIEBkZXY6IFBvaW50ZXIgdG8gaW50ZXJmYWNlIHN0cnVjdC4KKyAqIEBuZXdfbXR1OiBUaGUgbmV3IE1UVSB0byB1c2UgZm9yIHRoaXMgaW50ZXJmYWNlLgorICoKICAqIFNldHMgTVRVIG9mIGFuIGludGVyZmFjZS4KICAqCi0gKiBAcGFyYW0gZGV2ICAgICBQb2ludGVyIHRvIGludGVyZmFjZSBzdHJ1Y3QuCi0gKiBAcGFyYW0gbmV3X210dSBUaGUgbmV3IE1UVSB0byB1c2UgZm9yIHRoaXMgaW50ZXJmYWNlLgotICoKLSAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIE1UVSBpcyBvdXQgb2YgdmFsaWQgcmFuZ2UuCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBNVFUgaXMgb3V0IG9mIHZhbGlkIHJhbmdlLgogICogICAgICAgICAodmFsaWQgcmFuZ2UgaXMgNTc2IC4uIE5FVElVQ1ZfTVRVX01BWCkuCiAgKi8KLXN0YXRpYyBpbnQKLW5ldGl1Y3ZfY2hhbmdlX210dSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBuZXdfbXR1KQorc3RhdGljIGludCBuZXRpdWN2X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBuZXdfbXR1KQogewogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7Ci0JaWYgKChuZXdfbXR1IDwgNTc2KSB8fCAobmV3X210dSA+IE5FVElVQ1ZfTVRVX01BWCkpIHsKKwlpZiAobmV3X210dSA8IDU3NiB8fCBuZXdfbXR1ID4gTkVUSVVDVl9NVFVfTUFYKSB7CiAJCUlVQ1ZfREJGX1RFWFQoc2V0dXAsIDIsICJnaXZlbiBNVFUgb3V0IG9mIHZhbGlkIHJhbmdlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTM1MywxMiArMTM2NiwxMiBAQAogCXJldHVybiAwOwogfQogCi0vKioKKy8qCiAgKiBhdHRyaWJ1dGVzIGluIHN5c2ZzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIAotc3RhdGljIHNzaXplX3QKLXVzZXJfc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdXNlcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmKQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xMzY2LDggKzEzNzksOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBuZXRpdWN2X3ByaW50bmFtZShwcml2LT5jb25uLT51c2VyaWQpKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLXVzZXJfd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgdXNlcl93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHByaXYtPmNvbm4tPm5ldGRldjsKQEAgLTEzNzUsODAgKzEzODgsNzAgQEAKIAljaGFyICAgICp0bXA7CiAJY2hhciAJdXNlcm5hbWVbOV07CiAJaW50IAlpOwotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKipjbGlzdCA9ICZpdWN2X2Nvbm5zLml1Y3ZfY29ubmVjdGlvbnM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjcDsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7Ci0JaWYgKGNvdW50PjkpIHsKLQkJUFJJTlRfV0FSTigibmV0aXVjdjogdXNlcm5hbWUgdG9vIGxvbmcgKCVkKSFcbiIsIChpbnQpY291bnQpOworCWlmIChjb3VudCA+IDkpIHsKKwkJUFJJTlRfV0FSTigibmV0aXVjdjogdXNlcm5hbWUgdG9vIGxvbmcgKCVkKSFcbiIsIChpbnQpIGNvdW50KTsKIAkJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsCi0JCQkiJWQgaXMgbGVuZ3RoIG9mIHVzZXJuYW1lXG4iLCAoaW50KWNvdW50KTsKKwkJCSAgICAgICAiJWQgaXMgbGVuZ3RoIG9mIHVzZXJuYW1lXG4iLCAoaW50KSBjb3VudCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXRtcCA9IHN0cnNlcCgoY2hhciAqKikgJmJ1ZiwgIlxuIik7Ci0JZm9yIChpPTAsIHA9dG1wOyBpPDggJiYgKnA7IGkrKywgcCsrKSB7Ci0JCWlmIChpc2FsbnVtKCpwKSB8fCAoKnAgPT0gJyQnKSkKKwlmb3IgKGkgPSAwLCBwID0gdG1wOyBpIDwgOCAmJiAqcDsgaSsrLCBwKyspIHsKKwkJaWYgKGlzYWxudW0oKnApIHx8ICgqcCA9PSAnJCcpKSB7CiAJCQl1c2VybmFtZVtpXT0gdG91cHBlcigqcCk7Ci0JCWVsc2UgaWYgKCpwID09ICdcbicpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqcCA9PSAnXG4nKSB7CiAJCQkvKiB0cmFpbGluZyBsZiwgZ3JyICovCiAJCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCVBSSU5UX1dBUk4oIm5ldGl1Y3Y6IEludmFsaWQgY2hhciAlYyBpbiB1c2VybmFtZSFcbiIsCi0JCQkJKnApOwotCQkJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsCi0JCQkJInVzZXJuYW1lOiBpbnZhbGlkIGNoYXJhY3RlciAlY1xuIiwKLQkJCQkqcCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCQlQUklOVF9XQVJOKCJuZXRpdWN2OiBJbnZhbGlkIGNoYXIgJWMgaW4gdXNlcm5hbWUhXG4iLCAqcCk7CisJCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCAyLAorCQkJICAgICAgICJ1c2VybmFtZTogaW52YWxpZCBjaGFyYWN0ZXIgJWNcbiIsICpwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXdoaWxlIChpPDgpCisJd2hpbGUgKGkgPCA4KQogCQl1c2VybmFtZVtpKytdID0gJyAnOwogCXVzZXJuYW1lWzhdID0gJ1wwJzsKIAotCWlmIChtZW1jbXAodXNlcm5hbWUsIHByaXYtPmNvbm4tPnVzZXJpZCwgOSkpIHsKLQkJLyogdXNlcm5hbWUgY2hhbmdlZCAqLwotCQlpZiAobmRldi0+ZmxhZ3MgJiAoSUZGX1VQIHwgSUZGX1JVTk5JTkcpKSB7Ci0JCQlQUklOVF9XQVJOKAotCQkJCSJuZXRpdWN2OiBkZXZpY2UgJXMgYWN0aXZlLCBjb25uZWN0ZWQgdG8gJXNcbiIsCi0JCQkJZGV2LT5idXNfaWQsIHByaXYtPmNvbm4tPnVzZXJpZCk7Ci0JCQlQUklOVF9XQVJOKCJuZXRpdWN2OiB1c2VyIGNhbm5vdCBiZSB1cGRhdGVkXG4iKTsKLQkJCUlVQ1ZfREJGX1RFWFQoc2V0dXAsIDIsICJ1c2VyX3dyaXRlOiBkZXZpY2UgYWN0aXZlXG4iKTsKLQkJCXJldHVybiAtRUJVU1k7CisJaWYgKG1lbWNtcCh1c2VybmFtZSwgcHJpdi0+Y29ubi0+dXNlcmlkLCA5KSAmJgorCSAgICAobmRldi0+ZmxhZ3MgJiAoSUZGX1VQIHwgSUZGX1JVTk5JTkcpKSkgeworCQkvKiB1c2VybmFtZSBjaGFuZ2VkIHdoaWxlIHRoZSBpbnRlcmZhY2UgaXMgYWN0aXZlLiAqLworCQlQUklOVF9XQVJOKCJuZXRpdWN2OiBkZXZpY2UgJXMgYWN0aXZlLCBjb25uZWN0ZWQgdG8gJXNcbiIsCisJCQkgICBkZXYtPmJ1c19pZCwgcHJpdi0+Y29ubi0+dXNlcmlkKTsKKwkJUFJJTlRfV0FSTigibmV0aXVjdjogdXNlciBjYW5ub3QgYmUgdXBkYXRlZFxuIik7CisJCUlVQ1ZfREJGX1RFWFQoc2V0dXAsIDIsICJ1c2VyX3dyaXRlOiBkZXZpY2UgYWN0aXZlXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmVhZF9sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwLCAmaXVjdl9jb25uZWN0aW9uX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFzdHJuY21wKHVzZXJuYW1lLCBjcC0+dXNlcmlkLCA5KSAmJiBjcC0+bmV0ZGV2ICE9IG5kZXYpIHsKKwkJCXJlYWRfdW5sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKKwkJCVBSSU5UX1dBUk4oIm5ldGl1Y3Y6IENvbm5lY3Rpb24gdG8gJXMgYWxyZWFkeSAiCisJCQkJICAgImV4aXN0c1xuIiwgdXNlcm5hbWUpOworCQkJcmV0dXJuIC1FRVhJU1Q7CiAJCX0KIAl9Ci0JcmVhZF9sb2NrX2lycXNhdmUoJml1Y3ZfY29ubnMuaXVjdl9yd2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoKmNsaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKHVzZXJuYW1lLCAoKmNsaXN0KS0+dXNlcmlkLCA5KSB8fAotCQkgICAgKCgqY2xpc3QpLT5uZXRkZXYgIT0gbmRldikpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjbGlzdCA9ICYoKCpjbGlzdCktPm5leHQpOwotICAgICAgICB9Ci0JcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmaXVjdl9jb25ucy5pdWN2X3J3bG9jaywgZmxhZ3MpOwotICAgICAgICBpZiAoKmNsaXN0KSB7Ci0gICAgICAgICAgICAgICAgUFJJTlRfV0FSTigibmV0aXVjdjogQ29ubmVjdGlvbiB0byAlcyBhbHJlYWR5IGV4aXN0c1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVFWElTVDsKLSAgICAgICAgfQorCXJlYWRfdW5sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKIAltZW1jcHkocHJpdi0+Y29ubi0+dXNlcmlkLCB1c2VybmFtZSwgOSk7Ci0KIAlyZXR1cm4gY291bnQ7Ci0KIH0KIAogc3RhdGljIERFVklDRV9BVFRSKHVzZXIsIDA2NDQsIHVzZXJfc2hvdywgdXNlcl93cml0ZSk7CiAKLXN0YXRpYyBzc2l6ZV90Ci1idWZmZXJfc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOworc3RhdGljIHNzaXplX3QgYnVmZmVyX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQorewlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDUsIF9fRlVOQ1RJT05fXyk7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHByaXYtPmNvbm4tPm1heF9idWZmc2l6ZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci1idWZmZXJfd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgYnVmZmVyX3dyaXRlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHByaXYtPmNvbm4tPm5ldGRldjsKQEAgLTE1MDIsOCArMTUwNSw4IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihidWZmZXIsIDA2NDQsIGJ1ZmZlcl9zaG93LCBidWZmZXJfd3JpdGUpOwogCi1zdGF0aWMgc3NpemVfdAotZGV2X2ZzbV9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBkZXZfZnNtX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIApAQCAtMTUxMyw4ICsxNTE2LDggQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGRldmljZV9mc21fc3RhdGUsIDA0NDQsIGRldl9mc21fc2hvdywgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90Ci1jb25uX2ZzbV9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBjb25uX2ZzbV9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNTI0LDggKzE1MjcsOCBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIoY29ubmVjdGlvbl9mc21fc3RhdGUsIDA0NDQsIGNvbm5fZnNtX3Nob3csIE5VTEwpOwogCi1zdGF0aWMgc3NpemVfdAotbWF4bXVsdGlfc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgbWF4bXVsdGlfc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIApAQCAtMTUzMyw4ICsxNTM2LDkgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIHByaXYtPmNvbm4tPnByb2YubWF4bXVsdGkpOwogfQogCi1zdGF0aWMgc3NpemVfdAotbWF4bXVsdGlfd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgbWF4bXVsdGlfd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIApAQCAtMTU0NSw4ICsxNTQ5LDggQEAKIAogc3RhdGljIERFVklDRV9BVFRSKG1heF90eF9idWZmZXJfdXNlZCwgMDY0NCwgbWF4bXVsdGlfc2hvdywgbWF4bXVsdGlfd3JpdGUpOwogCi1zdGF0aWMgc3NpemVfdAotbWF4Y3Ffc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgbWF4Y3Ffc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIApAQCAtMTU1NCw4ICsxNTU4LDggQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIHByaXYtPmNvbm4tPnByb2YubWF4Y3F1ZXVlKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLW1heGNxX3dyaXRlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IG1heGNxX3dyaXRlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNTY2LDggKzE1NzAsOCBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIobWF4X2NoYWluZWRfc2ticywgMDY0NCwgbWF4Y3Ffc2hvdywgbWF4Y3Ffd3JpdGUpOwogCi1zdGF0aWMgc3NpemVfdAotc2RvaW9fc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2RvaW9fc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIApAQCAtMTU3NSw4ICsxNTc5LDggQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIHByaXYtPmNvbm4tPnByb2YuZG9pb3Nfc2luZ2xlKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLXNkb2lvX3dyaXRlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHNkb2lvX3dyaXRlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNTg3LDggKzE1OTEsOCBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIodHhfc2luZ2xlX3dyaXRlX29wcywgMDY0NCwgc2RvaW9fc2hvdywgc2RvaW9fd3JpdGUpOwogCi1zdGF0aWMgc3NpemVfdAotbWRvaW9fc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgbWRvaW9fc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIApAQCAtMTU5Niw4ICsxNjAwLDggQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIHByaXYtPmNvbm4tPnByb2YuZG9pb3NfbXVsdGkpOwogfQogCi1zdGF0aWMgc3NpemVfdAotbWRvaW9fd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgbWRvaW9fd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE2MDgsOCArMTYxMiw4IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUih0eF9tdWx0aV93cml0ZV9vcHMsIDA2NDQsIG1kb2lvX3Nob3csIG1kb2lvX3dyaXRlKTsKIAotc3RhdGljIHNzaXplX3QKLXR4bGVuX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHR4bGVuX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE2MTcsOCArMTYyMSw4IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBwcml2LT5jb25uLT5wcm9mLnR4bGVuKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLXR4bGVuX3dyaXRlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHR4bGVuX3dyaXRlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNjI5LDggKzE2MzMsOCBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIobmV0dG9fYnl0ZXMsIDA2NDQsIHR4bGVuX3Nob3csIHR4bGVuX3dyaXRlKTsKIAotc3RhdGljIHNzaXplX3QKLXR4dGltZV9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB0eHRpbWVfc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE2MzgsOCArMTY0Miw4IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBwcml2LT5jb25uLT5wcm9mLnR4X3RpbWUpOwogfQogCi1zdGF0aWMgc3NpemVfdAotdHh0aW1lX3dyaXRlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHR4dGltZV93cml0ZSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE2NTAsOCArMTY1NCw4IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihtYXhfdHhfaW9fdGltZSwgMDY0NCwgdHh0aW1lX3Nob3csIHR4dGltZV93cml0ZSk7CiAKLXN0YXRpYyBzc2l6ZV90Ci10eHBlbmRfc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdHhwZW5kX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNjU5LDggKzE2NjMsOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgcHJpdi0+Y29ubi0+cHJvZi50eF9wZW5kaW5nKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLXR4cGVuZF93cml0ZSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCB0eHBlbmRfd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNjcxLDggKzE2NzUsOCBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIodHhfcGVuZGluZywgMDY0NCwgdHhwZW5kX3Nob3csIHR4cGVuZF93cml0ZSk7CiAKLXN0YXRpYyBzc2l6ZV90Ci10eG1wbmRfc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdHhtcG5kX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNjgwLDggKzE2ODQsOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgcHJpdi0+Y29ubi0+cHJvZi50eF9tYXhfcGVuZGluZyk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci10eG1wbmRfd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgdHhtcG5kX3dyaXRlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIApAQCAtMTcyMSw4ICsxNzI1LDcgQEAKIAkuYXR0cnMgPSBuZXRpdWN2X3N0YXRfYXR0cnMsCiB9OwogCi1zdGF0aWMgaW5saW5lIGludAotbmV0aXVjdl9hZGRfZmlsZXMoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGlubGluZSBpbnQgbmV0aXVjdl9hZGRfZmlsZXMoc3RydWN0IGRldmljZSAqZGV2KQogewogCWludCByZXQ7CiAKQEAgLTE3MzYsMTggKzE3MzksMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLW5ldGl1Y3ZfcmVtb3ZlX2ZpbGVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRpdWN2X3JlbW92ZV9maWxlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJm5ldGl1Y3Zfc3RhdF9hdHRyX2dyb3VwKTsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJm5ldGl1Y3ZfYXR0cl9ncm91cCk7CiB9CiAKLXN0YXRpYyBpbnQKLW5ldGl1Y3ZfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQorc3RhdGljIGludCBuZXRpdWN2X3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLQlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gbmRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IGRldmljZSAqZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRldmljZSksIEdGUF9LRVJORUwpOwogCWludCByZXQ7CiAKQEAgLTE3ODYsOCArMTc4Nyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQKLW5ldGl1Y3ZfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbmV0aXVjdl91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKIAluZXRpdWN2X3JlbW92ZV9maWxlcyhkZXYpOwpAQCAtMTc5OCwxMDcgKzE3OTgsODkgQEAKICAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGNvbm5lY3Rpb24gc3RydWN0dXJlLgogICogQWRkIGl0IHRvIHRoZSBsaXN0IG9mIG5ldGl1Y3YgY29ubmVjdGlvbnM7CiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICoKLW5ldGl1Y3ZfbmV3X2Nvbm5lY3Rpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqdXNlcm5hbWUpCitzdGF0aWMgc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqbmV0aXVjdl9uZXdfY29ubmVjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJICAgICAgY2hhciAqdXNlcm5hbWUpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICoqY2xpc3QgPSAmaXVjdl9jb25ucy5pdWN2X2Nvbm5lY3Rpb25zOwotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPQotCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubjsKIAotCWlmIChjb25uKSB7Ci0JCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvbm4tPmNvbGxlY3RfcXVldWUpOwotCQlza2JfcXVldWVfaGVhZF9pbml0KCZjb25uLT5jb21taXRfcXVldWUpOwotCQlzcGluX2xvY2tfaW5pdCgmY29ubi0+Y29sbGVjdF9sb2NrKTsKLQkJY29ubi0+bWF4X2J1ZmZzaXplID0gTkVUSVVDVl9CVUZTSVpFX0RFRkFVTFQ7Ci0JCWNvbm4tPm5ldGRldiA9IGRldjsKKwljb25uID0ga3phbGxvYyhzaXplb2YoKmNvbm4pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbm4pCisJCWdvdG8gb3V0OworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvbm4tPmNvbGxlY3RfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvbm4tPmNvbW1pdF9xdWV1ZSk7CisJc3Bpbl9sb2NrX2luaXQoJmNvbm4tPmNvbGxlY3RfbG9jayk7CisJY29ubi0+bWF4X2J1ZmZzaXplID0gTkVUSVVDVl9CVUZTSVpFX0RFRkFVTFQ7CisJY29ubi0+bmV0ZGV2ID0gZGV2OwogCi0JCWNvbm4tPnJ4X2J1ZmYgPSBhbGxvY19za2IoTkVUSVVDVl9CVUZTSVpFX0RFRkFVTFQsCi0JCQkJCSAgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwotCQlpZiAoIWNvbm4tPnJ4X2J1ZmYpIHsKLQkJCWtmcmVlKGNvbm4pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJY29ubi0+dHhfYnVmZiA9IGFsbG9jX3NrYihORVRJVUNWX0JVRlNJWkVfREVGQVVMVCwKLQkJCQkJICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JCWlmICghY29ubi0+dHhfYnVmZikgewotCQkJa2ZyZWVfc2tiKGNvbm4tPnJ4X2J1ZmYpOwotCQkJa2ZyZWUoY29ubik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQljb25uLT5mc20gPSBpbml0X2ZzbSgibmV0aXVjdmNvbm4iLCBjb25uX3N0YXRlX25hbWVzLAotCQkJCSAgICAgY29ubl9ldmVudF9uYW1lcywgTlJfQ09OTl9TVEFURVMsCi0JCQkJICAgICBOUl9DT05OX0VWRU5UUywgY29ubl9mc20sIENPTk5fRlNNX0xFTiwKLQkJCQkgICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIWNvbm4tPmZzbSkgewotCQkJa2ZyZWVfc2tiKGNvbm4tPnR4X2J1ZmYpOwotCQkJa2ZyZWVfc2tiKGNvbm4tPnJ4X2J1ZmYpOwotCQkJa2ZyZWUoY29ubik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmc21fc2V0dGltZXIoY29ubi0+ZnNtLCAmY29ubi0+dGltZXIpOwotCQlmc21fbmV3c3RhdGUoY29ubi0+ZnNtLCBDT05OX1NUQVRFX0lOVkFMSUQpOworCWNvbm4tPnJ4X2J1ZmYgPSBhbGxvY19za2IoY29ubi0+bWF4X2J1ZmZzaXplLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCFjb25uLT5yeF9idWZmKQorCQlnb3RvIG91dF9jb25uOworCWNvbm4tPnR4X2J1ZmYgPSBhbGxvY19za2IoY29ubi0+bWF4X2J1ZmZzaXplLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCFjb25uLT50eF9idWZmKQorCQlnb3RvIG91dF9yeDsKKwljb25uLT5mc20gPSBpbml0X2ZzbSgibmV0aXVjdmNvbm4iLCBjb25uX3N0YXRlX25hbWVzLAorCQkJICAgICBjb25uX2V2ZW50X25hbWVzLCBOUl9DT05OX1NUQVRFUywKKwkJCSAgICAgTlJfQ09OTl9FVkVOVFMsIGNvbm5fZnNtLCBDT05OX0ZTTV9MRU4sCisJCQkgICAgIEdGUF9LRVJORUwpOworCWlmICghY29ubi0+ZnNtKQorCQlnb3RvIG91dF90eDsKIAotCQlpZiAodXNlcm5hbWUpIHsKLQkJCW1lbWNweShjb25uLT51c2VyaWQsIHVzZXJuYW1lLCA5KTsKLQkJCWZzbV9uZXdzdGF0ZShjb25uLT5mc20sIENPTk5fU1RBVEVfU1RPUFBFRCk7Ci0JCX0KKwlmc21fc2V0dGltZXIoY29ubi0+ZnNtLCAmY29ubi0+dGltZXIpOworCWZzbV9uZXdzdGF0ZShjb25uLT5mc20sIENPTk5fU1RBVEVfSU5WQUxJRCk7CiAKLQkJd3JpdGVfbG9ja19pcnFzYXZlKCZpdWN2X2Nvbm5zLml1Y3Zfcndsb2NrLCBmbGFncyk7Ci0JCWNvbm4tPm5leHQgPSAqY2xpc3Q7Ci0JCSpjbGlzdCA9IGNvbm47Ci0JCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZpdWN2X2Nvbm5zLml1Y3Zfcndsb2NrLCBmbGFncyk7CisJaWYgKHVzZXJuYW1lKSB7CisJCW1lbWNweShjb25uLT51c2VyaWQsIHVzZXJuYW1lLCA5KTsKKwkJZnNtX25ld3N0YXRlKGNvbm4tPmZzbSwgQ09OTl9TVEFURV9TVE9QUEVEKTsKIAl9CisKKwl3cml0ZV9sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZjb25uLT5saXN0LCAmaXVjdl9jb25uZWN0aW9uX2xpc3QpOworCXdyaXRlX3VubG9ja19iaCgmaXVjdl9jb25uZWN0aW9uX3J3bG9jayk7CiAJcmV0dXJuIGNvbm47CisKK291dF90eDoKKwlrZnJlZV9za2IoY29ubi0+dHhfYnVmZik7CitvdXRfcng6CisJa2ZyZWVfc2tiKGNvbm4tPnJ4X2J1ZmYpOworb3V0X2Nvbm46CisJa2ZyZWUoY29ubik7CitvdXQ6CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgogICogUmVsZWFzZSBhIGNvbm5lY3Rpb24gc3RydWN0dXJlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUKICAqIGxpc3Qgb2YgbmV0aXVjdiBjb25uZWN0aW9ucy4KICAqLwotc3RhdGljIHZvaWQKLW5ldGl1Y3ZfcmVtb3ZlX2Nvbm5lY3Rpb24oc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubikKK3N0YXRpYyB2b2lkIG5ldGl1Y3ZfcmVtb3ZlX2Nvbm5lY3Rpb24oc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubikKIHsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICoqY2xpc3QgPSAmaXVjdl9jb25ucy5pdWN2X2Nvbm5lY3Rpb25zOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwotCWlmIChjb25uID09IE5VTEwpCi0JCXJldHVybjsKLQl3cml0ZV9sb2NrX2lycXNhdmUoJml1Y3ZfY29ubnMuaXVjdl9yd2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoKmNsaXN0KSB7Ci0JCWlmICgqY2xpc3QgPT0gY29ubikgewotCQkJKmNsaXN0ID0gY29ubi0+bmV4dDsKLQkJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZpdWN2X2Nvbm5zLml1Y3Zfcndsb2NrLCBmbGFncyk7Ci0JCQlpZiAoY29ubi0+aGFuZGxlKSB7Ci0JCQkJaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW0oY29ubi0+aGFuZGxlKTsKLQkJCQljb25uLT5oYW5kbGUgPSBOVUxMOwotCQkJfQotCQkJZnNtX2RlbHRpbWVyKCZjb25uLT50aW1lcik7Ci0JCQlrZnJlZV9mc20oY29ubi0+ZnNtKTsKLQkJCWtmcmVlX3NrYihjb25uLT5yeF9idWZmKTsKLQkJCWtmcmVlX3NrYihjb25uLT50eF9idWZmKTsKLQkJCXJldHVybjsKLQkJfQotCQljbGlzdCA9ICYoKCpjbGlzdCktPm5leHQpOworCXdyaXRlX2xvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOworCWxpc3RfZGVsX2luaXQoJmNvbm4tPmxpc3QpOworCXdyaXRlX3VubG9ja19iaCgmaXVjdl9jb25uZWN0aW9uX3J3bG9jayk7CisJaWYgKGNvbm4tPnBhdGgpIHsKKwkJaXVjdl9wYXRoX3NldmVyKGNvbm4tPnBhdGgsIGl1Y3ZNYWdpYyk7CisJCWtmcmVlKGNvbm4tPnBhdGgpOworCQljb25uLT5wYXRoID0gTlVMTDsKIAl9Ci0Jd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJml1Y3ZfY29ubnMuaXVjdl9yd2xvY2ssIGZsYWdzKTsKKwlmc21fZGVsdGltZXIoJmNvbm4tPnRpbWVyKTsKKwlrZnJlZV9mc20oY29ubi0+ZnNtKTsKKwlrZnJlZV9za2IoY29ubi0+cnhfYnVmZik7CisJa2ZyZWVfc2tiKGNvbm4tPnR4X2J1ZmYpOwogfQogCiAvKioKICAqIFJlbGVhc2UgZXZlcnl0aGluZyBvZiBhIG5ldCBkZXZpY2UuCiAgKi8KLXN0YXRpYyB2b2lkCi1uZXRpdWN2X2ZyZWVfbmV0ZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuZXRpdWN2X2ZyZWVfbmV0ZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0cjsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7CiAKIAlpZiAoIWRldikKIAkJcmV0dXJuOwogCi0JcHJpdnB0ciA9IChzdHJ1Y3QgbmV0aXVjdl9wcml2ICopZGV2LT5wcml2OwogCWlmIChwcml2cHRyKSB7CiAJCWlmIChwcml2cHRyLT5jb25uKQogCQkJbmV0aXVjdl9yZW1vdmVfY29ubmVjdGlvbihwcml2cHRyLT5jb25uKTsKQEAgLTE5MTMsMTEgKzE4OTUsOCBAQAogLyoqCiAgKiBJbml0aWFsaXplIGEgbmV0IGRldmljZS4gKENhbGxlZCBmcm9tIGtlcm5lbCBpbiBhbGxvY19uZXRkZXYoKSkKICAqLwotc3RhdGljIHZvaWQKLW5ldGl1Y3Zfc2V0dXBfbmV0ZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuZXRpdWN2X3NldHVwX25ldGRldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgICAgICBtZW1zZXQoZGV2LT5wcml2LCAwLCBzaXplb2Yoc3RydWN0IG5ldGl1Y3ZfcHJpdikpOwotCiAJZGV2LT5tdHUJICAgICAgICAgPSBORVRJVUNWX01UVV9ERUZBVUxUOwogCWRldi0+aGFyZF9zdGFydF94bWl0ICAgICA9IG5ldGl1Y3ZfdHg7CiAJZGV2LT5vcGVuCSAgICAgICAgID0gbmV0aXVjdl9vcGVuOwpAQCAtMTkzNiw4ICsxOTE1LDcgQEAKIC8qKgogICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgZXZlcnl0aGluZyBvZiBhIG5ldCBkZXZpY2UuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqCi1uZXRpdWN2X2luaXRfbmV0ZGV2aWNlKGNoYXIgKnVzZXJuYW1lKQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRpdWN2X2luaXRfbmV0ZGV2aWNlKGNoYXIgKnVzZXJuYW1lKQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXZwdHI7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKQEAgLTE5NDYsNDAgKzE5MjQsNDAgQEAKIAkJCSAgIG5ldGl1Y3Zfc2V0dXBfbmV0ZGV2aWNlKTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIE5VTEw7Ci0JaWYgKGRldl9hbGxvY19uYW1lKGRldiwgZGV2LT5uYW1lKSA8IDApIHsKLQkJZnJlZV9uZXRkZXYoZGV2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorCWlmIChkZXZfYWxsb2NfbmFtZShkZXYsIGRldi0+bmFtZSkgPCAwKQorCQlnb3RvIG91dF9uZXRkZXY7CiAKLQlwcml2cHRyID0gKHN0cnVjdCBuZXRpdWN2X3ByaXYgKilkZXYtPnByaXY7CisJcHJpdnB0ciA9IG5ldGRldl9wcml2KGRldik7CiAJcHJpdnB0ci0+ZnNtID0gaW5pdF9mc20oIm5ldGl1Y3ZkZXYiLCBkZXZfc3RhdGVfbmFtZXMsCiAJCQkJZGV2X2V2ZW50X25hbWVzLCBOUl9ERVZfU1RBVEVTLCBOUl9ERVZfRVZFTlRTLAogCQkJCWRldl9mc20sIERFVl9GU01fTEVOLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXZwdHItPmZzbSkgewotCQlmcmVlX25ldGRldihkZXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisJaWYgKCFwcml2cHRyLT5mc20pCisJCWdvdG8gb3V0X25ldGRldjsKKwogCXByaXZwdHItPmNvbm4gPSBuZXRpdWN2X25ld19jb25uZWN0aW9uKGRldiwgdXNlcm5hbWUpOwogCWlmICghcHJpdnB0ci0+Y29ubikgewotCQlrZnJlZV9mc20ocHJpdnB0ci0+ZnNtKTsKLQkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJSVVDVl9EQkZfVEVYVChzZXR1cCwgMiwgIk5VTEwgZnJvbSBuZXRpdWN2X25ld19jb25uZWN0aW9uXG4iKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gb3V0X2ZzbTsKIAl9CiAJZnNtX25ld3N0YXRlKHByaXZwdHItPmZzbSwgREVWX1NUQVRFX1NUT1BQRUQpOwotCiAJcmV0dXJuIGRldjsKKworb3V0X2ZzbToKKwlrZnJlZV9mc20ocHJpdnB0ci0+ZnNtKTsKK291dF9uZXRkZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHNzaXplX3QKLWNvbm5fd3JpdGUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBjb25uX3dyaXRlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCisJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCWNoYXIgKnA7CisJY29uc3QgY2hhciAqcDsKIAljaGFyIHVzZXJuYW1lWzldOwotCWludCBpLCByZXQ7CisJaW50IGksIHJjOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqKmNsaXN0ID0gJml1Y3ZfY29ubnMuaXVjdl9jb25uZWN0aW9uczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXY7CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY3A7CiAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwogCWlmIChjb3VudD45KSB7CkBAIC0xOTg4LDgzICsxOTY2LDgyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWZvciAoaT0wLCBwPShjaGFyICopYnVmOyBpPDggJiYgKnA7IGkrKywgcCsrKSB7Ci0JCWlmIChpc2FsbnVtKCpwKSB8fCAoKnAgPT0gJyQnKSkKLQkJCXVzZXJuYW1lW2ldPSB0b3VwcGVyKCpwKTsKLQkJZWxzZSBpZiAoKnAgPT0gJ1xuJykgeworCWZvciAoaSA9IDAsIHAgPSBidWY7IGkgPCA4ICYmICpwOyBpKyssIHArKykgeworCQlpZiAoaXNhbG51bSgqcCkgfHwgKnAgPT0gJyQnKSB7CisJCQl1c2VybmFtZVtpXSA9IHRvdXBwZXIoKnApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCpwID09ICdcbicpCiAJCQkvKiB0cmFpbGluZyBsZiwgZ3JyICovCiAJCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCVBSSU5UX1dBUk4oIm5ldGl1Y3Y6IEludmFsaWQgY2hhcmFjdGVyIGluIHVzZXJuYW1lIVxuIik7Ci0JCQlJVUNWX0RCRl9URVhUXyhzZXR1cCwgMiwKLQkJCQkiY29ubl93cml0ZTogaW52YWxpZCBjaGFyYWN0ZXIgJWNcbiIsICpwKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9CisJCVBSSU5UX1dBUk4oIm5ldGl1Y3Y6IEludmFsaWQgY2hhcmFjdGVyIGluIHVzZXJuYW1lIVxuIik7CisJCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCAyLAorCQkJICAgICAgICJjb25uX3dyaXRlOiBpbnZhbGlkIGNoYXJhY3RlciAlY1xuIiwgKnApOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0Jd2hpbGUgKGk8OCkKKwl3aGlsZSAoaSA8IDgpCiAJCXVzZXJuYW1lW2krK10gPSAnICc7CiAJdXNlcm5hbWVbOF0gPSAnXDAnOwogCi0JcmVhZF9sb2NrX2lycXNhdmUoJml1Y3ZfY29ubnMuaXVjdl9yd2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoKmNsaXN0KSB7Ci0JCWlmICghc3RybmNtcCh1c2VybmFtZSwgKCpjbGlzdCktPnVzZXJpZCwgOSkpCi0JCQlicmVhazsKLQkJY2xpc3QgPSAmKCgqY2xpc3QpLT5uZXh0KTsKKwlyZWFkX2xvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZpdWN2X2Nvbm5lY3Rpb25fbGlzdCwgbGlzdCkgeworCQlpZiAoIXN0cm5jbXAodXNlcm5hbWUsIGNwLT51c2VyaWQsIDkpKSB7CisJCQlyZWFkX3VubG9ja19iaCgmaXVjdl9jb25uZWN0aW9uX3J3bG9jayk7CisJCQlQUklOVF9XQVJOKCJuZXRpdWN2OiBDb25uZWN0aW9uIHRvICVzIGFscmVhZHkgIgorCQkJCSAgICJleGlzdHNcbiIsIHVzZXJuYW1lKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CiAJfQotCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJml1Y3ZfY29ubnMuaXVjdl9yd2xvY2ssIGZsYWdzKTsKLQlpZiAoKmNsaXN0KSB7Ci0JCVBSSU5UX1dBUk4oIm5ldGl1Y3Y6IENvbm5lY3Rpb24gdG8gJXMgYWxyZWFkeSBleGlzdHNcbiIsCi0JCQl1c2VybmFtZSk7Ci0JCXJldHVybiAtRUVYSVNUOwotCX0KKwlyZWFkX3VubG9ja19iaCgmaXVjdl9jb25uZWN0aW9uX3J3bG9jayk7CisKIAlkZXYgPSBuZXRpdWN2X2luaXRfbmV0ZGV2aWNlKHVzZXJuYW1lKTsKIAlpZiAoIWRldikgewotCQlQUklOVF9XQVJOKAotCQkgICAgICAgIm5ldGl1Y3Y6IENvdWxkIG5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgIgotCQkgICAgICAgImZvciB1c2VyICclcydcbiIsIG5ldGl1Y3ZfcHJpbnRuYW1lKHVzZXJuYW1lKSk7CisJCVBSSU5UX1dBUk4oIm5ldGl1Y3Y6IENvdWxkIG5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZSAiCisJCQkgICAic3RydWN0dXJlIGZvciB1c2VyICclcydcbiIsCisJCQkgICBuZXRpdWN2X3ByaW50bmFtZSh1c2VybmFtZSkpOwogCQlJVUNWX0RCRl9URVhUKHNldHVwLCAyLCAiTlVMTCBmcm9tIG5ldGl1Y3ZfaW5pdF9uZXRkZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoKHJldCA9IG5ldGl1Y3ZfcmVnaXN0ZXJfZGV2aWNlKGRldikpKSB7CisJcmMgPSBuZXRpdWN2X3JlZ2lzdGVyX2RldmljZShkZXYpOworCWlmIChyYykgewogCQlJVUNWX0RCRl9URVhUXyhzZXR1cCwgMiwKLQkJCSJyZXQgJWQgZnJvbSBuZXRpdWN2X3JlZ2lzdGVyX2RldmljZVxuIiwgcmV0KTsKKwkJCSJyZXQgJWQgZnJvbSBuZXRpdWN2X3JlZ2lzdGVyX2RldmljZVxuIiwgcmMpOwogCQlnb3RvIG91dF9mcmVlX25kZXY7CiAJfQogCiAJLyogc3lzZnMgbWFnaWMgKi8KLQlTRVRfTkVUREVWX0RFVihkZXYsCi0JCQkoc3RydWN0IGRldmljZSopKChzdHJ1Y3QgbmV0aXVjdl9wcml2KilkZXYtPnByaXYpLT5kZXYpOworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgcHJpdi0+ZGV2KTsKIAotCWlmICgocmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldikpKSB7Ci0JCW5ldGl1Y3ZfdW5yZWdpc3Rlcl9kZXZpY2UoKHN0cnVjdCBkZXZpY2UqKQotCQkJKChzdHJ1Y3QgbmV0aXVjdl9wcml2KilkZXYtPnByaXYpLT5kZXYpOwotCQlnb3RvIG91dF9mcmVlX25kZXY7Ci0JfQorCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKQorCQlnb3RvIG91dF91bnJlZzsKIAogCVBSSU5UX0lORk8oIiVzOiAnJXMnXG4iLCBkZXYtPm5hbWUsIG5ldGl1Y3ZfcHJpbnRuYW1lKHVzZXJuYW1lKSk7CiAKIAlyZXR1cm4gY291bnQ7CiAKK291dF91bnJlZzoKKwluZXRpdWN2X3VucmVnaXN0ZXJfZGV2aWNlKHByaXYtPmRldik7CiBvdXRfZnJlZV9uZGV2OgogCVBSSU5UX1dBUk4oIm5ldGl1Y3Y6IENvdWxkIG5vdCByZWdpc3RlciAnJXMnXG4iLCBkZXYtPm5hbWUpOwogCUlVQ1ZfREJGX1RFWFQoc2V0dXAsIDIsICJjb25uX3dyaXRlOiBjb3VsZCBub3QgcmVnaXN0ZXJcbiIpOwogCW5ldGl1Y3ZfZnJlZV9uZXRkZXZpY2UoZGV2KTsKLQlyZXR1cm4gcmV0OworCXJldHVybiByYzsKIH0KIAogc3RhdGljIERSSVZFUl9BVFRSKGNvbm5lY3Rpb24sIDAyMDAsIE5VTEwsIGNvbm5fd3JpdGUpOwogCi1zdGF0aWMgc3NpemVfdAotcmVtb3ZlX3dyaXRlIChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHJlbW92ZV93cml0ZSAoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqKmNsaXN0ID0gJml1Y3ZfY29ubnMuaXVjdl9jb25uZWN0aW9uczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNwOwogICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKICAgICAgICAgc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdjsKICAgICAgICAgc3RydWN0IGRldmljZSAqZGV2OwogICAgICAgICBjaGFyIG5hbWVbSUZOQU1TSVpdOwotICAgICAgICBjaGFyICpwOworCWNvbnN0IGNoYXIgKnA7CiAgICAgICAgIGludCBpOwogCiAgICAgICAgIElVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7CkBAIC0yMDcyLDMzICsyMDQ5LDI3IEBACiAgICAgICAgIGlmIChjb3VudCA+PSBJRk5BTVNJWikKICAgICAgICAgICAgICAgICBjb3VudCA9IElGTkFNU0laIC0gMTs7CiAKLSAgICAgICAgZm9yIChpPTAsIHA9KGNoYXIgKilidWY7IGk8Y291bnQgJiYgKnA7IGkrKywgcCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCgqcCA9PSAnXG4nKSB8fCAoKnAgPT0gJyAnKSkgeworCWZvciAoaSA9IDAsIHAgPSBidWY7IGkgPCBjb3VudCAmJiAqcDsgaSsrLCBwKyspIHsKKwkJaWYgKCpwID09ICdcbicgfHwgKnAgPT0gJyAnKQogICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhaWxpbmcgbGYsIGdyciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbaV09KnA7Ci0gICAgICAgICAgICAgICAgfQorCQluYW1lW2ldID0gKnA7CiAgICAgICAgIH0KICAgICAgICAgbmFtZVtpXSA9ICdcMCc7CiAKLQlyZWFkX2xvY2tfaXJxc2F2ZSgmaXVjdl9jb25ucy5pdWN2X3J3bG9jaywgZmxhZ3MpOwotICAgICAgICB3aGlsZSAoKmNsaXN0KSB7Ci0gICAgICAgICAgICAgICAgbmRldiA9ICgqY2xpc3QpLT5uZXRkZXY7Ci0gICAgICAgICAgICAgICAgcHJpdiA9IChzdHJ1Y3QgbmV0aXVjdl9wcml2KiluZGV2LT5wcml2OworCXJlYWRfbG9ja19iaCgmaXVjdl9jb25uZWN0aW9uX3J3bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcCwgJml1Y3ZfY29ubmVjdGlvbl9saXN0LCBsaXN0KSB7CisJCW5kZXYgPSBjcC0+bmV0ZGV2OworCQlwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAgICAgICAgICAgICAgICAgZGV2ID0gcHJpdi0+ZGV2OwotCi0gICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAobmFtZSwgbmRldi0+bmFtZSwgY291bnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGlzdCA9ICYoKCpjbGlzdCktPm5leHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZpdWN2X2Nvbm5zLml1Y3Zfcndsb2NrLCBmbGFncyk7CisJCWlmIChzdHJuY21wKG5hbWUsIG5kZXYtPm5hbWUsIGNvdW50KSkKKwkJCWNvbnRpbnVlOworCQlyZWFkX3VubG9ja19iaCgmaXVjdl9jb25uZWN0aW9uX3J3bG9jayk7CiAgICAgICAgICAgICAgICAgaWYgKG5kZXYtPmZsYWdzICYgKElGRl9VUCB8IElGRl9SVU5OSU5HKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlRfV0FSTigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ldGl1Y3Y6IG5ldCBkZXZpY2UgJXMgYWN0aXZlIHdpdGggcGVlciAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRldi0+bmFtZSwgcHJpdi0+Y29ubi0+dXNlcmlkKTsKKwkJCVBSSU5UX1dBUk4oIm5ldGl1Y3Y6IG5ldCBkZXZpY2UgJXMgYWN0aXZlIHdpdGggcGVlciAiCisJCQkJICAgIiVzXG4iLCBuZGV2LT5uYW1lLCBwcml2LT5jb25uLT51c2VyaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlRfV0FSTigibmV0aXVjdjogJXMgY2Fubm90IGJlIHJlbW92ZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kZXYtPm5hbWUpOworCQkJCSAgIG5kZXYtPm5hbWUpOwogCQkJSVVDVl9EQkZfVEVYVChkYXRhLCAyLCAicmVtb3ZlX3dyaXRlOiBzdGlsbCBhY3RpdmVcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMTA2LDcgKzIwNzcsNyBAQAogICAgICAgICAgICAgICAgIG5ldGl1Y3ZfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2KTsKICAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgICAgIH0KLQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZpdWN2X2Nvbm5zLml1Y3Zfcndsb2NrLCBmbGFncyk7CisJcmVhZF91bmxvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOwogICAgICAgICBQUklOVF9XQVJOKCJuZXRpdWN2OiBuZXQgZGV2aWNlICVzIHVua25vd25cbiIsIG5hbWUpOwogCUlVQ1ZfREJGX1RFWFQoZGF0YSwgMiwgInJlbW92ZV93cml0ZTogdW5rbm93biBkZXZpY2VcbiIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTIxMTQsNjcgKzIwODUsODYgQEAKIAogc3RhdGljIERSSVZFUl9BVFRSKHJlbW92ZSwgMDIwMCwgTlVMTCwgcmVtb3ZlX3dyaXRlKTsKIAotc3RhdGljIHZvaWQKLW5ldGl1Y3ZfYmFubmVyKHZvaWQpCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIG5ldGl1Y3ZfZHJ2X2F0dHJzW10gPSB7CisJJmRyaXZlcl9hdHRyX2Nvbm5lY3Rpb24uYXR0ciwKKwkmZHJpdmVyX2F0dHJfcmVtb3ZlLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG5ldGl1Y3ZfZHJ2X2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gbmV0aXVjdl9kcnZfYXR0cnMsCit9OworCitzdGF0aWMgdm9pZCBuZXRpdWN2X2Jhbm5lcih2b2lkKQogewogCVBSSU5UX0lORk8oIk5FVElVQ1YgZHJpdmVyIGluaXRpYWxpemVkXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0Ci1uZXRpdWN2X2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZXRpdWN2X2V4aXQodm9pZCkKIHsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjcDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7Ci0Jd2hpbGUgKGl1Y3ZfY29ubnMuaXVjdl9jb25uZWN0aW9ucykgewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGl1Y3ZfY29ubnMuaXVjdl9jb25uZWN0aW9ucy0+bmV0ZGV2OwotCQlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gKHN0cnVjdCBuZXRpdWN2X3ByaXYqKW5kZXYtPnByaXY7Ci0JCXN0cnVjdCBkZXZpY2UgKmRldiA9IHByaXYtPmRldjsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJml1Y3ZfY29ubmVjdGlvbl9saXN0KSkgeworCQljcCA9IGxpc3RfZW50cnkoaXVjdl9jb25uZWN0aW9uX2xpc3QubmV4dCwKKwkJCQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uLCBsaXN0KTsKKwkJbGlzdF9kZWwoJmNwLT5saXN0KTsKKwkJbmRldiA9IGNwLT5uZXRkZXY7CisJCXByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwkJZGV2ID0gcHJpdi0+ZGV2OwogCiAJCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwogCQluZXRpdWN2X3VucmVnaXN0ZXJfZGV2aWNlKGRldik7CiAJfQogCi0JZHJpdmVyX3JlbW92ZV9maWxlKCZuZXRpdWN2X2RyaXZlciwgJmRyaXZlcl9hdHRyX2Nvbm5lY3Rpb24pOwotCWRyaXZlcl9yZW1vdmVfZmlsZSgmbmV0aXVjdl9kcml2ZXIsICZkcml2ZXJfYXR0cl9yZW1vdmUpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmbmV0aXVjdl9kcml2ZXIua29iaiwgJm5ldGl1Y3ZfZHJ2X2F0dHJfZ3JvdXApOwogCWRyaXZlcl91bnJlZ2lzdGVyKCZuZXRpdWN2X2RyaXZlcik7CisJaXVjdl91bnJlZ2lzdGVyKCZuZXRpdWN2X2hhbmRsZXIsIDEpOwogCWl1Y3ZfdW5yZWdpc3Rlcl9kYmZfdmlld3MoKTsKIAogCVBSSU5UX0lORk8oIk5FVElVQ1YgZHJpdmVyIHVubG9hZGVkXG4iKTsKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0Ci1uZXRpdWN2X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IG5ldGl1Y3ZfaW5pdCh2b2lkKQogewotCWludCByZXQ7CisJaW50IHJjOwogCi0JcmV0ID0gaXVjdl9yZWdpc3Rlcl9kYmZfdmlld3MoKTsKLQlpZiAocmV0KSB7Ci0JCVBSSU5UX1dBUk4oIm5ldGl1Y3ZfaW5pdCBmYWlsZWQsICIKLQkJCSJpdWN2X3JlZ2lzdGVyX2RiZl92aWV3cyByYyA9ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KKwlyYyA9IGl1Y3ZfcmVnaXN0ZXJfZGJmX3ZpZXdzKCk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwlyYyA9IGl1Y3ZfcmVnaXN0ZXIoJm5ldGl1Y3ZfaGFuZGxlciwgMSk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9kYmY7CiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKLQlyZXQgPSBkcml2ZXJfcmVnaXN0ZXIoJm5ldGl1Y3ZfZHJpdmVyKTsKLQlpZiAocmV0KSB7CisJcmMgPSBkcml2ZXJfcmVnaXN0ZXIoJm5ldGl1Y3ZfZHJpdmVyKTsKKwlpZiAocmMpIHsKIAkJUFJJTlRfRVJSKCJORVRJVUNWOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZHJpdmVyLlxuIik7Ci0JCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCAyLCAicmV0ICVkIGZyb20gZHJpdmVyX3JlZ2lzdGVyXG4iLCByZXQpOwotCQlpdWN2X3VucmVnaXN0ZXJfZGJmX3ZpZXdzKCk7Ci0JCXJldHVybiByZXQ7CisJCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCAyLCAicmV0ICVkIGZyb20gZHJpdmVyX3JlZ2lzdGVyXG4iLCByYyk7CisJCWdvdG8gb3V0X2l1Y3Y7CiAJfQogCi0JLyogQWRkIGVudHJ5IGZvciBzcGVjaWZ5aW5nIGNvbm5lY3Rpb25zLiAqLwotCXJldCA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmbmV0aXVjdl9kcml2ZXIsICZkcml2ZXJfYXR0cl9jb25uZWN0aW9uKTsKLQlpZiAoIXJldCkgewotCQlyZXQgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJm5ldGl1Y3ZfZHJpdmVyLCAmZHJpdmVyX2F0dHJfcmVtb3ZlKTsKLQkJbmV0aXVjdl9iYW5uZXIoKTsKLQkJcndsb2NrX2luaXQoJml1Y3ZfY29ubnMuaXVjdl9yd2xvY2spOwotCX0gZWxzZSB7Ci0JCVBSSU5UX0VSUigiTkVUSVVDVjogZmFpbGVkIHRvIGFkZCBkcml2ZXIgYXR0cmlidXRlLlxuIik7Ci0JCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCAyLCAicmV0ICVkIGZyb20gZHJpdmVyX2NyZWF0ZV9maWxlXG4iLCByZXQpOwotCQlkcml2ZXJfdW5yZWdpc3RlcigmbmV0aXVjdl9kcml2ZXIpOwotCQlpdWN2X3VucmVnaXN0ZXJfZGJmX3ZpZXdzKCk7CisJcmMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ldGl1Y3ZfZHJpdmVyLmtvYmosICZuZXRpdWN2X2Rydl9hdHRyX2dyb3VwKTsKKwlpZiAocmMpIHsKKwkJUFJJTlRfRVJSKCJORVRJVUNWOiBmYWlsZWQgdG8gYWRkIGRyaXZlciBhdHRyaWJ1dGVzLlxuIik7CisJCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCAyLAorCQkJICAgICAgICJyZXQgJWQgLSBuZXRpdWN2X2Rydl9hdHRyX2dyb3VwXG4iLCByYyk7CisJCWdvdG8gb3V0X2RyaXZlcjsKIAl9Ci0JcmV0dXJuIHJldDsKKwluZXRpdWN2X2Jhbm5lcigpOworCXJldHVybiByYzsKKworb3V0X2RyaXZlcjoKKwlkcml2ZXJfdW5yZWdpc3RlcigmbmV0aXVjdl9kcml2ZXIpOworb3V0X2l1Y3Y6CisJaXVjdl91bnJlZ2lzdGVyKCZuZXRpdWN2X2hhbmRsZXIsIDEpOworb3V0X2RiZjoKKwlpdWN2X3VucmVnaXN0ZXJfZGJmX3ZpZXdzKCk7CitvdXQ6CisJcmV0dXJuIHJjOwogfQogCiBtb2R1bGVfaW5pdChuZXRpdWN2X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9zbXNnaXVjdi5jIGIvZHJpdmVycy9zMzkwL25ldC9zbXNnaXVjdi5jCmluZGV4IGI4MTc5YzIuLjNjY2NhNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvc21zZ2l1Y3YuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3Ntc2dpdWN2LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogSVVDViBzcGVjaWFsIG1lc3NhZ2UgZHJpdmVyCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAzIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAyMDAzIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KICAqIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0yMywxMCArMjMsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvaXVjdi9pdWN2Lmg+CiAjaW5jbHVkZSA8YXNtL2NwY21kLmg+CiAjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgotCi0jaW5jbHVkZSAiaXVjdi5oIgorI2luY2x1ZGUgInNtc2dpdWN2LmgiCiAKIHN0cnVjdCBzbXNnX2NhbGxiYWNrIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC0zOSwzOCArMzksNDYgQEAKICAgICgiKEMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGJ5IE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkiKTsKIE1PRFVMRV9ERVNDUklQVElPTiAoIkxpbnV4IGZvciBTLzM5MCBJVUNWIHNwZWNpYWwgbWVzc2FnZSBkcml2ZXIiKTsKIAotc3RhdGljIGl1Y3ZfaGFuZGxlX3Qgc21zZ19oYW5kbGU7Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgc21zZ19wYXRoaWQ7CitzdGF0aWMgc3RydWN0IGl1Y3ZfcGF0aCAqc21zZ19wYXRoOworCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNtc2dfbGlzdF9sb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNtc2dfbGlzdCA9IExJU1RfSEVBRF9JTklUKHNtc2dfbGlzdCk7CiAKLXN0YXRpYyB2b2lkCi1zbXNnX2Nvbm5lY3Rpb25fY29tcGxldGUoaXVjdl9Db25uZWN0aW9uQ29tcGxldGUgKmVpYiwgdm9pZCAqcGdtX2RhdGEpCitzdGF0aWMgaW50IHNtc2dfcGF0aF9wZW5kaW5nKHN0cnVjdCBpdWN2X3BhdGggKiwgdTggaXB2bWlkWzhdLCB1OCBpcHVzZXJbMTZdKTsKK3N0YXRpYyB2b2lkIHNtc2dfbWVzc2FnZV9wZW5kaW5nKHN0cnVjdCBpdWN2X3BhdGggKiwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqKTsKKworc3RhdGljIHN0cnVjdCBpdWN2X2hhbmRsZXIgc21zZ19oYW5kbGVyID0geworCS5wYXRoX3BlbmRpbmcJID0gc21zZ19wYXRoX3BlbmRpbmcsCisJLm1lc3NhZ2VfcGVuZGluZyA9IHNtc2dfbWVzc2FnZV9wZW5kaW5nLAorfTsKKworc3RhdGljIGludCBzbXNnX3BhdGhfcGVuZGluZyhzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCB1OCBpcHZtaWRbOF0sCisJCQkgICAgIHU4IGlwdXNlclsxNl0pCiB7CisJaWYgKHN0cm5jbXAoaXB2bWlkLCAiKk1TRyAgICAiLCBzaXplb2YoaXB2bWlkKSkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogUGF0aCBwZW5kaW5nIGZyb20gKk1TRy4gKi8KKwlyZXR1cm4gaXVjdl9wYXRoX2FjY2VwdChwYXRoLCAmc21zZ19oYW5kbGVyLCAiU01TR0lVQ1YgICAgICAgICIsIE5VTEwpOwogfQogCi0KLXN0YXRpYyB2b2lkCi1zbXNnX21lc3NhZ2VfcGVuZGluZyhpdWN2X01lc3NhZ2VQZW5kaW5nICplaWIsIHZvaWQgKnBnbV9kYXRhKQorc3RhdGljIHZvaWQgc21zZ19tZXNzYWdlX3BlbmRpbmcoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwKKwkJCQkgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnKQogewogCXN0cnVjdCBzbXNnX2NhbGxiYWNrICpjYjsKLQl1bnNpZ25lZCBjaGFyICptc2c7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOwogCXVuc2lnbmVkIGNoYXIgc2VuZGVyWzldOwotCXVuc2lnbmVkIHNob3J0IGxlbjsKIAlpbnQgcmMsIGk7CiAKLQlsZW4gPSBlaWItPmxuMW1zZzIuaXBiZmxuMWY7Ci0JbXNnID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfQVRPTUlDfEdGUF9ETUEpOwotCWlmICghbXNnKSB7Ci0JCWl1Y3ZfcmVqZWN0KGVpYi0+aXBwYXRoaWQsIGVpYi0+aXBtc2dpZCwgZWliLT5pcHRyZ2Nscyk7CisJYnVmZmVyID0ga21hbGxvYyhtc2ctPmxlbmd0aCArIDEsIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKKwlpZiAoIWJ1ZmZlcikgeworCQlpdWN2X21lc3NhZ2VfcmVqZWN0KHBhdGgsIG1zZyk7CiAJCXJldHVybjsKIAl9Ci0JcmMgPSBpdWN2X3JlY2VpdmUoZWliLT5pcHBhdGhpZCwgZWliLT5pcG1zZ2lkLCBlaWItPmlwdHJnY2xzLAotCQkJICBtc2csIGxlbiwgTlVMTCwgTlVMTCwgTlVMTCk7CisJcmMgPSBpdWN2X21lc3NhZ2VfcmVjZWl2ZShwYXRoLCBtc2csIDAsIGJ1ZmZlciwgbXNnLT5sZW5ndGgsIE5VTEwpOwogCWlmIChyYyA9PSAwKSB7Ci0JCW1zZ1tsZW5dID0gMDsKLQkJRUJDQVNDKG1zZywgbGVuKTsKLQkJbWVtY3B5KHNlbmRlciwgbXNnLCA4KTsKKwkJYnVmZmVyW21zZy0+bGVuZ3RoXSA9IDA7CisJCUVCQ0FTQyhidWZmZXIsIG1zZy0+bGVuZ3RoKTsKKwkJbWVtY3B5KHNlbmRlciwgYnVmZmVyLCA4KTsKIAkJc2VuZGVyWzhdID0gMDsKIAkJLyogUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgc2VuZGVyIG5hbWUuICovCiAJCWZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7CkBAIC04MCwyNyArODgsMTcgQEAKIAkJfQogCQlzcGluX2xvY2soJnNtc2dfbGlzdF9sb2NrKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJnNtc2dfbGlzdCwgbGlzdCkKLQkJCWlmIChzdHJuY21wKG1zZyArIDgsIGNiLT5wcmVmaXgsIGNiLT5sZW4pID09IDApIHsKLQkJCQljYi0+Y2FsbGJhY2soc2VuZGVyLCBtc2cgKyA4KTsKKwkJCWlmIChzdHJuY21wKGJ1ZmZlciArIDgsIGNiLT5wcmVmaXgsIGNiLT5sZW4pID09IDApIHsKKwkJCQljYi0+Y2FsbGJhY2soc2VuZGVyLCBidWZmZXIgKyA4KTsKIAkJCQlicmVhazsKIAkJCX0KIAkJc3Bpbl91bmxvY2soJnNtc2dfbGlzdF9sb2NrKTsKIAl9Ci0Ja2ZyZWUobXNnKTsKKwlrZnJlZShidWZmZXIpOwogfQogCi1zdGF0aWMgaXVjdl9pbnRlcnJ1cHRfb3BzX3Qgc21zZ19vcHMgPSB7Ci0JLkNvbm5lY3Rpb25Db21wbGV0ZSA9IHNtc2dfY29ubmVjdGlvbl9jb21wbGV0ZSwKLQkuTWVzc2FnZVBlbmRpbmcgICAgID0gc21zZ19tZXNzYWdlX3BlbmRpbmcsCi19OwotCi1zdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgc21zZ19kcml2ZXIgPSB7Ci0JLm5hbWUgPSAiU01TR0lVQ1YiLAotCS5idXMgID0gJml1Y3ZfYnVzLAotfTsKLQotaW50Ci1zbXNnX3JlZ2lzdGVyX2NhbGxiYWNrKGNoYXIgKnByZWZpeCwgdm9pZCAoKmNhbGxiYWNrKShjaGFyICpmcm9tLCBjaGFyICpzdHIpKQoraW50IHNtc2dfcmVnaXN0ZXJfY2FsbGJhY2soY2hhciAqcHJlZml4LAorCQkJICAgdm9pZCAoKmNhbGxiYWNrKShjaGFyICpmcm9tLCBjaGFyICpzdHIpKQogewogCXN0cnVjdCBzbXNnX2NhbGxiYWNrICpjYjsKIApAQCAtMTEwLDE4ICsxMDgsMTggQEAKIAljYi0+cHJlZml4ID0gcHJlZml4OwogCWNiLT5sZW4gPSBzdHJsZW4ocHJlZml4KTsKIAljYi0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKLQlzcGluX2xvY2soJnNtc2dfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNtc2dfbGlzdF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJnNtc2dfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnNtc2dfbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc21zZ19saXN0X2xvY2spOwogCXJldHVybiAwOwogfQogCi12b2lkCi1zbXNnX3VucmVnaXN0ZXJfY2FsbGJhY2soY2hhciAqcHJlZml4LCB2b2lkICgqY2FsbGJhY2spKGNoYXIgKmZyb20sIGNoYXIgKnN0cikpCit2b2lkIHNtc2dfdW5yZWdpc3Rlcl9jYWxsYmFjayhjaGFyICpwcmVmaXgsCisJCQkgICAgICB2b2lkICgqY2FsbGJhY2spKGNoYXIgKmZyb20sIGNoYXIgKnN0cikpCiB7CiAJc3RydWN0IHNtc2dfY2FsbGJhY2sgKmNiLCAqdG1wOwogCi0Jc3Bpbl9sb2NrKCZzbXNnX2xpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZzbXNnX2xpc3RfbG9jayk7CiAJY2IgPSBOVUxMOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmc21zZ19saXN0LCBsaXN0KQogCQlpZiAodG1wLT5jYWxsYmFjayA9PSBjYWxsYmFjayAmJgpAQCAtMTMwLDU1ICsxMjgsNTggQEAKIAkJCWxpc3RfZGVsKCZjYi0+bGlzdCk7CiAJCQlicmVhazsKIAkJfQotCXNwaW5fdW5sb2NrKCZzbXNnX2xpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNtc2dfbGlzdF9sb2NrKTsKIAlrZnJlZShjYik7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAotc21zZ19leGl0KHZvaWQpCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgc21zZ19kcml2ZXIgPSB7CisJLm5hbWUgPSAiU01TR0lVQ1YiLAorCS5idXMgID0gJml1Y3ZfYnVzLAorfTsKKworc3RhdGljIHZvaWQgX19leGl0IHNtc2dfZXhpdCh2b2lkKQogewotCWlmIChzbXNnX2hhbmRsZSA+IDApIHsKLQkJY3BjbWQoIlNFVCBTTVNHIE9GRiIsIE5VTEwsIDAsIE5VTEwpOwotCQlpdWN2X3NldmVyKHNtc2dfcGF0aGlkLCBOVUxMKTsKLQkJaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW0oc21zZ19oYW5kbGUpOwotCQlkcml2ZXJfdW5yZWdpc3Rlcigmc21zZ19kcml2ZXIpOwotCX0KLQlyZXR1cm47CisJY3BjbWQoIlNFVCBTTVNHIElVQ1YiLCBOVUxMLCAwLCBOVUxMKTsKKwlpdWN2X3VucmVnaXN0ZXIoJnNtc2dfaGFuZGxlciwgMSk7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnNtc2dfZHJpdmVyKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQKLXNtc2dfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgc21zZ19pbml0KHZvaWQpCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgcGdtbWFza1syNF0gPSB7Ci0JCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0JCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0JCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKLQl9OwogCWludCByYzsKIAogCXJjID0gZHJpdmVyX3JlZ2lzdGVyKCZzbXNnX2RyaXZlcik7Ci0JaWYgKHJjICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTTVNHSVVDVjogZmFpbGVkIHRvIHJlZ2lzdGVyIGRyaXZlci5cbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCXNtc2dfaGFuZGxlID0gaXVjdl9yZWdpc3Rlcl9wcm9ncmFtKCJTTVNHSVVDViAgICAgICAgIiwgIipNU0cgICAgIiwKLQkJCQkJICAgIHBnbW1hc2ssICZzbXNnX29wcywgTlVMTCk7Ci0JaWYgKCFzbXNnX2hhbmRsZSkgeworCWlmIChyYyAhPSAwKQorCQlnb3RvIG91dDsKKwlyYyA9IGl1Y3ZfcmVnaXN0ZXIoJnNtc2dfaGFuZGxlciwgMSk7CisJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU01TR0lVQ1Y6IGZhaWxlZCB0byByZWdpc3RlciB0byBpdWN2Iik7Ci0JCWRyaXZlcl91bnJlZ2lzdGVyKCZzbXNnX2RyaXZlcik7Ci0JCXJldHVybiAtRUlPOwkvKiBiZXR0ZXIgZXJybm8gPyAqLworCQlyYyA9IC1FSU87CS8qIGJldHRlciBlcnJubyA/ICovCisJCWdvdG8gb3V0X2RyaXZlcjsKIAl9Ci0JcmMgPSBpdWN2X2Nvbm5lY3QgKCZzbXNnX3BhdGhpZCwgMjU1LCBOVUxMLCAiKk1TRyAgICAiLCBOVUxMLCAwLAotCQkJICAgTlVMTCwgTlVMTCwgc21zZ19oYW5kbGUsIE5VTEwpOworCXNtc2dfcGF0aCA9IGl1Y3ZfcGF0aF9hbGxvYygyNTUsIDAsIEdGUF9LRVJORUwpOworCWlmICghc21zZ19wYXRoKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfcmVnaXN0ZXI7CisJfQorCXJjID0gaXVjdl9wYXRoX2Nvbm5lY3Qoc21zZ19wYXRoLCAmc21zZ19oYW5kbGVyLCAiKk1TRyAgICAiLAorCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOwogCWlmIChyYykgewogCQlwcmludGsoS0VSTl9FUlIgIlNNU0dJVUNWOiBmYWlsZWQgdG8gY29ubmVjdCB0byAqTVNHIik7Ci0JCWl1Y3ZfdW5yZWdpc3Rlcl9wcm9ncmFtKHNtc2dfaGFuZGxlKTsKLQkJZHJpdmVyX3VucmVnaXN0ZXIoJnNtc2dfZHJpdmVyKTsKLQkJc21zZ19oYW5kbGUgPSBOVUxMOwotCQlyZXR1cm4gLUVJTzsKKwkJcmMgPSAtRUlPOwkvKiBiZXR0ZXIgZXJybm8gPyAqLworCQlnb3RvIG91dF9mcmVlOwogCX0KIAljcGNtZCgiU0VUIFNNU0cgSVVDViIsIE5VTEwsIDAsIE5VTEwpOwogCXJldHVybiAwOworCitvdXRfZnJlZToKKwlpdWN2X3BhdGhfZnJlZShzbXNnX3BhdGgpOworb3V0X3JlZ2lzdGVyOgorCWl1Y3ZfdW5yZWdpc3Rlcigmc21zZ19oYW5kbGVyLCAxKTsKK291dF9kcml2ZXI6CisJZHJpdmVyX3VucmVnaXN0ZXIoJnNtc2dfZHJpdmVyKTsKK291dDoKKwlyZXR1cm4gcmM7CiB9CiAKIG1vZHVsZV9pbml0KHNtc2dfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSNTNDOXguYyBiL2RyaXZlcnMvc2NzaS9OQ1I1M0M5eC5jCmluZGV4IDNjOTEyZWUuLjhiNTMzNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9OQ1I1M0M5eC5jCisrKyBiL2RyaXZlcnMvc2NzaS9OQ1I1M0M5eC5jCkBAIC01MjgsMTIgKzUyOCwxNiBAQAogLyogQWxsb2NhdGUgc3RydWN0dXJlIGFuZCBpbnNlcnQgYmFzaWMgZGF0YSBzdWNoIGFzIFNDU0kgY2hpcCBmcmVxdWVuY3kKICAqIGRhdGEgYW5kIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlCiAgKi8KLXN0cnVjdCBOQ1JfRVNQKiBlc3BfYWxsb2NhdGUoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCwgdm9pZCAqZXNwX2RldikKK3N0cnVjdCBOQ1JfRVNQKiBlc3BfYWxsb2NhdGUoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCwgdm9pZCAqZXNwX2RldiwKKwkJCSAgICAgaW50IGhvdHBsdWcpCiB7CiAJc3RydWN0IE5DUl9FU1AgKmVzcCwgKmVsaW5rOwogCXN0cnVjdCBTY3NpX0hvc3QgKmVzcF9ob3N0OwogCi0JZXNwX2hvc3QgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgTkNSX0VTUCkpOworCWlmIChob3RwbHVnKQorCQllc3BfaG9zdCA9IHNjc2lfaG9zdF9hbGxvYyh0cG50LCBzaXplb2Yoc3RydWN0IE5DUl9FU1ApKTsKKwllbHNlCisJCWVzcF9ob3N0ID0gc2NzaV9yZWdpc3Rlcih0cG50LCBzaXplb2Yoc3RydWN0IE5DUl9FU1ApKTsKIAlpZighZXNwX2hvc3QpCiAJCXBhbmljKCJDYW5ub3QgcmVnaXN0ZXIgRVNQIFNDU0kgaG9zdCIpOwogCWVzcCA9IChzdHJ1Y3QgTkNSX0VTUCAqKSBlc3BfaG9zdC0+aG9zdGRhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSNTNDOXguaCBiL2RyaXZlcnMvc2NzaS9OQ1I1M0M5eC5oCmluZGV4IDUyMWUzZjguLmQ4NWNiNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9OQ1I1M0M5eC5oCisrKyBiL2RyaXZlcnMvc2NzaS9OQ1I1M0M5eC5oCkBAIC02NTIsNyArNjUyLDcgQEAKIAogLyogRXh0ZXJuYWwgZnVuY3Rpb25zICovCiBleHRlcm4gdm9pZCBlc3BfYm9vdHVwX3Jlc2V0KHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpOwotZXh0ZXJuIHN0cnVjdCBOQ1JfRVNQICplc3BfYWxsb2NhdGUoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqLCB2b2lkICopOworZXh0ZXJuIHN0cnVjdCBOQ1JfRVNQICplc3BfYWxsb2NhdGUoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqLCB2b2lkICosIGludCk7CiBleHRlcm4gdm9pZCBlc3BfZGVhbGxvY2F0ZShzdHJ1Y3QgTkNSX0VTUCAqKTsKIGV4dGVybiB2b2lkIGVzcF9yZWxlYXNlKHZvaWQpOwogZXh0ZXJuIHZvaWQgZXNwX2luaXRpYWxpemUoc3RydWN0IE5DUl9FU1AgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmx6MTIzMC5jIGIvZHJpdmVycy9zY3NpL2JsejEyMzAuYwppbmRleCAzMjlhOGYyLi4yM2Y3YzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmx6MTIzMC5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibHoxMjMwLmMKQEAgLTEyMSw3ICsxMjEsOCBAQAogCQkgKi8KIAkJYWRkcmVzcyA9IFpUV09fVkFERFIoYm9hcmQpOwogCQllcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikoYWRkcmVzcyArIFJFQUxfQkxaMTIzMF9FU1BfQUREUik7Ci0JCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKWJvYXJkK1JFQUxfQkxaMTIzMF9FU1BfQUREUik7CisJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKWJvYXJkICsgUkVBTF9CTFoxMjMwX0VTUF9BRERSLAorCQkJCSAgIDApOwogCiAJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzEsIChFU1BfQ09ORklHMV9QRU5BQkxFIHwgNykpOwogCQl1ZGVsYXkoNSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmx6MjA2MC5jIGIvZHJpdmVycy9zY3NpL2JsejIwNjAuYwppbmRleCBiNmMxMzdiLi5iNjIwM2VjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmx6MjA2MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibHoyMDYwLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCSAgICB1bnNpZ25lZCBsb25nIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CiAJICAgIGlmIChyZXF1ZXN0X21lbV9yZWdpb24oYm9hcmQrQkxaMjA2MF9FU1BfQUREUiwKIAkJCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSwgIk5DUjUzQzl4IikpIHsKLQkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopYm9hcmQrQkxaMjA2MF9FU1BfQUREUik7CisJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKWJvYXJkICsgQkxaMjA2MF9FU1BfQUREUiwgMCk7CiAKIAkJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIHByb2dyYW1tZWQgSS9PICovCiAJCWVzcC0+ZG9fcGlvX2NtZHMgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N5YmVyc3Rvcm0uYyBiL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtLmMKaW5kZXggN2M3Y2ZiNS4uYzZiOThhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2N5YmVyc3Rvcm0uYworKysgYi9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybS5jCkBAIC0xMjYsNyArMTI2LDcgQEAKIAkJCQkJICAgc2l6ZW9mKHN0cnVjdCBFU1BfcmVncykpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopYm9hcmQrQ1lCRVJfRVNQX0FERFIpOworCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKilib2FyZCArIENZQkVSX0VTUF9BRERSLCAwKTsKIAogCQkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggcHJvZ3JhbW1lZCBJL08gKi8KIAkJZXNwLT5kb19waW9fY21kcyA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybUlJLmMgYi9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybUlJLmMKaW5kZXggZDg4Y2I5Yy4uZTMzNmU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2N5YmVyc3Rvcm1JSS5jCisrKyBiL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtSUkuYwpAQCAtOTgsNyArOTgsNyBAQAogCQlhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpWlRXT19WQUREUihib2FyZCk7CiAJCWVyZWdzID0gKHN0cnVjdCBFU1BfcmVncyAqKShhZGRyZXNzICsgQ1lCRVJJSV9FU1BfQUREUik7CiAKLQkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopYm9hcmQrQ1lCRVJJSV9FU1BfQUREUik7CisJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKWJvYXJkICsgQ1lCRVJJSV9FU1BfQUREUiwgMCk7CiAKIAkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMSwgKEVTUF9DT05GSUcxX1BFTkFCTEUgfCA3KSk7CiAJCXVkZWxheSg1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kZWNfZXNwLmMgYi9kcml2ZXJzL3Njc2kvZGVjX2VzcC5jCmluZGV4IGMyOWNjYmMuLmQ0MmFkNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kZWNfZXNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2RlY19lc3AuYwpAQCAtMTgsNyArMTgsNyBAQAogICogMjAwMDEwMDUJLSBJbml0aWFsaXphdGlvbiBmaXhlcyBmb3IgMi40LjAtdGVzdDkKICAqIAkJCSAgRmxvcmlhbiBMb2hvZmYgPGZsb0ByZmM4MjIub3JnPgogICoKLSAqCUNvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSAgTWFjaWVqIFcuIFJvenlja2kKKyAqCUNvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiAgTWFjaWVqIFcuIFJvenlja2kKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjLmg+CiAKICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtNDIsNyArNDMsNiBAQAogI2luY2x1ZGUgPGFzbS9kZWMvaW9hc2ljX2ludHMuaD4KICNpbmNsdWRlIDxhc20vZGVjL21hY2h0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL2RlYy9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vZGVjL3RjLmg+CiAKICNkZWZpbmUgREVDX1NDU0lfU1JFRyAwCiAjZGVmaW5lIERFQ19TQ1NJX0RNQVJFRyAweDQwMDAwCkBAIC05OCw1MSArOTgsMzMgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzY3NpX2RtYV9lcnJfaW50KGludCwgdm9pZCAqKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBzY3NpX2RtYV9pbnQoaW50LCB2b2lkICopOwogCi1zdGF0aWMgaW50IGRlY19lc3BfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKiB0cG50KTsKLQotc3RhdGljIGludCBkZWNfZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCi17Ci0JaWYgKHNob3N0LT5pcnEpCi0JCWZyZWVfaXJxKHNob3N0LT5pcnEsIE5VTEwpOwotCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQotCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7Ci0Jc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0gewotCS5wcm9jX25hbWUJCT0gImRlY19lc3AiLAotCS5wcm9jX2luZm8JCT0gZXNwX3Byb2NfaW5mbywKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRlY19lc3BfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCQk9ICJOQ1I1M0M5NCIsCi0JLmRldGVjdAkJCT0gZGVjX2VzcF9kZXRlY3QsCi0JLnNsYXZlX2FsbG9jCQk9IGVzcF9zbGF2ZV9hbGxvYywKLQkuc2xhdmVfZGVzdHJveQkJPSBlc3Bfc2xhdmVfZGVzdHJveSwKLQkucmVsZWFzZQkJPSBkZWNfZXNwX3JlbGVhc2UsCiAJLmluZm8JCQk9IGVzcF9pbmZvLAogCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAogCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAogCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKKwkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAorCS5wcm9jX2luZm8JCT0gZXNwX3Byb2NfaW5mbywKKwkucHJvY19uYW1lCQk9ICJkZWNfZXNwIiwKIAkuY2FuX3F1ZXVlCQk9IDcsCi0JLnRoaXNfaWQJCT0gNywKIAkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKIAkuY21kX3Blcl9sdW4JCT0gMSwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAogfTsKIAotCi0jaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKK3N0YXRpYyBzdHJ1Y3QgTkNSX0VTUCAqZGVjX2VzcF9wbGF0Zm9ybTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldGVjdGlvbiAqLwotc3RhdGljIGludCBkZWNfZXNwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCkKK3N0YXRpYyBpbnQgZGVjX2VzcF9wbGF0Zm9ybV9wcm9iZSh2b2lkKQogewogCXN0cnVjdCBOQ1JfRVNQICplc3A7Ci0Jc3RydWN0IENvbmZpZ0RldiAqZXNwX2RldjsKLQlpbnQgc2xvdDsKLQl1bnNpZ25lZCBsb25nIG1lbV9zdGFydDsKKwlpbnQgZXJyID0gMDsKIAogCWlmIChJT0FTSUMpIHsKLQkJZXNwX2RldiA9IDA7Ci0JCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKSBlc3BfZGV2KTsKKwkJZXNwID0gZXNwX2FsbG9jYXRlKCZkZWNfZXNwX3RlbXBsYXRlLCBOVUxMLCAxKTsKIAogCQkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggcHJvZ3JhbW1lZCBJL08gKi8KIAkJZXNwLT5kb19waW9fY21kcyA9IDE7CkBAIC0yMDAsMTEyICsxODIsMTc1IEBACiAJCS8qIENoZWNrIGZvciBkaWZmZXJlbnRpYWwgU0NTSS1idXMgKi8KIAkJZXNwLT5kaWZmID0gMDsKIAorCQllcnIgPSByZXF1ZXN0X2lycShlc3AtPmlycSwgZXNwX2ludHIsIElSUUZfRElTQUJMRUQsCisJCQkJICAibmNyNTNjOTQiLCBlc3AtPmVob3N0KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX2FsbG9jOworCQllcnIgPSByZXF1ZXN0X2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX01FUlJdLAorCQkJCSAgc2NzaV9kbWFfbWVycl9pbnQsIElSUUZfRElTQUJMRUQsCisJCQkJICAibmNyNTNjOTQgZXJyb3IiLCBlc3AtPmVob3N0KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX2lycTsKKwkJZXJyID0gcmVxdWVzdF9pcnEoZGVjX2ludGVycnVwdFtERUNfSVJRX0FTQ19FUlJdLAorCQkJCSAgc2NzaV9kbWFfZXJyX2ludCwgSVJRRl9ESVNBQkxFRCwKKwkJCQkgICJuY3I1M2M5NCBvdmVycnVuIiwgZXNwLT5laG9zdCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9pcnFfbWVycjsKKwkJZXJyID0gcmVxdWVzdF9pcnEoZGVjX2ludGVycnVwdFtERUNfSVJRX0FTQ19ETUFdLCBzY3NpX2RtYV9pbnQsCisJCQkJICBJUlFGX0RJU0FCTEVELCAibmNyNTNjOTQgZG1hIiwgZXNwLT5laG9zdCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9pcnFfZXJyOworCiAJCWVzcF9pbml0aWFsaXplKGVzcCk7CiAKLQkJaWYgKHJlcXVlc3RfaXJxKGVzcC0+aXJxLCBlc3BfaW50ciwgSVJRRl9ESVNBQkxFRCwKLQkJCQkibmNyNTNjOTQiLCBlc3AtPmVob3N0KSkKLQkJCWdvdG8gZXJyX2RlYWxsb2M7Ci0JCWlmIChyZXF1ZXN0X2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX01FUlJdLAotCQkJCXNjc2lfZG1hX21lcnJfaW50LCBJUlFGX0RJU0FCTEVELAotCQkJCSJuY3I1M2M5NCBlcnJvciIsIGVzcC0+ZWhvc3QpKQotCQkJZ290byBlcnJfZnJlZV9pcnE7Ci0JCWlmIChyZXF1ZXN0X2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX0VSUl0sCi0JCQkJc2NzaV9kbWFfZXJyX2ludCwgSVJRRl9ESVNBQkxFRCwKLQkJCQkibmNyNTNjOTQgb3ZlcnJ1biIsIGVzcC0+ZWhvc3QpKQotCQkJZ290byBlcnJfZnJlZV9pcnFfbWVycjsKLQkJaWYgKHJlcXVlc3RfaXJxKGRlY19pbnRlcnJ1cHRbREVDX0lSUV9BU0NfRE1BXSwKLQkJCQlzY3NpX2RtYV9pbnQsIElSUUZfRElTQUJMRUQsCi0JCQkJIm5jcjUzYzk0IGRtYSIsIGVzcC0+ZWhvc3QpKQotCQkJZ290byBlcnJfZnJlZV9pcnFfZXJyOwotCi0JfQotCi0JaWYgKFRVUkJPQ0hBTk5FTCkgewotCQl3aGlsZSAoKHNsb3QgPSBzZWFyY2hfdGNfY2FyZCgiUE1BWi1BQSIpKSA+PSAwKSB7Ci0JCQljbGFpbV90Y19jYXJkKHNsb3QpOwotCi0JCQllc3BfZGV2ID0gMDsKLQkJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKSBlc3BfZGV2KTsKLQotCQkJbWVtX3N0YXJ0ID0gZ2V0X3RjX2Jhc2VfYWRkcihzbG90KTsKLQotCQkJLyogU3RvcmUgYmFzZSBhZGRyIGludG8gZXNwIHN0cnVjdCAqLwotCQkJZXNwLT5zbG90ID0gQ1BIWVNBRERSKG1lbV9zdGFydCk7Ci0KLQkJCWVzcC0+ZHJlZ3MgPSAwOwotCQkJZXNwLT5lcmVncyA9ICh2b2lkICopQ0tTRUcxQUREUihtZW1fc3RhcnQgKwotCQkJCQkJCURFQ19TQ1NJX1NSRUcpOwotCQkJZXNwLT5kb19waW9fY21kcyA9IDE7Ci0KLQkJCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KLQkJCWVzcC0+ZXNwX2NvbW1hbmQgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBwbWF6X2NtZF9idWZmZXI7Ci0KLQkJCS8qIGdldCB2aXJ0dWFsIGRtYSBhZGRyZXNzIGZvciBjb21tYW5kIGJ1ZmZlciAqLwotCQkJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gdmlydF90b19waHlzKHBtYXpfY21kX2J1ZmZlcik7Ci0KLQkJCWVzcC0+Y2ZyZXEgPSBnZXRfdGNfc3BlZWQoKTsKLQotCQkJZXNwLT5pcnEgPSBnZXRfdGNfaXJxX25yKHNsb3QpOwotCi0JCQkvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KLQkJCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7Ci0JCQllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKLQkJCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7Ci0JCQllc3AtPmRtYV9pbml0X3JlYWQgPSAmcG1hel9kbWFfaW5pdF9yZWFkOwotCQkJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZwbWF6X2RtYV9pbml0X3dyaXRlOwotCQkJZXNwLT5kbWFfaW50c19vZmYgPSAmcG1hel9kbWFfaW50c19vZmY7Ci0JCQllc3AtPmRtYV9pbnRzX29uID0gJnBtYXpfZG1hX2ludHNfb247Ci0JCQllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7Ci0JCQllc3AtPmRtYV9wb3J0c19wID0gJmRtYV9wb3J0c19wOwotCQkJZXNwLT5kbWFfc2V0dXAgPSAmcG1hel9kbWFfc2V0dXA7Ci0KLQkJCS8qIE9wdGlvbmFsIGZ1bmN0aW9ucyAqLwotCQkJZXNwLT5kbWFfYmFycmllciA9IDA7Ci0JCQllc3AtPmRtYV9kcmFpbiA9ICZwbWF6X2RtYV9kcmFpbjsKLQkJCWVzcC0+ZG1hX2ludmFsaWRhdGUgPSAwOwotCQkJZXNwLT5kbWFfaXJxX2VudHJ5ID0gMDsKLQkJCWVzcC0+ZG1hX2lycV9leGl0ID0gMDsKLQkJCWVzcC0+ZG1hX3BvbGwgPSAwOwotCQkJZXNwLT5kbWFfcmVzZXQgPSAwOwotCQkJZXNwLT5kbWFfbGVkX29mZiA9IDA7Ci0JCQllc3AtPmRtYV9sZWRfb24gPSAwOwotCi0JCQllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfb25lID0gcG1hel9kbWFfbW11X2dldF9zY3NpX29uZTsKLQkJCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9zZ2wgPSAwOwotCQkJZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmUgPSAwOwotCQkJZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wgPSAwOwotCQkJZXNwLT5kbWFfYWR2YW5jZV9zZyA9IDA7Ci0KLSAJCQlpZiAocmVxdWVzdF9pcnEoZXNwLT5pcnEsIGVzcF9pbnRyLCBJUlFGX0RJU0FCTEVELAotIAkJCQkJICJQTUFaX0FBIiwgZXNwLT5laG9zdCkpIHsKLSAJCQkJZXNwX2RlYWxsb2NhdGUoZXNwKTsKLSAJCQkJcmVsZWFzZV90Y19jYXJkKHNsb3QpOwotIAkJCQljb250aW51ZTsKLSAJCQl9Ci0JCQllc3AtPnNjc2lfaWQgPSA3OwotCQkJZXNwLT5kaWZmID0gMDsKLQkJCWVzcF9pbml0aWFsaXplKGVzcCk7CisJCWVyciA9IHNjc2lfYWRkX2hvc3QoZXNwLT5laG9zdCwgTlVMTCk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVNQOiBVbmFibGUgdG8gcmVnaXN0ZXIgYWRhcHRlclxuIik7CisJCQlnb3RvIGVycl9pcnFfZG1hOwogCQl9CisKKwkJc2NzaV9zY2FuX2hvc3QoZXNwLT5laG9zdCk7CisKKwkJZGVjX2VzcF9wbGF0Zm9ybSA9IGVzcDsKIAl9CiAKLQlpZihuZXNwcykgewotCQlwcmludGsoIkVTUDogVG90YWwgb2YgJWQgRVNQIGhvc3RzIGZvdW5kLCAlZCBhY3R1YWxseSBpbiB1c2UuXG4iLCBuZXNwcywgZXNwc19pbl91c2UpOwotCQllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKLQkJcmV0dXJuIGVzcHNfaW5fdXNlOwotCX0KIAlyZXR1cm4gMDsKIAotZXJyX2ZyZWVfaXJxX2VycjoKLQlmcmVlX2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX0VSUl0sIHNjc2lfZG1hX2Vycl9pbnQpOwotZXJyX2ZyZWVfaXJxX21lcnI6Ci0JZnJlZV9pcnEoZGVjX2ludGVycnVwdFtERUNfSVJRX0FTQ19NRVJSXSwgc2NzaV9kbWFfbWVycl9pbnQpOwotZXJyX2ZyZWVfaXJxOgotCWZyZWVfaXJxKGVzcC0+aXJxLCBlc3BfaW50cik7Ci1lcnJfZGVhbGxvYzoKK2Vycl9pcnFfZG1hOgorCWZyZWVfaXJxKGRlY19pbnRlcnJ1cHRbREVDX0lSUV9BU0NfRE1BXSwgZXNwLT5laG9zdCk7CitlcnJfaXJxX2VycjoKKwlmcmVlX2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX0VSUl0sIGVzcC0+ZWhvc3QpOworZXJyX2lycV9tZXJyOgorCWZyZWVfaXJxKGRlY19pbnRlcnJ1cHRbREVDX0lSUV9BU0NfTUVSUl0sIGVzcC0+ZWhvc3QpOworZXJyX2lycToKKwlmcmVlX2lycShlc3AtPmlycSwgZXNwLT5laG9zdCk7CitlcnJfYWxsb2M6CiAJZXNwX2RlYWxsb2NhdGUoZXNwKTsKLQlyZXR1cm4gMDsKKwlzY3NpX2hvc3RfcHV0KGVzcC0+ZWhvc3QpOworCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IGRlY19lc3BfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBOQ1JfRVNQICplc3A7CisJcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCBsZW47CisJaW50IGVycjsKKworCWVzcCA9IGVzcF9hbGxvY2F0ZSgmZGVjX2VzcF90ZW1wbGF0ZSwgIE5VTEwsIDEpOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgZXNwKTsKKworCXN0YXJ0ID0gdG9fdGNfZGV2KGRldiktPnJlc291cmNlLnN0YXJ0OworCWxlbiA9IHRvX3RjX2RldihkZXYpLT5yZXNvdXJjZS5lbmQgLSBzdGFydCArIDE7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCwgbGVuLCBkZXYtPmJ1c19pZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHJlc2VydmUgTU1JTyByZXNvdXJjZVxuIiwKKwkJICAgICAgIGRldi0+YnVzX2lkKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGVycl9hbGxvYzsKKwl9CisKKwkvKiBTdG9yZSBiYXNlIGFkZHIgaW50byBlc3Agc3RydWN0LiAgKi8KKwllc3AtPnNsb3QgPSBzdGFydDsKKworCWVzcC0+ZHJlZ3MgPSAwOworCWVzcC0+ZXJlZ3MgPSAodm9pZCAqKUNLU0VHMUFERFIoc3RhcnQgKyBERUNfU0NTSV9TUkVHKTsKKwllc3AtPmRvX3Bpb19jbWRzID0gMTsKKworCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIuICAqLworCWVzcC0+ZXNwX2NvbW1hbmQgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBtYXpfY21kX2J1ZmZlcjsKKworCS8qIEdldCB2aXJ0dWFsIGRtYSBhZGRyZXNzIGZvciBjb21tYW5kIGJ1ZmZlci4gICovCisJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gdmlydF90b19waHlzKHBtYXpfY21kX2J1ZmZlcik7CisKKwllc3AtPmNmcmVxID0gdGNfZ2V0X3NwZWVkKHRvX3RjX2RldihkZXYpLT5idXMpOworCisJZXNwLT5pcnEgPSB0b190Y19kZXYoZGV2KS0+aW50ZXJydXB0OworCisJLyogUmVxdWlyZWQgZnVuY3Rpb25zLiAgKi8KKwllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OworCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOworCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7CisJZXNwLT5kbWFfaW5pdF9yZWFkID0gJnBtYXpfZG1hX2luaXRfcmVhZDsKKwllc3AtPmRtYV9pbml0X3dyaXRlID0gJnBtYXpfZG1hX2luaXRfd3JpdGU7CisJZXNwLT5kbWFfaW50c19vZmYgPSAmcG1hel9kbWFfaW50c19vZmY7CisJZXNwLT5kbWFfaW50c19vbiA9ICZwbWF6X2RtYV9pbnRzX29uOworCWVzcC0+ZG1hX2lycV9wID0gJmRtYV9pcnFfcDsKKwllc3AtPmRtYV9wb3J0c19wID0gJmRtYV9wb3J0c19wOworCWVzcC0+ZG1hX3NldHVwID0gJnBtYXpfZG1hX3NldHVwOworCisJLyogT3B0aW9uYWwgZnVuY3Rpb25zLiAgKi8KKwllc3AtPmRtYV9iYXJyaWVyID0gMDsKKwllc3AtPmRtYV9kcmFpbiA9ICZwbWF6X2RtYV9kcmFpbjsKKwllc3AtPmRtYV9pbnZhbGlkYXRlID0gMDsKKwllc3AtPmRtYV9pcnFfZW50cnkgPSAwOworCWVzcC0+ZG1hX2lycV9leGl0ID0gMDsKKwllc3AtPmRtYV9wb2xsID0gMDsKKwllc3AtPmRtYV9yZXNldCA9IDA7CisJZXNwLT5kbWFfbGVkX29mZiA9IDA7CisJZXNwLT5kbWFfbGVkX29uID0gMDsKKworCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9vbmUgPSBwbWF6X2RtYV9tbXVfZ2V0X3Njc2lfb25lOworCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9zZ2wgPSAwOworCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lID0gMDsKKwllc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbCA9IDA7CisJZXNwLT5kbWFfYWR2YW5jZV9zZyA9IDA7CisKKwllcnIgPSByZXF1ZXN0X2lycShlc3AtPmlycSwgZXNwX2ludHIsIElSUUZfRElTQUJMRUQsICJQTUFaX0FBIiwKKwkJCSAgZXNwLT5laG9zdCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IElSUSAlZFxuIiwKKwkJICAgICAgIGRldi0+YnVzX2lkLCBlc3AtPmlycSk7CisJCWdvdG8gZXJyX3Jlc291cmNlOworCX0KKworCWVzcC0+c2NzaV9pZCA9IDc7CisJZXNwLT5kaWZmID0gMDsKKwllc3BfaW5pdGlhbGl6ZShlc3ApOworCisJZXJyID0gc2NzaV9hZGRfaG9zdChlc3AtPmVob3N0LCBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIGFkYXB0ZXJcbiIsCisJCSAgICAgICBkZXYtPmJ1c19pZCk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisKKwlzY3NpX3NjYW5faG9zdChlc3AtPmVob3N0KTsKKworCXJldHVybiAwOworCitlcnJfaXJxOgorCWZyZWVfaXJxKGVzcC0+aXJxLCBlc3AtPmVob3N0KTsKKworZXJyX3Jlc291cmNlOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihzdGFydCwgbGVuKTsKKworZXJyX2FsbG9jOgorCWVzcF9kZWFsbG9jYXRlKGVzcCk7CisJc2NzaV9ob3N0X3B1dChlc3AtPmVob3N0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGVjX2VzcF9wbGF0Zm9ybV9yZW1vdmUodm9pZCkKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZXNwID0gZGVjX2VzcF9wbGF0Zm9ybTsKKworCWZyZWVfaXJxKGVzcC0+aXJxLCBlc3AtPmVob3N0KTsKKwllc3BfZGVhbGxvY2F0ZShlc3ApOworCXNjc2lfaG9zdF9wdXQoZXNwLT5laG9zdCk7CisJZGVjX2VzcF9wbGF0Zm9ybSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZWNfZXNwX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJZnJlZV9pcnEoZXNwLT5pcnEsIGVzcC0+ZWhvc3QpOworCWVzcF9kZWFsbG9jYXRlKGVzcCk7CisJc2NzaV9ob3N0X3B1dChlc3AtPmVob3N0KTsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgRnVuY3Rpb25zICovCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9kbWFfbWVycl9pbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewpAQCAtNTc2LDMgKzYyMSw2NyBAQAogewogCXNwLT5TQ3AucHRyID0gKGNoYXIgKil2aXJ0X3RvX3BoeXMoc3AtPnJlcXVlc3RfYnVmZmVyKTsKIH0KKworCisjaWZkZWYgQ09ORklHX1RDCitzdGF0aWMgaW50IF9faW5pdCBkZWNfZXNwX3RjX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgaW50IF9fZXhpdCBkZWNfZXNwX3RjX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRjX2RldmljZV9pZCBkZWNfZXNwX3RjX3RhYmxlW10gPSB7CisgICAgICAgIHsgIkRFQyAgICAgIiwgIlBNQVotQUEgIiB9LAorICAgICAgICB7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHRjLCBkZWNfZXNwX3RjX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCB0Y19kcml2ZXIgZGVjX2VzcF90Y19kcml2ZXIgPSB7CisgICAgICAgIC5pZF90YWJsZSAgICAgICA9IGRlY19lc3BfdGNfdGFibGUsCisgICAgICAgIC5kcml2ZXIgICAgICAgICA9IHsKKyAgICAgICAgICAgICAgICAubmFtZSAgID0gImRlY19lc3AiLAorICAgICAgICAgICAgICAgIC5idXMgICAgPSAmdGNfYnVzX3R5cGUsCisgICAgICAgICAgICAgICAgLnByb2JlICA9IGRlY19lc3BfdGNfcHJvYmUsCisgICAgICAgICAgICAgICAgLnJlbW92ZSA9IF9fZXhpdF9wKGRlY19lc3BfdGNfcmVtb3ZlKSwKKyAgICAgICAgfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRlY19lc3BfdGNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBzdGF0dXMgPSBkZWNfZXNwX3Byb2JlKGRldik7CisJaWYgKCFzdGF0dXMpCisJCWdldF9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBkZWNfZXNwX3RjX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcHV0X2RldmljZShkZXYpOworCWRlY19lc3BfcmVtb3ZlKGRldik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgZGVjX2VzcF9pbml0KHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHRjX3JlZ2lzdGVyX2RyaXZlcigmZGVjX2VzcF90Y19kcml2ZXIpOworCWlmICghc3RhdHVzKQorCQlkZWNfZXNwX3BsYXRmb3JtX3Byb2JlKCk7CisKKwlpZiAobmVzcHMpIHsKKwkJcHJfaW5mbygiRVNQOiBUb3RhbCBvZiAlZCBFU1AgaG9zdHMgZm91bmQsICIKKwkJCSIlZCBhY3R1YWxseSBpbiB1c2UuXG4iLCBuZXNwcywgZXNwc19pbl91c2UpOworCQllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGVjX2VzcF9leGl0KHZvaWQpCit7CisJZGVjX2VzcF9wbGF0Zm9ybV9yZW1vdmUoKTsKKwl0Y191bnJlZ2lzdGVyX2RyaXZlcigmZGVjX2VzcF90Y19kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KGRlY19lc3BfaW5pdCk7Cittb2R1bGVfZXhpdChkZWNfZXNwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zhc3RsYW5lLmMgYi9kcml2ZXJzL3Njc2kvZmFzdGxhbmUuYwppbmRleCAyYTFjNWMyLi40MjY2YTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZmFzdGxhbmUuYworKysgYi9kcml2ZXJzL3Njc2kvZmFzdGxhbmUuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJCWlmIChib2FyZCA8IDB4MTAwMDAwMCkgewogCQkJZ290byBlcnJfcmVsZWFzZTsKIAkJfQotCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKilib2FyZCtGQVNUTEFORV9FU1BfQUREUik7CisJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKWJvYXJkICsgRkFTVExBTkVfRVNQX0FERFIsIDApOwogCiAJCS8qIERvIGNvbW1hbmQgdHJhbnNmZXIgd2l0aCBwcm9ncmFtbWVkIEkvTyAqLwogCQllc3AtPmRvX3Bpb19jbWRzID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwppbmRleCA0Mzc2ODQwLi44ZjU1ZTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCkBAIC0xMzc1LDcgKzEzNzUsNyBAQAogCX0KIAogCUJVR19PTih0Y3BfbXRhc2stPnhtc3RhdGUgIT0gWE1TVEFURV9JRExFKTsKLQlpZiAobXRhc2stPmhkci0+aXR0ID09IGNwdV90b19iZTMyKElTQ1NJX1JFU0VSVkVEX1RBRykpIHsKKwlpZiAobXRhc2stPmhkci0+aXR0ID09IFJFU0VSVkVEX0lUVCkgewogCQlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CiAKIAkJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9qYXp6X2VzcC5jIGIvZHJpdmVycy9zY3NpL2phenpfZXNwLmMKaW5kZXggYmZhYzQ0NC4uMTlkZDRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2phenpfZXNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2phenpfZXNwLmMKQEAgLTc1LDcgKzc1LDcgQEAKICAgICAgKi8KICAgICBpZiAoMSkgewogCWVzcF9kZXYgPSBOVUxMOwotCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKSBlc3BfZGV2KTsKKwllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgZXNwX2RldiwgMCk7CiAJCiAJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIHByb2dyYW1tZWQgSS9PICovCiAJZXNwLT5kb19waW9fY21kcyA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCmluZGV4IGQzNzA0OGMuLjdjNzU3NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCkBAIC0xMTMsOCArMTEzLDcgQEAKICAgICAgICAgaGRyLT5vcGNvZGUgPSBJU0NTSV9PUF9TQ1NJX0NNRDsKICAgICAgICAgaGRyLT5mbGFncyA9IElTQ1NJX0FUVFJfU0lNUExFOwogICAgICAgICBpbnRfdG9fc2NzaWx1bihzYy0+ZGV2aWNlLT5sdW4sIChzdHJ1Y3Qgc2NzaV9sdW4gKiloZHItPmx1bik7Ci0gICAgICAgIGhkci0+aXR0ID0gY3Rhc2stPml0dCB8IChjb25uLT5pZCA8PCBJU0NTSV9DSURfU0hJRlQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbi0+YWdlIDw8IElTQ1NJX0FHRV9TSElGVCk7CisgICAgICAgIGhkci0+aXR0ID0gYnVpbGRfaXR0KGN0YXNrLT5pdHQsIGNvbm4tPmlkLCBzZXNzaW9uLT5hZ2UpOwogICAgICAgICBoZHItPmRhdGFfbGVuZ3RoID0gY3B1X3RvX2JlMzIoc2MtPnJlcXVlc3RfYnVmZmxlbik7CiAgICAgICAgIGhkci0+Y21kc24gPSBjcHVfdG9fYmUzMihzZXNzaW9uLT5jbWRzbik7CiAgICAgICAgIHNlc3Npb24tPmNtZHNuKys7CkBAIC0yNzAsNyArMjY5LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJc2Vuc2VsZW4gPSBiZTE2X3RvX2NwdSgqKHVpbnQxNl90ICopZGF0YSk7CisJCXNlbnNlbGVuID0gYmUxNl90b19jcHUoKihfX2JlMTYgKilkYXRhKTsKIAkJaWYgKGRhdGFsZW4gPCBzZW5zZWxlbikKIAkJCWdvdG8gaW52YWxpZF9kYXRhbGVuOwogCkBAIC0zMzgsNyArMzM3LDcgQEAKIAogCQlpZiAobnRvaDI0KHJlamVjdC0+ZGxlbmd0aCkgPj0gc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpKSB7CiAJCQltZW1jcHkoJnJlamVjdGVkX3BkdSwgZGF0YSwgc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpKTsKLQkJCWl0dCA9IHJlamVjdGVkX3BkdS5pdHQgJiBJU0NTSV9JVFRfTUFTSzsKKwkJCWl0dCA9IGdldF9pdHQocmVqZWN0ZWRfcGR1Lml0dCk7CiAJCQlwcmludGsoS0VSTl9FUlIgIml0dCAweCV4IGhhZCBwZHUgKG9wIDB4JXgpIHJlamVjdGVkICIKIAkJCQkiZHVlIHRvIERhdGFEaWdlc3QgZXJyb3IuXG4iLCBpdHQsCiAJCQkJcmVqZWN0ZWRfcGR1Lm9wY29kZSk7CkBAIC0zNjcsMTAgKzM2NiwxMCBAQAogCXN0cnVjdCBpc2NzaV9tZ210X3Rhc2sgKm10YXNrOwogCXVpbnQzMl90IGl0dDsKIAotCWlmIChoZHItPml0dCAhPSBjcHVfdG9fYmUzMihJU0NTSV9SRVNFUlZFRF9UQUcpKQotCQlpdHQgPSBoZHItPml0dCAmIElTQ1NJX0lUVF9NQVNLOworCWlmIChoZHItPml0dCAhPSBSRVNFUlZFRF9JVFQpCisJCWl0dCA9IGdldF9pdHQoaGRyLT5pdHQpOwogCWVsc2UKLQkJaXR0ID0gaGRyLT5pdHQ7CisJCWl0dCA9IH4wVTsKIAogCWlmIChpdHQgPCBzZXNzaW9uLT5jbWRzX21heCkgewogCQljdGFzayA9IHNlc3Npb24tPmNtZHNbaXR0XTsKQEAgLTQ0MCw3ICs0MzksNyBAQAogCQkJaXNjc2lfdG1mX3JzcChjb25uLCBoZHIpOwogCQkJYnJlYWs7CiAJCWNhc2UgSVNDU0lfT1BfTk9PUF9JTjoKLQkJCWlmIChoZHItPnR0dCAhPSBJU0NTSV9SRVNFUlZFRF9UQUcgfHwgZGF0YWxlbikgeworCQkJaWYgKGhkci0+dHR0ICE9IGNwdV90b19iZTMyKElTQ1NJX1JFU0VSVkVEX1RBRykgfHwgZGF0YWxlbikgewogCQkJCXJjID0gSVNDU0lfRVJSX1BST1RPOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtNDU3LDcgKzQ1Niw3IEBACiAJCQlyYyA9IElTQ1NJX0VSUl9CQURfT1BDT0RFOwogCQkJYnJlYWs7CiAJCX0KLQl9IGVsc2UgaWYgKGl0dCA9PSBJU0NTSV9SRVNFUlZFRF9UQUcpIHsKKwl9IGVsc2UgaWYgKGl0dCA9PSB+MFUpIHsKIAkJcmMgPSBpc2NzaV9jaGVja19hc3NpZ25fY21kc24oc2Vzc2lvbiwKIAkJCQkJICAgICAoc3RydWN0IGlzY3NpX25vcGluKiloZHIpOwogCQlpZiAocmMpCkBAIC00NzAsNyArNDY5LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJaWYgKGhkci0+dHR0ID09IElTQ1NJX1JFU0VSVkVEX1RBRykKKwkJCWlmIChoZHItPnR0dCA9PSBjcHVfdG9fYmUzMihJU0NTSV9SRVNFUlZFRF9UQUcpKQogCQkJCWJyZWFrOwogCiAJCQlpZiAoaXNjc2lfcmVjdl9wZHUoY29ubi0+Y2xzX2Nvbm4sIGhkciwgTlVMTCwgMCkpCkBAIC01MTYsMjQgKzUxNSwyNCBAQAogCXN0cnVjdCBpc2NzaV9jbWRfdGFzayAqY3Rhc2s7CiAJdWludDMyX3QgaXR0OwogCi0JaWYgKGhkci0+aXR0ICE9IGNwdV90b19iZTMyKElTQ1NJX1JFU0VSVkVEX1RBRykpIHsKLQkJaWYgKChoZHItPml0dCAmIElTQ1NJX0FHRV9NQVNLKSAhPQorCWlmIChoZHItPml0dCAhPSBSRVNFUlZFRF9JVFQpIHsKKwkJaWYgKCgoX19mb3JjZSB1MzIpaGRyLT5pdHQgJiBJU0NTSV9BR0VfTUFTSykgIT0KIAkJICAgIChzZXNzaW9uLT5hZ2UgPDwgSVNDU0lfQUdFX1NISUZUKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaTogcmVjZWl2ZWQgaXR0ICV4IGV4cGVjdGVkICIKLQkJCQkic2Vzc2lvbiBhZ2UgKCV4KVxuIiwgaGRyLT5pdHQsCisJCQkJInNlc3Npb24gYWdlICgleClcbiIsIChfX2ZvcmNlIHUzMiloZHItPml0dCwKIAkJCQlzZXNzaW9uLT5hZ2UgJiBJU0NTSV9BR0VfTUFTSyk7CiAJCQlyZXR1cm4gSVNDU0lfRVJSX0JBRF9JVFQ7CiAJCX0KIAotCQlpZiAoKGhkci0+aXR0ICYgSVNDU0lfQ0lEX01BU0spICE9CisJCWlmICgoKF9fZm9yY2UgdTMyKWhkci0+aXR0ICYgSVNDU0lfQ0lEX01BU0spICE9CiAJCSAgICAoY29ubi0+aWQgPDwgSVNDU0lfQ0lEX1NISUZUKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaTogcmVjZWl2ZWQgaXR0ICV4LCBleHBlY3RlZCAiCi0JCQkJIkNJRCAoJXgpXG4iLCBoZHItPml0dCwgY29ubi0+aWQpOworCQkJCSJDSUQgKCV4KVxuIiwgKF9fZm9yY2UgdTMyKWhkci0+aXR0LCBjb25uLT5pZCk7CiAJCQlyZXR1cm4gSVNDU0lfRVJSX0JBRF9JVFQ7CiAJCX0KLQkJaXR0ID0gaGRyLT5pdHQgJiBJU0NTSV9JVFRfTUFTSzsKKwkJaXR0ID0gZ2V0X2l0dChoZHItPml0dCk7CiAJfSBlbHNlCi0JCWl0dCA9IGhkci0+aXR0OworCQlpdHQgPSB+MFU7CiAKIAlpZiAoaXR0IDwgc2Vzc2lvbi0+Y21kc19tYXgpIHsKIAkJY3Rhc2sgPSBzZXNzaW9uLT5jbWRzW2l0dF07CkBAIC04OTYsOSArODk1LDggQEAKIAkvKgogCSAqIHByZS1mb3JtYXQgQ21kU04gZm9yIG91dGdvaW5nIFBEVS4KIAkgKi8KLQlpZiAoaGRyLT5pdHQgIT0gY3B1X3RvX2JlMzIoSVNDU0lfUkVTRVJWRURfVEFHKSkgewotCQloZHItPml0dCA9IG10YXNrLT5pdHQgfCAoY29ubi0+aWQgPDwgSVNDU0lfQ0lEX1NISUZUKSB8Ci0JCQkgICAoc2Vzc2lvbi0+YWdlIDw8IElTQ1NJX0FHRV9TSElGVCk7CisJaWYgKGhkci0+aXR0ICE9IFJFU0VSVkVEX0lUVCkgeworCQloZHItPml0dCA9IGJ1aWxkX2l0dChtdGFzay0+aXR0LCBjb25uLT5pZCwgc2Vzc2lvbi0+YWdlKTsKIAkJbm9wLT5jbWRzbiA9IGNwdV90b19iZTMyKHNlc3Npb24tPmNtZHNuKTsKIAkJaWYgKGNvbm4tPmNfc3RhZ2UgPT0gSVNDU0lfQ09OTl9TVEFSVEVEICYmCiAJCSAgICAhKGhkci0+b3Bjb2RlICYgSVNDU0lfT1BfSU1NRURJQVRFKSkKQEAgLTEwNjQsNyArMTA2Miw3IEBACiAKIAlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCWN0YXNrLT5tdGFzayA9IChzdHJ1Y3QgaXNjc2lfbWdtdF90YXNrICopCi0JCQlzZXNzaW9uLT5tZ210X2NtZHNbKGhkci0+aXR0ICYgSVNDU0lfSVRUX01BU0spIC0KKwkJCXNlc3Npb24tPm1nbXRfY21kc1tnZXRfaXR0KGhkci0+aXR0KSAtCiAJCQkJCUlTQ1NJX01HTVRfSVRUX09GRlNFVF07CiAKIAlpZiAoY29ubi0+dG1hYm9ydF9zdGF0ZSA9PSBUTUFCT1JUX0lOSVRJQUwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tYWNfZXNwLmMgYi9kcml2ZXJzL3Njc2kvbWFjX2VzcC5jCmluZGV4IDM1ODZmYWMuLmJjYjQ5MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tYWNfZXNwLmMKKysrIGIvZHJpdmVycy9zY3NpL21hY19lc3AuYwpAQCAtMzUxLDcgKzM1MSw3IEBACiAJZm9yIChjaGlwbnVtID0gMDsgY2hpcG51bSA8IGNoaXBzcHJlc2VudDsgY2hpcG51bSArKykgewogCQlzdHJ1Y3QgTkNSX0VTUCAqIGVzcDsKIAotCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKikgTlVMTCk7CisJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCBOVUxMLCAwKTsKIAkJZXNwLT5lcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikgZ2V0X2Jhc2UoY2hpcG51bSk7CiAKIAkJZXNwLT5kbWFfaXJxX3AgPSAmZXNwX2RhZmJfZG1hX2lycV9wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21jYV81M2M5eC5jIGIvZHJpdmVycy9zY3NpL21jYV81M2M5eC5jCmluZGV4IDk5OGE4YmIuLmQ2OTNkMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tY2FfNTNjOXguYworKysgYi9kcml2ZXJzL3Njc2kvbWNhXzUzYzl4LmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQlpZiAoKHNsb3QgPSBtY2FfZmluZF9hZGFwdGVyKCppZF90b19jaGVjaywgMCkpICE9CiAJCSAgTUNBX05PVEZPVU5EKSAKIAkJewotCQkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopIE5VTEwpOworCQkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsIE5VTEwsIDApOwogCiAJCQlwb3NbMF0gPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDIpOwogCQkJcG9zWzFdID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9va3RhZ29uX2VzcC5jIGIvZHJpdmVycy9zY3NpL29rdGFnb25fZXNwLmMKaW5kZXggYzExNmE2YS4uMjZhNmQ1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL29rdGFnb25fZXNwLmMKKysrIGIvZHJpdmVycy9zY3NpL29rdGFnb25fZXNwLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQllcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikoYWRkcmVzcyArIE9LVEFHT05fRVNQX0FERFIpOwogCiAJCS8qIFRoaXMgbGluZSB3YXMgNSBsaW5lcyBsb3dlciAqLwotCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKilib2FyZCtPS1RBR09OX0VTUF9BRERSKTsKKwkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopYm9hcmQgKyBPS1RBR09OX0VTUF9BRERSLCAwKTsKIAogCQkvKiB3ZSBoYXZlIHRvIHNoaWZ0IHRoZSByZWdpc3RlcnMgb25seSBvbmUgYml0IGZvciBva3RhZ29uICovCiAJCWVzcC0+c2hpZnQgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29zc3QuYyBiL2RyaXZlcnMvc2NzaS9vc3N0LmMKaW5kZXggN2QyMzExMC4uYmQ2YmJmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL29zc3QuYworKysgYi9kcml2ZXJzL3Njc2kvb3NzdC5jCkBAIC01MjEsMTAgKzUyMSwxMCBAQAogCQlicmVhazsKIAkgIGRlZmF1bHQ6IDsgLyogcHJvYmFibHkgRklMTCAqLwogCX0KLQlhdXgtPmZpbGVtYXJrX2NudCA9IG50b2hsKFNUcC0+ZmlsZW1hcmtfY250KTsKLQlhdXgtPnBoeXNfZm0gPSBudG9obCgweGZmZmZmZmZmKTsKLQlhdXgtPmxhc3RfbWFya19wcG9zID0gbnRvaGwoU1RwLT5sYXN0X21hcmtfcHBvcyk7Ci0JYXV4LT5sYXN0X21hcmtfbGJuICA9IG50b2hsKFNUcC0+bGFzdF9tYXJrX2xibik7CisJYXV4LT5maWxlbWFya19jbnQgPSBodG9ubChTVHAtPmZpbGVtYXJrX2NudCk7CisJYXV4LT5waHlzX2ZtID0gaHRvbmwoMHhmZmZmZmZmZik7CisJYXV4LT5sYXN0X21hcmtfcHBvcyA9IGh0b25sKFNUcC0+bGFzdF9tYXJrX3Bwb3MpOworCWF1eC0+bGFzdF9tYXJrX2xibiAgPSBodG9ubChTVHAtPmxhc3RfbWFya19sYm4pOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29zc3QuaCBiL2RyaXZlcnMvc2NzaS9vc3N0LmgKaW5kZXggMWU0MjZmNS4uMmNjN2I1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL29zc3QuaAorKysgYi9kcml2ZXJzL3Njc2kvb3NzdC5oCkBAIC0yODgsMTEgKzI4OCwxMSBAQAogI2Vsc2UKICNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKICNlbmRpZgotICAgICAgICB1MTYgICAgICAgICAgICAgbWF4X3NwZWVkOyAgICAgICAgICAgICAgLyogTWF4aW11bSBzcGVlZCBzdXBwb3J0ZWQgaW4gS0JwcyAqLworICAgICAgICBfX2JlMTYgICAgICAgICAgbWF4X3NwZWVkOyAgICAgICAgICAgICAgLyogTWF4aW11bSBzcGVlZCBzdXBwb3J0ZWQgaW4gS0JwcyAqLwogICAgICAgICB1OCAgICAgICAgICAgICAgcmVzZXJ2ZWQxMCwgcmVzZXJ2ZWQxMTsKLSAgICAgICAgdTE2ICAgICAgICAgICAgIGN0bDsgICAgICAgICAgICAgICAgICAgIC8qIENvbnRpbnVvdXMgVHJhbnNmZXIgTGltaXQgaW4gYmxvY2tzICovCi0gICAgICAgIHUxNiAgICAgICAgICAgICBzcGVlZDsgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IFNwZWVkLCBpbiBLQnBzICovCi0gICAgICAgIHUxNiAgICAgICAgICAgICBidWZmZXJfc2l6ZTsgICAgICAgICAgICAvKiBCdWZmZXIgU2l6ZSwgaW4gNTEyIGJ5dGVzICovCisgICAgICAgIF9fYmUxNiAgICAgICAgICBjdGw7ICAgICAgICAgICAgICAgICAgICAvKiBDb250aW51b3VzIFRyYW5zZmVyIExpbWl0IGluIGJsb2NrcyAqLworICAgICAgICBfX2JlMTYgICAgICAgICAgc3BlZWQ7ICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBTcGVlZCwgaW4gS0JwcyAqLworICAgICAgICBfX2JlMTYgICAgICAgICAgYnVmZmVyX3NpemU7ICAgICAgICAgICAgLyogQnVmZmVyIFNpemUsIGluIDUxMiBieXRlcyAqLwogICAgICAgICB1OCAgICAgICAgICAgICAgcmVzZXJ2ZWQxOCwgcmVzZXJ2ZWQxOTsKIH0gb3NzdF9jYXBhYmlsaXRpZXNfcGFnZV90OwogCkBAIC0zNTIsOCArMzUyLDggQEAKIAl1OAkJcmVzZXJ2ZWQyOwogCXU4CQlkZW5zaXR5OwogCXU4CQlyZXNlcnZlZDMscmVzZXJ2ZWQ0OwotCXUxNgkJc2VndHJrOwotCXUxNgkJdHJrczsKKwlfX2JlMTYJCXNlZ3RyazsKKwlfX2JlMTYJCXRya3M7CiAJdTgJCXJlc2VydmVkNSxyZXNlcnZlZDYscmVzZXJ2ZWQ3LHJlc2VydmVkOCxyZXNlcnZlZDkscmVzZXJ2ZWQxMDsKIH0gb3NzdF90YXBlX3BhcmFtdHJfcGFnZV90OwogCkBAIC0zNjksMTggKzM2OSwxOCBAQAogdHlwZWRlZiBzdHJ1Y3Qgb3NfcGFydGl0aW9uX3MgewogICAgICAgICBfX3U4ICAgIHBhcnRpdGlvbl9udW07CiAgICAgICAgIF9fdTggICAgcGFyX2Rlc2NfdmVyOwotICAgICAgICBfX3UxNiAgIHdydF9wYXNzX2NudHI7Ci0gICAgICAgIF9fdTMyICAgZmlyc3RfZnJhbWVfcHBvczsKLSAgICAgICAgX191MzIgICBsYXN0X2ZyYW1lX3Bwb3M7Ci0gICAgICAgIF9fdTMyICAgZW9kX2ZyYW1lX3Bwb3M7CisgICAgICAgIF9fYmUxNiAgd3J0X3Bhc3NfY250cjsKKyAgICAgICAgX19iZTMyICBmaXJzdF9mcmFtZV9wcG9zOworICAgICAgICBfX2JlMzIgIGxhc3RfZnJhbWVfcHBvczsKKyAgICAgICAgX19iZTMyICBlb2RfZnJhbWVfcHBvczsKIH0gb3NfcGFydGl0aW9uX3Q7CiAKIC8qCiAgKiBEQVQgZW50cnkKICAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3NfZGF0X2VudHJ5X3MgewotICAgICAgICBfX3UzMiAgIGJsa19zejsKLSAgICAgICAgX191MTYgICBibGtfY250OworICAgICAgICBfX2JlMzIgIGJsa19zejsKKyAgICAgICAgX19iZTE2ICBibGtfY250OwogICAgICAgICBfX3U4ICAgIGZsYWdzOwogICAgICAgICBfX3U4ICAgIHJlc2VydmVkOwogfSBvc19kYXRfZW50cnlfdDsKQEAgLTQxMiwyMyArNDEyLDIzIEBACiAgKiBBVVgKICAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3NfYXV4X3MgewotICAgICAgICBfX3UzMiAgICAgICAgICAgZm9ybWF0X2lkOyAgICAgICAgICAgICAgLyogaGFyZHdhcmUgY29tcGFiaWxpdHkgQVVYIGlzIGJhc2VkIG9uICovCisgICAgICAgIF9fYmUzMiAgICAgICAgICBmb3JtYXRfaWQ7ICAgICAgICAgICAgICAvKiBoYXJkd2FyZSBjb21wYWJpbGl0eSBBVVggaXMgYmFzZWQgb24gKi8KICAgICAgICAgY2hhciAgICAgICAgICAgIGFwcGxpY2F0aW9uX3NpZ1s0XTsgICAgIC8qIGRyaXZlciB1c2VkIHRvIHdyaXRlIHRoaXMgbWVkaWEgKi8KLSAgICAgICAgX191MzIgICAgICAgICAgIGhkd3I7ICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICB1cGRhdGVfZnJhbWVfY250cjsgICAgICAvKiBmb3IgY29uZmlndXJhdGlvbiBmcmFtZSAqLworICAgICAgICBfX2JlMzIgICAgICAgICAgaGR3cjsgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgX19iZTMyICAgICAgICAgIHVwZGF0ZV9mcmFtZV9jbnRyOyAgICAgIC8qIGZvciBjb25maWd1cmF0aW9uIGZyYW1lICovCiAgICAgICAgIF9fdTggICAgICAgICAgICBmcmFtZV90eXBlOwogICAgICAgICBfX3U4ICAgICAgICAgICAgZnJhbWVfdHlwZV9yZXNlcnZlZDsKICAgICAgICAgX191OCAgICAgICAgICAgIHJlc2VydmVkXzE4XzE5WzJdOwogICAgICAgICBvc19wYXJ0aXRpb25fdCAgcGFydGl0aW9uOwogICAgICAgICBfX3U4ICAgICAgICAgICAgcmVzZXJ2ZWRfMzZfNDNbOF07Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBmcmFtZV9zZXFfbnVtOwotICAgICAgICBfX3UzMiAgICAgICAgICAgbG9naWNhbF9ibGtfbnVtX2hpZ2g7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBsb2dpY2FsX2Jsa19udW07CisgICAgICAgIF9fYmUzMiAgICAgICAgICBmcmFtZV9zZXFfbnVtOworICAgICAgICBfX2JlMzIgICAgICAgICAgbG9naWNhbF9ibGtfbnVtX2hpZ2g7CisgICAgICAgIF9fYmUzMiAgICAgICAgICBsb2dpY2FsX2Jsa19udW07CiAgICAgICAgIG9zX2RhdF90ICAgICAgICBkYXQ7CiAgICAgICAgIF9fdTggICAgICAgICAgICByZXNlcnZlZDE4OF8xOTFbNF07Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBmaWxlbWFya19jbnQ7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBwaHlzX2ZtOwotICAgICAgICBfX3UzMiAgICAgICAgICAgbGFzdF9tYXJrX3Bwb3M7CisgICAgICAgIF9fYmUzMiAgICAgICAgICBmaWxlbWFya19jbnQ7CisgICAgICAgIF9fYmUzMiAgICAgICAgICBwaHlzX2ZtOworICAgICAgICBfX2JlMzIgICAgICAgICAgbGFzdF9tYXJrX3Bwb3M7CiAgICAgICAgIF9fdTggICAgICAgICAgICByZXNlcnZlZDIwNF8yMjNbMjBdOwogCiAgICAgICAgIC8qCkBAIC00MzYsOCArNDM2LDggQEAKICAgICAgICAgICoKICAgICAgICAgICogTGludXggc3BlY2lmaWMgZmllbGRzOgogICAgICAgICAgKi8KLSAgICAgICAgIF9fdTMyICAgICAgICAgIG5leHRfbWFya19wcG9zOyAgICAgICAgIC8qIHdoZW4ga25vd24sIHBvaW50cyB0byBuZXh0IG1hcmtlciAqLwotCSBfX3UzMgkJbGFzdF9tYXJrX2xibjsJCS8qIHN0b3JpbmcgbG9nX2Jsa19udW0gb2YgbGFzdCBtYXJrIGlzIGV4dGVuZHMgQURSIHNwZWMgKi8KKyAgICAgICAgIF9fYmUzMiAgICAgICAgIG5leHRfbWFya19wcG9zOyAgICAgICAgIC8qIHdoZW4ga25vd24sIHBvaW50cyB0byBuZXh0IG1hcmtlciAqLworCSBfX2JlMzIJCWxhc3RfbWFya19sYm47CQkvKiBzdG9yaW5nIGxvZ19ibGtfbnVtIG9mIGxhc3QgbWFyayBpcyBleHRlbmRzIEFEUiBzcGVjICovCiAgICAgICAgICBfX3U4ICAgICAgICAgICBsaW51eF9zcGVjaWZpY1syNF07CiAKICAgICAgICAgX191OCAgICAgICAgICAgIHJlc2VydmVkXzI1Nl81MTFbMjU2XTsKQEAgLTQ1MCwxOSArNDUwLDE5IEBACiAJX191OAkJcmVzZXJ2ZWRfMTsKIAlfX3U4CQlmbV90YWJfZW50X3N6OwogCV9fdTgJCXJlc2VydmVkXzM7Ci0JX191MTYJCWZtX3RhYl9lbnRfY250OworCV9fYmUxNgkJZm1fdGFiX2VudF9jbnQ7CiAJX191OAkJcmVzZXJ2ZWQ2XzE1WzEwXTsKLQlfX3UzMgkJZm1fdGFiX2VudFtPU19GTV9UQUJfTUFYXTsKKwlfX2JlMzIJCWZtX3RhYl9lbnRbT1NfRk1fVEFCX01BWF07CiB9IG9zX2ZtX3RhYl90OwogCiB0eXBlZGVmIHN0cnVjdCBvc19leHRfdHJrX2V5X3MgewogCV9fdTgJCWV0X3BhcnRfbnVtOwogCV9fdTgJCWZtdDsKLQlfX3UxNgkJZm1fdGFiX29mZjsKKwlfX2JlMTYJCWZtX3RhYl9vZmY7CiAJX191OAkJcmVzZXJ2ZWQ0XzdbNF07Ci0JX191MzIJCWxhc3RfaGxiX2hpOwotCV9fdTMyCQlsYXN0X2hsYjsKLQlfX3UzMgkJbGFzdF9wcDsKKwlfX2JlMzIJCWxhc3RfaGxiX2hpOworCV9fYmUzMgkJbGFzdF9obGI7CisJX19iZTMyCQlsYXN0X3BwOwogCV9fdTgJCXJlc2VydmVkMjBfMzFbMTJdOwogfSBvc19leHRfdHJrX2V5X3Q7CiAKQEAgLTQ3OSwxNyArNDc5LDE3IEBACiAgICAgICAgIGNoYXIgICAgICAgICAgICBpZGVudF9zdHJbOF07CiAgICAgICAgIF9fdTggICAgICAgICAgICBtYWpvcl9yZXY7CiAgICAgICAgIF9fdTggICAgICAgICAgICBtaW5vcl9yZXY7Ci0JX191MTYJCWV4dF90cmtfdGJfb2ZmOworCV9fYmUxNgkJZXh0X3Rya190Yl9vZmY7CiAgICAgICAgIF9fdTggICAgICAgICAgICByZXNlcnZlZDEyXzE1WzRdOwogICAgICAgICBfX3U4ICAgICAgICAgICAgcHRfcGFyX251bTsKICAgICAgICAgX191OCAgICAgICAgICAgIHB0X3Jlc2VydmVkMV8zWzNdOwogICAgICAgICBvc19wYXJ0aXRpb25fdCAgcGFydGl0aW9uWzE2XTsKLQlfX3UzMgkJY2ZnX2NvbF93aWR0aDsKLQlfX3UzMgkJZGF0X2NvbF93aWR0aDsKLQlfX3UzMgkJcWZhX2NvbF93aWR0aDsKKwlfX2JlMzIJCWNmZ19jb2xfd2lkdGg7CisJX19iZTMyCQlkYXRfY29sX3dpZHRoOworCV9fYmUzMgkJcWZhX2NvbF93aWR0aDsKIAlfX3U4CQljYXJ0cmlkZ2VbMTZdOwogCV9fdTgJCXJlc2VydmVkMzA0XzUxMVsyMDhdOwotCV9fdTMyCQlvbGRfZmlsZW1hcmtfbGlzdFsxNjY4MC80XTsJCS8qIGluIEFEUiAxLjQgX191OCB0cmFja190YWJsZVsxNjY4MF0gKi8KKwlfX2JlMzIJCW9sZF9maWxlbWFya19saXN0WzE2NjgwLzRdOwkJLyogaW4gQURSIDEuNCBfX3U4IHRyYWNrX3RhYmxlWzE2NjgwXSAqLwogCW9zX2V4dF90cmtfdGJfdAlleHRfdHJhY2tfdGI7CiAJX191OAkJcmVzZXJ2ZWQxNzI3Ml8xNzczNVs0NjRdOwogCW9zX2ZtX3RhYl90CWRhdF9mbV90YWI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3VuM3hfZXNwLmMgYi9kcml2ZXJzL3Njc2kvc3VuM3hfZXNwLmMKaW5kZXggNmI2MDUzNi4uODBmYjNmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N1bjN4X2VzcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdW4zeF9lc3AuYwpAQCAtNTMsNyArNTMsNyBAQAogCXN0cnVjdCBDb25maWdEZXYgKmVzcF9kZXY7CiAKIAllc3BfZGV2ID0gMDsKLQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKikgZXNwX2Rldik7CisJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsIGVzcF9kZXYsIDApOwogCiAJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIERNQSAqLwogCWVzcC0+ZG9fcGlvX2NtZHMgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvdWFydGxpdGUuYyBiL2RyaXZlcnMvc2VyaWFsL3VhcnRsaXRlLmMKaW5kZXggZGI4NjA3ZS4uZjUwNTFjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvdWFydGxpdGUuYworKysgYi9kcml2ZXJzL3NlcmlhbC91YXJ0bGl0ZS5jCkBAIC0yNTYsNyArMjU2LDcgQEAKIHsKIAlyZWxlYXNlX21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgVUxJVEVfUkVHSU9OKTsKIAlpb3VubWFwKHBvcnQtPm1lbWJhc2UpOwotCXBvcnQtPm1lbWJhc2UgPSAwOworCXBvcnQtPm1lbWJhc2UgPSBOVUxMOwogfQogCiBzdGF0aWMgaW50IHVsaXRlX3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtNDM4LDcgKzQzOCw3IEBACiAJcG9ydC0+aW90eXBlCT0gVVBJT19NRU07CiAJcG9ydC0+aW9iYXNlCT0gMTsgLyogbWFyayBwb3J0IGluIHVzZSAqLwogCXBvcnQtPm1hcGJhc2UJPSByZXMtPnN0YXJ0OwotCXBvcnQtPm1lbWJhc2UJPSAwOworCXBvcnQtPm1lbWJhc2UJPSBOVUxMOwogCXBvcnQtPm9wcwk9ICZ1bGl0ZV9vcHM7CiAJcG9ydC0+aXJxCT0gcmVzMi0+c3RhcnQ7CiAJcG9ydC0+ZmxhZ3MJPSBVUEZfQk9PVF9BVVRPQ09ORjsKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmdWxpdGVfdWFydF9kcml2ZXIsIHBvcnQpOwogCiAJLyogbWFyayBwb3J0IGFzIGZyZWUgKi8KLQlwb3J0LT5tZW1iYXNlID0gMDsKKwlwb3J0LT5tZW1iYXNlID0gTlVMTDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90Yy9NYWtlZmlsZSBiL2RyaXZlcnMvdGMvTWFrZWZpbGUKaW5kZXggODNiNWJkNy4uOTY3MzQyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy90Yy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3RjL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCiAjIE9iamVjdCBmaWxlIGxpc3RzLgogCi1vYmotJChDT05GSUdfVEMpICs9IHRjLm8KK29iai0kKENPTkZJR19UQykgKz0gdGMubyB0Yy1kcml2ZXIubwogb2JqLSQoQ09ORklHX1pTKSArPSB6cy5vCiBvYmotJChDT05GSUdfVlQpICs9IGxrMjAxLm8gbGsyMDEtbWFwLm8gbGsyMDEtcmVtYXAubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RjL3RjLWRyaXZlci5jIGIvZHJpdmVycy90Yy90Yy1kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmI1YmFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy90Yy90Yy1kcml2ZXIuYwpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqCVRVUkJPY2hhbm5lbCBkcml2ZXIgc2VydmljZXMuCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDA1ICBKYW1lcyBTaW1tb25zCisgKglDb3B5cmlnaHQgKGMpIDIwMDYgIE1hY2llaiBXLiBSb3p5Y2tpCisgKgorICoJTG9vc2VseSBiYXNlZCBvbiBkcml2ZXJzL2Rpby9kaW8tZHJpdmVyLmMgYW5kCisgKglkcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMuCisgKgorICoJVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUKKyAqCUdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluCisgKglkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90Yy5oPgorCisvKioKKyAqIHRjX3JlZ2lzdGVyX2RyaXZlciAtIHJlZ2lzdGVyIGEgbmV3IFRDIGRyaXZlcgorICogQGRydjogdGhlIGRyaXZlciBzdHJ1Y3R1cmUgdG8gcmVnaXN0ZXIKKyAqCisgKiBBZGRzIHRoZSBkcml2ZXIgc3RydWN0dXJlIHRvIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgZHJpdmVycworICogUmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLCBvdGhlcndpc2UgMC4KKyAqIElmIG5vIGVycm9yIG9jY3VycmVkLCB0aGUgZHJpdmVyIHJlbWFpbnMgcmVnaXN0ZXJlZCBldmVuIGlmCisgKiBubyBkZXZpY2Ugd2FzIGNsYWltZWQgZHVyaW5nIHJlZ2lzdHJhdGlvbi4KKyAqLworaW50IHRjX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdGNfZHJpdmVyICp0ZHJ2KQoreworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnRkcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKHRjX3JlZ2lzdGVyX2RyaXZlcik7CisKKy8qKgorICogdGNfdW5yZWdpc3Rlcl9kcml2ZXIgLSB1bnJlZ2lzdGVyIGEgVEMgZHJpdmVyCisgKiBAZHJ2OiB0aGUgZHJpdmVyIHN0cnVjdHVyZSB0byB1bnJlZ2lzdGVyCisgKgorICogRGVsZXRlcyB0aGUgZHJpdmVyIHN0cnVjdHVyZSBmcm9tIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgVEMgZHJpdmVycywKKyAqIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGNsZWFuIHVwIGJ5IGNhbGxpbmcgaXRzIHJlbW92ZSgpIGZ1bmN0aW9uIGZvcgorICogZWFjaCBkZXZpY2UgaXQgd2FzIHJlc3BvbnNpYmxlIGZvciwgYW5kIG1hcmtzIHRob3NlIGRldmljZXMgYXMKKyAqIGRyaXZlcmxlc3MuCisgKi8KK3ZvaWQgdGNfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHRjX2RyaXZlciAqdGRydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmdGRydi0+ZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0wodGNfdW5yZWdpc3Rlcl9kcml2ZXIpOworCisvKioKKyAqIHRjX21hdGNoX2RldmljZSAtIHRlbGwgaWYgYSBUQyBkZXZpY2Ugc3RydWN0dXJlIGhhcyBhIG1hdGNoaW5nCisgKiAgICAgICAgICAgICAgICAgICBUQyBkZXZpY2UgSUQgc3RydWN0dXJlCisgKiBAdGRydjogdGhlIFRDIGRyaXZlciB0byBlYXJjaCBmb3IgbWF0Y2hpbmcgVEMgZGV2aWNlIElEIHN0cmluZ3MKKyAqIEB0ZGV2OiB0aGUgVEMgZGV2aWNlIHN0cnVjdHVyZSB0byBtYXRjaCBhZ2FpbnN0CisgKgorICogVXNlZCBieSBhIGRyaXZlciB0byBjaGVjayB3aGV0aGVyIGEgVEMgZGV2aWNlIHByZXNlbnQgaW4gdGhlCisgKiBzeXN0ZW0gaXMgaW4gaXRzIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMuICBSZXR1cm5zIHRoZSBtYXRjaGluZworICogdGNfZGV2aWNlX2lkIHN0cnVjdHVyZSBvciAlTlVMTCBpZiB0aGVyZSBpcyBubyBtYXRjaC4KKyAqLworY29uc3Qgc3RydWN0IHRjX2RldmljZV9pZCAqdGNfbWF0Y2hfZGV2aWNlKHN0cnVjdCB0Y19kcml2ZXIgKnRkcnYsCisJCQkJCSAgIHN0cnVjdCB0Y19kZXYgKnRkZXYpCit7CisJY29uc3Qgc3RydWN0IHRjX2RldmljZV9pZCAqaWQgPSB0ZHJ2LT5pZF90YWJsZTsKKworCWlmIChpZCkgeworCQl3aGlsZSAoaWQtPm5hbWVbMF0gfHwgaWQtPnZlbmRvclswXSkgeworCQkJaWYgKHN0cmNtcCh0ZGV2LT5uYW1lLCBpZC0+bmFtZSkgPT0gMCAmJgorCQkJICAgIHN0cmNtcCh0ZGV2LT52ZW5kb3IsIGlkLT52ZW5kb3IpID09IDApCisJCQkJcmV0dXJuIGlkOworCQkJaWQrKzsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wodGNfbWF0Y2hfZGV2aWNlKTsKKworLyoqCisgKiB0Y19idXNfbWF0Y2ggLSBUZWxsIGlmIGEgZGV2aWNlIHN0cnVjdHVyZSBoYXMgYSBtYXRjaGluZworICogICAgICAgICAgICAgICAgVEMgZGV2aWNlIElEIHN0cnVjdHVyZQorICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAorICogQGRydjogdGhlIGRldmljZSBkcml2ZXIgdG8gc2VhcmNoIGZvciBtYXRjaGluZyBUQyBkZXZpY2UgSUQgc3RyaW5ncworICoKKyAqIFVzZWQgYnkgYSBkcml2ZXIgdG8gY2hlY2sgd2hldGhlciBhIFRDIGRldmljZSBwcmVzZW50IGluIHRoZQorICogc3lzdGVtIGlzIGluIGl0cyBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2VzLiAgUmV0dXJucyAxIGlmIHRoZXJlCisgKiBpcyBhIG1hdGNoIG9yIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHRjX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IHRjX2RldiAqdGRldiA9IHRvX3RjX2RldihkZXYpOworCXN0cnVjdCB0Y19kcml2ZXIgKnRkcnYgPSB0b190Y19kcml2ZXIoZHJ2KTsKKwljb25zdCBzdHJ1Y3QgdGNfZGV2aWNlX2lkICppZDsKKworCWlkID0gdGNfbWF0Y2hfZGV2aWNlKHRkcnYsIHRkZXYpOworCWlmIChpZCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJ1c190eXBlIHRjX2J1c190eXBlID0geworCS5uYW1lCT0gInRjIiwKKwkubWF0Y2gJPSB0Y19idXNfbWF0Y2gsCit9OworRVhQT1JUX1NZTUJPTCh0Y19idXNfdHlwZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IHRjX2RyaXZlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGJ1c19yZWdpc3RlcigmdGNfYnVzX3R5cGUpOworfQorCitwb3N0Y29yZV9pbml0Y2FsbCh0Y19kcml2ZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RjL3RjLmMgYi9kcml2ZXJzL3RjL3RjLmMKaW5kZXggNGE1MWU1Ni4uZjc3ZjYyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy90Yy90Yy5jCisrKyBiL2RyaXZlcnMvdGMvdGMuYwpAQCAtMSwyNTQgKzEsMTkzIEBACiAvKgotICogdGMtaW5pdDogV2UgYXNzdW1lIHRoZSBUVVJCT2NoYW5uZWwgdG8gYmUgdXAgYW5kIHJ1bm5pbmcgc28KLSAqIGp1c3QgcHJvYmUgZm9yIE1vZHVsZXMgYW5kIGZpbGwgaW4gdGhlIGdsb2JhbCBkYXRhIHN0cnVjdHVyZQotICogdGNfYnVzLgorICoJVFVSQk9jaGFubmVsIGJ1cyBzZXJ2aWNlcy4KICAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCUNvcHlyaWdodCAoYykgSGFyYWxkIEtvZXJmZ2VuLCAxOTk4CisgKglDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDMsIDIwMDUsIDIwMDYgIE1hY2llaiBXLiBSb3p5Y2tpCisgKglDb3B5cmlnaHQgKGMpIDIwMDUgIEphbWVzIFNpbW1vbnMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIEhhcmFsZCBLb2VyZmdlbiwgMTk5OAotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAzLCAyMDA1ICBNYWNpZWogVy4gUm96eWNraQorICoJVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUKKyAqCUdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluCisgKglkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3BhY2Nlc3MuaD4KIAotI2luY2x1ZGUgPGFzbS9kZWMvbWFjaHR5cGUuaD4KLSNpbmNsdWRlIDxhc20vZGVjL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vZGVjL3RjaW5mby5oPgotI2luY2x1ZGUgPGFzbS9kZWMvdGNtb2R1bGUuaD4KLSNpbmNsdWRlIDxhc20vZGVjL2ludGVycnVwdHMuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotc2xvdF9pbmZvIHRjX2J1c1tNQVhfU0xPVF07Ci1zdGF0aWMgaW50IG51bV90Y3Nsb3RzOwotc3RhdGljIHRjaW5mbyAqaW5mbzsKK3N0YXRpYyBzdHJ1Y3QgdGNfYnVzIHRjX2J1cyA9IHsKKwkubmFtZSA9ICJUVVJCT2NoYW5uZWwiLAorfTsKIAogLyoKLSAqIEludGVyZmFjZSB0byB0aGUgd29ybGQuIFJlYWQgY29tbWVudCBpbiBpbmNsdWRlL2FzbS1taXBzL3RjLmguCisgKiBQcm9iaW5nIGZvciBUVVJCT2NoYW5uZWwgbW9kdWxlcy4KICAqLwotCi1pbnQgc2VhcmNoX3RjX2NhcmQoY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyB2b2lkIF9faW5pdCB0Y19idXNfYWRkX2RldmljZXMoc3RydWN0IHRjX2J1cyAqdGJ1cykKIHsKLQlpbnQgc2xvdDsKLQlzbG90X2luZm8gKnNpcDsKLQotCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBudW1fdGNzbG90czsgc2xvdCsrKSB7Ci0JCXNpcCA9ICZ0Y19idXNbc2xvdF07Ci0JCWlmICgoc2lwLT5mbGFncyAmIEZSRUUpICYmCi0JCSAgICAoc3RybmNtcChzaXAtPm5hbWUsIG5hbWUsIHN0cmxlbihuYW1lKSkgPT0gMCkpIHsKLQkJCXJldHVybiBzbG90OwotCQl9Ci0JfQotCi0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXZvaWQgY2xhaW1fdGNfY2FyZChpbnQgc2xvdCkKLXsKLQlpZiAodGNfYnVzW3Nsb3RdLmZsYWdzICYgSU5fVVNFKSB7Ci0JCXByaW50aygiY2xhaW1fdGNfY2FyZDogYXR0ZW1wdGluZyB0byBjbGFpbSBhIGNhcmQgYWxyZWFkeSBpbiB1c2VcbiIpOwotCQlyZXR1cm47Ci0JfQotCXRjX2J1c1tzbG90XS5mbGFncyAmPSB+RlJFRTsKLQl0Y19idXNbc2xvdF0uZmxhZ3MgfD0gSU5fVVNFOwotfQotCi12b2lkIHJlbGVhc2VfdGNfY2FyZChpbnQgc2xvdCkKLXsKLQlpZiAodGNfYnVzW3Nsb3RdLmZsYWdzICYgRlJFRSkgewotCQlwcmludGsoInJlbGVhc2VfdGNfY2FyZDogIgotCQkgICAgICAgImF0dGVtcHRpbmcgdG8gcmVsZWFzZSBhIGNhcmQgYWxyZWFkeSBmcmVlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQl0Y19idXNbc2xvdF0uZmxhZ3MgJj0gfklOX1VTRTsKLQl0Y19idXNbc2xvdF0uZmxhZ3MgfD0gRlJFRTsKLX0KLQotdW5zaWduZWQgbG9uZyBnZXRfdGNfYmFzZV9hZGRyKGludCBzbG90KQotewotCXJldHVybiB0Y19idXNbc2xvdF0uYmFzZV9hZGRyOwotfQotCi11bnNpZ25lZCBsb25nIGdldF90Y19pcnFfbnIoaW50IHNsb3QpCi17Ci0JcmV0dXJuIHRjX2J1c1tzbG90XS5pbnRlcnJ1cHQ7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgZ2V0X3RjX3NwZWVkKHZvaWQpCi17Ci0JcmV0dXJuIDEwMDAwMCAqICgxMDAwMCAvICh1bnNpZ25lZCBsb25nKWluZm8tPmNsa19wZXJpb2QpOwotfQotCi0vKgotICogUHJvYmluZyBmb3IgVFVSQk9jaGFubmVsIG1vZHVsZXMKLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHRjX3Byb2JlKHVuc2lnbmVkIGxvbmcgc3RhcnRhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkgICAgaW50IHNsb3RzKQotewotCXVuc2lnbmVkIGxvbmcgc2xvdGFkZHI7CisJcmVzb3VyY2Vfc2l6ZV90IHNsb3RzaXplID0gdGJ1cy0+aW5mby5zbG90X3NpemUgPDwgMjA7CisJcmVzb3VyY2Vfc2l6ZV90IGV4dHNsb3RzaXplID0gdGJ1cy0+ZXh0X3Nsb3Rfc2l6ZTsKKwlyZXNvdXJjZV9zaXplX3Qgc2xvdGFkZHI7CisJcmVzb3VyY2Vfc2l6ZV90IGV4dHNsb3RhZGRyOworCXJlc291cmNlX3NpemVfdCBkZXZzaXplOworCXZvaWQgX19pb21lbSAqbW9kdWxlOworCXN0cnVjdCB0Y19kZXYgKnRkZXY7CiAJaW50IGksIHNsb3QsIGVycjsKLQlsb25nIG9mZnNldDsKIAl1OCBwYXR0ZXJuWzRdOwotCXZvbGF0aWxlIHU4ICptb2R1bGU7CisJbG9uZyBvZmZzZXQ7CiAKLQlmb3IgKHNsb3QgPSAwOyBzbG90IDwgc2xvdHM7IHNsb3QrKykgewotCQlzbG90YWRkciA9IHN0YXJ0YWRkciArIHNsb3QgKiBzaXplOwotCQltb2R1bGUgPSBpb3JlbWFwX25vY2FjaGUoc2xvdGFkZHIsIHNpemUpOworCWZvciAoc2xvdCA9IDA7IHNsb3QgPCB0YnVzLT5udW1fdGNzbG90czsgc2xvdCsrKSB7CisJCXNsb3RhZGRyID0gdGJ1cy0+c2xvdF9iYXNlICsgc2xvdCAqIHNsb3RzaXplOworCQlleHRzbG90YWRkciA9IHRidXMtPmV4dF9zbG90X2Jhc2UgKyBzbG90ICogZXh0c2xvdHNpemU7CisJCW1vZHVsZSA9IGlvcmVtYXBfbm9jYWNoZShzbG90YWRkciwgc2xvdHNpemUpOwogCQlCVUdfT04oIW1vZHVsZSk7CiAKLQkJb2Zmc2V0ID0gT0xEQ0FSRDsKKwkJb2Zmc2V0ID0gVENfT0xEQ0FSRDsKIAogCQllcnIgPSAwOwotCQllcnIgfD0gZ2V0X2RiZShwYXR0ZXJuWzBdLCBtb2R1bGUgKyBPTERDQVJEICsgVENfUEFUVEVSTjApOwotCQllcnIgfD0gZ2V0X2RiZShwYXR0ZXJuWzFdLCBtb2R1bGUgKyBPTERDQVJEICsgVENfUEFUVEVSTjEpOwotCQllcnIgfD0gZ2V0X2RiZShwYXR0ZXJuWzJdLCBtb2R1bGUgKyBPTERDQVJEICsgVENfUEFUVEVSTjIpOwotCQllcnIgfD0gZ2V0X2RiZShwYXR0ZXJuWzNdLCBtb2R1bGUgKyBPTERDQVJEICsgVENfUEFUVEVSTjMpOwotCQlpZiAoZXJyKSB7Ci0JCQlpb3VubWFwKG1vZHVsZSk7Ci0JCQljb250aW51ZTsKLQkJfQorCQllcnIgfD0gdGNfcHJlYWRiKHBhdHRlcm4gKyAwLCBtb2R1bGUgKyBvZmZzZXQgKyBUQ19QQVRURVJOMCk7CisJCWVyciB8PSB0Y19wcmVhZGIocGF0dGVybiArIDEsIG1vZHVsZSArIG9mZnNldCArIFRDX1BBVFRFUk4xKTsKKwkJZXJyIHw9IHRjX3ByZWFkYihwYXR0ZXJuICsgMiwgbW9kdWxlICsgb2Zmc2V0ICsgVENfUEFUVEVSTjIpOworCQllcnIgfD0gdGNfcHJlYWRiKHBhdHRlcm4gKyAzLCBtb2R1bGUgKyBvZmZzZXQgKyBUQ19QQVRURVJOMyk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9lcnI7CiAKIAkJaWYgKHBhdHRlcm5bMF0gIT0gMHg1NSB8fCBwYXR0ZXJuWzFdICE9IDB4MDAgfHwKIAkJICAgIHBhdHRlcm5bMl0gIT0gMHhhYSB8fCBwYXR0ZXJuWzNdICE9IDB4ZmYpIHsKLQkJCW9mZnNldCA9IE5FV0NBUkQ7CisJCQlvZmZzZXQgPSBUQ19ORVdDQVJEOwogCiAJCQllcnIgPSAwOwotCQkJZXJyIHw9IGdldF9kYmUocGF0dGVyblswXSwgbW9kdWxlICsgVENfUEFUVEVSTjApOwotCQkJZXJyIHw9IGdldF9kYmUocGF0dGVyblsxXSwgbW9kdWxlICsgVENfUEFUVEVSTjEpOwotCQkJZXJyIHw9IGdldF9kYmUocGF0dGVyblsyXSwgbW9kdWxlICsgVENfUEFUVEVSTjIpOwotCQkJZXJyIHw9IGdldF9kYmUocGF0dGVyblszXSwgbW9kdWxlICsgVENfUEFUVEVSTjMpOwotCQkJaWYgKGVycikgewotCQkJCWlvdW5tYXAobW9kdWxlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KKwkJCWVyciB8PSB0Y19wcmVhZGIocGF0dGVybiArIDAsCisJCQkJCSBtb2R1bGUgKyBvZmZzZXQgKyBUQ19QQVRURVJOMCk7CisJCQllcnIgfD0gdGNfcHJlYWRiKHBhdHRlcm4gKyAxLAorCQkJCQkgbW9kdWxlICsgb2Zmc2V0ICsgVENfUEFUVEVSTjEpOworCQkJZXJyIHw9IHRjX3ByZWFkYihwYXR0ZXJuICsgMiwKKwkJCQkJIG1vZHVsZSArIG9mZnNldCArIFRDX1BBVFRFUk4yKTsKKwkJCWVyciB8PSB0Y19wcmVhZGIocGF0dGVybiArIDMsCisJCQkJCSBtb2R1bGUgKyBvZmZzZXQgKyBUQ19QQVRURVJOMyk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0X2VycjsKIAkJfQogCiAJCWlmIChwYXR0ZXJuWzBdICE9IDB4NTUgfHwgcGF0dGVyblsxXSAhPSAweDAwIHx8Ci0JCSAgICBwYXR0ZXJuWzJdICE9IDB4YWEgfHwgcGF0dGVyblszXSAhPSAweGZmKSB7Ci0JCQlpb3VubWFwKG1vZHVsZSk7Ci0JCQljb250aW51ZTsKLQkJfQorCQkgICAgcGF0dGVyblsyXSAhPSAweGFhIHx8IHBhdHRlcm5bM10gIT0gMHhmZikKKwkJCWdvdG8gb3V0X2VycjsKIAotCQl0Y19idXNbc2xvdF0uYmFzZV9hZGRyID0gc2xvdGFkZHI7CisJCS8qIEZvdW5kIGEgYm9hcmQsIGFsbG9jYXRlIGl0IGFuIGVudHJ5IGluIHRoZSBsaXN0ICovCisJCXRkZXYgPSBremFsbG9jKHNpemVvZigqdGRldiksIEdGUF9LRVJORUwpOworCQlpZiAoIXRkZXYpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidGMleDogdW5hYmxlIHRvIGFsbG9jYXRlIHRjX2RldlxuIiwKKwkJCSAgICAgICBzbG90KTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCQlzcHJpbnRmKHRkZXYtPmRldi5idXNfaWQsICJ0YyV4Iiwgc2xvdCk7CisJCXRkZXYtPmJ1cyA9IHRidXM7CisJCXRkZXYtPmRldi5wYXJlbnQgPSAmdGJ1cy0+ZGV2OworCQl0ZGV2LT5kZXYuYnVzID0gJnRjX2J1c190eXBlOworCQl0ZGV2LT5zbG90ID0gc2xvdDsKKwogCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQl0Y19idXNbc2xvdF0uZmlybXdhcmVbaV0gPQotCQkJCW1vZHVsZVtUQ19GSVJNX1ZFUiArIG9mZnNldCArIDQgKiBpXTsKLQkJCXRjX2J1c1tzbG90XS52ZW5kb3JbaV0gPQotCQkJCW1vZHVsZVtUQ19WRU5ET1IgKyBvZmZzZXQgKyA0ICogaV07Ci0JCQl0Y19idXNbc2xvdF0ubmFtZVtpXSA9Ci0JCQkJbW9kdWxlW1RDX01PRFVMRSArIG9mZnNldCArIDQgKiBpXTsKKwkJCXRkZXYtPmZpcm13YXJlW2ldID0KKwkJCQlyZWFkYihtb2R1bGUgKyBvZmZzZXQgKyBUQ19GSVJNX1ZFUiArIDQgKiBpKTsKKwkJCXRkZXYtPnZlbmRvcltpXSA9CisJCQkJcmVhZGIobW9kdWxlICsgb2Zmc2V0ICsgVENfVkVORE9SICsgNCAqIGkpOworCQkJdGRldi0+bmFtZVtpXSA9CisJCQkJcmVhZGIobW9kdWxlICsgb2Zmc2V0ICsgVENfTU9EVUxFICsgNCAqIGkpOwogCQl9Ci0JCXRjX2J1c1tzbG90XS5maXJtd2FyZVs4XSA9IDA7Ci0JCXRjX2J1c1tzbG90XS52ZW5kb3JbOF0gPSAwOwotCQl0Y19idXNbc2xvdF0ubmFtZVs4XSA9IDA7Ci0JCS8qCi0JCSAqIExvb2tzIHVubmVjY2VzYXJ5LCBidXQgd2UgbWF5IGNoYW5nZQotCQkgKiBUQz8gaW4gdGhlIGZ1dHVyZQotCQkgKi8KLQkJc3dpdGNoIChzbG90KSB7Ci0JCWNhc2UgMDoKLQkJCXRjX2J1c1tzbG90XS5pbnRlcnJ1cHQgPSBkZWNfaW50ZXJydXB0W0RFQ19JUlFfVEMwXTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQl0Y19idXNbc2xvdF0uaW50ZXJydXB0ID0gZGVjX2ludGVycnVwdFtERUNfSVJRX1RDMV07Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJdGNfYnVzW3Nsb3RdLmludGVycnVwdCA9IGRlY19pbnRlcnJ1cHRbREVDX0lSUV9UQzJdOwotCQkJYnJlYWs7Ci0JCS8qCi0JCSAqIFl1Y2shIERTNTAwMC8yMDAgb25ib2FyZCBkZXZpY2VzCi0JCSAqLwotCQljYXNlIDU6Ci0JCQl0Y19idXNbc2xvdF0uaW50ZXJydXB0ID0gZGVjX2ludGVycnVwdFtERUNfSVJRX1RDNV07Ci0JCQlicmVhazsKLQkJY2FzZSA2OgotCQkJdGNfYnVzW3Nsb3RdLmludGVycnVwdCA9IGRlY19pbnRlcnJ1cHRbREVDX0lSUV9UQzZdOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl0Y19idXNbc2xvdF0uaW50ZXJydXB0ID0gLTE7Ci0JCQlicmVhazsKLQkJfQorCQl0ZGV2LT5maXJtd2FyZVs4XSA9IDA7CisJCXRkZXYtPnZlbmRvcls4XSA9IDA7CisJCXRkZXYtPm5hbWVbOF0gPSAwOwogCisJCXByX2luZm8oIiVzOiAlcyAlcyAlc1xuIiwgdGRldi0+ZGV2LmJ1c19pZCwgdGRldi0+dmVuZG9yLAorCQkJdGRldi0+bmFtZSwgdGRldi0+ZmlybXdhcmUpOworCisJCWRldnNpemUgPSByZWFkYihtb2R1bGUgKyBvZmZzZXQgKyBUQ19TTE9UX1NJWkUpOworCQlkZXZzaXplIDw8PSAyMjsKKwkJaWYgKGRldnNpemUgPD0gc2xvdHNpemUpIHsKKwkJCXRkZXYtPnJlc291cmNlLnN0YXJ0ID0gc2xvdGFkZHI7CisJCQl0ZGV2LT5yZXNvdXJjZS5lbmQgPSBzbG90YWRkciArIGRldnNpemUgLSAxOworCQl9IGVsc2UgaWYgKGRldnNpemUgPD0gZXh0c2xvdHNpemUpIHsKKwkJCXRkZXYtPnJlc291cmNlLnN0YXJ0ID0gZXh0c2xvdGFkZHI7CisJCQl0ZGV2LT5yZXNvdXJjZS5lbmQgPSBleHRzbG90YWRkciArIGRldnNpemUgLSAxOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IHByb3ZpZGUgc2xvdCBzcGFjZSAiCisJCQkgICAgICAgIiglZE1pQiByZXF1aXJlZCwgdXAgdG8gJWRNaUIgc3VwcG9ydGVkKVxuIiwKKwkJCSAgICAgICB0ZGV2LT5kZXYuYnVzX2lkLCBkZXZzaXplID4+IDIwLAorCQkJICAgICAgIG1heChzbG90c2l6ZSwgZXh0c2xvdHNpemUpID4+IDIwKTsKKwkJCWtmcmVlKHRkZXYpOworCQkJZ290byBvdXRfZXJyOworCQl9CisJCXRkZXYtPnJlc291cmNlLm5hbWUgPSB0ZGV2LT5uYW1lOworCQl0ZGV2LT5yZXNvdXJjZS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCisJCXRjX2RldmljZV9nZXRfaXJxKHRkZXYpOworCisJCWRldmljZV9yZWdpc3RlcigmdGRldi0+ZGV2KTsKKwkJbGlzdF9hZGRfdGFpbCgmdGRldi0+bm9kZSwgJnRidXMtPmRldmljZXMpOworCitvdXRfZXJyOgogCQlpb3VubWFwKG1vZHVsZSk7CiAJfQogfQogCiAvKgotICogdGhlIG1haW4gZW50cnkKKyAqIFRoZSBtYWluIGVudHJ5LgogICovCiBzdGF0aWMgaW50IF9faW5pdCB0Y19pbml0KHZvaWQpCiB7Ci0JaW50IHRjX2Nsb2NrOwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgc2xvdDBhZGRyOwotCXVuc2lnbmVkIGxvbmcgc2xvdF9zaXplOwotCi0JaWYgKCFUVVJCT0NIQU5ORUwpCisJLyogSW5pdGlhbGl6ZSB0aGUgVFVSQk9jaGFubmVsIGJ1cyAqLworCWlmICh0Y19idXNfZ2V0X2luZm8oJnRjX2J1cykpCiAJCXJldHVybiAwOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9TTE9UOyBpKyspIHsKLQkJdGNfYnVzW2ldLmJhc2VfYWRkciA9IDA7Ci0JCXRjX2J1c1tpXS5uYW1lWzBdID0gMDsKLQkJdGNfYnVzW2ldLnZlbmRvclswXSA9IDA7Ci0JCXRjX2J1c1tpXS5maXJtd2FyZVswXSA9IDA7Ci0JCXRjX2J1c1tpXS5pbnRlcnJ1cHQgPSAtMTsKLQkJdGNfYnVzW2ldLmZsYWdzID0gRlJFRTsKLQl9CisJSU5JVF9MSVNUX0hFQUQoJnRjX2J1cy5kZXZpY2VzKTsKKwlzdHJjcHkodGNfYnVzLmRldi5idXNfaWQsICJ0YyIpOworCWRldmljZV9yZWdpc3RlcigmdGNfYnVzLmRldik7CiAKLQlpbmZvID0gcmV4X2dldHRjaW5mbygpOwotCXNsb3QwYWRkciA9IENQSFlTQUREUigobG9uZylyZXhfc2xvdF9hZGRyZXNzKDApKTsKKwlpZiAodGNfYnVzLmluZm8uc2xvdF9zaXplKSB7CisJCXVuc2lnbmVkIGludCB0Y19jbG9jayA9IHRjX2dldF9zcGVlZCgmdGNfYnVzKSAvIDEwMDAwMDsKIAotCXN3aXRjaCAobWlwc19tYWNodHlwZSkgewotCWNhc2UgTUFDSF9EUzUwMDBfMjAwOgotCQludW1fdGNzbG90cyA9IDc7Ci0JCWJyZWFrOwotCWNhc2UgTUFDSF9EUzUwMDBfMVhYOgotCWNhc2UgTUFDSF9EUzUwMDBfMlgwOgotCWNhc2UgTUFDSF9EUzU5MDA6Ci0JCW51bV90Y3Nsb3RzID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBNQUNIX0RTNTAwMF9YWDoKLQlkZWZhdWx0OgotCQludW1fdGNzbG90cyA9IDI7Ci0JCWJyZWFrOwotCX0KKwkJcHJfaW5mbygidGM6IFRVUkJPY2hhbm5lbCByZXYuICVkIGF0ICVkLiVkIE1IeiAiCisJCQkiKHdpdGglcyBwYXJpdHkpXG4iLCB0Y19idXMuaW5mby5yZXZpc2lvbiwKKwkJCXRjX2Nsb2NrIC8gMTAsIHRjX2Nsb2NrICUgMTAsCisJCQl0Y19idXMuaW5mby5wYXJpdHkgPyAiIiA6ICJvdXQiKTsKIAotCXRjX2Nsb2NrID0gMTAwMDAgLyBpbmZvLT5jbGtfcGVyaW9kOwotCi0JaWYgKGluZm8tPnNsb3Rfc2l6ZSAmJiBzbG90MGFkZHIpIHsKLQkJcHJfaW5mbygiVFVSQk9jaGFubmVsIHJldi4gJWQgYXQgJWQuJWQgTUh6ICh3aXRoJXMgcGFyaXR5KVxuIiwKLQkJCWluZm8tPnJldmlzaW9uLCB0Y19jbG9jayAvIDEwLCB0Y19jbG9jayAlIDEwLAotCQkJaW5mby0+cGFyaXR5ID8gIiIgOiAib3V0Iik7Ci0KLQkJc2xvdF9zaXplID0gaW5mby0+c2xvdF9zaXplIDw8IDIwOwotCi0JCXRjX3Byb2JlKHNsb3QwYWRkciwgc2xvdF9zaXplLCBudW1fdGNzbG90cyk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IG51bV90Y3Nsb3RzOyBpKyspIHsKLQkJCWlmICghdGNfYnVzW2ldLmJhc2VfYWRkcikKLQkJCQljb250aW51ZTsKLQkJCXByX2luZm8oIiAgICBzbG90ICVkOiAlcyAlcyAlc1xuIiwgaSwgdGNfYnVzW2ldLnZlbmRvciwKLQkJCQl0Y19idXNbaV0ubmFtZSwgdGNfYnVzW2ldLmZpcm13YXJlKTsKKwkJdGNfYnVzLnJlc291cmNlWzBdLnN0YXJ0ID0gdGNfYnVzLnNsb3RfYmFzZTsKKwkJdGNfYnVzLnJlc291cmNlWzBdLmVuZCA9IHRjX2J1cy5zbG90X2Jhc2UgKworCQkJCQkgKHRjX2J1cy5pbmZvLnNsb3Rfc2l6ZSA8PCAyMCkgKgorCQkJCQkgdGNfYnVzLm51bV90Y3Nsb3RzIC0gMTsKKwkJdGNfYnVzLnJlc291cmNlWzBdLm5hbWUgPSB0Y19idXMubmFtZTsKKwkJdGNfYnVzLnJlc291cmNlWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwKKwkJCQkgICAgICZ0Y19idXMucmVzb3VyY2VbMF0pIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ0YzogQ2Fubm90IHJlc2VydmUgcmVzb3VyY2VcbiIpOworCQkJcmV0dXJuIDA7CiAJCX0KKwkJaWYgKHRjX2J1cy5leHRfc2xvdF9zaXplKSB7CisJCQl0Y19idXMucmVzb3VyY2VbMV0uc3RhcnQgPSB0Y19idXMuZXh0X3Nsb3RfYmFzZTsKKwkJCXRjX2J1cy5yZXNvdXJjZVsxXS5lbmQgPSB0Y19idXMuZXh0X3Nsb3RfYmFzZSArCisJCQkJCQkgdGNfYnVzLmV4dF9zbG90X3NpemUgKgorCQkJCQkJIHRjX2J1cy5udW1fdGNzbG90cyAtIDE7CisJCQl0Y19idXMucmVzb3VyY2VbMV0ubmFtZSA9IHRjX2J1cy5uYW1lOworCQkJdGNfYnVzLnJlc291cmNlWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCQlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsCisJCQkJCSAgICAgJnRjX2J1cy5yZXNvdXJjZVsxXSkgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJ0YzogQ2Fubm90IHJlc2VydmUgcmVzb3VyY2VcbiIpOworCQkJCXJlbGVhc2VfcmVzb3VyY2UoJnRjX2J1cy5yZXNvdXJjZVswXSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQl0Y19idXNfYWRkX2RldmljZXMoJnRjX2J1cyk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKIHN1YnN5c19pbml0Y2FsbCh0Y19pbml0KTsKLQotRVhQT1JUX1NZTUJPTChzZWFyY2hfdGNfY2FyZCk7Ci1FWFBPUlRfU1lNQk9MKGNsYWltX3RjX2NhcmQpOwotRVhQT1JUX1NZTUJPTChyZWxlYXNlX3RjX2NhcmQpOwotRVhQT1JUX1NZTUJPTChnZXRfdGNfYmFzZV9hZGRyKTsKLUVYUE9SVF9TWU1CT0woZ2V0X3RjX2lycV9ucik7Ci1FWFBPUlRfU1lNQk9MKGdldF90Y19zcGVlZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHMzLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHMzLmMKaW5kZXggMzcxZjE5NC4uNGQ3ODFhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBzMy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wczMuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG1taW8gbWFwcGVkX2FkZHIgJWx4aFxuIiwgX19mdW5jX18sCiAJCV9fTElORV9fLCBkZXYtPm1fcmVnaW9uLT5scGFyX2FkZHIpOwogCi0JcmVzdWx0ID0gcHMzX2FsbG9jX2lvX2lycShkZXYtPmludGVycnVwdF9pZCwgJnZpcnEpOworCXJlc3VsdCA9IHBzM19hbGxvY19pb19pcnEoUFMzX0JJTkRJTkdfQ1BVX0FOWSwgZGV2LT5pbnRlcnJ1cHRfaWQsICZ2aXJxKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHBzM19jb25zdHJ1Y3RfaW9faXJxKCVkKSBmYWlsZWQuXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLmggYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaAppbmRleCBlYzBkYTAzLi40NmZhNTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaApAQCAtNjc3LDEwICs2NzcsMTAgQEAKIHsKICNpZmRlZiBDT05GSUdfVVNCX0VIQ0lfQklHX0VORElBTl9NTUlPCiAJcmV0dXJuIGVoY2lfYmlnX2VuZGlhbl9tbWlvKGVoY2kpID8KLQkJcmVhZGxfYmUoKF9fZm9yY2UgdTMyICopcmVncykgOgotCQlyZWFkbCgoX19mb3JjZSB1MzIgKilyZWdzKTsKKwkJcmVhZGxfYmUocmVncykgOgorCQlyZWFkbChyZWdzKTsKICNlbHNlCi0JcmV0dXJuIHJlYWRsKChfX2ZvcmNlIHUzMiAqKXJlZ3MpOworCXJldHVybiByZWFkbChyZWdzKTsKICNlbmRpZgogfQogCkBAIC02ODksMTAgKzY4OSwxMCBAQAogewogI2lmZGVmIENPTkZJR19VU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8KIAllaGNpX2JpZ19lbmRpYW5fbW1pbyhlaGNpKSA/Ci0JCXdyaXRlbF9iZSh2YWwsIChfX2ZvcmNlIHUzMiAqKXJlZ3MpIDoKLQkJd3JpdGVsKHZhbCwgKF9fZm9yY2UgdTMyICopcmVncyk7CisJCXdyaXRlbF9iZSh2YWwsIHJlZ3MpIDoKKwkJd3JpdGVsKHZhbCwgcmVncyk7CiAjZWxzZQotCXdyaXRlbCh2YWwsIChfX2ZvcmNlIHUzMiAqKXJlZ3MpOworCXdyaXRlbCh2YWwsIHJlZ3MpOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wczMuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wczMuYwppbmRleCA2OWQ5NDhiLi42MjI4M2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHMzLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBzMy5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogbW1pbyBtYXBwZWRfYWRkciAlbHhoXG4iLCBfX2Z1bmNfXywKIAkJX19MSU5FX18sIGRldi0+bV9yZWdpb24tPmxwYXJfYWRkcik7CiAKLQlyZXN1bHQgPSBwczNfYWxsb2NfaW9faXJxKGRldi0+aW50ZXJydXB0X2lkLCAmdmlycSk7CisJcmVzdWx0ID0gcHMzX2FsbG9jX2lvX2lycShQUzNfQklORElOR19DUFVfQU5ZLCBkZXYtPmludGVycnVwdF9pZCwgJnZpcnEpOwogCiAJaWYgKHJlc3VsdCkgewogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogcHMzX2NvbnN0cnVjdF9pb19pcnEoJWQpIGZhaWxlZC5cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2kuaCBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS5oCmluZGV4IDBkYWZjZGEuLmMyYjVlY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS5oCkBAIC01MDcsMTAgKzUwNywxMCBAQAogewogI2lmZGVmIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8KIAlyZXR1cm4gYmlnX2VuZGlhbl9tbWlvKG9oY2kpID8KLQkJcmVhZGxfYmUgKChfX2ZvcmNlIHUzMiAqKXJlZ3MpIDoKLQkJcmVhZGwgKChfX2ZvcmNlIHUzMiAqKXJlZ3MpOworCQlyZWFkbF9iZSAocmVncykgOgorCQlyZWFkbCAocmVncyk7CiAjZWxzZQotCXJldHVybiByZWFkbCAoKF9fZm9yY2UgdTMyICopcmVncyk7CisJcmV0dXJuIHJlYWRsIChyZWdzKTsKICNlbmRpZgogfQogCkBAIC01MTksMTAgKzUxOSwxMCBAQAogewogI2lmZGVmIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8KIAliaWdfZW5kaWFuX21taW8ob2hjaSkgPwotCQl3cml0ZWxfYmUgKHZhbCwgKF9fZm9yY2UgdTMyICopcmVncykgOgotCQl3cml0ZWwgKHZhbCwgKF9fZm9yY2UgdTMyICopcmVncyk7CisJCXdyaXRlbF9iZSAodmFsLCByZWdzKSA6CisJCXdyaXRlbCAodmFsLCByZWdzKTsKICNlbHNlCi0JCXdyaXRlbCAodmFsLCAoX19mb3JjZSB1MzIgKilyZWdzKTsKKwkJd3JpdGVsICh2YWwsIHJlZ3MpOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9nbDYyMGEuYyBiL2RyaXZlcnMvdXNiL25ldC9nbDYyMGEuYwppbmRleCBhNmYwZjRkLi4zMWU1ZmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvZ2w2MjBhLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2dsNjIwYS5jCkBAIC03MCwxMiArNzAsMTIgQEAKIAkoKChHTF9NQVhfUEFDS0VUX0xFTiArIDQpICogR0xfTUFYX1RSQU5TTUlUX1BBQ0tFVFMpICsgNCkKIAogc3RydWN0IGdsX3BhY2tldCB7Ci0JdTMyCQlwYWNrZXRfbGVuZ3RoOworCV9fbGUzMgkJcGFja2V0X2xlbmd0aDsKIAljaGFyCQlwYWNrZXRfZGF0YSBbMV07CiB9OwogCiBzdHJ1Y3QgZ2xfaGVhZGVyIHsKLQl1MzIJCQlwYWNrZXRfY291bnQ7CisJX19sZTMyCQkJcGFja2V0X2NvdW50OwogCXN0cnVjdCBnbF9wYWNrZXQJcGFja2V0czsKIH07CiAKQEAgLTg1LDE1ICs4NSwxNCBAQAogCXN0cnVjdCBnbF9wYWNrZXQJKnBhY2tldDsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKmdsX3NrYjsKIAl1MzIJCQlzaXplOworCXUzMgkJCWNvdW50OwogCiAJaGVhZGVyID0gKHN0cnVjdCBnbF9oZWFkZXIgKikgc2tiLT5kYXRhOwogCiAJLy8gZ2V0IHRoZSBwYWNrZXQgY291bnQgb2YgdGhlIHJlY2VpdmVkIHNrYgotCWxlMzJfdG9fY3B1cygmaGVhZGVyLT5wYWNrZXRfY291bnQpOwotCWlmICgoaGVhZGVyLT5wYWNrZXRfY291bnQgPiBHTF9NQVhfVFJBTlNNSVRfUEFDS0VUUykKLQkJCXx8IChoZWFkZXItPnBhY2tldF9jb3VudCA8IDApKSB7Ci0JCWRiZygiZ2VuZWxpbms6IGludmFsaWQgcmVjZWl2ZWQgcGFja2V0IGNvdW50ICVkIiwKLQkJCWhlYWRlci0+cGFja2V0X2NvdW50KTsKKwljb3VudCA9IGxlMzJfdG9fY3B1KGhlYWRlci0+cGFja2V0X2NvdW50KTsKKwlpZiAoY291bnQgPiBHTF9NQVhfVFJBTlNNSVRfUEFDS0VUUykgeworCQlkYmcoImdlbmVsaW5rOiBpbnZhbGlkIHJlY2VpdmVkIHBhY2tldCBjb3VudCAldSIsIGNvdW50KTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMDMsNyArMTAyLDcgQEAKIAkvLyBkZWNyZW1lbnQgdGhlIGxlbmd0aCBmb3IgdGhlIHBhY2tldCBjb3VudCBzaXplIDQgYnl0ZXMKIAlza2JfcHVsbChza2IsIDQpOwogCi0Jd2hpbGUgKGhlYWRlci0+cGFja2V0X2NvdW50ID4gMSkgeworCXdoaWxlIChjb3VudCA+IDEpIHsKIAkJLy8gZ2V0IHRoZSBwYWNrZXQgbGVuZ3RoCiAJCXNpemUgPSBsZTMyX3RvX2NwdShwYWNrZXQtPnBhY2tldF9sZW5ndGgpOwogCkBAIC0xMjQsOSArMTIzLDggQEAKIAkJfQogCiAJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgcGFja2V0Ci0JCXBhY2tldCA9IChzdHJ1Y3QgZ2xfcGFja2V0ICopCi0JCQkmcGFja2V0LT5wYWNrZXRfZGF0YSBbc2l6ZV07Ci0JCWhlYWRlci0+cGFja2V0X2NvdW50LS07CisJCXBhY2tldCA9IChzdHJ1Y3QgZ2xfcGFja2V0ICopJnBhY2tldC0+cGFja2V0X2RhdGFbc2l6ZV07CisJCWNvdW50LS07CiAKIAkJLy8gc2hpZnQgdGhlIGRhdGEgcG9pbnRlciB0byB0aGUgbmV4dCBnbF9wYWNrZXQKIAkJc2tiX3B1bGwoc2tiLCBzaXplICsgNCk7CkBAIC0xNDksOCArMTQ3LDggQEAKIAlpbnQJbGVuZ3RoID0gc2tiLT5sZW47CiAJaW50CWhlYWRyb29tID0gc2tiX2hlYWRyb29tKHNrYik7CiAJaW50CXRhaWxyb29tID0gc2tiX3RhaWxyb29tKHNrYik7Ci0JdTMyCSpwYWNrZXRfY291bnQ7Ci0JdTMyCSpwYWNrZXRfbGVuOworCV9fbGUzMgkqcGFja2V0X2NvdW50OworCV9fbGUzMgkqcGFja2V0X2xlbjsKIAogCS8vIEZJWE1FOiAgbWFnaWMgbnVtYmVycywgYmxlZWNoCiAJcGFkbGVuID0gKChza2ItPmxlbiArICg0ICsgNCoxKSkgJSA2NCkgPyAwIDogMTsKQEAgLTE3Miw3ICsxNzAsNyBAQAogCX0KIAogCS8vIGF0dGFjaCB0aGUgcGFja2V0IGNvdW50IHRvIHRoZSBoZWFkZXIKLQlwYWNrZXRfY291bnQgPSAodTMyICopIHNrYl9wdXNoKHNrYiwgKDQgKyA0KjEpKTsKKwlwYWNrZXRfY291bnQgPSAoX19sZTMyICopIHNrYl9wdXNoKHNrYiwgKDQgKyA0KjEpKTsKIAlwYWNrZXRfbGVuID0gcGFja2V0X2NvdW50ICsgMTsKIAogCSpwYWNrZXRfY291bnQgPSBjcHVfdG9fbGUzMigxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYwppbmRleCAwNmI0ZmZmLi4zZWMyNDg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTAxLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jCkBAIC0xNzAsMTMgKzE3MCwxMyBAQAogCQl1bnNpZ25lZCBpbnQgKmRhdGEsIGludCBzaXplKQogewogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7Ci0JdTMyICpidWY7CisJX19sZTMyICpidWY7CiAJaW50IHJlc3VsdCwgaSwgbGVuZ3RoOwogCiAJLyogTnVtYmVyIG9mIGludGVnZXJzIHJlcXVpcmVkIHRvIGNvbnRhaW4gdGhlIGFycmF5ICovCiAJbGVuZ3RoID0gKCgoc2l6ZSAtIDEpIHwgMykgKyAxKS80OwogCi0JYnVmID0ga2NhbGxvYyhsZW5ndGgsIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKKwlidWYgPSBrY2FsbG9jKGxlbmd0aCwgc2l6ZW9mKF9fbGUzMiksIEdGUF9LRVJORUwpOwogCWlmICghYnVmKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjE2LDEzICsyMTYsMTMgQEAKIAkJdW5zaWduZWQgaW50ICpkYXRhLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwotCXUzMiAqYnVmOworCV9fbGUzMiAqYnVmOwogCWludCByZXN1bHQsIGksIGxlbmd0aDsKIAogCS8qIE51bWJlciBvZiBpbnRlZ2VycyByZXF1aXJlZCB0byBjb250YWluIHRoZSBhcnJheSAqLwogCWxlbmd0aCA9ICgoKHNpemUgLSAxKSB8IDMpICsgMSkvNDsKIAotCWJ1ZiA9IGttYWxsb2MobGVuZ3RoICogc2l6ZW9mKHUzMiksIEdGUF9LRVJORUwpOworCWJ1ZiA9IGttYWxsb2MobGVuZ3RoICogc2l6ZW9mKF9fbGUzMiksIEdGUF9LRVJORUwpOwogCWlmICghYnVmKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsCiAJCQkJX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwppbmRleCA0ZTgzZjAxLi40NWZlNjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9LY29uZmlnCkBAIC0xNDQ0LDggKzE0NDQsOCBAQAogCSAgdXNlZCBtYWlubHkgaW4gdGhlIE1JUFMtYmFzZWQgREVDc3RhdGlvbiBzZXJpZXMuCiAKIGNvbmZpZyBGQl9QTUFHX0JBCi0JYm9vbCAiUE1BRy1CQSBUVVJCT2NoYW5uZWwgZnJhbWVidWZmZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChGQiA9IHkpICYmIFRDCisJdHJpc3RhdGUgIlBNQUctQkEgVFVSQk9jaGFubmVsIGZyYW1lYnVmZmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGQiAmJiBUQwogIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAgCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKICAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKQEAgLTE0NTQsOCArMTQ1NCw4IEBACiAJICB1c2VkIG1haW5seSBpbiB0aGUgTUlQUy1iYXNlZCBERUNzdGF0aW9uIHNlcmllcy4KIAogY29uZmlnIEZCX1BNQUdCX0IKLQlib29sICJQTUFHQi1CIFRVUkJPY2hhbm5lbCBmcmFtZWJ1ZmZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gKEZCID0geSkgJiYgVEMKKwl0cmlzdGF0ZSAiUE1BR0ItQiBUVVJCT2NoYW5uZWwgZnJhbWVidWZmZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRDCiAgCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKICAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbWFnLWJhLWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BtYWctYmEtZmIuYwppbmRleCBmNTM2MWNkLi4yNjRkMzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BtYWctYmEtZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BtYWctYmEtZmIuYwpAQCAtMTUsNyArMTUsOCBAQAogICoJTWljaGFlbCBFbmdlbCA8ZW5nZWxAdW5peC1hZy5vcmc+LAogICoJS2Fyc3RlbiBNZXJrZXIgPG1lcmtlckBsaW51eHRhZy5vcmc+IGFuZAogICoJSGFyYWxkIEtvZXJmZ2VuLgotICoJQ29weXJpZ2h0IChjKSAyMDA1ICBNYWNpZWogVy4gUm96eWNraQorICoJQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2ICBNYWNpZWogVy4gUm96eWNraQorICoJQ29weXJpZ2h0IChjKSAyMDA1ICBKYW1lcyBTaW1tb25zCiAgKgogICoJVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAogICoJUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcwpAQCAtMjgsMjYgKzI5LDIxIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RjLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPGFzbS9kZWMvdGMuaD4KLQogI2luY2x1ZGUgPHZpZGVvL3BtYWctYmEtZmIuaD4KIAogCiBzdHJ1Y3QgcG1hZ2JhZmJfcGFyIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqbmV4dDsKIAl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKm1taW87CiAJdm9sYXRpbGUgdTMyIF9faW9tZW0gKmRhYzsKLQlpbnQgc2xvdDsKIH07CiAKIAotc3RhdGljIHN0cnVjdCBmYl9pbmZvICpyb290X3BtYWdiYWZiX2RldjsKLQogc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBwbWFnYmFmYl9kZWZpbmVkIF9faW5pdGRhdGEgPSB7CiAJLnhyZXMJCT0gMTAyNCwKIAkueXJlcwkJPSA4NjQsCkBAIC0xNDUsMjQgKzE0MSwxOSBAQAogfQogCiAKLXN0YXRpYyBpbnQgX19pbml0IHBtYWdiYWZiX2luaXRfb25lKGludCBzbG90KQorc3RhdGljIGludCBfX2luaXQgcG1hZ2JhZmJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCB0Y19kZXYgKnRkZXYgPSB0b190Y19kZXYoZGV2KTsKKwlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGxlbjsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgcG1hZ2JhZmJfcGFyICpwYXI7Ci0JdW5zaWduZWQgbG9uZyBiYXNlX2FkZHI7CiAKLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbWFnYmFmYl9wYXIpLCBOVUxMKTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbWFnYmFmYl9wYXIpLCBkZXYpOwogCWlmICghaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlwYXIgPSBpbmZvLT5wYXI7Ci0JcGFyLT5zbG90ID0gc2xvdDsKLQljbGFpbV90Y19jYXJkKHBhci0+c2xvdCk7Ci0KLQliYXNlX2FkZHIgPSBnZXRfdGNfYmFzZV9hZGRyKHBhci0+c2xvdCk7Ci0KLQlwYXItPm5leHQgPSByb290X3BtYWdiYWZiX2RldjsKLQlyb290X3BtYWdiYWZiX2RldiA9IGluZm87CisJZGV2X3NldF9kcnZkYXRhKGRldiwgaW5mbyk7CiAKIAlpZiAoZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKSA8IDApCiAJCWdvdG8gZXJyX2FsbG9jOwpAQCAtMTcyLDE1ICsxNjMsMjEgQEAKIAlpbmZvLT52YXIgPSBwbWFnYmFmYl9kZWZpbmVkOwogCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7CiAKKwkvKiBSZXF1ZXN0IHRoZSBJL08gTUVNIHJlc291cmNlLiAgKi8KKwlzdGFydCA9IHRkZXYtPnJlc291cmNlLnN0YXJ0OworCWxlbiA9IHRkZXYtPnJlc291cmNlLmVuZCAtIHN0YXJ0ICsgMTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCwgbGVuLCBkZXYtPmJ1c19pZCkpCisJCWdvdG8gZXJyX2NtYXA7CisKIAkvKiBNTUlPIG1hcHBpbmcgc2V0dXAuICAqLwotCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gYmFzZV9hZGRyOworCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gc3RhcnQ7CiAJcGFyLT5tbWlvID0gaW9yZW1hcF9ub2NhY2hlKGluZm8tPmZpeC5tbWlvX3N0YXJ0LCBpbmZvLT5maXgubW1pb19sZW4pOwogCWlmICghcGFyLT5tbWlvKQotCQlnb3RvIGVycl9jbWFwOworCQlnb3RvIGVycl9yZXNvdXJjZTsKIAlwYXItPmRhYyA9IHBhci0+bW1pbyArIFBNQUdfQkFfQlQ0NTk7CiAKIAkvKiBGcmFtZSBidWZmZXIgbWFwcGluZyBzZXR1cC4gICovCi0JaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBiYXNlX2FkZHIgKyBQTUFHX0JBX0ZCTUVNOworCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gc3RhcnQgKyBQTUFHX0JBX0ZCTUVNOwogCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKGluZm8tPmZpeC5zbWVtX3N0YXJ0LAogCQkJCQkgICAgaW5mby0+Zml4LnNtZW1fbGVuKTsKIAlpZiAoIWluZm8tPnNjcmVlbl9iYXNlKQpAQCAtMTkyLDggKzE4OSwxMCBAQAogCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSA8IDApCiAJCWdvdG8gZXJyX3NtZW1fbWFwOwogCi0JcHJfaW5mbygiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZSBpbiBzbG90ICVkXG4iLAotCQlpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQsIHBhci0+c2xvdCk7CisJZ2V0X2RldmljZShkZXYpOworCisJcHJfaW5mbygiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZSBhdCAlc1xuIiwKKwkJaW5mby0+bm9kZSwgaW5mby0+Zml4LmlkLCBkZXYtPmJ1c19pZCk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMjA0LDU0ICsyMDMsNjggQEAKIGVycl9tbWlvX21hcDoKIAlpb3VubWFwKHBhci0+bW1pbyk7CiAKK2Vycl9yZXNvdXJjZToKKwlyZWxlYXNlX21lbV9yZWdpb24oc3RhcnQsIGxlbik7CisKIGVycl9jbWFwOgogCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAKIGVycl9hbGxvYzoKLQlyb290X3BtYWdiYWZiX2RldiA9IHBhci0+bmV4dDsKLQlyZWxlYXNlX3RjX2NhcmQocGFyLT5zbG90KTsKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCXJldHVybiAtRU5YSU87CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBwbWFnYmFmYl9leGl0X29uZSh2b2lkKQorc3RhdGljIGludCBfX2V4aXQgcG1hZ2JhZmJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHJvb3RfcG1hZ2JhZmJfZGV2OworCXN0cnVjdCB0Y19kZXYgKnRkZXYgPSB0b190Y19kZXYoZGV2KTsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBwbWFnYmFmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGxlbjsKIAorCXB1dF9kZXZpY2UoZGV2KTsKIAl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwogCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwogCWlvdW5tYXAocGFyLT5tbWlvKTsKKwlzdGFydCA9IHRkZXYtPnJlc291cmNlLnN0YXJ0OworCWxlbiA9IHRkZXYtPnJlc291cmNlLmVuZCAtIHN0YXJ0ICsgMTsKKwlyZWxlYXNlX21lbV9yZWdpb24oc3RhcnQsIGxlbik7CiAJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKLQlyb290X3BtYWdiYWZiX2RldiA9IHBhci0+bmV4dDsKLQlyZWxlYXNlX3RjX2NhcmQocGFyLT5zbG90KTsKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCXJldHVybiAwOwogfQogCiAKIC8qCi0gKiBJbml0aWFsaXNlIHRoZSBmcmFtZWJ1ZmZlci4KKyAqIEluaXRpYWxpemUgdGhlIGZyYW1lYnVmZmVyLgogICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHRjX2RldmljZV9pZCBwbWFnYmFmYl90Y190YWJsZVtdID0geworCXsgIkRFQyAgICAgIiwgIlBNQUctQkEgIiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodGMsIHBtYWdiYWZiX3RjX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCB0Y19kcml2ZXIgcG1hZ2JhZmJfZHJpdmVyID0geworCS5pZF90YWJsZQk9IHBtYWdiYWZiX3RjX3RhYmxlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJwbWFnYmFmYiIsCisJCS5idXMJPSAmdGNfYnVzX3R5cGUsCisJCS5wcm9iZQk9IHBtYWdiYWZiX3Byb2JlLAorCQkucmVtb3ZlCT0gX19leGl0X3AocG1hZ2JhZmJfcmVtb3ZlKSwKKwl9LAorfTsKKwogc3RhdGljIGludCBfX2luaXQgcG1hZ2JhZmJfaW5pdCh2b2lkKQogewotCWludCBjb3VudCA9IDA7Ci0JaW50IHNsb3Q7Ci0KKyNpZm5kZWYgTU9EVUxFCiAJaWYgKGZiX2dldF9vcHRpb25zKCJwbWFnYmFmYiIsIE5VTEwpKQogCQlyZXR1cm4gLUVOWElPOwotCi0Jd2hpbGUgKChzbG90ID0gc2VhcmNoX3RjX2NhcmQoIlBNQUctQkEiKSkgPj0gMCkgewotCQlpZiAocG1hZ2JhZmJfaW5pdF9vbmUoc2xvdCkgPCAwKQotCQkJYnJlYWs7Ci0JCWNvdW50Kys7Ci0JfQotCXJldHVybiAoY291bnQgPiAwKSA/IDAgOiAtRU5YSU87CisjZW5kaWYKKwlyZXR1cm4gdGNfcmVnaXN0ZXJfZHJpdmVyKCZwbWFnYmFmYl9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcG1hZ2JhZmJfZXhpdCh2b2lkKQogewotCXdoaWxlIChyb290X3BtYWdiYWZiX2RldikKLQkJcG1hZ2JhZmJfZXhpdF9vbmUoKTsKKwl0Y191bnJlZ2lzdGVyX2RyaXZlcigmcG1hZ2JhZmJfZHJpdmVyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BtYWdiLWItZmIuYyBiL2RyaXZlcnMvdmlkZW8vcG1hZ2ItYi1mYi5jCmluZGV4IGEwNmEwNjQuLjdhMGNlN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcG1hZ2ItYi1mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcG1hZ2ItYi1mYi5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKglNaWNoYWVsIEVuZ2VsIDxlbmdlbEB1bml4LWFnLm9yZz4sCiAgKglLYXJzdGVuIE1lcmtlciA8bWVya2VyQGxpbnV4dGFnLm9yZz4gYW5kCiAgKglIYXJhbGQgS29lcmZnZW4uCi0gKglDb3B5cmlnaHQgKGMpIDIwMDUgIE1hY2llaiBXLiBSb3p5Y2tpCisgKglDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgIE1hY2llaiBXLiBSb3p5Y2tpCiAgKgogICoJVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAogICoJUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcwpAQCAtMjUsMTggKzI1LDE2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RjLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPGFzbS9kZWMvdGMuaD4KLQogI2luY2x1ZGUgPHZpZGVvL3BtYWdiLWItZmIuaD4KIAogCiBzdHJ1Y3QgcG1hZ2JiZmJfcGFyIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqbmV4dDsKIAl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKm1taW87CiAJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpzbWVtOwogCXZvbGF0aWxlIHUzMiBfX2lvbWVtICpzZmI7CkBAIC00Nyw4ICs0NSw2IEBACiB9OwogCiAKLXN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyAqcm9vdF9wbWFnYmJmYl9kZXY7Ci0KIHN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gcG1hZ2JiZmJfZGVmaW5lZCBfX2luaXRkYXRhID0gewogCS5iaXRzX3Blcl9waXhlbAk9IDgsCiAJLnJlZC5sZW5ndGgJPSA4LApAQCAtMTkwLDggKzE4Niw5IEBACiAJCTY5MTk3LCA2NjAwMCwgNjUwMDAsIDUwMzUwLCAzNjAwMCwgMzIwMDAsIDI1MTc1CiAJfTsKIAlzdHJ1Y3QgcG1hZ2JiZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IHRjX2J1cyAqdGJ1cyA9IHRvX3RjX2RldihpbmZvLT5kZXZpY2UpLT5idXM7CiAJdTMyIGNvdW50MCA9IDgsIGNvdW50MSA9IDgsIGNvdW50dGMgPSAxNiAqIDI1NiArIDg7Ci0JdTMyIGZyZXEwLCBmcmVxMSwgZnJlcXRjID0gZ2V0X3RjX3NwZWVkKCkgLyAyNTA7CisJdTMyIGZyZXEwLCBmcmVxMSwgZnJlcXRjID0gdGNfZ2V0X3NwZWVkKHRidXMpIC8gMjUwOwogCWludCBpLCBqOwogCiAJZ3AwX3dyaXRlKHBhciwgMCk7CQkJCS8qIHNlbGVjdCBPc2MwICovCkBAIC0yNDksMjYgKzI0NiwyMSBAQAogfTsKIAogCi1zdGF0aWMgaW50IF9faW5pdCBwbWFnYmJmYl9pbml0X29uZShpbnQgc2xvdCkKK3N0YXRpYyBpbnQgX19pbml0IHBtYWdiYmZiX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQljaGFyIGZyZXEwWzEyXSwgZnJlcTFbMTJdOworCXN0cnVjdCB0Y19kZXYgKnRkZXYgPSB0b190Y19kZXYoZGV2KTsKKwlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGxlbjsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgcG1hZ2JiZmJfcGFyICpwYXI7Ci0JdW5zaWduZWQgbG9uZyBiYXNlX2FkZHI7CisJY2hhciBmcmVxMFsxMl0sIGZyZXExWzEyXTsKIAl1MzIgdmlkX2Jhc2U7CiAKLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbWFnYmJmYl9wYXIpLCBOVUxMKTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbWFnYmJmYl9wYXIpLCBkZXYpOwogCWlmICghaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlwYXIgPSBpbmZvLT5wYXI7Ci0JcGFyLT5zbG90ID0gc2xvdDsKLQljbGFpbV90Y19jYXJkKHBhci0+c2xvdCk7Ci0KLQliYXNlX2FkZHIgPSBnZXRfdGNfYmFzZV9hZGRyKHBhci0+c2xvdCk7Ci0KLQlwYXItPm5leHQgPSByb290X3BtYWdiYmZiX2RldjsKLQlyb290X3BtYWdiYmZiX2RldiA9IGluZm87CisJZGV2X3NldF9kcnZkYXRhKGRldiwgaW5mbyk7CiAKIAlpZiAoZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKSA8IDApCiAJCWdvdG8gZXJyX2FsbG9jOwpAQCAtMjc4LDE2ICsyNzAsMjIgQEAKIAlpbmZvLT52YXIgPSBwbWFnYmJmYl9kZWZpbmVkOwogCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7CiAKKwkvKiBSZXF1ZXN0IHRoZSBJL08gTUVNIHJlc291cmNlLiAgKi8KKwlzdGFydCA9IHRkZXYtPnJlc291cmNlLnN0YXJ0OworCWxlbiA9IHRkZXYtPnJlc291cmNlLmVuZCAtIHN0YXJ0ICsgMTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCwgbGVuLCBkZXYtPmJ1c19pZCkpCisJCWdvdG8gZXJyX2NtYXA7CisKIAkvKiBNTUlPIG1hcHBpbmcgc2V0dXAuICAqLwotCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gYmFzZV9hZGRyOworCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gc3RhcnQ7CiAJcGFyLT5tbWlvID0gaW9yZW1hcF9ub2NhY2hlKGluZm8tPmZpeC5tbWlvX3N0YXJ0LCBpbmZvLT5maXgubW1pb19sZW4pOwogCWlmICghcGFyLT5tbWlvKQotCQlnb3RvIGVycl9jbWFwOworCQlnb3RvIGVycl9yZXNvdXJjZTsKIAlwYXItPnNmYiA9IHBhci0+bW1pbyArIFBNQUdCX0JfU0ZCOwogCXBhci0+ZGFjID0gcGFyLT5tbWlvICsgUE1BR0JfQl9CVDQ1OTsKIAogCS8qIEZyYW1lIGJ1ZmZlciBtYXBwaW5nIHNldHVwLiAgKi8KLQlpbmZvLT5maXguc21lbV9zdGFydCA9IGJhc2VfYWRkciArIFBNQUdCX0JfRkJNRU07CisJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBzdGFydCArIFBNQUdCX0JfRkJNRU07CiAJcGFyLT5zbWVtID0gaW9yZW1hcF9ub2NhY2hlKGluZm8tPmZpeC5zbWVtX3N0YXJ0LCBpbmZvLT5maXguc21lbV9sZW4pOwogCWlmICghcGFyLT5zbWVtKQogCQlnb3RvIGVycl9tbWlvX21hcDsKQEAgLTMwMiwxMyArMzAwLDE1IEBACiAJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pIDwgMCkKIAkJZ290byBlcnJfc21lbV9tYXA7CiAKKwlnZXRfZGV2aWNlKGRldik7CisKIAlzbnByaW50ZihmcmVxMCwgc2l6ZW9mKGZyZXEwKSwgIiV1LiUwM3VNSHoiLAogCQkgcGFyLT5vc2MwIC8gMTAwMCwgcGFyLT5vc2MwICUgMTAwMCk7CiAJc25wcmludGYoZnJlcTEsIHNpemVvZihmcmVxMSksICIldS4lMDN1TUh6IiwKIAkJIHBhci0+b3NjMSAvIDEwMDAsIHBhci0+b3NjMSAlIDEwMDApOwogCi0JcHJfaW5mbygiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZSBpbiBzbG90ICVkXG4iLAotCQlpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQsIHBhci0+c2xvdCk7CisJcHJfaW5mbygiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZSBhdCAlc1xuIiwKKwkJaW5mby0+bm9kZSwgaW5mby0+Zml4LmlkLCBkZXYtPmJ1c19pZCk7CiAJcHJfaW5mbygiZmIlZDogT3NjMDogJXMsIE9zYzE6ICVzLCBPc2MldSBzZWxlY3RlZFxuIiwKIAkJaW5mby0+bm9kZSwgZnJlcTAsIHBhci0+b3NjMSA/IGZyZXExIDogImRpc2FibGVkIiwKIAkJcGFyLT5vc2MxICE9IDApOwpAQCAtMzIyLDU0ICszMjIsNjggQEAKIGVycl9tbWlvX21hcDoKIAlpb3VubWFwKHBhci0+bW1pbyk7CiAKK2Vycl9yZXNvdXJjZToKKwlyZWxlYXNlX21lbV9yZWdpb24oc3RhcnQsIGxlbik7CisKIGVycl9jbWFwOgogCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAKIGVycl9hbGxvYzoKLQlyb290X3BtYWdiYmZiX2RldiA9IHBhci0+bmV4dDsKLQlyZWxlYXNlX3RjX2NhcmQocGFyLT5zbG90KTsKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCXJldHVybiAtRU5YSU87CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBwbWFnYmJmYl9leGl0X29uZSh2b2lkKQorc3RhdGljIGludCBfX2V4aXQgcG1hZ2JiZmJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHJvb3RfcG1hZ2JiZmJfZGV2OworCXN0cnVjdCB0Y19kZXYgKnRkZXYgPSB0b190Y19kZXYoZGV2KTsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBwbWFnYmJmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGxlbjsKIAorCXB1dF9kZXZpY2UoZGV2KTsKIAl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwogCWlvdW5tYXAocGFyLT5zbWVtKTsKIAlpb3VubWFwKHBhci0+bW1pbyk7CisJc3RhcnQgPSB0ZGV2LT5yZXNvdXJjZS5zdGFydDsKKwlsZW4gPSB0ZGV2LT5yZXNvdXJjZS5lbmQgLSBzdGFydCArIDE7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHN0YXJ0LCBsZW4pOwogCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7Ci0Jcm9vdF9wbWFnYmJmYl9kZXYgPSBwYXItPm5leHQ7Ci0JcmVsZWFzZV90Y19jYXJkKHBhci0+c2xvdCk7CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwlyZXR1cm4gMDsKIH0KIAogCiAvKgotICogSW5pdGlhbGlzZSB0aGUgZnJhbWVidWZmZXIuCisgKiBJbml0aWFsaXplIHRoZSBmcmFtZWJ1ZmZlci4KICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0Y19kZXZpY2VfaWQgcG1hZ2JiZmJfdGNfdGFibGVbXSA9IHsKKwl7ICJERUMgICAgICIsICJQTUFHQi1CQSIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHRjLCBwbWFnYmJmYl90Y190YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgdGNfZHJpdmVyIHBtYWdiYmZiX2RyaXZlciA9IHsKKwkuaWRfdGFibGUJPSBwbWFnYmJmYl90Y190YWJsZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicG1hZ2JiZmIiLAorCQkuYnVzCT0gJnRjX2J1c190eXBlLAorCQkucHJvYmUJPSBwbWFnYmJmYl9wcm9iZSwKKwkJLnJlbW92ZQk9IF9fZXhpdF9wKHBtYWdiYmZiX3JlbW92ZSksCisJfSwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHBtYWdiYmZiX2luaXQodm9pZCkKIHsKLQlpbnQgY291bnQgPSAwOwotCWludCBzbG90OwotCisjaWZuZGVmIE1PRFVMRQogCWlmIChmYl9nZXRfb3B0aW9ucygicG1hZ2JiZmIiLCBOVUxMKSkKIAkJcmV0dXJuIC1FTlhJTzsKLQotCXdoaWxlICgoc2xvdCA9IHNlYXJjaF90Y19jYXJkKCJQTUFHQi1CQSIpKSA+PSAwKSB7Ci0JCWlmIChwbWFnYmJmYl9pbml0X29uZShzbG90KSA8IDApCi0JCQlicmVhazsKLQkJY291bnQrKzsKLQl9Ci0JcmV0dXJuIChjb3VudCA+IDApID8gMCA6IC1FTlhJTzsKKyNlbmRpZgorCXJldHVybiB0Y19yZWdpc3Rlcl9kcml2ZXIoJnBtYWdiYmZiX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwbWFnYmJmYl9leGl0KHZvaWQpCiB7Ci0Jd2hpbGUgKHJvb3RfcG1hZ2JiZmJfZGV2KQotCQlwbWFnYmJmYl9leGl0X29uZSgpOworCXRjX3VucmVnaXN0ZXJfZHJpdmVyKCZwbWFnYmJmYl9kcml2ZXIpOwogfQogCiAKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19pbm9kZS5jIGIvZnMvOXAvdmZzX2lub2RlLmMKaW5kZXggOTEwOWJhMS4uMzc4NzY3YyAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2lub2RlLmMKKysrIGIvZnMvOXAvdmZzX2lub2RlLmMKQEAgLTU4NSwxNyArNTg1LDE0IEBACiAJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJZXJyID0gUFRSX0VSUihpbm9kZSk7CiAJCWlub2RlID0gTlVMTDsKLQkJZ290byBjbGVhbl91cF9maWRzOworCQl2OWZzX2ZpZF9kZXN0cm95KHZmaWQpOworCQlnb3RvIGVycm9yOwogCX0KIAogCWRlbnRyeS0+ZF9vcCA9ICZ2OWZzX2RlbnRyeV9vcGVyYXRpb25zOwogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJcmV0dXJuIDA7CiAKLWNsZWFuX3VwX2ZpZHM6Ci0JaWYgKHZmaWQpCi0JCXY5ZnNfZmlkX2Rlc3Ryb3kodmZpZCk7Ci0KIGNsZWFuX3VwX2RmaWQ6CiAJdjlmc19maWRfY2x1bmsodjlzZXMsIGRmaWQpOwogCmRpZmYgLS1naXQgYS9mcy9kbG0vbG93Y29tbXMtdGNwLmMgYi9mcy9kbG0vbG93Y29tbXMtdGNwLmMKaW5kZXggZjFlZmQxNy4uMDdlMGExMiAxMDA2NDQKLS0tIGEvZnMvZGxtL2xvd2NvbW1zLXRjcC5jCisrKyBiL2ZzL2RsbS9sb3djb21tcy10Y3AuYwpAQCAtMjY4LDEyICsyNjgsMTIgQEAKIHN0YXRpYyBpbnQgcmVjZWl2ZV9mcm9tX3NvY2soc3RydWN0IGNvbm5lY3Rpb24gKmNvbikKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbXNnaGRyIG1zZzsKLQlzdHJ1Y3QgaW92ZWMgaW92WzJdOwotCW1tX3NlZ21lbnRfdCBmczsKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHt9OworCXN0cnVjdCBrdmVjIGlvdlsyXTsKIAl1bnNpZ25lZCBsZW47CiAJaW50IHI7CiAJaW50IGNhbGxfYWdhaW5fc29vbiA9IDA7CisJaW50IG52ZWM7CiAKIAltdXRleF9sb2NrKCZjb24tPnNvY2tfbXV0ZXgpOwogCkBAIC0yOTMsMjEgKzI5MywxMyBAQAogCQljYnVmX2luaXQoJmNvbi0+Y2IsIFBBR0VfQ0FDSEVfU0laRSk7CiAJfQogCi0JbXNnLm1zZ19jb250cm9sID0gTlVMTDsKLQltc2cubXNnX2NvbnRyb2xsZW4gPSAwOwotCW1zZy5tc2dfaW92bGVuID0gMTsKLQltc2cubXNnX2lvdiA9IGlvdjsKLQltc2cubXNnX25hbWUgPSBOVUxMOwotCW1zZy5tc2dfbmFtZWxlbiA9IDA7Ci0JbXNnLm1zZ19mbGFncyA9IDA7Ci0KIAkvKgogCSAqIGlvdlswXSBpcyB0aGUgYml0IG9mIHRoZSBjaXJjdWxhciBidWZmZXIgYmV0d2VlbiB0aGUgY3VycmVudCBlbmQKIAkgKiBwb2ludCAoY2IuYmFzZSArIGNiLmxlbikgYW5kIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KIAkgKi8KIAlpb3ZbMF0uaW92X2xlbiA9IGNvbi0+Y2IuYmFzZSAtIGNidWZfZGF0YSgmY29uLT5jYik7CiAJaW92WzBdLmlvdl9iYXNlID0gcGFnZV9hZGRyZXNzKGNvbi0+cnhfcGFnZSkgKyBjYnVmX2RhdGEoJmNvbi0+Y2IpOwotCWlvdlsxXS5pb3ZfbGVuID0gMDsKKwludmVjID0gMTsKIAogCS8qCiAJICogaW92WzFdIGlzIHRoZSBiaXQgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUKQEAgLTMxNywxNSArMzA5LDEyIEBACiAJCWlvdlswXS5pb3ZfbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0gY2J1Zl9kYXRhKCZjb24tPmNiKTsKIAkJaW92WzFdLmlvdl9sZW4gPSBjb24tPmNiLmJhc2U7CiAJCWlvdlsxXS5pb3ZfYmFzZSA9IHBhZ2VfYWRkcmVzcyhjb24tPnJ4X3BhZ2UpOwotCQltc2cubXNnX2lvdmxlbiA9IDI7CisJCW52ZWMgPSAyOwogCX0KIAlsZW4gPSBpb3ZbMF0uaW92X2xlbiArIGlvdlsxXS5pb3ZfbGVuOwogCi0JZnMgPSBnZXRfZnMoKTsKLQlzZXRfZnMoZ2V0X2RzKCkpOwotCXIgPSByZXQgPSBzb2NrX3JlY3Ztc2coY29uLT5zb2NrLCAmbXNnLCBsZW4sCisJciA9IHJldCA9IGtlcm5lbF9yZWN2bXNnKGNvbi0+c29jaywgJm1zZywgaW92LCBudmVjLCBsZW4sCiAJCQkgICAgICAgTVNHX0RPTlRXQUlUIHwgTVNHX05PU0lHTkFMKTsKLQlzZXRfZnMoZnMpOwogCiAJaWYgKHJldCA8PSAwKQogCQlnb3RvIG91dF9jbG9zZTsKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2NyeXB0by5jIGIvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKaW5kZXggNzE5NmY1MC4uYTg2YTU1YyAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKKysrIGIvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKQEAgLTgyOCw5ICs4MjgsNyBAQAogCQltdXRleF91bmxvY2soJmNyeXB0X3N0YXQtPmNzX3RmbV9tdXRleCk7CiAJCWdvdG8gb3V0OwogCX0KLQljcnlwdG9fYmxrY2lwaGVyX3NldF9mbGFncyhjcnlwdF9zdGF0LT50Zm0sCi0JCQkJICAgKEVDUllQVEZTX0RFRkFVTFRfQ0hBSU5JTkdfTU9ERQotCQkJCSAgICB8IENSWVBUT19URk1fUkVRX1dFQUtfS0VZKSk7CisJY3J5cHRvX2Jsa2NpcGhlcl9zZXRfZmxhZ3MoY3J5cHRfc3RhdC0+dGZtLCBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSk7CiAJbXV0ZXhfdW5sb2NrKCZjcnlwdF9zdGF0LT5jc190Zm1fbXV0ZXgpOwogCXJjID0gMDsKIG91dDoKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oIGIvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKaW5kZXggYWZiNjRiZC4uMGY4OTcxMCAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKKysrIGIvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKQEAgLTE3Niw3ICsxNzYsNiBAQAogI2RlZmluZSBFQ1JZUFRGU19GSUxFX1NJWkVfQllURVMgOAogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0NJUEhFUiAiYWVzIgogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0tFWV9CWVRFUyAxNgotI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0NIQUlOSU5HX01PREUgQ1JZUFRPX1RGTV9NT0RFX0NCQwogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0hBU0ggIm1kNSIKICNkZWZpbmUgRUNSWVBURlNfVEFHXzNfUEFDS0VUX1RZUEUgMHg4QwogI2RlZmluZSBFQ1JZUFRGU19UQUdfMTFfUEFDS0VUX1RZUEUgMHhFRApkaWZmIC0tZ2l0IGEvZnMvaHVnZXRsYmZzL2lub2RlLmMgYi9mcy9odWdldGxiZnMvaW5vZGUuYwppbmRleCA0ZjRjZDEzLi5lNmJkNTUzIDEwMDY0NAotLS0gYS9mcy9odWdldGxiZnMvaW5vZGUuYworKysgYi9mcy9odWdldGxiZnMvaW5vZGUuYwpAQCAtNDQ5LDEwICs0NDksMTMgQEAKIH0KIAogLyoKLSAqIEZvciBkaXJlY3QtSU8gcmVhZHMgaW50byBodWdldGxiIHBhZ2VzCisgKiBtYXJrIHRoZSBoZWFkIHBhZ2UgZGlydHkKICAqLwogc3RhdGljIGludCBodWdldGxiZnNfc2V0X3BhZ2VfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CisJc3RydWN0IHBhZ2UgKmhlYWQgPSAoc3RydWN0IHBhZ2UgKilwYWdlX3ByaXZhdGUocGFnZSk7CisKKwlTZXRQYWdlRGlydHkoaGVhZCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9kaXIuYyBiL2ZzL3Vmcy9kaXIuYwppbmRleCA0MzNiNmY2Li5hNmMwY2E5IDEwMDY0NAotLS0gYS9mcy91ZnMvZGlyLmMKKysrIGIvZnMvdWZzL2Rpci5jCkBAIC0xMDYsMTIgKzEwNiwxMyBAQAogCWNoYXIgKmthZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwogCXVuc2lnbmVkIG9mZnMsIHJlY19sZW47CiAJdW5zaWduZWQgbGltaXQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJY29uc3QgdW5zaWduZWQgY2h1bmtfbWFzayA9IFVGU19TQihzYiktPnNfdXNwaS0+c19kaXJibGtzaXplIC0gMTsKIAlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqcDsKIAljaGFyICplcnJvcjsKIAogCWlmICgoZGlyLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVCkgPT0gcGFnZS0+aW5kZXgpIHsKIAkJbGltaXQgPSBkaXItPmlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7Ci0JCWlmIChsaW1pdCAmIChVRlNfU0VDVE9SX1NJWkUgLSAxKSkKKwkJaWYgKGxpbWl0ICYgY2h1bmtfbWFzaykKIAkJCWdvdG8gRWJhZHNpemU7CiAJCWlmICghbGltaXQpCiAJCQlnb3RvIG91dDsKQEAgLTEyNiw3ICsxMjcsNyBAQAogCQkJZ290byBFYWxpZ247CiAJCWlmIChyZWNfbGVuIDwgVUZTX0RJUl9SRUNfTEVOKHVmc19nZXRfZGVfbmFtbGVuKHNiLCBwKSkpCiAJCQlnb3RvIEVuYW1lbGVuOwotCQlpZiAoKChvZmZzICsgcmVjX2xlbiAtIDEpIF4gb2ZmcykgJiB+KFVGU19TRUNUT1JfU0laRS0xKSkKKwkJaWYgKCgob2ZmcyArIHJlY19sZW4gLSAxKSBeIG9mZnMpICYgfmNodW5rX21hc2spCiAJCQlnb3RvIEVzcGFuOwogCQlpZiAoZnMzMl90b19jcHUoc2IsIHAtPmRfaW5vKSA+IChVRlNfU0Ioc2IpLT5zX3VzcGktPnNfaXBnICoKIAkJCQkJCSAgVUZTX1NCKHNiKS0+c191c3BpLT5zX25jZykpCkBAIC0zMTAsNiArMzExLDcgQEAKIAlpbnQgbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOwogCXVuc2lnbmVkIHJlY2xlbiA9IFVGU19ESVJfUkVDX0xFTihuYW1lbGVuKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgY2h1bmtfc2l6ZSA9IFVGU19TQihzYiktPnNfdXNwaS0+c19kaXJibGtzaXplOwogCXVuc2lnbmVkIHNob3J0IHJlY19sZW4sIG5hbWVfbGVuOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqZGU7CkBAIC0zNDIsOCArMzQ0LDggQEAKIAkJCWlmICgoY2hhciAqKWRlID09IGRpcl9lbmQpIHsKIAkJCQkvKiBXZSBoaXQgaV9zaXplICovCiAJCQkJbmFtZV9sZW4gPSAwOwotCQkJCXJlY19sZW4gPSBVRlNfU0VDVE9SX1NJWkU7Ci0JCQkJZGUtPmRfcmVjbGVuID0gY3B1X3RvX2ZzMTYoc2IsIFVGU19TRUNUT1JfU0laRSk7CisJCQkJcmVjX2xlbiA9IGNodW5rX3NpemU7CisJCQkJZGUtPmRfcmVjbGVuID0gY3B1X3RvX2ZzMTYoc2IsIGNodW5rX3NpemUpOwogCQkJCWRlLT5kX2lubyA9IDA7CiAJCQkJZ290byBnb3RfaXQ7CiAJCQl9CkBAIC00MzEsNyArNDMzLDcgQEAKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gcG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKIAl1bnNpZ25lZCBsb25nIG4gPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IHVmc19kaXJfcGFnZXMoaW5vZGUpOwotCXVuc2lnbmVkIGNodW5rX21hc2sgPSB+KFVGU19TRUNUT1JfU0laRSAtIDEpOworCXVuc2lnbmVkIGNodW5rX21hc2sgPSB+KFVGU19TQihzYiktPnNfdXNwaS0+c19kaXJibGtzaXplIC0gMSk7CiAJaW50IG5lZWRfcmV2YWxpZGF0ZSA9IGZpbHAtPmZfdmVyc2lvbiAhPSBpbm9kZS0+aV92ZXJzaW9uOwogCXVuc2lnbmVkIGZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKIApAQCAtNTExLDcgKzUxMyw3IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKIAljaGFyICprYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKLQl1bnNpZ25lZCBmcm9tID0gKChjaGFyKilkaXIgLSBrYWRkcikgJiB+KFVGU19TRUNUT1JfU0laRSAtIDEpOworCXVuc2lnbmVkIGZyb20gPSAoKGNoYXIqKWRpciAtIGthZGRyKSAmIH4oVUZTX1NCKHNiKS0+c191c3BpLT5zX2RpcmJsa3NpemUgLSAxKTsKIAl1bnNpZ25lZCB0byA9ICgoY2hhciopZGlyIC0ga2FkZHIpICsgZnMxNl90b19jcHUoc2IsIGRpci0+ZF9yZWNsZW4pOwogCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpwZGUgPSBOVUxMOwogCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSAoa2FkZHIgKyBmcm9tKTsKQEAgLTU1Niw2ICs1NTgsNyBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gZGlyLT5pX3NiOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCAwKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgY2h1bmtfc2l6ZSA9IFVGU19TQihzYiktPnNfdXNwaS0+c19kaXJibGtzaXplOwogCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGU7CiAJY2hhciAqYmFzZTsKIAlpbnQgZXJyOwpAQCAtNTYzLDcgKzU2Niw3IEBACiAJaWYgKCFwYWdlKQogCQlyZXR1cm4gLUVOT01FTTsKIAlrbWFwKHBhZ2UpOwotCWVyciA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIDAsIFVGU19TRUNUT1JfU0laRSk7CisJZXJyID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgMCwgY2h1bmtfc2l6ZSk7CiAJaWYgKGVycikgewogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJZ290byBmYWlsOwpAQCAtNTg0LDExICs1ODcsMTEgQEAKIAkJKChjaGFyICopZGUgKyBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKSk7CiAJZGUtPmRfaW5vID0gY3B1X3RvX2ZzMzIoc2IsIGRpci0+aV9pbm8pOwogCXVmc19zZXRfZGVfdHlwZShzYiwgZGUsIGRpci0+aV9tb2RlKTsKLQlkZS0+ZF9yZWNsZW4gPSBjcHVfdG9fZnMxNihzYiwgVUZTX1NFQ1RPUl9TSVpFIC0gVUZTX0RJUl9SRUNfTEVOKDEpKTsKKwlkZS0+ZF9yZWNsZW4gPSBjcHVfdG9fZnMxNihzYiwgY2h1bmtfc2l6ZSAtIFVGU19ESVJfUkVDX0xFTigxKSk7CiAJdWZzX3NldF9kZV9uYW1sZW4oc2IsIGRlLCAyKTsKIAlzdHJjcHkgKGRlLT5kX25hbWUsICIuLiIpOwogCi0JZXJyID0gdWZzX2NvbW1pdF9jaHVuayhwYWdlLCAwLCBVRlNfU0VDVE9SX1NJWkUpOworCWVyciA9IHVmc19jb21taXRfY2h1bmsocGFnZSwgMCwgY2h1bmtfc2l6ZSk7CiBmYWlsOgogCWt1bm1hcChwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CmRpZmYgLS1naXQgYS9mcy91ZnMvc3VwZXIuYyBiL2ZzL3Vmcy9zdXBlci5jCmluZGV4IDhhOGU5MzguLjIwOWJlOTUgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy9zdXBlci5jCisrKyBiL2ZzL3Vmcy9zdXBlci5jCkBAIC02NDksNyArNjQ5LDcgQEAKIAkJa21hbGxvYyAoc2l6ZW9mKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1c3BpKQogCQlnb3RvIGZhaWxlZDsKLQorCXVzcGktPnNfZGlyYmxrc2l6ZSA9IFVGU19TRUNUT1JfU0laRTsKIAlzdXBlcl9ibG9ja19vZmZzZXQ9VUZTX1NCTE9DSzsKIAogCS8qIEtlZXAgMkdpZyBmaWxlIGxpbWl0LiBTb21lIFVGUyB2YXJpYW50cyBuZWVkIHRvIG92ZXJyaWRlIApAQCAtNzE4LDYgKzcxOCw3IEBACiAJCWJyZWFrOwogCQogCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfTkVYVFNURVA6CisJCS8qVE9ETzogY2hlY2sgbWF5IGJlIHdlIG5lZWQgc2V0IHNwZWNpYWwgZGlyIGJsb2NrIHNpemU/Ki8KIAkJVUZTRCgidWZzdHlwZT1uZXh0c3RlcFxuIik7CiAJCXVzcGktPnNfZnNpemUgPSBibG9ja19zaXplID0gMTAyNDsKIAkJdXNwaS0+c19mbWFzayA9IH4oMTAyNCAtIDEpOwpAQCAtNzMzLDYgKzczNCw3IEBACiAJCWJyZWFrOwogCQogCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfTkVYVFNURVBfQ0Q6CisJCS8qVE9ETzogY2hlY2sgbWF5IGJlIHdlIG5lZWQgc2V0IHNwZWNpYWwgZGlyIGJsb2NrIHNpemU/Ki8KIAkJVUZTRCgidWZzdHlwZT1uZXh0c3RlcC1jZFxuIik7CiAJCXVzcGktPnNfZnNpemUgPSBibG9ja19zaXplID0gMjA0ODsKIAkJdXNwaS0+c19mbWFzayA9IH4oMjA0OCAtIDEpOwpAQCAtNzU0LDYgKzc1Niw3IEBACiAJCXVzcGktPnNfZnNoaWZ0ID0gMTA7CiAJCXVzcGktPnNfc2JzaXplID0gc3VwZXJfYmxvY2tfc2l6ZSA9IDIwNDg7CiAJCXVzcGktPnNfc2JiYXNlID0gMDsKKwkJdXNwaS0+c19kaXJibGtzaXplID0gMTAyNDsKIAkJZmxhZ3MgfD0gVUZTX0RFXzQ0QlNEIHwgVUZTX1VJRF80NEJTRCB8IFVGU19TVF80NEJTRCB8IFVGU19DR180NEJTRDsKIAkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCQlpZiAoIXNpbGVudCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2lvLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9pby5oCmluZGV4IDVkMTVhZjIuLjI0YmRjYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvaW8uaApAQCAtNTI1LDE1ICs1MjUsNiBAQAogZXh0ZXJuIHZvaWQgb3V0c2wgKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIAogLyoKLSAqIFhYWCAtIFdlIGRvbid0IGhhdmUgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbWlvKCkgeWV0LCBzbyB3ZSBjaGVhdCBoZXJlIGFuZCAKLSAqIGp1c3QgY29weSBpdC4gVGhlIG5ldCBjb2RlIHdpbGwgdGhlbiBkbyB0aGUgY2hlY2tzdW0gbGF0ZXIuIFByZXNlbnRseSAKLSAqIG9ubHkgdXNlZCBieSBzb21lIHNoYXJlZCBtZW1vcnkgODM5MCBFdGhlcm5ldCBjYXJkcyBhbnl3YXkuCi0gKi8KLQotI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKHNrYixzcmMsbGVuLHVudXNlZCkgXAotICBtZW1jcHlfZnJvbWlvKChza2IpLT5kYXRhLHNyYyxsZW4pCi0KLS8qCiAgKiBUaGUgQWxwaGEgSmVuc2VuIGhhcmR3YXJlIGZvciBzb21lIHJhdGhlciBzdHJhbmdlIHJlYXNvbiBwdXRzCiAgKiB0aGUgUlRDIGNsb2NrIGF0IDB4MTcwIGluc3RlYWQgb2YgMHg3MC4gUHJvYmFibHkgZHVlIHRvIHNvbWUKICAqIG1pc2d1aWRlZCBpZGVhIGFib3V0IHVzaW5nIDB4NzAgZm9yIE5NSSBzdHVmZi4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2lvLmgKaW5kZXggMGQ1MTcyNi4uYjdiNTQxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2lvLmgKQEAgLTIzOCw5ICsyMzgsNiBAQAogI2RlZmluZSBtZW1jcHlfZnJvbWlvKGEsYyxsKQkJX21lbWNweV9mcm9taW8oKGEpLChjKSwobCkpCiAjZGVmaW5lIG1lbWNweV90b2lvKGMsYSxsKQkJX21lbWNweV90b2lvKChjKSwoYSksKGwpKQogCi0jZGVmaW5lIGV0aF9pb19jb3B5X2FuZF9zdW0ocyxjLGwsYikgXAotCQkJCWV0aF9jb3B5X2FuZF9zdW0oKHMpLF9fbWVtX3BjaShjKSwobCksKGIpKQotCiBzdGF0aWMgaW5saW5lIGludAogY2hlY2tfc2lnbmF0dXJlKGNvbnN0IHVuc2lnbmVkIGNoYXIgX19pb21lbSAqYnVzX2FkZHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwKIAkJaW50IGxlbmd0aCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9pby5oIGIvaW5jbHVkZS9hc20tYXJtL2lvLmgKaW5kZXggMjg4Zjc2YjE2Li41ZjYwYjQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vaW8uaApAQCAtMTgyLDkgKzE4Miw2IEBACiAjZGVmaW5lIG1lbWNweV9mcm9taW8oYSxjLGwpCV9tZW1jcHlfZnJvbWlvKChhKSxfX21lbV9wY2koYyksKGwpKQogI2RlZmluZSBtZW1jcHlfdG9pbyhjLGEsbCkJX21lbWNweV90b2lvKF9fbWVtX3BjaShjKSwoYSksKGwpKQogCi0jZGVmaW5lIGV0aF9pb19jb3B5X2FuZF9zdW0ocyxjLGwsYikgXAotCQkJCWV0aF9jb3B5X2FuZF9zdW0oKHMpLF9fbWVtX3BjaShjKSwobCksKGIpKQotCiAjZWxpZiAhZGVmaW5lZChyZWFkYikKIAogI2RlZmluZSByZWFkYihjKQkJCShfX3JlYWR3cml0ZV9idWcoInJlYWRiIiksMCkKQEAgLTE5NCw4ICsxOTEsNiBAQAogI2RlZmluZSB3cml0ZXcodixjKQkJCV9fcmVhZHdyaXRlX2J1Zygid3JpdGV3IikKICNkZWZpbmUgd3JpdGVsKHYsYykJCQlfX3JlYWR3cml0ZV9idWcoIndyaXRlbCIpCiAKLSNkZWZpbmUgZXRoX2lvX2NvcHlfYW5kX3N1bShzLGMsbCxiKQlfX3JlYWR3cml0ZV9idWcoImV0aF9pb19jb3B5X2FuZF9zdW0iKQotCiAjZGVmaW5lIGNoZWNrX3NpZ25hdHVyZShpbyxzaWcsbGVuKQkoMCkKIAogI2VuZGlmCS8qIF9fbWVtX3BjaSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYXQzMmFwNzAwMC5oIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYXQzMmFwNzAwMC5oCmluZGV4IGJhODVlMDQuLjM5MTRkN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2F0MzJhcDcwMDAuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9hdDMyYXA3MDAwLmgKQEAgLTI0LDEwICsyNCwxMiBAQAogI2RlZmluZSBHUElPX1BJT0JfQkFTRQkoR1BJT19QSU9BX0JBU0UgKyAzMikKICNkZWZpbmUgR1BJT19QSU9DX0JBU0UJKEdQSU9fUElPQl9CQVNFICsgMzIpCiAjZGVmaW5lIEdQSU9fUElPRF9CQVNFCShHUElPX1BJT0NfQkFTRSArIDMyKQorI2RlZmluZSBHUElPX1BJT0VfQkFTRQkoR1BJT19QSU9EX0JBU0UgKyAzMikKIAogI2RlZmluZSBHUElPX1BJTl9QQShOKQkoR1BJT19QSU9BX0JBU0UgKyAoTikpCiAjZGVmaW5lIEdQSU9fUElOX1BCKE4pCShHUElPX1BJT0JfQkFTRSArIChOKSkKICNkZWZpbmUgR1BJT19QSU5fUEMoTikJKEdQSU9fUElPQ19CQVNFICsgKE4pKQogI2RlZmluZSBHUElPX1BJTl9QRChOKQkoR1BJT19QSU9EX0JBU0UgKyAoTikpCisjZGVmaW5lIEdQSU9fUElOX1BFKE4pCShHUElPX1BJT0VfQkFTRSArIChOKSkKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfQVQzMkFQNzAwMF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2dwaW8uaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I3NTZiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvZ3Bpby5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX19BU01fQVZSMzJfQVJDSF9HUElPX0gKKyNkZWZpbmUgX19BU01fQVZSMzJfQVJDSF9HUElPX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisKKy8qIEFyY2gtbmV1dHJhbCBHUElPIEFQSSAqLworaW50IF9fbXVzdF9jaGVjayBncGlvX3JlcXVlc3QodW5zaWduZWQgaW50IGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKTsKK3ZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIGludCBncGlvKTsKKworaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGludCBncGlvKTsKK2ludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgaW50IGdwaW8pOworaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGludCBncGlvKTsKK3ZvaWQgZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgaW50IGdwaW8sIGludCB2YWx1ZSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGludCBncGlvKQoreworCXJldHVybiBncGlvICsgR1BJT19JUlFfQkFTRTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaW50IGlycSkKK3sKKwlyZXR1cm4gaXJxIC0gR1BJT19JUlFfQkFTRTsKK30KKworI2VuZGlmIC8qIF9fQVNNX0FWUjMyX0FSQ0hfR1BJT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9pcnEuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZGZmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9pcnEuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9fQVNNX0FWUjMyX0FSQ0hfSVJRX0gKKyNkZWZpbmUgX19BU01fQVZSMzJfQVJDSF9JUlFfSAorCisjZGVmaW5lIEVJTV9JUlFfQkFTRQlOUl9JTlRFUk5BTF9JUlFTCisjZGVmaW5lIE5SX0VJTV9JUlFTCTMyCisKKyNkZWZpbmUgQVQzMl9FWFRJTlQobikJKEVJTV9JUlFfQkFTRSArIChuKSkKKworI2RlZmluZSBHUElPX0lSUV9CQVNFCShFSU1fSVJRX0JBU0UgKyBOUl9FSU1fSVJRUykKKyNkZWZpbmUgTlJfR1BJT19JUlFTCSg1ICogMzIpCisKKyNkZWZpbmUgTlJfSVJRUwkJKEdQSU9fSVJRX0JBU0UgKyBOUl9HUElPX0lSUVMpCisKKyNlbmRpZiAvKiBfX0FTTV9BVlIzMl9BUkNIX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9wb3J0bXV4LmggYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9wb3J0bXV4LmgKaW5kZXggODNjNjkwNS4uOTkzMDg3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvcG9ydG11eC5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL3BvcnRtdXguaApAQCAtMTUsMTIgKzE1LDE0IEBACiAgKgogICogVGhlIGZvbGxvd2luZyBmbGFncyBkZXRlcm1pbmUgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIHBpbi4KICAqLwotI2RlZmluZSBBVDMyX0dQSU9GX1BVTExVUAkweDAwMDAwMDAxCS8qIEVuYWJsZSBwdWxsLXVwICovCi0jZGVmaW5lIEFUMzJfR1BJT0ZfT1VUUFVUCTB4MDAwMDAwMDIJLyogRW5hYmxlIG91dHB1dCBkcml2ZXIgKi8KLSNkZWZpbmUgQVQzMl9HUElPRl9ISUdICQkweDAwMDAwMDA0CS8qIFNldCBvdXRwdXQgaGlnaCAqLworI2RlZmluZSBBVDMyX0dQSU9GX1BVTExVUAkweDAwMDAwMDAxCS8qIChub3QtT1VUKSBFbmFibGUgcHVsbC11cCAqLworI2RlZmluZSBBVDMyX0dQSU9GX09VVFBVVAkweDAwMDAwMDAyCS8qIChPVVQpIEVuYWJsZSBvdXRwdXQgZHJpdmVyICovCisjZGVmaW5lIEFUMzJfR1BJT0ZfSElHSAkJMHgwMDAwMDAwNAkvKiAoT1VUKSBTZXQgb3V0cHV0IGhpZ2ggKi8KKyNkZWZpbmUgQVQzMl9HUElPRl9ERUdMSVRDSAkweDAwMDAwMDA4CS8qIChJTikgRmlsdGVyIGdsaXRjaGVzICovCiAKIHZvaWQgYXQzMl9zZWxlY3RfcGVyaXBoKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBwZXJpcGgsCiAJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKIHZvaWQgYXQzMl9zZWxlY3RfZ3Bpbyh1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3ZvaWQgYXQzMl9yZXNlcnZlX3Bpbih1bnNpZ25lZCBpbnQgcGluKTsKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUE9SVE1VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9jaGVja3N1bS5oCmluZGV4IGFmOWQ1M2YuLjRkZGJmZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvY2hlY2tzdW0uaApAQCAtMzgsNyArMzgsNyBAQAogICoJcGFzc2VkIGluIGFuIGluY29ycmVjdCBrZXJuZWwgYWRkcmVzcyB0byBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLgogICoKICAqCUlmIHlvdSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHBsZWFzZSBkb24ndCBmb3JnZXQgdGhlCi0gKgl2ZXJpZnlfYXJlYSgpLgorICoJYWNjZXNzX29rKCkuCiAgKi8KIHN0YXRpYyBpbmxpbmUKIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2RtYS1tYXBwaW5nLmgKaW5kZXggNWMwMWUyNy4uMTE1ODEzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9kbWEtbWFwcGluZy5oCkBAIC0zMiw2ICszMiwxNCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogZG1hX21hcF9zaW5nbGUgY2FuJ3QgZmFpbCBhcyBpdCBpcyBpbXBsZW1lbnRlZCBub3cuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRtYV9tYXBwaW5nX2Vycm9yKGRtYV9hZGRyX3QgYWRkcikKK3sKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBkbWFfYWxsb2NfY29oZXJlbnQgLSBhbGxvY2F0ZSBjb25zaXN0ZW50IG1lbW9yeSBmb3IgRE1BCiAgKiBAZGV2OiB2YWxpZCBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIsIG9yIE5VTEwgZm9yIElTQSBhbmQgRUlTQS1saWtlIGRldmljZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2dwaW8uaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWU4Y2NjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvZ3Bpby5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfX0FTTV9BVlIzMl9HUElPX0gKKyNkZWZpbmUgX19BU01fQVZSMzJfR1BJT19ICisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisKKyNlbmRpZiAvKiBfX0FTTV9BVlIzMl9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2lycS5oIGIvaW5jbHVkZS9hc20tYXZyMzIvaXJxLmgKaW5kZXggZjdlNzI1Ny4uODNlNjU0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvaXJxLmgKQEAgLTIsOCArMiwxMiBAQAogI2RlZmluZSBfX0FTTV9BVlIzMl9JUlFfSAogCiAjZGVmaW5lIE5SX0lOVEVSTkFMX0lSUVMJNjQKLSNkZWZpbmUgTlJfRVhURVJOQUxfSVJRUwk2NAotI2RlZmluZSBOUl9JUlFTCQkJKE5SX0lOVEVSTkFMX0lSUVMgKyBOUl9FWFRFUk5BTF9JUlFTKQorCisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxLmg+CisKKyNpZm5kZWYgTlJfSVJRUworI2RlZmluZSBOUl9JUlFTCQkJKE5SX0lOVEVSTkFMX0lSUVMpCisjZW5kaWYKIAogI2RlZmluZSBpcnFfY2Fub25pY2FsaXplKGkpCShpKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9wb3NpeF90eXBlcy5oIGIvaW5jbHVkZS9hc20tYXZyMzIvcG9zaXhfdHlwZXMuaAppbmRleCAyODMxYjAzLi45ZTI1NWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9wb3NpeF90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3Bvc2l4X3R5cGVzLmgKQEAgLTIzLDcgKzIzLDcgQEAKIHR5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX3VpZF90OwogdHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfZ2lkX3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcJX19rZXJuZWxfc2l6ZV90OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgX19rZXJuZWxfc3NpemVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfc3NpemVfdDsKIHR5cGVkZWYgaW50ICAgICAgICAgICAgIF9fa2VybmVsX3B0cmRpZmZfdDsKIHR5cGVkZWYgbG9uZyAgICAgICAgICAgIF9fa2VybmVsX3RpbWVfdDsKIHR5cGVkZWYgbG9uZyAgICAgICAgICAgIF9fa2VybmVsX3N1c2Vjb25kc190OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tYXZyMzIvdWFjY2Vzcy5oCmluZGV4IDgyMWRlYjUuLjc0YTY3OWU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvdWFjY2Vzcy5oCkBAIC02OCwxMiArNjgsNiBAQAogCiAjZGVmaW5lIGFjY2Vzc19vayh0eXBlLCBhZGRyLCBzaXplKSAobGlrZWx5KF9fcmFuZ2Vfb2soYWRkciwgc2l6ZSkgPT0gMCkpCiAKLXN0YXRpYyBpbmxpbmUgaW50Ci12ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCBfX3VzZXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpID8gMCA6IC1FRkFVTFQ7Ci19Ci0KIC8qIEdlbmVyaWMgYXJiaXRyYXJ5IHNpemVkIGNvcHkuIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIE5PVCBjb3BpZWQgKi8KIGV4dGVybiBfX2tlcm5lbF9zaXplX3QgX19jb3B5X3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sCiAJCQkJICAgX19rZXJuZWxfc2l6ZV90IG4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9pby5oIGIvaW5jbHVkZS9hc20tY3Jpcy9pby5oCmluZGV4IDcxNmM2OWIuLmQxOTZkZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2lvLmgKQEAgLTEyMSwxMSArMTIxLDYgQEAKICNkZWZpbmUgbWVtY3B5X2Zyb21pbyhhLGIsYykJbWVtY3B5KChhKSwodm9pZCAqKShiKSwoYykpCiAjZGVmaW5lIG1lbWNweV90b2lvKGEsYixjKQltZW1jcHkoKHZvaWQgKikoYSksKGIpLChjKSkKIAotLyoKLSAqIEFnYWluLCBDUklTIGRvZXMgbm90IHJlcXVpcmUgbWVtIElPIHNwZWNpZmljIGZ1bmN0aW9uLgotICovCi0KLSNkZWZpbmUgZXRoX2lvX2NvcHlfYW5kX3N1bShhLGIsYyxkKQlldGhfY29weV9hbmRfc3VtKChhKSwodm9pZCBfX2ZvcmNlICopKGIpLChjKSwoZCkpCiAKIC8qIFRoZSBmb2xsb3dpbmcgaXMganVuayBuZWVkZWQgZm9yIHRoZSBhcmNoLWluZGVwZW5kZW50IGNvZGUgYnV0IHdoaWNoCiAgKiB3ZSBuZXZlciB1c2UgaW4gdGhlIENSSVMgcG9ydApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pby5oIGIvaW5jbHVkZS9hc20taTM4Ni9pby5oCmluZGV4IDg2ZmY1ZTguLjU5ZmU2MTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lvLmgKQEAgLTIxOSwxMiArMjE5LDYgQEAKICNkZWZpbmUgX19JU0FfSU9fYmFzZSAoKGNoYXIgX19pb21lbSAqKShQQUdFX09GRlNFVCkpCiAKIC8qCi0gKiBBZ2FpbiwgaTM4NiBkb2VzIG5vdCByZXF1aXJlIG1lbSBJTyBzcGVjaWZpYyBmdW5jdGlvbi4KLSAqLwotCi0jZGVmaW5lIGV0aF9pb19jb3B5X2FuZF9zdW0oYSxiLGMsZCkJCWV0aF9jb3B5X2FuZF9zdW0oKGEpLCh2b2lkIF9fZm9yY2UgKikoYiksKGMpLChkKSkKLQotLyoKICAqCUNhY2hlIG1hbmFnZW1lbnQKICAqCiAgKglUaGlzIG5lZWRlZCBmb3IgdHdvIGNhc2VzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RlYy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLW1pcHMvZGVjL3N5c3RlbS5oCmluZGV4IDc4YWY1MWYuLmIyYWZhY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZGVjL3N5c3RlbS5oCkBAIC0zLDcgKzMsNyBAQAogICoKICAqCUdlbmVyaWMgREVDc3RhdGlvbi9ERUNzeXN0ZW0gYml0cy4KICAqCi0gKglDb3B5cmlnaHQgKEMpIDIwMDUgIE1hY2llaiBXLiBSb3p5Y2tpCisgKglDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgIE1hY2llaiBXLiBSb3p5Y2tpCiAgKgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTE0LDUgKzE0LDYgQEAKICNkZWZpbmUgX19BU01fREVDX1NZU1RFTV9ICiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRlY19rbl9zbG90X2Jhc2UsIGRlY19rbl9zbG90X3NpemU7CitleHRlcm4gaW50IGRlY190Y19idXM7CiAKICNlbmRpZiAvKiBfX0FTTV9ERUNfU1lTVEVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL3RjLmggYi9pbmNsdWRlL2FzbS1taXBzL2RlYy90Yy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2I1MWYyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL3RjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogSW50ZXJmYWNlIHRvIHRoZSBUVVJCT2NoYW5uZWwgcmVsYXRlZCByb3V0aW5lcwotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OCBIYXJhbGQgS29lcmZnZW4KLSAqLwotI2lmbmRlZiBfX0FTTV9ERUNfVENfSAotI2RlZmluZSBfX0FTTV9ERUNfVENfSAotCi0vKgotICogU2VhcmNoIGZvciBhIFRVUkJPY2hhbm5lbCBPcHRpb24gTW9kdWxlCi0gKiB3aXRoIGEgY2VydGFpbiBuYW1lLiBSZXR1cm5zIHNsb3QgbnVtYmVyCi0gKiBvZiB0aGUgZmlyc3QgY2FyZCBub3QgaW4gdXNlIG9yIC1FTk9ERVYKLSAqIGlmIG5vbmUgZm91bmQuCi0gKi8KLWV4dGVybiBpbnQgc2VhcmNoX3RjX2NhcmQoY29uc3QgY2hhciAqKTsKLS8qCi0gKiBNYXJrcyB0aGUgY2FyZCBpbiBzbG90IGFzIHVzZWQKLSAqLwotZXh0ZXJuIHZvaWQgY2xhaW1fdGNfY2FyZChpbnQpOwotLyoKLSAqIE1hcmtzIHRoZSBjYXJkIGluIHNsb3QgYXMgZnJlZQotICovCi1leHRlcm4gdm9pZCByZWxlYXNlX3RjX2NhcmQoaW50KTsKLS8qCi0gKiBSZXR1cm4gYmFzZSBhZGRyZXNzIG9mIGNhcmQgaW4gc2xvdAotICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfdGNfYmFzZV9hZGRyKGludCk7Ci0vKgotICogUmV0dXJuIGludGVycnVwdCBudW1iZXIgb2Ygc2xvdAotICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfdGNfaXJxX25yKGludCk7Ci0vKgotICogUmV0dXJuIFRVUkJPY2hhbm5lbCBjbG9jayBmcmVxdWVuY3kgaW4gSHoKLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3RjX3NwZWVkKHZvaWQpOwotCi0jZW5kaWYgLyogX19BU01fREVDX1RDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL3RjaW5mby5oIGIvaW5jbHVkZS9hc20tbWlwcy9kZWMvdGNpbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMjM1MDkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9kZWMvdGNpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogVmFyaW91cyBUVVJCT2NoYW5uZWwgcmVsYXRlZCBzdHVmZgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIEluZm9ybWF0aW9uIG9idGFpbmVkIHRocm91Z2ggdGhlIGdldF90Y2luZm8gcHJvbSBjYWxsCi0gKiBjcmVhdGVkIGZyb206Ci0gKgotICogVFVSQk9jaGFubmVsIEZpcm13YXJlIFNwZWNpZmljYXRpb24KLSAqCi0gKiBFSy1UQ0FBRC1GUy0wMDQKLSAqIGZyb20gRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTggSGFyYWxkIEtvZXJmZ2VuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCByZXZpc2lvbjsKLQlpbnQgY2xrX3BlcmlvZDsKLQlpbnQgc2xvdF9zaXplOwotCWludCBpb190aW1lb3V0OwotCWludCBkbWFfcmFuZ2U7Ci0JaW50IG1heF9kbWFfYnVyc3Q7Ci0JaW50IHBhcml0eTsKLQlpbnQgcmVzZXJ2ZWRbNF07Ci19IHRjaW5mbzsKLQotI2RlZmluZSBNQVhfU0xPVCA3Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIGJhc2VfYWRkcjsKLQl1bnNpZ25lZCBjaGFyIG5hbWVbOV07Ci0JdW5zaWduZWQgY2hhciB2ZW5kb3JbOV07Ci0JdW5zaWduZWQgY2hhciBmaXJtd2FyZVs5XTsKLQlpbnQgaW50ZXJydXB0OwotCWludCBmbGFnczsKLX0gc2xvdF9pbmZvOwotCi0vKgotICogVmFsdWVzIGZvciBmbGFncwotICovCi0jZGVmaW5lIEZSRUUgCTE8PDAKLSNkZWZpbmUgSU5fVVNFCTE8PDEKLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RlYy90Y21vZHVsZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9kZWMvdGNtb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI2OGU4OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2RlYy90Y21vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIE9mZnNldHMgZm9yIHRoZSBST00gaGVhZGVyIGxvY2F0aW9ucyBmb3IKLSAqIFRVUkJPY2hhbm5lbCBjYXJkcwotICoKLSAqIGNyZWF0ZWQgZnJvbToKLSAqCi0gKiBUVVJCT2NoYW5uZWwgRmlybXdhcmUgU3BlY2lmaWNhdGlvbgotICoKLSAqIEVLLVRDQUFELUZTLTAwNAotICogZnJvbSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbgotICoKLSAqIEphbi4xOTk4IEhhcmFsZCBLb2VyZmdlbgotICovCi0jaWZuZGVmIF9fQVNNX0RFQ19UQ01PRFVMRV9ICi0jZGVmaW5lIF9fQVNNX0RFQ19UQ01PRFVMRV9ICi0KLSNkZWZpbmUgT0xEQ0FSRCAweDNjMDAwMAotI2RlZmluZSBORVdDQVJEIDB4MDAwMDAwCi0KLSNkZWZpbmUgVENfUk9NX1dJRFRICTB4M2UwCi0jZGVmaW5lIFRDX1JPTV9TVFJJREUJMHgzZTQKLSNkZWZpbmUgVENfUk9NX1NJWkUJMHgzZTgKLSNkZWZpbmUgVENfU0xPVF9TSVpFCTB4M2VjCi0jZGVmaW5lIFRDX1BBVFRFUk4wCTB4M2YwCi0jZGVmaW5lIFRDX1BBVFRFUk4xCTB4M2Y0Ci0jZGVmaW5lIFRDX1BBVFRFUk4yCTB4M2Y4Ci0jZGVmaW5lIFRDX1BBVFRFUk4zCTB4M2ZjCi0jZGVmaW5lIFRDX0ZJUk1fVkVSCTB4NDAwCi0jZGVmaW5lIFRDX1ZFTkRPUgkweDQyMAotI2RlZmluZSBUQ19NT0RVTEUJMHg0NDAKLSNkZWZpbmUgVENfRklSTV9UWVBFCTB4NDYwCi0jZGVmaW5lIFRDX0ZMQUdTCTB4NDcwCi0jZGVmaW5lIFRDX1JPTV9PQkpFQ1RTCTB4NDgwCi0KLSNlbmRpZiAvKiBfX0FTTV9ERUNfVENNT0RVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pby5oIGIvaW5jbHVkZS9hc20tbWlwcy9pby5oCmluZGV4IDY3ZjA4MTAuLmI2YTJlYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2lvLmgKQEAgLTU1NiwxMiArNTU2LDYgQEAKICNkZWZpbmUgX19JU0FfSU9fYmFzZSAoKGNoYXIgKikoaXNhX3Nsb3Rfb2Zmc2V0KSkKIAogLyoKLSAqIFdlIGRvbid0IGhhdmUgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbWlvKCkgeWV0LCBzbyB3ZSBjaGVhdCBoZXJlIGFuZAotICoganVzdCBjb3B5IGl0LiBUaGUgbmV0IGNvZGUgd2lsbCB0aGVuIGRvIHRoZSBjaGVja3N1bSBsYXRlci4KLSAqLwotI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKHNrYixzcmMsbGVuLHVudXNlZCkgbWVtY3B5X2Zyb21pbygoc2tiKS0+ZGF0YSwoc3JjKSwobGVuKSkKLQotLyoKICAqIFRoZSBjYWNoZXMgb24gc29tZSBhcmNoaXRlY3R1cmVzIGFyZW4ndCBkbWEtY29oZXJlbnQgYW5kIGhhdmUgbmVlZCB0bwogICogaGFuZGxlIHRoaXMgaW4gc29mdHdhcmUuICBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygb3BlcmF0aW9ucyB0aGF0CiAgKiBjYW4gYmUgYXBwbGllZCB0byBkbWEgYnVmZmVycy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9pby5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2lvLmgKaW5kZXggYzE5NjNjZS4uY2E0NmU3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2lvLmgKQEAgLTE5MSwxNSArMTkxLDYgQEAKIHZvaWQgbWVtY3B5X2Zyb21pbyh2b2lkICpkc3QsIGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqc3JjLCBpbnQgY291bnQpOwogdm9pZCBtZW1jcHlfdG9pbyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgY291bnQpOwogCi0vKgotICogWFhYIC0gV2UgZG9uJ3QgaGF2ZSBjc3VtX3BhcnRpYWxfY29weV9mcm9taW8oKSB5ZXQsIHNvIHdlIGNoZWF0IGhlcmUgYW5kIAotICoganVzdCBjb3B5IGl0LiBUaGUgbmV0IGNvZGUgd2lsbCB0aGVuIGRvIHRoZSBjaGVja3N1bSBsYXRlci4gUHJlc2VudGx5IAotICogb25seSB1c2VkIGJ5IHNvbWUgc2hhcmVkIG1lbW9yeSA4MzkwIEV0aGVybmV0IGNhcmRzIGFueXdheS4KLSAqLwotCi0jZGVmaW5lIGV0aF9pb19jb3B5X2FuZF9zdW0oc2tiLHNyYyxsZW4sdW51c2VkKSBcCi0gIG1lbWNweV9mcm9taW8oKHNrYiktPmRhdGEsKHNyYyksKGxlbikpCi0KIC8qIFBvcnQtc3BhY2UgSU8gKi8KIAogI2RlZmluZSBpbmJfcCBpbmIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9pby5oIGIvaW5jbHVkZS9hc20tcHBjL2lvLmgKaW5kZXggY2NmMWE5Yi4uOTVkNTkwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2lvLmgKQEAgLTM1OCw4ICszNTgsNiBAQAogfQogI2VuZGlmCiAKLSNkZWZpbmUgZXRoX2lvX2NvcHlfYW5kX3N1bShhLGIsYyxkKQkJZXRoX2NvcHlfYW5kX3N1bSgoYSksKHZvaWQgX19mb3JjZSAqKSh2b2lkIF9faW9tZW0gKikoYiksKGMpLChkKSkKLQogLyoKICAqIE1hcCBpbiBhbiBhcmVhIG9mIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UsIGZvciBhY2Nlc3NpbmcKICAqIEkvTyBkZXZpY2VzIGV0Yy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pby5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKaW5kZXggNmVlOWZhZC4uZjVkODRiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKQEAgLTI0OCwxMiArMjQ4LDYgQEAKICAqLwogI2RlZmluZSBfX0lTQV9JT19iYXNlICgoY2hhciBfX2lvbWVtICopKFBBR0VfT0ZGU0VUKSkKIAotLyoKLSAqIEFnYWluLCB4ODYtNjQgZG9lcyBub3QgcmVxdWlyZSBtZW0gSU8gc3BlY2lmaWMgZnVuY3Rpb24uCi0gKi8KLQotI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKGEsYixjLGQpCQlldGhfY29weV9hbmRfc3VtKChhKSwodm9pZCAqKShiKSwoYyksKGQpKQotCiAvKiBOb3RoaW5nIHRvIGRvICovCiAKICNkZWZpbmUgZG1hX2NhY2hlX2ludihfc3RhcnQsX3NpemUpCQlkbyB7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCmluZGV4IDZkMzI0YjguLmE2ZDJmZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCkBAIC04MSw3ICs4MSw2IEBACiBleHRlcm4gdm9pZCBfX3Nob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOwogZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICogcmVncyk7CiAKLWV4dGVybiBjaGFyICpzeXNjYWxsMzJfcGFnZTsKIGV4dGVybiB2b2lkIHN5c2NhbGwzMl9jcHVfaW5pdCh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgc2V0dXBfbm9kZV9ib290bWVtKGludCBub2RlaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL2FsZ2FwaS5oIGIvaW5jbHVkZS9jcnlwdG8vYWxnYXBpLmgKaW5kZXggNTc0OGFlYy4uNGUwNWU5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jcnlwdG8vYWxnYXBpLmgKKysrIGIvaW5jbHVkZS9jcnlwdG8vYWxnYXBpLmgKQEAgLTE4LDggKzE4LDggQEAKIHN0cnVjdCBzZXFfZmlsZTsKIAogc3RydWN0IGNyeXB0b190eXBlIHsKLQl1bnNpZ25lZCBpbnQgKCpjdHhzaXplKShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKLQlpbnQgKCppbml0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKwl1bnNpZ25lZCBpbnQgKCpjdHhzaXplKShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLCB1MzIgdHlwZSwgdTMyIG1hc2spOworCWludCAoKmluaXQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiB0eXBlLCB1MzIgbWFzayk7CiAJdm9pZCAoKmV4aXQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwogCXZvaWQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpOwogfTsKQEAgLTkzLDcgKzkzLDggQEAKIGludCBjcnlwdG9faW5pdF9zcGF3bihzdHJ1Y3QgY3J5cHRvX3NwYXduICpzcGF3biwgc3RydWN0IGNyeXB0b19hbGcgKmFsZywKIAkJICAgICAgc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCk7CiB2b2lkIGNyeXB0b19kcm9wX3NwYXduKHN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduKTsKLXN0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fc3Bhd25fdGZtKHN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduKTsKK3N0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fc3Bhd25fdGZtKHN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduLCB1MzIgdHlwZSwKKwkJCQkgICAgdTMyIG1hc2spOwogCiBzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2dldF9hdHRyX2FsZyh2b2lkICpwYXJhbSwgdW5zaWduZWQgaW50IGxlbiwKIAkJCQkgICAgICAgdTMyIHR5cGUsIHUzMiBtYXNrKTsKQEAgLTEzMiwxMSArMTMzLDI4IEBACiAJcmV0dXJuIGNyeXB0b190Zm1fY3R4X2FsaWduZWQoJnRmbS0+YmFzZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19jaXBoZXIgKmNyeXB0b19zcGF3bl9jaXBoZXIoCisJc3RydWN0IGNyeXB0b19zcGF3biAqc3Bhd24pCit7CisJdTMyIHR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOworCXUzMiBtYXNrID0gQ1JZUFRPX0FMR19UWVBFX01BU0s7CisKKwlyZXR1cm4gX19jcnlwdG9fY2lwaGVyX2Nhc3QoY3J5cHRvX3NwYXduX3RmbShzcGF3biwgdHlwZSwgbWFzaykpOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjaXBoZXJfYWxnICpjcnlwdG9fY2lwaGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtKQogewogCXJldHVybiAmY3J5cHRvX2NpcGhlcl90Zm0odGZtKS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9faGFzaCAqY3J5cHRvX3NwYXduX2hhc2goc3RydWN0IGNyeXB0b19zcGF3biAqc3Bhd24pCit7CisJdTMyIHR5cGUgPSBDUllQVE9fQUxHX1RZUEVfSEFTSDsKKwl1MzIgbWFzayA9IENSWVBUT19BTEdfVFlQRV9IQVNIX01BU0s7CisKKwlyZXR1cm4gX19jcnlwdG9faGFzaF9jYXN0KGNyeXB0b19zcGF3bl90Zm0oc3Bhd24sIHR5cGUsIG1hc2spKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkICpjcnlwdG9faGFzaF9jdHhfYWxpZ25lZChzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSkKIHsKIAlyZXR1cm4gY3J5cHRvX3RmbV9jdHhfYWxpZ25lZCgmdGZtLT5iYXNlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRtYXJwLmggYi9pbmNsdWRlL2xpbnV4L2F0bWFycC5oCmluZGV4IGVlMTA4ZjkuLjIzMWY0YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXRtYXJwLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdG1hcnAuaApAQCAtNiw5ICs2LDcgQEAKICNpZm5kZWYgX0xJTlVYX0FUTUFSUF9ICiAjZGVmaW5lIF9MSU5VWF9BVE1BUlBfSAogCi0jaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KICNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcnlwdG8uaCBiL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKaW5kZXggNGFhOTA0Ni4uNzc5YWE3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcnlwdG8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCkBAIC01MSwxNSArNTEsOSBAQAogLyoKICAqIFRyYW5zZm9ybSBtYXNrcyBhbmQgdmFsdWVzIChmb3IgY3J0X2ZsYWdzKS4KICAqLwotI2RlZmluZSBDUllQVE9fVEZNX01PREVfTUFTSwkJMHgwMDAwMDBmZgogI2RlZmluZSBDUllQVE9fVEZNX1JFUV9NQVNLCQkweDAwMGZmZjAwCiAjZGVmaW5lIENSWVBUT19URk1fUkVTX01BU0sJCTB4ZmZmMDAwMDAKIAotI2RlZmluZSBDUllQVE9fVEZNX01PREVfRUNCCQkweDAwMDAwMDAxCi0jZGVmaW5lIENSWVBUT19URk1fTU9ERV9DQkMJCTB4MDAwMDAwMDIKLSNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NGQgkJMHgwMDAwMDAwNAotI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ1RSCQkweDAwMDAwMDA4Ci0KICNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkJCTB4MDAwMDAxMDAKICNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQCTB4MDAwMDAyMDAKICNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVkJCTB4MDAxMDAwMDAKQEAgLTcxLDEyICs2NSw4IEBACiAvKgogICogTWlzY2VsbGFuZW91cyBzdHVmZi4KICAqLwotI2RlZmluZSBDUllQVE9fVU5TUEVDCQkJMAogI2RlZmluZSBDUllQVE9fTUFYX0FMR19OQU1FCQk2NAogCi0jZGVmaW5lIENSWVBUT19ESVJfRU5DUllQVAkJMQotI2RlZmluZSBDUllQVE9fRElSX0RFQ1JZUFQJCTAKLQogLyoKICAqIFRoZSBtYWNybyBDUllQVE9fTUlOQUxJR05fQVRUUiAoYWxvbmcgd2l0aCB0aGUgdm9pZCAqIHR5cGUgaW4gdGhlIGFjdHVhbAogICogZGVjbGFyYXRpb24pIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNyeXB0b190Zm0gY29udGV4dCBzdHJ1Y3R1cmUgaXMKQEAgLTE0OCwxOSArMTM4LDYgQEAKIAkgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKTsKIAl2b2lkICgqY2lhX2VuY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwogCXZvaWQgKCpjaWFfZGVjcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Ci0KLQl1bnNpZ25lZCBpbnQgKCpjaWFfZW5jcnlwdF9lY2IpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKLQkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKLQkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykgX19kZXByZWNhdGVkOwotCXVuc2lnbmVkIGludCAoKmNpYV9kZWNyeXB0X2VjYikoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAotCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAotCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKSBfX2RlcHJlY2F0ZWQ7Ci0JdW5zaWduZWQgaW50ICgqY2lhX2VuY3J5cHRfY2JjKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCi0JCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCi0JCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpIF9fZGVwcmVjYXRlZDsKLQl1bnNpZ25lZCBpbnQgKCpjaWFfZGVjcnlwdF9jYmMpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKLQkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKLQkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykgX19kZXByZWNhdGVkOwogfTsKIAogc3RydWN0IGRpZ2VzdF9hbGcgewpAQCAtMjQzLDExICsyMjAsNiBAQAogI2lmZGVmIENPTkZJR19DUllQVE8KIGludCBjcnlwdG9faGFzX2FsZyhjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19hbGdfYXZhaWxhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncykKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2hhc19hbGcoY29uc3QgY2hhciAqbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKQogewogCXJldHVybiAwOwpAQCAtMzM5LDEzICszMTEsMTggQEAKIAl2b2lkICpfX2NydF9jdHhbXSBDUllQVE9fTUlOQUxJR05fQVRUUjsKIH07CiAKLSNkZWZpbmUgY3J5cHRvX2NpcGhlciBjcnlwdG9fdGZtCi0jZGVmaW5lIGNyeXB0b19jb21wIGNyeXB0b190Zm0KLQogc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgewogCXN0cnVjdCBjcnlwdG9fdGZtIGJhc2U7CiB9OwogCitzdHJ1Y3QgY3J5cHRvX2NpcGhlciB7CisJc3RydWN0IGNyeXB0b190Zm0gYmFzZTsKK307CisKK3N0cnVjdCBjcnlwdG9fY29tcCB7CisJc3RydWN0IGNyeXB0b190Zm0gYmFzZTsKK307CisKIHN0cnVjdCBjcnlwdG9faGFzaCB7CiAJc3RydWN0IGNyeXB0b190Zm0gYmFzZTsKIH07CkBAIC0zOTUsNDAgKzM3MiwxMSBAQAogCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0s7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLQlfX2RlcHJlY2F0ZWQ7Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19taW5fa2V5c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9taW5fa2V5c2l6ZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19tYXhfa2V5c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotCV9fZGVwcmVjYXRlZDsKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX21heF9rZXlzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX21heF9rZXlzaXplOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2l2c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKSBfX2RlcHJlY2F0ZWQ7Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19pdnNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2c2l6ZTsKLX0KLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7CiAJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfYmxvY2tzaXplOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19kaWdlc3RzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKLQlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2RpZ2VzdHNpemU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewogCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2FsaWdubWFzazsKQEAgLTYzMyw3ICs1ODEsNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fY2lwaGVyX3RmbShzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtKQogewotCXJldHVybiB0Zm07CisJcmV0dXJuICZ0Zm0tPmJhc2U7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZnJlZV9jaXBoZXIoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSkKQEAgLTgwOSw3NiArNzU3LDYgQEAKIAlyZXR1cm4gY3J5cHRvX2hhc2hfY3J0KGhhc2gpLT5zZXRrZXkoaGFzaCwga2V5LCBrZXlsZW4pOwogfQogCi1zdGF0aWMgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkJIHVuc2lnbmVkIGludCBuYnl0ZXMpIF9fZGVwcmVjYXRlZDsKLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9lbmNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Ci19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi1zdGF0aWMgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkJICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikgX19kZXByZWNhdGVkOwotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZW5jcnlwdF9pdih0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsIGl2KTsKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLXN0YXRpYyBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCQkgdW5zaWduZWQgaW50IG5ieXRlcykgX19kZXByZWNhdGVkOwotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2RlY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKLX0KLQotc3RhdGljIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpIF9fZGVwcmVjYXRlZDsKLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2RlY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNyeXB0b19jaXBoZXJfc2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBsZW4pIF9fZGVwcmVjYXRlZDsKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX3NldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQltZW1jcHkodGZtLT5jcnRfY2lwaGVyLmNpdF9pdiwgc3JjLCBsZW4pOwotfQotCi1zdGF0aWMgdm9pZCBjcnlwdG9fY2lwaGVyX2dldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCSB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgbGVuKSBfX2RlcHJlY2F0ZWQ7Ci1zdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9nZXRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgbGVuKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JbWVtY3B5KGRzdCwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdiwgbGVuKTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2NvbXAgKl9fY3J5cHRvX2NvbXBfY2FzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewogCXJldHVybiAoc3RydWN0IGNyeXB0b19jb21wICopdGZtOwpAQCAtOTAzLDcgKzc4MSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19jb21wX3RmbShzdHJ1Y3QgY3J5cHRvX2NvbXAgKnRmbSkKIHsKLQlyZXR1cm4gdGZtOworCXJldHVybiAmdGZtLT5iYXNlOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2ZyZWVfY29tcChzdHJ1Y3QgY3J5cHRvX2NvbXAgKnRmbSkKQEAgLTkzNCwxNCArODEyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKIHsKLQlyZXR1cm4gY3J5cHRvX2NvbXBfY3J0KHRmbSktPmNvdF9jb21wcmVzcyh0Zm0sIHNyYywgc2xlbiwgZHN0LCBkbGVuKTsKKwlyZXR1cm4gY3J5cHRvX2NvbXBfY3J0KHRmbSktPmNvdF9jb21wcmVzcyhjcnlwdG9fY29tcF90Zm0odGZtKSwKKwkJCQkJCSAgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY29tcF9kZWNvbXByZXNzKHN0cnVjdCBjcnlwdG9fY29tcCAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQogewotCXJldHVybiBjcnlwdG9fY29tcF9jcnQodGZtKS0+Y290X2RlY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7CisJcmV0dXJuIGNyeXB0b19jb21wX2NydCh0Zm0pLT5jb3RfZGVjb21wcmVzcyhjcnlwdG9fY29tcF90Zm0odGZtKSwKKwkJCQkJCSAgICBzcmMsIHNsZW4sIGRzdCwgZGxlbik7CiB9CiAKICNlbmRpZgkvKiBfTElOVVhfQ1JZUFRPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWlzYS5oIGIvaW5jbHVkZS9saW51eC9laXNhLmgKaW5kZXggMWZmN2MxMy4uZmU4MDZiNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9laXNhLmgKKysrIGIvaW5jbHVkZS9saW51eC9laXNhLmgKQEAgLTYxLDEwICs2MSwyMCBAQAogCiAjZGVmaW5lIHRvX2Vpc2FfZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydixzdHJ1Y3QgZWlzYV9kcml2ZXIsIGRyaXZlcikKIAorLyogVGhlc2UgZXh0ZXJuYWwgZnVuY3Rpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSB3aGVuIEVJU0Egc3VwcG9ydCBpcyBlbmFibGVkLiAqLworI2lmZGVmIENPTkZJR19FSVNBCisKIGV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgZWlzYV9idXNfdHlwZTsKIGludCBlaXNhX2RyaXZlcl9yZWdpc3RlciAoc3RydWN0IGVpc2FfZHJpdmVyICplZHJ2KTsKIHZvaWQgZWlzYV9kcml2ZXJfdW5yZWdpc3RlciAoc3RydWN0IGVpc2FfZHJpdmVyICplZHJ2KTsKIAorI2Vsc2UgLyogIUNPTkZJR19FSVNBICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGVpc2FfZHJpdmVyX3JlZ2lzdGVyIChzdHJ1Y3QgZWlzYV9kcml2ZXIgKmVkcnYpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBlaXNhX2RyaXZlcl91bnJlZ2lzdGVyIChzdHJ1Y3QgZWlzYV9kcml2ZXIgKmVkcnYpIHsgfQorCisjZW5kaWYgLyogIUNPTkZJR19FSVNBICovCisKIC8qIE1pbWljcyBwY2kuaC4uLiAqLwogc3RhdGljIGlubGluZSB2b2lkICplaXNhX2dldF9kcnZkYXRhIChzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXYpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCAwMGMzMTRhLi4wNjM3OTllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dmcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKQEAgLTcwLDcgKzcwLDcgQEAKICNpZmRlZiBDT05GSUdfTlVNQQogI2RlZmluZSBHRlBfVEhJU05PREUJKF9fR0ZQX1RISVNOT0RFIHwgX19HRlBfTk9XQVJOIHwgX19HRlBfTk9SRVRSWSkKICNlbHNlCi0jZGVmaW5lIEdGUF9USElTTk9ERQkwCisjZGVmaW5lIEdGUF9USElTTk9ERQkoKF9fZm9yY2UgZ2ZwX3QpMCkKICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLWlkLmggYi9pbmNsdWRlL2xpbnV4L2kyYy1pZC5oCmluZGV4IGQzODc3OGYuLjZlN2VjNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLWlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMtaWQuaApAQCAtMTE1LDYgKzExNSw4IEBACiAjZGVmaW5lIEkyQ19EUklWRVJJRF9LUzAxMjcJODYJLyogU2Ftc3VuZyBrczAxMjcgdmlkZW8gZGVjb2RlciAqLwogI2RlZmluZSBJMkNfRFJJVkVSSURfVExWMzIwQUlDMjNCIDg3CS8qIFRJIFRMVjMyMEFJQzIzQiBhdWRpbyBjb2RlYyAgKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX0lTTDEyMDgJODgJLyogSW50ZXJzaWwgSVNMMTIwOCBSVEMJCSovCisjZGVmaW5lIEkyQ19EUklWRVJJRF9XTTg3MzEJCTg5CS8qIFdvbGZzb24gV004NzMxIGF1ZGlvIGNvZGVjICovCisjZGVmaW5lIEkyQ19EUklWRVJJRF9XTTg3NTAJCTkwCS8qIFdvbGZzb24gV004NzUwIGF1ZGlvIGNvZGVjICovCiAKICNkZWZpbmUgSTJDX0RSSVZFUklEX0kyQ0RFVgk5MDAKICNkZWZpbmUgSTJDX0RSSVZFUklEX0FSUCAgICAgICAgOTAyICAgIC8qIFNNQnVzIEFSUCBDbGllbnQgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oIGIvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaAppbmRleCA5OTM5M2VmLi5mM2RlMDVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKQEAgLTQxLDYgKzQxLDcgQEAKICNkZWZpbmUgUEFDS0VUX1JYX1JJTkcJCQk1CiAjZGVmaW5lIFBBQ0tFVF9TVEFUSVNUSUNTCQk2CiAjZGVmaW5lIFBBQ0tFVF9DT1BZX1RIUkVTSAkJNworI2RlZmluZSBQQUNLRVRfQVVYREFUQQkJCTgKIAogc3RydWN0IHRwYWNrZXRfc3RhdHMKIHsKQEAgLTQ4LDYgKzQ5LDE1IEBACiAJdW5zaWduZWQgaW50CXRwX2Ryb3BzOwogfTsKIAorc3RydWN0IHRwYWNrZXRfYXV4ZGF0YQoreworCV9fdTMyCQl0cF9zdGF0dXM7CisJX191MzIJCXRwX2xlbjsKKwlfX3UzMgkJdHBfc25hcGxlbjsKKwlfX3UxNgkJdHBfbWFjOworCV9fdTE2CQl0cF9uZXQ7Cit9OworCiBzdHJ1Y3QgdHBhY2tldF9oZHIKIHsKIAl1bnNpZ25lZCBsb25nCXRwX3N0YXR1czsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCAyZDJjMDhkLi5iYjc5M2E0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC0xMDMwLDYgKzEwMzAsOSBAQAogCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHBnb2ZmX3QgcGdvZmYpOwogZXh0ZXJuIHZvaWQgZXhpdF9tbWFwKHN0cnVjdCBtbV9zdHJ1Y3QgKik7CiBleHRlcm4gaW50IG1heV9leHBhbmRfdm0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKTsKK2V4dGVybiBpbnQgaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0LmggYi9pbmNsdWRlL2xpbnV4L25ldC5oCmluZGV4IGYyOGQ4YTIuLjRkYjIxZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXQuaApAQCAtMjQsNyArMjQsNyBAQAogc3RydWN0IHBvbGxfdGFibGVfc3RydWN0Owogc3RydWN0IGlub2RlOwogCi0jZGVmaW5lIE5QUk9UTwkJMzIJCS8qIHNob3VsZCBiZSBlbm91Z2ggZm9yIG5vdy4uCSovCisjZGVmaW5lIE5QUk9UTwkJMzMJCS8qIHNob3VsZCBiZSBlbm91Z2ggZm9yIG5vdy4uCSovCiAKICNkZWZpbmUgU1lTX1NPQ0tFVAkxCQkvKiBzeXNfc29ja2V0KDIpCQkqLwogI2RlZmluZSBTWVNfQklORAkyCQkvKiBzeXNfYmluZCgyKQkJCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCAyZTM3ZjUwLi4xYTUyODU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTU4OSw3ICs1ODksNyBAQAogZXh0ZXJuIGludAkJZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludAkJZGV2X3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50CQlyZWdpc3Rlcl9uZXRkZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gaW50CQl1bnJlZ2lzdGVyX25ldGRldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkCQl1bnJlZ2lzdGVyX25ldGRldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkCQlmcmVlX25ldGRldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkCQlzeW5jaHJvbml6ZV9uZXQodm9pZCk7CiBleHRlcm4gaW50IAkJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkCmluZGV4IDYzMjgxNzUuLjQzMzk3YTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9LYnVpbGQKQEAgLTMzLDYgKzMzLDcgQEAKIGhlYWRlci15ICs9IHh0X3RjcHVkcC5oCiBoZWFkZXIteSArPSB4dF9TRUNNQVJLLmgKIGhlYWRlci15ICs9IHh0X0NPTk5TRUNNQVJLLmgKK2hlYWRlci15ICs9IHh0X1RDUE1TUy5oCiAKIHVuaWZkZWYteSArPSBuZl9jb25udHJhY2tfY29tbW9uLmgKIHVuaWZkZWYteSArPSBuZl9jb25udHJhY2tfZnRwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zYW5lLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjdkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19TQU5FX0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19TQU5FX0gKKy8qIFNBTkUgdHJhY2tpbmcuICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgU0FORV9QT1JUCTY1NjYKKworZW51bSBzYW5lX3N0YXRlIHsKKwlTQU5FX1NUQVRFX05PUk1BTCwKKwlTQU5FX1NUQVRFX1NUQVJUX1JFUVVFU1RFRCwKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGV4aXN0cyBvbmx5IG9uY2UgcGVyIG1hc3RlciAqLworc3RydWN0IG5mX2N0X3NhbmVfbWFzdGVyIHsKKwllbnVtIHNhbmVfc3RhdGUgc3RhdGU7Cit9OworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX05GX0NPTk5UUkFDS19TQU5FX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaAppbmRleCAyZjRlOThiLi4wMDdhZjRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGNwLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RjcC5oCkBAIC0yNyw2ICsyNyw5IEBACiAvKiBUaGlzIHNlbmRlciBzZW50IEZJTiBmaXJzdCAqLwogI2RlZmluZSBJUF9DVF9UQ1BfRkxBR19DTE9TRV9JTklUCQkweDA0CiAKKy8qIEJlIGxpYmVyYWwgaW4gd2luZG93IGNoZWNraW5nICovCisjZGVmaW5lIElQX0NUX1RDUF9GTEFHX0JFX0xJQkVSQUwJCTB4MDgKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogc3RydWN0IGlwX2N0X3RjcF9zdGF0ZSB7CkBAIC0zNCw3ICszNyw2IEBACiAJdV9pbnQzMl90CXRkX21heGVuZDsJLyogbWF4IG9mIGFjayArIG1heCh3aW4sIDEpICovCiAJdV9pbnQzMl90CXRkX21heHdpbjsJLyogbWF4KHdpbikgKi8KIAl1X2ludDhfdAl0ZF9zY2FsZTsJLyogd2luZG93IHNjYWxlIGZhY3RvciAqLwotCXVfaW50OF90CWxvb3NlOwkJLyogdXNlZCB3aGVuIGNvbm5lY3Rpb24gcGlja2VkIHVwIGZyb20gdGhlIG1pZGRsZSAqLwogCXVfaW50OF90CWZsYWdzOwkJLyogcGVyIGRpcmVjdGlvbiBvcHRpb25zICovCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UQ1BNU1MuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RDUE1TUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTI5MmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UQ1BNU1MuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9YVF9UQ1BNU1NfSAorI2RlZmluZSBfWFRfVENQTVNTX0gKKworc3RydWN0IHh0X3RjcG1zc19pbmZvIHsKKwl1X2ludDE2X3QgbXNzOworfTsKKworI2RlZmluZSBYVF9UQ1BNU1NfQ0xBTVBfUE1UVSAweGZmZmYKKworI2VuZGlmIC8qIF9YVF9UQ1BNU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0LmgKaW5kZXggYmRmNTUzNi4uYmJjYTg5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oCkBAIC0xNiw2ICsxNiw3IEBACiAKICNkZWZpbmUgSVBfTkFUX1JBTkdFX01BUF9JUFMgMQogI2RlZmluZSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEIDIKKyNkZWZpbmUgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSA0IC8qIGFkZCByYW5kb21uZXNzIHRvICJwb3J0IiBzZWxlY3Rpb24gKi8KIAogLyogTkFUIHNlcXVlbmNlIG51bWJlciBtb2RpZmljYXRpb25zICovCiBzdHJ1Y3QgaXBfbmF0X3NlcSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaAppbmRleCA5OGQ1NjZjLi45NTI3Mjk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmgKQEAgLTI3MiwyNSArMjcyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiBleHRlcm4gdm9pZCBpcHRfaW5pdCh2b2lkKSBfX2luaXQ7CiAKLSNkZWZpbmUgaXB0X3JlZ2lzdGVyX3RhcmdldCh0Z3QpIAlcCi0oewkodGd0KS0+ZmFtaWx5ID0gQUZfSU5FVDsJXAotIAl4dF9yZWdpc3Rlcl90YXJnZXQodGd0KTsgfSkKLSNkZWZpbmUgaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KHRndCkgeHRfdW5yZWdpc3Rlcl90YXJnZXQodGd0KQotCi0jZGVmaW5lIGlwdF9yZWdpc3Rlcl9tYXRjaChtdGNoKSAJXAotKHsJKG10Y2gpLT5mYW1pbHkgPSBBRl9JTkVUOwlcCi0JeHRfcmVnaXN0ZXJfbWF0Y2gobXRjaCk7IH0pCi0jZGVmaW5lIGlwdF91bnJlZ2lzdGVyX21hdGNoKG10Y2gpIHh0X3VucmVnaXN0ZXJfbWF0Y2gobXRjaCkKLQotLy8jZGVmaW5lIGlwdF9yZWdpc3Rlcl90YWJsZSh0YmwsIHJlcGwpIHh0X3JlZ2lzdGVyX3RhYmxlKEFGX0lORVQsIHRibCwgcmVwbCkKLS8vI2RlZmluZSBpcHRfdW5yZWdpc3Rlcl90YWJsZSh0YmwpIHh0X3VucmVnaXN0ZXJfdGFibGUoQUZfSU5FVCwgdGJsKQotCi1leHRlcm4gaW50IGlwdF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSwKK2V4dGVybiBpbnQgaXB0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCB4dF90YWJsZSAqdGFibGUsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X3JlcGxhY2UgKnJlcGwpOwotZXh0ZXJuIHZvaWQgaXB0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IGlwdF90YWJsZSAqdGFibGUpOwotCi0vKiBuZXQvc2NoZWQvaXB0LmM6IEdpbW1lIGFjY2VzcyB0byB5b3VyIHRhcmdldHMhICBHZXRzIHRhcmdldC0+bWUuICovCi1leHRlcm4gc3RydWN0IGlwdF90YXJnZXQgKmlwdF9maW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbik7CitleHRlcm4gdm9pZCBpcHRfdW5yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKTsKIAogLyogU3RhbmRhcmQgZW50cnkuICovCiBzdHJ1Y3QgaXB0X3N0YW5kYXJkCkBAIC0zMTUsNyArMjk5LDcgQEAKIAkJCQkgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKIAkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgc3RydWN0IGlwdF90YWJsZSAqdGFibGUpOworCQkJCSBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKTsKIAogI2RlZmluZSBJUFRfQUxJR04ocykgWFRfQUxJR04ocykKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVENQTVNTLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9UQ1BNU1MuaAppbmRleCBhYWRiMzk1Li43YTg1MGY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9UQ1BNU1MuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9UQ1BNU1MuaApAQCAtMSwxMCArMSw5IEBACiAjaWZuZGVmIF9JUFRfVENQTVNTX0gKICNkZWZpbmUgX0lQVF9UQ1BNU1NfSAogCi1zdHJ1Y3QgaXB0X3RjcG1zc19pbmZvIHsKLQl1X2ludDE2X3QgbXNzOwotfTsKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfVENQTVNTLmg+CiAKLSNkZWZpbmUgSVBUX1RDUE1TU19DTEFNUF9QTVRVIDB4ZmZmZgorI2RlZmluZSBpcHRfdGNwbXNzX2luZm8JCXh0X3RjcG1zc19pbmZvCisjZGVmaW5lIElQVF9UQ1BNU1NfQ0xBTVBfUE1UVQlYVF9UQ1BNU1NfQ0xBTVBfUE1UVQogCiAjZW5kaWYgLypfSVBUX1RDUE1TU19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKaW5kZXggNGFlZDM0MC4uNjFhYTEwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKQEAgLTEwNCw2ICsxMDQsMjUgQEAKIAl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdOwogfTsKIAorLyogU3RhbmRhcmQgZW50cnkgKi8KK3N0cnVjdCBpcDZ0X3N0YW5kYXJkCit7CisJc3RydWN0IGlwNnRfZW50cnkgZW50cnk7CisJc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0IHRhcmdldDsKK307CisKK3N0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldAoreworCXN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCB0YXJnZXQ7CisJY2hhciBlcnJvcm5hbWVbSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKK307CisKK3N0cnVjdCBpcDZ0X2Vycm9yCit7CisJc3RydWN0IGlwNnRfZW50cnkgZW50cnk7CisJc3RydWN0IGlwNnRfZXJyb3JfdGFyZ2V0IHRhcmdldDsKK307CisKIC8qCiAgKiBOZXcgSVAgZmlyZXdhbGwgb3B0aW9ucyBmb3IgW2dzXWV0c29ja29wdCBhdCB0aGUgUkFXIElQIGxldmVsLgogICogVW5saWtlIEJTRCBMaW51eCBpbmhlcml0cyBJUCBvcHRpb25zIHNvIHlvdSBkb24ndCBoYXZlIHRvIHVzZQpAQCAtMjg2LDI0ICszMDUsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiBleHRlcm4gdm9pZCBpcDZ0X2luaXQodm9pZCkgX19pbml0OwogCi0jZGVmaW5lIGlwNnRfcmVnaXN0ZXJfdGFyZ2V0KHRndCkgCQlcCi0oewkodGd0KS0+ZmFtaWx5ID0gQUZfSU5FVDY7CQlcCi0gCXh0X3JlZ2lzdGVyX3RhcmdldCh0Z3QpOyB9KQotI2RlZmluZSBpcDZ0X3VucmVnaXN0ZXJfdGFyZ2V0KHRndCkgeHRfdW5yZWdpc3Rlcl90YXJnZXQodGd0KQotCi0jZGVmaW5lIGlwNnRfcmVnaXN0ZXJfbWF0Y2gobWF0Y2gpCQlcCi0oewkobWF0Y2gpLT5mYW1pbHkgPSBBRl9JTkVUNjsJCVwKLQl4dF9yZWdpc3Rlcl9tYXRjaChtYXRjaCk7IH0pCi0jZGVmaW5lIGlwNnRfdW5yZWdpc3Rlcl9tYXRjaChtYXRjaCkgeHRfdW5yZWdpc3Rlcl9tYXRjaChtYXRjaCkKLQotZXh0ZXJuIGludCBpcDZ0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSwKK2V4dGVybiBpbnQgaXA2dF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X3JlcGxhY2UgKnJlcGwpOwotZXh0ZXJuIHZvaWQgaXA2dF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSk7CitleHRlcm4gdm9pZCBpcDZ0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSk7CiBleHRlcm4gdW5zaWduZWQgaW50IGlwNnRfZG9fdGFibGUoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAogCQkJCSAgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgc3RydWN0IGlwNnRfdGFibGUgKnRhYmxlKTsKKwkJCQkgIHN0cnVjdCB4dF90YWJsZSAqdGFibGUpOwogCiAvKiBDaGVjayBmb3IgYW4gZXh0ZW5zaW9uICovCiBleHRlcm4gaW50IGlwNnRfZXh0X2hkcih1OCBuZXh0aGRyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9taC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21oLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljYTlhNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9taC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX0lQNlRfTUhfSAorI2RlZmluZSBfSVA2VF9NSF9ICisKKy8qIE1IIG1hdGNoaW5nIHN0dWZmICovCitzdHJ1Y3QgaXA2dF9taAoreworCXVfaW50OF90IHR5cGVzWzJdOwkvKiBNSCB0eXBlIHJhbmdlICovCisJdV9pbnQ4X3QgaW52ZmxhZ3M7CS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXA2dF9taC4gKi8KKyNkZWZpbmUgSVA2VF9NSF9JTlZfVFlQRQkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgdHlwZS4gKi8KKyNkZWZpbmUgSVA2VF9NSF9JTlZfTUFTSwkweDAxCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworI2VuZGlmIC8qX0lQNlRfTUhfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaCBiL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCmluZGV4IGMzZTI1NWIuLjdhOGRjYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCkBAIC03Niw4ICs3Niw2IEBACiAJCQkJdW5zaWduZWQgbG9uZyBpbmRleCk7CiBleHRlcm4gc3RydWN0IHBhZ2UgKiBmaW5kX2xvY2tfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCQl1bnNpZ25lZCBsb25nIGluZGV4KTsKLWV4dGVybiBfX2RlcHJlY2F0ZWRfZm9yX21vZHVsZXMgc3RydWN0IHBhZ2UgKiBmaW5kX3RyeWxvY2tfcGFnZSgKLQkJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCB1bnNpZ25lZCBsb25nIGluZGV4KTsKIGV4dGVybiBzdHJ1Y3QgcGFnZSAqIGZpbmRfb3JfY3JlYXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgZ2ZwX3QgZ2ZwX21hc2spOwogdW5zaWduZWQgZmluZF9nZXRfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3Qgc3RhcnQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IGRlZmRlZWQuLjkyMGQyMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC0yMDczLDYgKzIwNzMsOCBAQAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfUEFTRU1JCQkweDE5NTkKIAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FUVEFOU0lDCQkweDE5NjkKKwogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0pNSUNST04JCTB4MTk3QgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzYwCTB4MjM2MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzYxCTB4MjM2MQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZmtleXYyLmggYi9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaAppbmRleCAyNjViYWZhLi5kOWRiNWY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaApAQCAtMjUxLDcgKzI1MSw4IEBACiAjZGVmaW5lIFNBREJfWF9TUERFWFBJUkUJMjEKICNkZWZpbmUgU0FEQl9YX1NQRERFTEVURTIJMjIKICNkZWZpbmUgU0FEQl9YX05BVF9UX05FV19NQVBQSU5HCTIzCi0jZGVmaW5lIFNBREJfTUFYCQkyMworI2RlZmluZSBTQURCX1hfTUlHUkFURQkJMjQKKyNkZWZpbmUgU0FEQl9NQVgJCTI0CiAKIC8qIFNlY3VyaXR5IEFzc29jaWF0aW9uIGZsYWdzICovCiAjZGVmaW5lIFNBREJfU0FGTEFHU19QRlMJMQpAQCAtMjk3LDYgKzI5OCw3IEBACiAjZGVmaW5lIFNBREJfWF9FQUxHX0JMT1dGSVNIQ0JDCQk3CiAjZGVmaW5lIFNBREJfRUFMR19OVUxMCQkJMTEKICNkZWZpbmUgU0FEQl9YX0VBTEdfQUVTQ0JDCQkxMgorI2RlZmluZSBTQURCX1hfRUFMR19DQU1FTExJQUNCQwkJMjIKICNkZWZpbmUgU0FEQl9FQUxHX01BWCAgICAgICAgICAgICAgICAgICAyNTMgLyogbGFzdCBFQUxHICovCiAvKiBwcml2YXRlIGFsbG9jYXRpb25zIHNob3VsZCB1c2UgMjQ5LTI1NSAoUkZDMjQwNykgKi8KICNkZWZpbmUgU0FEQl9YX0VBTEdfU0VSUEVOVENCQyAgMjUyICAgICAvKiBkcmFmdC1pZXRmLWlwc2VjLWNpcGgtYWVzLWNiYy0wMCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oIGIvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oCmluZGV4IGViZDQyYTMuLjZkYjlhNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmgKQEAgLTI0Nyw2ICsyNDcsNyBAQAogCiAJYXRvbWljX3QgcGVuZGluZ193cml0ZXM7IC8qIHBlbmRpbmcgd3JpdGVzIHRvIHRoZSBiaXRtYXAgZmlsZSAqLwogCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3ZlcmZsb3dfd2FpdDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaCBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKaW5kZXggOTJjZDM4ZS4uZmNkMzVhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCkBAIC0xODcsNyArMTg3LDggQEAKICNkZWZpbmUgQUZfTExDCQkyNgkvKiBMaW51eCBMTEMJCQkqLwogI2RlZmluZSBBRl9USVBDCQkzMAkvKiBUSVBDIHNvY2tldHMJCQkqLwogI2RlZmluZSBBRl9CTFVFVE9PVEgJMzEJLyogQmx1ZXRvb3RoIHNvY2tldHMgCQkqLwotI2RlZmluZSBBRl9NQVgJCTMyCS8qIEZvciBub3cuLiAqLworI2RlZmluZSBBRl9JVUNWCQkzMgkvKiBJVUNWIHNvY2tldHMJCQkqLworI2RlZmluZSBBRl9NQVgJCTMzCS8qIEZvciBub3cuLiAqLwogCiAvKiBQcm90b2NvbCBmYW1pbGllcywgc2FtZSBhcyBhZGRyZXNzIGZhbWlsaWVzLiAqLwogI2RlZmluZSBQRl9VTlNQRUMJQUZfVU5TUEVDCkBAIC0yMjAsNiArMjIxLDcgQEAKICNkZWZpbmUgUEZfTExDCQlBRl9MTEMKICNkZWZpbmUgUEZfVElQQwkJQUZfVElQQwogI2RlZmluZSBQRl9CTFVFVE9PVEgJQUZfQkxVRVRPT1RICisjZGVmaW5lIFBGX0lVQ1YJCUFGX0lVQ1YKICNkZWZpbmUgUEZfTUFYCQlBRl9NQVgKIAogLyogTWF4aW11bSBxdWV1ZSBsZW5ndGggc3BlY2lmaWFibGUgYnkgbGlzdGVuLiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y3NvY2suaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y3NvY2suaAppbmRleCA5OGIyMWFkLi5kYjMxMmExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNzb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3Zjc29jay5oCkBAIC02Myw3ICs2Myw3IEBACiAgKiBGdW5jdGlvbiBwcm90b3R5cGVzLgogICovCiBpbnQJCXN2Y19tYWtlc29jayhzdHJ1Y3Qgc3ZjX3NlcnYgKiwgaW50LCB1bnNpZ25lZCBzaG9ydCk7Ci12b2lkCQlzdmNfZGVsZXRlX3NvY2tldChzdHJ1Y3Qgc3ZjX3NvY2sgKik7Cit2b2lkCQlzdmNfY2xvc2Vfc29ja2V0KHN0cnVjdCBzdmNfc29jayAqKTsKIGludAkJc3ZjX3JlY3Yoc3RydWN0IHN2Y19ycXN0ICosIGxvbmcpOwogaW50CQlzdmNfc2VuZChzdHJ1Y3Qgc3ZjX3Jxc3QgKik7CiB2b2lkCQlzdmNfZHJvcChzdHJ1Y3Qgc3ZjX3Jxc3QgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaAppbmRleCA4MTQ4MGU2Li42NjU0MTJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKQEAgLTY5OSw3ICs2OTksOCBAQAogCU5FVF9YMjVfQ0FMTF9SRVFVRVNUX1RJTUVPVVQ9MiwKIAlORVRfWDI1X1JFU0VUX1JFUVVFU1RfVElNRU9VVD0zLAogCU5FVF9YMjVfQ0xFQVJfUkVRVUVTVF9USU1FT1VUPTQsCi0JTkVUX1gyNV9BQ0tfSE9MRF9CQUNLX1RJTUVPVVQ9NQorCU5FVF9YMjVfQUNLX0hPTERfQkFDS19USU1FT1VUPTUsCisJTkVUX1gyNV9GT1JXQVJEPTYKIH07CiAKIC8qIC9wcm9jL3N5cy9uZXQvdG9rZW4tcmluZyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90Yy5oIGIvaW5jbHVkZS9saW51eC90Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjUxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3RjLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKglJbnRlcmZhY2UgdG8gdGhlIFRVUkJPY2hhbm5lbCByZWxhdGVkIHJvdXRpbmVzLgorICoKKyAqCUNvcHlyaWdodCAoYykgMTk5OCAgSGFyYWxkIEtvZXJmZ2VuCisgKglDb3B5cmlnaHQgKGMpIDIwMDUgIEphbWVzIFNpbW1vbnMKKyAqCUNvcHlyaWdodCAoYykgMjAwNiAgTWFjaWVqIFcuIFJvenlja2kKKyAqCisgKglCYXNlZCBvbjoKKyAqCisgKgkiVFVSQk9jaGFubmVsIEZpcm13YXJlIFNwZWNpZmljYXRpb24iLCBFSy1UQ0FBRC1GUy0wMDQKKyAqCisgKglmcm9tIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLgorICoKKyAqCVRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VCisgKglHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbgorICoJZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9MSU5VWF9UQ19ICisjZGVmaW5lIF9MSU5VWF9UQ19ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBPZmZzZXRzIGZvciB0aGUgUk9NIGhlYWRlciBsb2NhdGlvbnMgZm9yIFRVUkJPY2hhbm5lbCBjYXJkcy4KKyAqLworI2RlZmluZSBUQ19PTERDQVJECTB4M2MwMDAwCisjZGVmaW5lIFRDX05FV0NBUkQJMHgwMDAwMDAKKworI2RlZmluZSBUQ19ST01fV0lEVEgJMHgzZTAKKyNkZWZpbmUgVENfUk9NX1NUUklERQkweDNlNAorI2RlZmluZSBUQ19ST01fU0laRQkweDNlOAorI2RlZmluZSBUQ19TTE9UX1NJWkUJMHgzZWMKKyNkZWZpbmUgVENfUEFUVEVSTjAJMHgzZjAKKyNkZWZpbmUgVENfUEFUVEVSTjEJMHgzZjQKKyNkZWZpbmUgVENfUEFUVEVSTjIJMHgzZjgKKyNkZWZpbmUgVENfUEFUVEVSTjMJMHgzZmMKKyNkZWZpbmUgVENfRklSTV9WRVIJMHg0MDAKKyNkZWZpbmUgVENfVkVORE9SCTB4NDIwCisjZGVmaW5lIFRDX01PRFVMRQkweDQ0MAorI2RlZmluZSBUQ19GSVJNX1RZUEUJMHg0NjAKKyNkZWZpbmUgVENfRkxBR1MJMHg0NzAKKyNkZWZpbmUgVENfUk9NX09CSkVDVFMJMHg0ODAKKworLyoKKyAqIEluZm9ybWF0aW9uIG9idGFpbmVkIHRocm91Z2ggdGhlIGdldF90Y2luZm8oKSBQUk9NIGNhbGwuCisgKi8KK3N0cnVjdCB0Y2luZm8geworCXMzMgkJcmV2aXNpb247CS8qIEhhcmR3YXJlIHJldmlzaW9uIGxldmVsLiAqLworCXMzMgkJY2xrX3BlcmlvZDsJLyogQ2xvY2sgcGVyaW9kIGluIG5hbm9zZWNvbmRzLiAqLworCXMzMgkJc2xvdF9zaXplOwkvKiBTbG90IHNpemUgaW4gbWVnYWJ5dGVzLiAqLworCXMzMgkJaW9fdGltZW91dDsJLyogSS9PIHRpbWVvdXQgaW4gY3ljbGVzLiAqLworCXMzMgkJZG1hX3JhbmdlOwkvKiBETUEgYWRkcmVzcyByYW5nZSBpbiBtZWdhYnl0ZXMuICovCisJczMyCQltYXhfZG1hX2J1cnN0OwkvKiBNYXhpbXVtIERNQSBidXJzdCBsZW5ndGguICovCisJczMyCQlwYXJpdHk7CQkvKiBTeXN0ZW0gbW9kdWxlIHN1cHBvcnRzIFRDIHBhcml0eS4gKi8KKwlzMzIJCXJlc2VydmVkWzRdOworfTsKKworLyoKKyAqIFRVUkJPY2hhbm5lbCBidXMuCisgKi8KK3N0cnVjdCB0Y19idXMgeworCXN0cnVjdCBsaXN0X2hlYWQgZGV2aWNlczsJLyogTGlzdCBvZiBkZXZpY2VzIG9uIHRoaXMgYnVzLiAqLworCXN0cnVjdCByZXNvdXJjZQlyZXNvdXJjZVsyXTsJLyogQWRkcmVzcyBzcGFjZSByb3V0ZWQgdG8gdGhpcyBidXMuICovCisKKwlzdHJ1Y3QgZGV2aWNlCWRldjsKKwljaGFyCQluYW1lWzEzXTsKKwlyZXNvdXJjZV9zaXplX3QJc2xvdF9iYXNlOworCXJlc291cmNlX3NpemVfdAlleHRfc2xvdF9iYXNlOworCXJlc291cmNlX3NpemVfdAlleHRfc2xvdF9zaXplOworCWludAkJbnVtX3Rjc2xvdHM7CisJc3RydWN0IHRjaW5mbwlpbmZvOworfTsKKworLyoKKyAqIFRVUkJPY2hhbm5lbCBkZXZpY2UuCisgKi8KK3N0cnVjdCB0Y19kZXYgeworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsJCS8qIE5vZGUgaW4gbGlzdCBvZiBhbGwgVEMgZGV2aWNlcy4gKi8KKwlzdHJ1Y3QgdGNfYnVzCSpidXM7CQkvKiBCdXMgdGhpcyBkZXZpY2UgaXMgb24uICovCisJc3RydWN0IHRjX2RyaXZlciAqZHJpdmVyOwkvKiBXaGljaCBkcml2ZXIgaGFzIGFsbG9jYXRlZCB0aGlzCisJCQkJCSAgIGRldmljZS4gKi8KKwlzdHJ1Y3QgZGV2aWNlCWRldjsJCS8qIEdlbmVyaWMgZGV2aWNlIGludGVyZmFjZS4gKi8KKwlzdHJ1Y3QgcmVzb3VyY2UJcmVzb3VyY2U7CS8qIEFkZHJlc3Mgc3BhY2Ugb2YgdGhpcyBkZXZpY2UuICovCisJY2hhcgkJdmVuZG9yWzldOworCWNoYXIJCW5hbWVbOV07CisJY2hhcgkJZmlybXdhcmVbOV07CisJaW50CQlpbnRlcnJ1cHQ7CisJaW50CQlzbG90OworfTsKKworI2RlZmluZSB0b190Y19kZXYobikgY29udGFpbmVyX29mKG4sIHN0cnVjdCB0Y19kZXYsIGRldikKKworc3RydWN0IHRjX2RldmljZV9pZCB7CisJY2hhcgkJdmVuZG9yWzldOworCWNoYXIJCW5hbWVbOV07Cit9OworCisvKgorICogVFVSQk9jaGFubmVsIGRyaXZlci4KKyAqLworc3RydWN0IHRjX2RyaXZlciB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWNvbnN0IHN0cnVjdCB0Y19kZXZpY2VfaWQgKmlkX3RhYmxlOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKK307CisKKyNkZWZpbmUgdG9fdGNfZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydiwgc3RydWN0IHRjX2RyaXZlciwgZHJpdmVyKQorCisvKgorICogUmV0dXJuIFRVUkJPY2hhbm5lbCBjbG9jayBmcmVxdWVuY3kgaW4gSHouCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0Y19nZXRfc3BlZWQoc3RydWN0IHRjX2J1cyAqdGJ1cykKK3sKKwlyZXR1cm4gMTAwMDAwICogKDEwMDAwIC8gKHVuc2lnbmVkIGxvbmcpdGJ1cy0+aW5mby5jbGtfcGVyaW9kKTsKK30KKworI2lmZGVmIENPTkZJR19UQworCitleHRlcm4gc3RydWN0IGJ1c190eXBlIHRjX2J1c190eXBlOworCitleHRlcm4gaW50IHRjX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdGNfZHJpdmVyICp0ZHJ2KTsKK2V4dGVybiB2b2lkIHRjX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB0Y19kcml2ZXIgKnRkcnYpOworCisjZWxzZSAvKiAhQ09ORklHX1RDICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHRjX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdGNfZHJpdmVyICp0ZHJ2KSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGNfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHRjX2RyaXZlciAqdGRydikgeyB9CisKKyNlbmRpZiAvKiBDT05GSUdfVEMgKi8KKworLyoKKyAqIFRoZXNlIGhhdmUgdG8gYmUgcHJvdmlkZWQgYnkgdGhlIGFyY2hpdGVjdHVyZS4KKyAqLworZXh0ZXJuIGludCB0Y19wcmVhZGIodTggKnZhbHAsIHZvaWQgX19pb21lbSAqYWRkcik7CitleHRlcm4gaW50IHRjX2J1c19nZXRfaW5mbyhzdHJ1Y3QgdGNfYnVzICp0YnVzKTsKK2V4dGVybiB2b2lkIHRjX2RldmljZV9nZXRfaXJxKHN0cnVjdCB0Y19kZXYgKnRkZXYpOworCisjZW5kaWYgLyogX0xJTlVYX1RDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGNwLmggYi9pbmNsdWRlL2xpbnV4L3RjcC5oCmluZGV4IDNjYzcwZDEuLjI5ZDMwODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGNwLmgKKysrIGIvaW5jbHVkZS9saW51eC90Y3AuaApAQCAtMzE2LDcgKzMxNiw3IEBACiAJc3RydWN0IHRjcF9zYWNrX2Jsb2NrIGR1cGxpY2F0ZV9zYWNrWzFdOyAvKiBELVNBQ0sgYmxvY2sgKi8KIAlzdHJ1Y3QgdGNwX3NhY2tfYmxvY2sgc2VsZWN0aXZlX2Fja3NbNF07IC8qIFRoZSBTQUNLUyB0aGVtc2VsdmVzKi8KIAotCXN0cnVjdCB0Y3Bfc2Fja19ibG9jayByZWN2X3NhY2tfY2FjaGVbNF07CisJc3RydWN0IHRjcF9zYWNrX2Jsb2NrX3dpcmUgcmVjdl9zYWNrX2NhY2hlWzRdOwogCiAJLyogZnJvbSBTVENQLCByZXRyYW5zIHF1ZXVlIGhpbnRpbmcgKi8KIAlzdHJ1Y3Qgc2tfYnVmZiogbG9zdF9za2JfaGludDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3Vmc19mcy5oCmluZGV4IDI4OTY3ZWQuLmQzYTRmOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC91ZnNfZnMuaApAQCAtNzg5LDYgKzc4OSw3IEBACiAKIAlfX3UzMglzX21heHN5bWxpbmtsZW47LyogdXBwZXIgbGltaXQgb24gZmFzdCBzeW1saW5rcycgc2l6ZSAqLwogCV9fczMyCWZzX21hZ2ljOyAgICAgICAvKiBmaWxlc3lzdGVtIG1hZ2ljICovCisJdW5zaWduZWQgaW50IHNfZGlyYmxrc2l6ZTsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oIGIvaW5jbHVkZS9saW51eC93YW5yb3V0ZXIuaAppbmRleCAyY2QwNTAxLi4zYWRkODc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvd2Fucm91dGVyLmgKQEAgLTUxNiw5ICs1MTYsNiBAQAogLyogUHVibGljIGZ1bmN0aW9ucyBhdmFpbGFibGUgZm9yIGRldmljZSBkcml2ZXJzICovCiBleHRlcm4gaW50IHJlZ2lzdGVyX3dhbl9kZXZpY2Uoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldik7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfd2FuX2RldmljZShjaGFyICpuYW1lKTsKLV9fYmUxNiB3YW5yb3V0ZXJfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWludCB3YW5yb3V0ZXJfZW5jYXBzdWxhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgdW5zaWduZWQgc2hvcnQgdHlwZSk7CiAKIC8qIFByb2MgaW50ZXJmYWNlIGZ1bmN0aW9ucy4gVGhlc2UgbXVzdCBub3QgYmUgY2FsbGVkIGJ5IHRoZSBkcml2ZXJzISAqLwogZXh0ZXJuIGludCB3YW5yb3V0ZXJfcHJvY19pbml0KHZvaWQpOwpAQCAtNTI3LDExICs1MjQsNiBAQAogZXh0ZXJuIGludCB3YW5yb3V0ZXJfcHJvY19kZWxldGUoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldik7CiBleHRlcm4gaW50IHdhbnJvdXRlcl9pb2N0bCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAotZXh0ZXJuIHZvaWQgbG9ja19hZGFwdGVyX2lycShzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOwotZXh0ZXJuIHZvaWQgdW5sb2NrX2FkYXB0ZXJfaXJxKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7Ci0KLQotCiAvKiBQdWJsaWMgRGF0YSAqLwogLyogbGlzdCBvZiByZWdpc3RlcmVkIGRldmljZXMgKi8KIGV4dGVybiBzdHJ1Y3Qgd2FuX2RldmljZSAqd2Fucm91dGVyX3JvdXRlcl9kZXZsaXN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC94ZnJtLmggYi9pbmNsdWRlL2xpbnV4L3hmcm0uaAppbmRleCA5NTI5ZWExLi4xNWNhODllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3hmcm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3hmcm0uaApAQCAtMTc4LDYgKzE3OCw5IEBACiAJWEZSTV9NU0dfUkVQT1JULAogI2RlZmluZSBYRlJNX01TR19SRVBPUlQgWEZSTV9NU0dfUkVQT1JUCiAKKwlYRlJNX01TR19NSUdSQVRFLAorI2RlZmluZSBYRlJNX01TR19NSUdSQVRFIFhGUk1fTVNHX01JR1JBVEUKKwogCV9fWEZSTV9NU0dfTUFYCiB9OwogI2RlZmluZSBYRlJNX01TR19NQVggKF9fWEZSTV9NU0dfTUFYIC0gMSkKQEAgLTI1Niw2ICsyNTksNyBAQAogCVhGUk1BX0NPQUREUiwJCS8qIHhmcm1fYWRkcmVzc190ICovCiAJWEZSTUFfTEFTVFVTRUQsCiAJWEZSTUFfUE9MSUNZX1RZUEUsCS8qIHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSAqLworCVhGUk1BX01JR1JBVEUsCiAJX19YRlJNQV9NQVgKIAogI2RlZmluZSBYRlJNQV9NQVggKF9fWEZSTUFfTUFYIC0gMSkKQEAgLTM1MSw2ICszNTUsMTkgQEAKIAlzdHJ1Y3QgeGZybV9zZWxlY3RvcgkJc2VsOwogfTsKIAorc3RydWN0IHhmcm1fdXNlcl9taWdyYXRlIHsKKwl4ZnJtX2FkZHJlc3NfdAkJCW9sZF9kYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAkJCW9sZF9zYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAkJCW5ld19kYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAkJCW5ld19zYWRkcjsKKwlfX3U4CQkJCXByb3RvOworCV9fdTgJCQkJbW9kZTsKKwlfX3UxNgkJCQlyZXNlcnZlZDsKKwlfX3UzMgkJCQlyZXFpZDsKKwlfX3UxNgkJCQlvbGRfZmFtaWx5OworCV9fdTE2CQkJCW5ld19mYW1pbHk7Cit9OworCiAjaWZuZGVmIF9fS0VSTkVMX18KIC8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1c2Vyc3BhY2UgKi8KICNkZWZpbmUgWEZSTUdSUF9BQ1FVSVJFCQkxCkBAIC0zNzUsNiArMzkyLDggQEAKICNkZWZpbmUgWEZSTU5MR1JQX0FFVkVOVFMJWEZSTU5MR1JQX0FFVkVOVFMKIAlYRlJNTkxHUlBfUkVQT1JULAogI2RlZmluZSBYRlJNTkxHUlBfUkVQT1JUCVhGUk1OTEdSUF9SRVBPUlQKKwlYRlJNTkxHUlBfTUlHUkFURSwKKyNkZWZpbmUgWEZSTU5MR1JQX01JR1JBVEUJWEZSTU5MR1JQX01JR1JBVEUKIAlfX1hGUk1OTEdSUF9NQVgKIH07CiAjZGVmaW5lIFhGUk1OTEdSUF9NQVgJKF9fWEZSTU5MR1JQX01BWCAtIDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2hhc2h0YWJsZXMuaCBiL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCmluZGV4IDM0Y2M3NmUuLmQyN2VlOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCkBAIC0zNCwxMiArMzQsMTMgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKIC8qIFRoaXMgaXMgZm9yIGFsbCBjb25uZWN0aW9ucyB3aXRoIGEgZnVsbCBpZGVudGl0eSwgbm8gd2lsZGNhcmRzLgotICogTmV3IHNjaGVtZSwgaGFsZiB0aGUgdGFibGUgaXMgZm9yIFRJTUVfV0FJVCwgdGhlIG90aGVyIGhhbGYgaXMKLSAqIGZvciB0aGUgcmVzdC4gIEknbGwgZXhwZXJpbWVudCB3aXRoIGR5bmFtaWMgdGFibGUgZ3Jvd3RoIGxhdGVyLgorICogT25lIGNoYWluIGlzIGRlZGljYXRlZCB0byBUSU1FX1dBSVQgc29ja2V0cy4KKyAqIEknbGwgZXhwZXJpbWVudCB3aXRoIGR5bmFtaWMgdGFibGUgZ3Jvd3RoIGxhdGVyLgogICovCiBzdHJ1Y3QgaW5ldF9laGFzaF9idWNrZXQgewogCXJ3bG9ja190CSAgbG9jazsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCBjaGFpbjsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCB0d2NoYWluOwogfTsKIAogLyogVGhlcmUgYXJlIGEgZmV3IHNpbXBsZSBydWxlcywgd2hpY2ggYWxsb3cgZm9yIGxvY2FsIHBvcnQgcmV1c2UgYnkKQEAgLTk3LDggKzk4LDcgQEAKIAkgKgogCSAqICAgICAgICAgIFRDUF9FU1RBQkxJU0hFRCA8PSBzay0+c2tfc3RhdGUgPCBUQ1BfQ0xPU0UKIAkgKgotCSAqIEZpcnN0IGhhbGYgb2YgdGhlIHRhYmxlIGlzIGZvciBzb2NrZXRzIG5vdCBpbiBUSU1FX1dBSVQsIHNlY29uZCBoYWxmCi0JICogaXMgZm9yIFRJTUVfV0FJVCBzb2NrZXRzIG9ubHkuCisJICogVElNRV9XQUlUIHNvY2tldHMgdXNlIGEgc2VwYXJhdGUgY2hhaW4gKHR3Y2hhaW4pLgogCSAqLwogCXN0cnVjdCBpbmV0X2VoYXNoX2J1Y2tldAkqZWhhc2g7CiAKQEAgLTM2OSw3ICszNjksNyBAQAogCX0KIAogCS8qIE11c3QgY2hlY2sgZm9yIGEgVElNRV9XQUlUJ2VyIGJlZm9yZSBnb2luZyB0byBsaXN0ZW5lciBoYXNoLiAqLwotCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmKGhlYWQgKyBoYXNoaW5mby0+ZWhhc2hfc2l6ZSktPmNoYWluKSB7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZoZWFkLT50d2NoYWluKSB7CiAJCWlmIChJTkVUX1RXX01BVENIKHNrLCBoYXNoLCBhY29va2llLCBzYWRkciwgZGFkZHIsIHBvcnRzLCBkaWYpKQogCQkJZ290byBoaXQ7CiAJfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXVjdi9hZl9pdWN2LmggYi9pbmNsdWRlL25ldC9pdWN2L2FmX2l1Y3YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGQxYWJiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvaXVjdi9hZl9pdWN2LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBJQk0gQ29ycG9yYXRpb24KKyAqIElVQ1YgcHJvdG9jb2wgc3RhY2sgZm9yIExpbnV4IG9uIHpTZXJpZXMKKyAqIFZlcnNpb24gMS4wCisgKiBBdXRob3Iocyk6IEplbm5pZmVyIEh1bnQgPGplbmh1bnRAdXMuaWJtLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FGSVVDVl9ICisjZGVmaW5lIF9fQUZJVUNWX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisjaWZuZGVmIEFGX0lVQ1YKKyNkZWZpbmUgQUZfSVVDVgkJMzIKKyNkZWZpbmUgUEZfSVVDVgkJQUZfSVVDVgorI2VuZGlmCisKKy8qIENvbm5lY3Rpb24gYW5kIHNvY2tldCBzdGF0ZXMgKi8KK2VudW0geworCUlVQ1ZfQ09OTkVDVEVEID0gMSwKKwlJVUNWX09QRU4sCisJSVVDVl9CT1VORCwKKwlJVUNWX0xJU1RFTiwKKwlJVUNWX1NFVkVSRUQsCisJSVVDVl9ESVNDT05OLAorCUlVQ1ZfQ0xPU0VECit9OworCisjZGVmaW5lIElVQ1ZfUVVFVUVMRU5fREVGQVVMVAk2NTUzNQorI2RlZmluZSBJVUNWX0NPTk5fVElNRU9VVAkoSFogKiA0MCkKKyNkZWZpbmUgSVVDVl9ESVNDT05OX1RJTUVPVVQJKEhaICogMikKKyNkZWZpbmUgSVVDVl9DT05OX0lETEVfVElNRU9VVAkoSFogKiA2MCkKKyNkZWZpbmUgSVVDVl9CVUZTSVpFX0RFRkFVTFQJMzI3NjgKKworLyogSVVDViBzb2NrZXQgYWRkcmVzcyAqLworc3RydWN0IHNvY2thZGRyX2l1Y3YgeworCXNhX2ZhbWlseV90CXNpdWN2X2ZhbWlseTsKKwl1bnNpZ25lZCBzaG9ydAlzaXVjdl9wb3J0OwkJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBpbnQJc2l1Y3ZfYWRkcjsJCS8qIFJlc2VydmVkICovCisJY2hhcgkJc2l1Y3Zfbm9kZWlkWzhdOwkvKiBSZXNlcnZlZCAqLworCWNoYXIJCXNpdWN2X3VzZXJfaWRbOF07CS8qIEd1ZXN0IFVzZXIgSWQgKi8KKwljaGFyCQlzaXVjdl9uYW1lWzhdOwkJLyogQXBwbGljYXRpb24gTmFtZSAqLworfTsKKworCisvKiBDb21tb24gc29ja2V0IHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIGl1Y3Zfc2soX19zaykgKChzdHJ1Y3QgaXVjdl9zb2NrICopIF9fc2spCisKK3N0cnVjdCBpdWN2X3NvY2sgeworCXN0cnVjdCBzb2NrCQlzazsKKwljaGFyCQkJc3JjX3VzZXJfaWRbOF07CisJY2hhcgkJCXNyY19uYW1lWzhdOworCWNoYXIJCQlkc3RfdXNlcl9pZFs4XTsKKwljaGFyCQkJZHN0X25hbWVbOF07CisJc3RydWN0IGxpc3RfaGVhZAlhY2NlcHRfcTsKKwlzdHJ1Y3Qgc29jawkJKnBhcmVudDsKKwlzdHJ1Y3QgaXVjdl9wYXRoCSpwYXRoOworCXN0cnVjdCBza19idWZmX2hlYWQJc2VuZF9za2JfcTsKKwl1bnNpZ25lZCBpbnQJCXNlbmRfdGFnOworfTsKKworc3RydWN0IGl1Y3Zfc29ja19saXN0IHsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCBoZWFkOworCXJ3bG9ja190CSAgbG9jazsKKwlhdG9taWNfdAkgIGF1dG9iaW5kX25hbWU7Cit9OworCitzdGF0aWMgdm9pZCBpdWN2X3NvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKTsKK3N0YXRpYyB2b2lkIGl1Y3Zfc29ja19jbGVhbnVwX2xpc3RlbihzdHJ1Y3Qgc29jayAqcGFyZW50KTsKK3N0YXRpYyB2b2lkIGl1Y3Zfc29ja19raWxsKHN0cnVjdCBzb2NrICpzayk7CitzdGF0aWMgdm9pZCBpdWN2X3NvY2tfY2xvc2Uoc3RydWN0IHNvY2sgKnNrKTsKK3N0YXRpYyBpbnQgIGl1Y3Zfc29ja19jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvKTsKK3N0YXRpYyBpbnQgIGl1Y3Zfc29ja19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCWludCBhZGRyX2xlbik7CitzdGF0aWMgaW50ICBpdWN2X3NvY2tfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisJCQkgICAgICBpbnQgYWxlbiwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgIGl1Y3Zfc29ja19saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpOworc3RhdGljIGludCAgaXVjdl9zb2NrX2FjY2VwdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrLAorCQkJICAgICBpbnQgZmxhZ3MpOworc3RhdGljIGludCAgaXVjdl9zb2NrX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJICAgICAgaW50ICpsZW4sIGludCBwZWVyKTsKK3N0YXRpYyBpbnQgIGl1Y3Zfc29ja19zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbik7CitzdGF0aWMgaW50ICBpdWN2X3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncyk7Cit1bnNpZ25lZCBpbnQgaXVjdl9zb2NrX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgcG9sbF90YWJsZSAqd2FpdCk7CitzdGF0aWMgaW50IGl1Y3Zfc29ja19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spOworc3RhdGljIGludCBpdWN2X3NvY2tfc2h1dGRvd24oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGhvdyk7CisKK3ZvaWQgaXVjdl9zb2NrX2xpbmsoc3RydWN0IGl1Y3Zfc29ja19saXN0ICpsLCBzdHJ1Y3Qgc29jayAqcyk7Cit2b2lkIGl1Y3Zfc29ja191bmxpbmsoc3RydWN0IGl1Y3Zfc29ja19saXN0ICpsLCBzdHJ1Y3Qgc29jayAqcyk7CitpbnQgIGl1Y3Zfc29ja193YWl0X3N0YXRlKHN0cnVjdCBzb2NrICpzaywgaW50IHN0YXRlLCBpbnQgc3RhdGUyLAorCQkJICB1bnNpZ25lZCBsb25nIHRpbWVvKTsKK2ludCAgaXVjdl9zb2NrX3dhaXRfY250KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyB0aW1lbyk7Cit2b2lkIGl1Y3ZfYWNjZXB0X2VucXVldWUoc3RydWN0IHNvY2sgKnBhcmVudCwgc3RydWN0IHNvY2sgKnNrKTsKK3ZvaWQgaXVjdl9hY2NlcHRfdW5saW5rKHN0cnVjdCBzb2NrICpzayk7CitzdHJ1Y3Qgc29jayAqaXVjdl9hY2NlcHRfZGVxdWV1ZShzdHJ1Y3Qgc29jayAqcGFyZW50LCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrKTsKKworI2VuZGlmIC8qIF9fSVVDVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pdWN2L2l1Y3YuaCBiL2luY2x1ZGUvbmV0L2l1Y3YvaXVjdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NmU3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9pdWN2L2l1Y3YuaApAQCAtMCwwICsxLDQxNSBAQAorLyoKKyAqICBkcml2ZXJzL3MzOTAvbmV0L2l1Y3YuaAorICogICAgSVVDViBiYXNlIHN1cHBvcnQuCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uCisgKiAgICBBdXRob3Iocyk6QWxhbiBBbHRtYXJrIChBbGFuX0FsdG1hcmtAdXMuaWJtLmNvbSkKKyAqCQlYZW5pYSBUa2F0c2Nob3cgKHhlbmlhQHVzLmlibS5jb20pCisgKiAgICBSZXdyaXR0ZW4gZm9yIGFmX2l1Y3Y6CisgKglNYXJ0aW4gU2Nod2lkZWZza3kgPHNjaHdpZGVmc2t5QGRlLmlibS5jb20+CisgKgorICoKKyAqIEZ1bmN0aW9uYWxpdHk6CisgKiBUbyBleHBsb3JlIGFueSBvZiB0aGUgSVVDViBmdW5jdGlvbnMsIG9uZSBtdXN0IGZpcnN0IHJlZ2lzdGVyIHRoZWlyCisgKiBwcm9ncmFtIHVzaW5nIGl1Y3ZfcmVnaXN0ZXIoKS4gT25jZSB5b3VyIHByb2dyYW0gaGFzIHN1Y2Nlc3NmdWxseQorICogY29tcGxldGVkIGEgcmVnaXN0ZXIsIGl0IGNhbiBleHBsb2l0IHRoZSBvdGhlciBmdW5jdGlvbnMuCisgKiBGb3IgZnVydGh1ciByZWZlcmVuY2Ugb24gYWxsIElVQ1YgZnVuY3Rpb25hbGl0eSwgcmVmZXIgdG8gdGhlCisgKiBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlcyBib29rLCBhbHNvIGF2YWlsYWJsZSBvbiB0aGUgd2ViIHRocnUKKyAqIHd3dy5pYm0uY29tL3MzOTAvdm0vcHVicywgbWFudWFsICMgU0MyNC01NzYwCisgKgorICogRGVmaW5pdGlvbiBvZiBSZXR1cm4gQ29kZXMKKyAqIC0gQWxsIHBvc2l0aXZlIHJldHVybiBjb2RlcyBpbmNsdWRpbmcgemVybyBhcmUgcmVmbGVjdGVkIGJhY2sKKyAqICAgZnJvbSBDUC4gVGhlIGRlZmluaXRpb24gb2YgZWFjaCByZXR1cm4gY29kZSBjYW4gYmUgZm91bmQgaW4KKyAqICAgQ1AgUHJvZ3JhbW1pbmcgU2VydmljZXMgYm9vay4KKyAqIC0gUmV0dXJuIENvZGUgb2Y6CisgKiAgIC1FSU5WQUw6IEludmFsaWQgdmFsdWUKKyAqICAgLUVOT01FTTogc3RvcmFnZSBhbGxvY2F0aW9uIGZhaWxlZAorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgorCisvKgorICogSVVDViBvcHRpb24gZmxhZ3MgdXNhYmxlIGJ5IGRldmljZSBkcml2ZXJzOgorICoKKyAqIElVQ1ZfSVBSTURBVEEgIEluZGljYXRlcyB0aGF0IHlvdXIgcHJvZ3JhbSBjYW4gaGFuZGxlIGEgbWVzc2FnZSBpbiB0aGUKKyAqCQkgIHBhcmFtZXRlciBsaXN0IC8gYSBtZXNzYWdlIGlzIHNlbnQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LgorICoJCSAgVXNlZCBmb3IgaXVjdl9wYXRoX2FjY2VwdCwgaXVjdl9wYXRoX2Nvbm5lY3QsCisgKgkJICBpdWN2X21lc3NhZ2VfcmVwbHksIGl1Y3ZfbWVzc2FnZV9zZW5kLCBpdWN2X21lc3NhZ2Vfc2VuZDJ3YXkuCisgKiBJVUNWX0lQUVVTQ0UJICBJbmRpY2F0ZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVjZWl2ZSBtZXNzYWdlcyBvbiB0aGlzCisgKgkJICBwYXRoIHVudGlsIGFuIGl1Y3ZfcGF0aF9yZXN1bWUgaXMgaXNzdWVkLgorICoJCSAgVXNlZCBmb3IgaXVjdl9wYXRoX2FjY2VwdCwgaXVjdl9wYXRoX2Nvbm5lY3QuCisgKiBJVUNWX0lQQlVGTFNUICBJbmRpY2F0ZXMgdGhhdCBhbiBhZGRyZXNzIGxpc3QgaXMgdXNlZCBmb3IgdGhlIG1lc3NhZ2UgZGF0YS4KKyAqCQkgIFVzZWQgZm9yIGl1Y3ZfbWVzc2FnZV9yZWNlaXZlLCBpdWN2X21lc3NhZ2Vfc2VuZCwKKyAqCQkgIGl1Y3ZfbWVzc2FnZV9zZW5kMndheS4KKyAqIElVQ1ZfSVBQUlRZCSAgU3BlY2lmaWVzIHRoYXQgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlcy4KKyAqCQkgIFVzZWQgZm9yIGl1Y3ZfcGF0aF9hY2NlcHQsIGl1Y3ZfcGF0aF9jb25uZWN0LAorICoJCSAgaXVjdl9tZXNzYWdlX3JlcGx5LCBpdWN2X21lc3NhZ2Vfc2VuZCwgaXVjdl9tZXNzYWdlX3NlbmQyd2F5LgorICogSVVDVl9JUFNZTkMJICBJbmRpY2F0ZXMgYSBzeW5jaHJvbm91cyBzZW5kIHJlcXVlc3QuCisgKgkJICBVc2VkIGZvciBpdWN2X21lc3NhZ2Vfc2VuZCwgaXVjdl9tZXNzYWdlX3NlbmQyd2F5LgorICogSVVDVl9JUEFOU0xTVCAgSW5kaWNhdGVzIHRoYXQgYW4gYWRkcmVzcyBsaXN0IGlzIHVzZWQgZm9yIHRoZSByZXBseSBkYXRhLgorICoJCSAgVXNlZCBmb3IgaXVjdl9tZXNzYWdlX3JlcGx5LCBpdWN2X21lc3NhZ2Vfc2VuZDJ3YXkuCisgKiBJVUNWX0lQTE9DQUwJICBTcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbiBwYXJ0bmVyIGhhcyB0byBiZSBvbiB0aGUKKyAqCQkgIGxvY2FsIHN5c3RlbS4gSWYgbG9jYWwgaXMgc3BlY2lmaWVkIG5vIHRhcmdldCBjbGFzcyBjYW4gYmUKKyAqCQkgIHNwZWNpZmllZC4KKyAqCQkgIFVzZWQgZm9yIGl1Y3ZfcGF0aF9jb25uZWN0LgorICoKKyAqIEFsbCBmbGFncyBhcmUgZGVmaW5lZCBpbiB0aGUgaW5wdXQgZmllbGQgSVBGTEFHUzEgb2YgZWFjaCBmdW5jdGlvbgorICogYW5kIGNhbiBiZSBmb3VuZCBpbiBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlcy4KKyAqLworI2RlZmluZSBJVUNWX0lQUk1EQVRBCTB4ODAKKyNkZWZpbmUgSVVDVl9JUFFVU0NFCTB4NDAKKyNkZWZpbmUgSVVDVl9JUEJVRkxTVAkweDQwCisjZGVmaW5lIElVQ1ZfSVBQUlRZCTB4MjAKKyNkZWZpbmUgSVVDVl9JUEFOU0xTVAkweDA4CisjZGVmaW5lIElVQ1ZfSVBTWU5DCTB4MDQKKyNkZWZpbmUgSVVDVl9JUExPQ0FMCTB4MDEKKworLyoKKyAqIGl1Y3ZfYXJyYXkgOiBEZWZpbmVzIGJ1ZmZlciBhcnJheS4KKyAqIEluc2lkZSB0aGUgYXJyYXkgbWF5IGJlIDMxLSBiaXQgYWRkcmVzc2VzIGFuZCAzMS1iaXQgbGVuZ3Rocy4KKyAqIFVzZSBhIHBvaW50ZXIgdG8gYW4gaXVjdl9hcnJheSBhcyB0aGUgYnVmZmVyLCByZXBseSBvciBhbnN3ZXIKKyAqIHBhcmFtZXRlciBvbiBpdWN2X21lc3NhZ2Vfc2VuZCwgaXVjdl9tZXNzYWdlX3NlbmQyd2F5LCBpdWN2X21lc3NhZ2VfcmVjZWl2ZQorICogYW5kIGl1Y3ZfbWVzc2FnZV9yZXBseSBpZiBJVUNWX0lQQlVGTFNUIG9yIElVQ1ZfSVBBTlNMU1QgYXJlIHVzZWQuCisgKi8KK3N0cnVjdCBpdWN2X2FycmF5IHsKKwl1MzIgYWRkcmVzczsKKwl1MzIgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKTsKKworZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBpdWN2X2J1czsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlICppdWN2X3Jvb3Q7CisKKy8qCisgKiBzdHJ1Y3QgaXVjdl9wYXRoCisgKiBwYXRoaWQ6IDE2IGJpdCBwYXRoIGlkZW50aWZpY2F0aW9uCisgKiBtc2dsaW06IDE2IGJpdCBtZXNzYWdlIGxpbWl0CisgKiBmbGFnczogcHJvcGVydGllcyBvZiB0aGUgcGF0aDogSVBSTURBVEEsIElQUVVTQ0UsIElQUFJUWQorICogaGFuZGxlcjogIGFkZHJlc3Mgb2YgaXVjdiBoYW5kbGVyIHN0cnVjdHVyZQorICogcHJpdmF0ZTogcHJpdmF0ZSBpbmZvcm1hdGlvbiBvZiB0aGUgaGFuZGxlciBhc3NvY2lhdGVkIHdpdGggdGhlIHBhdGgKKyAqIGxpc3Q6IGxpc3RfaGVhZCBmb3IgdGhlIGl1Y3ZfaGFuZGxlciBwYXRoIGxpc3QuCisgKi8KK3N0cnVjdCBpdWN2X3BhdGggeworCXUxNiBwYXRoaWQ7CisJdTE2IG1zZ2xpbTsKKwl1OCAgZmxhZ3M7CisJdm9pZCAqcHJpdmF0ZTsKKwlzdHJ1Y3QgaXVjdl9oYW5kbGVyICpoYW5kbGVyOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qCisgKiBzdHJ1Y3QgaXVjdl9tZXNzYWdlCisgKiBpZDogMzIgYml0IG1lc3NhZ2UgaWQKKyAqIGF1ZGl0OiAzMiBiaXQgZXJyb3IgaW5mb3JtYXRpb24gb2YgcHVyZ2VkIG9yIHJlcGxpZWQgbWVzc2FnZXMKKyAqIGNsYXNzOiAzMiBiaXQgdGFyZ2V0IGNsYXNzIG9mIGEgbWVzc2FnZSAoc291cmNlIGNsYXNzIGZvciByZXBsaWVzKQorICogdGFnOiAzMiBiaXQgdGFnIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZQorICogbGVuZ3RoOiAzMiBiaXQgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIC8gcmVwbHkKKyAqIHJlcGx5X3NpemU6IDMyIGJpdCBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHRoZSByZXBseQorICogcm1tc2c6IDggYnl0ZSBpbmxpbmUgbWVzc2FnZQorICogZmxhZ3M6IG1lc3NhZ2UgcHJvcGVydGllcyAoSVVDVl9JUFBSVFkpCisgKi8KK3N0cnVjdCBpdWN2X21lc3NhZ2UgeworCXUzMiBpZDsKKwl1MzIgYXVkaXQ7CisJdTMyIGNsYXNzOworCXUzMiB0YWc7CisJdTMyIGxlbmd0aDsKKwl1MzIgcmVwbHlfc2l6ZTsKKwl1OCAgcm1tc2dbOF07CisJdTggIGZsYWdzOworfTsKKworLyoKKyAqIHN0cnVjdCBpdWN2X2hhbmRsZXIKKyAqCisgKiBBIHZlY3RvciBvZiBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgSVVDViBpbnRlcnJ1cHRzLiBFYWNoIGZ1bmN0aW9ucyBnZXRzCisgKiBhIHBhcmFtZXRlciBhcmVhIGFzIGRlZmluZWQgYnkgdGhlIENQIFByb2dyYW1taW5nIFNlcnZpY2VzIGFuZCBwcml2YXRlCisgKiBwb2ludGVyIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgb2YgdGhlIGludGVyZmFjZS4KKyAqLworc3RydWN0IGl1Y3ZfaGFuZGxlciB7CisJIC8qCisJICAqIFRoZSBwYXRoX3BlbmRpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFuIGl1Y3YgaW50ZXJydXB0CisJICAqIHR5cGUgMHgwMSBoYXMgYmVlbiByZWNlaXZlZC4gVGhlIGJhc2UgY29kZSBhbGxvY2F0ZXMgYSBwYXRoCisJICAqIHN0cnVjdHVyZSBhbmQgImFza3MiIHRoZSBoYW5kbGVyIGlmIHRoaXMgcGF0aCBiZWxvbmdzIHRvIHRoZQorCSAgKiBoYW5kbGVyLiBUbyBhY2NlcHQgdGhlIHBhdGggdGhlIHBhdGhfcGVuZGluZyBmdW5jdGlvbiBuZWVkcworCSAgKiB0byBjYWxsIGl1Y3ZfcGF0aF9hY2NlcHQgYW5kIHJldHVybiAwLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucworCSAgKiBhIHZhbHVlICE9IDAgdGhlIGl1Y3YgYmFzZSBjb2RlIHdpbGwgY29udGludWUgd2l0aCB0aGUgbmV4dAorCSAgKiBoYW5kbGVyLiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIHBhdGhfcGVuZGluZyBmdW5jdGlvbnMgYXJlCisJICAqIGNhbGxlZCBpcyB0aGUgb3JkZXIgb2YgdGhlIHJlZ2lzdHJhdGlvbiBvZiB0aGUgaXVjdiBoYW5kbGVycworCSAgKiB0byB0aGUgYmFzZSBjb2RlLgorCSAgKi8KKwlpbnQgICgqcGF0aF9wZW5kaW5nKShzdHJ1Y3QgaXVjdl9wYXRoICosIHU4IGlwdm1pZFs4XSwgdTggaXB1c2VyWzE2XSk7CisJLyoKKwkgKiBUaGUgcGF0aF9jb21wbGV0ZSBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYW4gaXVjdiBpbnRlcnJ1cHQKKwkgKiB0eXBlIDB4MDIgaGFzIGJlZW4gcmVjZWl2ZWQgZm9yIGEgcGF0aCB0aGF0IGhhcyBiZWVuIGVzdGFibGlzaGVkCisJICogZm9yIHRoaXMgaGFuZGxlciB3aXRoIGl1Y3ZfcGF0aF9jb25uZWN0IGFuZCBnb3QgYWNjZXB0ZWQgYnkgdGhlCisJICogcGVlciB3aXRoIGl1Y3ZfcGF0aF9hY2NlcHQuCisJICovCisJdm9pZCAoKnBhdGhfY29tcGxldGUpKHN0cnVjdCBpdWN2X3BhdGggKiwgdTggaXB1c2VyWzE2XSk7CisJIC8qCisJICAqIFRoZSBwYXRoX3NldmVyZWQgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFuIGl1Y3YgaW50ZXJydXB0CisJICAqIHR5cGUgMHgwMyBoYXMgYmVlbiByZWNlaXZlZC4gVGhlIGNvbW11bmljYXRpb24gcGVlciBzaHV0ZG93bgorCSAgKiBoaXMgZW5kIG9mIHRoZSBjb21tdW5pY2F0aW9uIHBhdGguIFRoZSBwYXRoIHN0aWxsIGV4aXN0cyBhbmQKKwkgICogcmVtYWluaW5nIG1lc3NhZ2VzIGNhbiBiZSByZWNlaXZlZCB1bnRpbCBhIGl1Y3ZfcGF0aF9zZXZlcgorCSAgKiBzaHV0cyBkb3duIHRoZSBvdGhlciBlbmQgb2YgdGhlIHBhdGggYXMgd2VsbC4KKwkgICovCisJdm9pZCAoKnBhdGhfc2V2ZXJlZCkoc3RydWN0IGl1Y3ZfcGF0aCAqLCB1OCBpcHVzZXJbMTZdKTsKKwkvKgorCSAqIFRoZSBwYXRoX3F1aWVzY2VkIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhbiBpY3V2IGludGVycnVwdAorCSAqIHR5cGUgMHgwNCBoYXMgYmVlbiByZWNlaXZlZC4gVGhlIGNvbW11bmljYXRpb24gcGVlciBoYXMgcXVpZXNjZWQKKwkgKiB0aGUgcGF0aC4gRGVsaXZlcnkgb2YgbWVzc2FnZXMgaXMgc3RvcHBlZCB1bnRpbCBpdWN2X3BhdGhfcmVzdW1lCisJICogaGFzIGJlZW4gY2FsbGVkLgorCSAqLworCXZvaWQgKCpwYXRoX3F1aWVzY2VkKShzdHJ1Y3QgaXVjdl9wYXRoICosIHU4IGlwdXNlclsxNl0pOworCS8qCisJICogVGhlIHBhdGhfcmVzdW1lZCBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYW4gaWN1diBpbnRlcnJ1cHQKKwkgKiB0eXBlIDB4MDUgaGFzIGJlZW4gcmVjZWl2ZWQuIFRoZSBjb21tdW5pY2F0aW9uIHBlZXIgaGFzIHJlc3VtZWQKKwkgKiB0aGUgcGF0aC4KKwkgKi8KKwl2b2lkICgqcGF0aF9yZXN1bWVkKShzdHJ1Y3QgaXVjdl9wYXRoICosIHU4IGlwdXNlclsxNl0pOworCS8qCisJICogVGhlIG1lc3NhZ2VfcGVuZGluZyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYW4gaWN1diBpbnRlcnJ1cHQKKwkgKiB0eXBlIDB4MDYgb3IgdHlwZSAweDA3IGhhcyBiZWVuIHJlY2VpdmVkLiBBIG5ldyBtZXNzYWdlIGlzCisJICogYXZhaWxhYmUgYW5kIGNhbiBiZSByZWNlaXZlZCB3aXRoIGl1Y3ZfbWVzc2FnZV9yZWNlaXZlLgorCSAqLworCXZvaWQgKCptZXNzYWdlX3BlbmRpbmcpKHN0cnVjdCBpdWN2X3BhdGggKiwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqKTsKKwkvKgorCSAqIFRoZSBtZXNzYWdlX2NvbXBsZXRlIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhbiBpY3V2IGludGVycnVwdAorCSAqIHR5cGUgMHgwOCBvciB0eXBlIDB4MDkgaGFzIGJlZW4gcmVjZWl2ZWQuIEEgbWVzc2FnZSBzZW5kIHdpdGgKKwkgKiBpdWN2X21lc3NhZ2Vfc2VuZDJ3YXkgaGFzIGJlZW4gcmVwbGllZCB0by4gVGhlIHJlcGx5IGNhbiBiZQorCSAqIHJlY2VpdmVkIHdpdGggaXVjdl9tZXNzYWdlX3JlY2VpdmUuCisJICovCisJdm9pZCAoKm1lc3NhZ2VfY29tcGxldGUpKHN0cnVjdCBpdWN2X3BhdGggKiwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqKTsKKworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBhdGhzOworfTsKKworLyoqCisgKiBpdWN2X3JlZ2lzdGVyOgorICogQGhhbmRsZXI6IGFkZHJlc3Mgb2YgaXVjdiBoYW5kbGVyIHN0cnVjdHVyZQorICogQHNtcDogIT0gMCBpbmRpY2F0ZXMgdGhhdCB0aGUgaGFuZGxlciBjYW4gZGVhbCB3aXRoIG91dCBvZiBvcmRlciBtZXNzYWdlcworICoKKyAqIFJlZ2lzdGVycyBhIGRyaXZlciB3aXRoIElVQ1YuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gaWYgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgcGF0aGlkCisgKiB0YWJsZSBmYWlsZWQsIG9yIC1FSU8gaWYgSVVDVl9ERUNMQVJFX0JVRkZFUiBmYWlsZWQgb24gYWxsIGNwdXMuCisgKi8KK2ludCBpdWN2X3JlZ2lzdGVyKHN0cnVjdCBpdWN2X2hhbmRsZXIgKmhhbmRsZXIsIGludCBzbXApOworCisvKioKKyAqIGl1Y3ZfdW5yZWdpc3RlcgorICogQGhhbmRsZXI6ICBhZGRyZXNzIG9mIGl1Y3YgaGFuZGxlciBzdHJ1Y3R1cmUKKyAqIEBzbXA6ICE9IDAgaW5kaWNhdGVzIHRoYXQgdGhlIGhhbmRsZXIgY2FuIGRlYWwgd2l0aCBvdXQgb2Ygb3JkZXIgbWVzc2FnZXMKKyAqCisgKiBVbnJlZ2lzdGVyIGRyaXZlciBmcm9tIElVQ1YuCisgKi8KK3ZvaWQgaXVjdl91bnJlZ2lzdGVyKHN0cnVjdCBpdWN2X2hhbmRsZXIgKmhhbmRsZSwgaW50IHNtcCk7CisKKy8qKgorICogaXVjdl9wYXRoX2FsbG9jCisgKiBAbXNnbGltOiBpbml0aWFsIG1lc3NhZ2UgbGltaXQKKyAqIEBmbGFnczogaW5pdGlhbCBmbGFncworICogQGdmcDoga21hbGxvYyBhbGxvY2F0aW9uIGZsYWcKKyAqCisgKiBBbGxvY2F0ZSBhIG5ldyBwYXRoIHN0cnVjdHVyZSBmb3IgdXNlIHdpdGggaXVjdl9jb25uZWN0LgorICoKKyAqIFJldHVybnMgTlVMTCBpZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIG9yIGEgcG9pbnRlciB0byB0aGUKKyAqIHBhdGggc3RydWN0dXJlLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpdWN2X3BhdGggKml1Y3ZfcGF0aF9hbGxvYyh1MTYgbXNnbGltLCB1OCBmbGFncywgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBpdWN2X3BhdGggKnBhdGg7CisKKwlwYXRoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl1Y3ZfcGF0aCksIGdmcCk7CisJaWYgKHBhdGgpIHsKKwkJcGF0aC0+bXNnbGltID0gbXNnbGltOworCQlwYXRoLT5mbGFncyA9IGZsYWdzOworCX0KKwlyZXR1cm4gcGF0aDsKK30KKworLyoqCisgKiBpdWN2X3BhdGhfZnJlZQorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICoKKyAqIEZyZWVzIGEgcGF0aCBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpdWN2X3BhdGhfZnJlZShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoKQoreworCWtmcmVlKHBhdGgpOworfQorCisvKioKKyAqIGl1Y3ZfcGF0aF9hY2NlcHQKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEBoYW5kbGVyOiBhZGRyZXNzIG9mIGl1Y3YgaGFuZGxlciBzdHJ1Y3R1cmUKKyAqIEB1c2VyZGF0YTogMTYgYnl0ZXMgb2YgZGF0YSByZWZsZWN0ZWQgdG8gdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorICogQHByaXZhdGU6IHByaXZhdGUgZGF0YSBwYXNzZWQgdG8gaW50ZXJydXB0IGhhbmRsZXJzIGZvciB0aGlzIHBhdGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGlzc3VlZCBhZnRlciB0aGUgdXNlciByZWNlaXZlZCBhIGNvbm5lY3Rpb24gcGVuZGluZworICogZXh0ZXJuYWwgaW50ZXJydXB0IGFuZCBub3cgd2lzaGVzIHRvIGNvbXBsZXRlIHRoZSBJVUNWIGNvbW11bmljYXRpb24gcGF0aC4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfcGF0aF9hY2NlcHQoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfaGFuZGxlciAqaGFuZGxlciwKKwkJICAgICB1OCB1c2VyZGF0YVsxNl0sIHZvaWQgKnByaXZhdGUpOworCisvKioKKyAqIGl1Y3ZfcGF0aF9jb25uZWN0CisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAaGFuZGxlcjogYWRkcmVzcyBvZiBpdWN2IGhhbmRsZXIgc3RydWN0dXJlCisgKiBAdXNlcmlkOiA4LWJ5dGUgdXNlciBpZGVudGlmaWNhdGlvbgorICogQHN5c3RlbTogOC1ieXRlIHRhcmdldCBzeXN0ZW0gaWRlbnRpZmljYXRpb24KKyAqIEB1c2VyZGF0YTogMTYgYnl0ZXMgb2YgZGF0YSByZWZsZWN0ZWQgdG8gdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorICogQHByaXZhdGU6IHByaXZhdGUgZGF0YSBwYXNzZWQgdG8gaW50ZXJydXB0IGhhbmRsZXJzIGZvciB0aGlzIHBhdGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVzdGFibGlzaGVzIGFuIElVQ1YgcGF0aC4gQWx0aG91Z2ggdGhlIGNvbm5lY3QgbWF5IGNvbXBsZXRlCisgKiBzdWNjZXNzZnVsbHksIHlvdSBhcmUgbm90IGFibGUgdG8gdXNlIHRoZSBwYXRoIHVudGlsIHlvdSByZWNlaXZlIGFuIElVQ1YKKyAqIENvbm5lY3Rpb24gQ29tcGxldGUgZXh0ZXJuYWwgaW50ZXJydXB0LgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9wYXRoX2Nvbm5lY3Qoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfaGFuZGxlciAqaGFuZGxlciwKKwkJICAgICAgdTggdXNlcmlkWzhdLCB1OCBzeXN0ZW1bOF0sIHU4IHVzZXJkYXRhWzE2XSwKKwkJICAgICAgdm9pZCAqcHJpdmF0ZSk7CisKKy8qKgorICogaXVjdl9wYXRoX3F1aWVzY2U6CisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAdXNlcmRhdGE6IDE2IGJ5dGVzIG9mIGRhdGEgcmVmbGVjdGVkIHRvIHRoZSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRlbXBvcmFyaWx5IHN1c3BlbmRzIGluY29taW5nIG1lc3NhZ2VzIG9uIGFuIElVQ1YgcGF0aC4KKyAqIFlvdSBjYW4gbGF0ZXIgcmVhY3RpdmF0ZSB0aGUgcGF0aCBieSBpbnZva2luZyB0aGUgaXVjdl9yZXN1bWUgZnVuY3Rpb24uCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfcGF0aF9xdWllc2NlKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IHVzZXJkYXRhWzE2XSk7CisKKy8qKgorICogaXVjdl9wYXRoX3Jlc3VtZToKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEB1c2VyZGF0YTogMTYgYnl0ZXMgb2YgZGF0YSByZWZsZWN0ZWQgdG8gdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzdW1lcyBpbmNvbWluZyBtZXNzYWdlcyBvbiBhbiBJVUNWIHBhdGggdGhhdCBoYXMKKyAqIGJlZW4gc3RvcHBlZCB3aXRoIGl1Y3ZfcGF0aF9xdWllc2NlLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBmcm9tIHRoZSBDUCBJVUNWIGNhbGwuCisgKi8KK2ludCBpdWN2X3BhdGhfcmVzdW1lKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IHVzZXJkYXRhWzE2XSk7CisKKy8qKgorICogaXVjdl9wYXRoX3NldmVyCisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAdXNlcmRhdGE6IDE2IGJ5dGVzIG9mIGRhdGEgcmVmbGVjdGVkIHRvIHRoZSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgYW4gSVVDViBwYXRoLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBmcm9tIHRoZSBDUCBJVUNWIGNhbGwuCisgKi8KK2ludCBpdWN2X3BhdGhfc2V2ZXIoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgdTggdXNlcmRhdGFbMTZdKTsKKworLyoqCisgKiBpdWN2X21lc3NhZ2VfcHVyZ2UKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEBtc2c6IGFkZHJlc3Mgb2YgaXVjdiBtc2cgc3RydWN0dXJlCisgKiBAc3JjY2xzOiBzb3VyY2UgY2xhc3Mgb2YgbWVzc2FnZQorICoKKyAqIENhbmNlbHMgYSBtZXNzYWdlIHlvdSBoYXZlIHNlbnQuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfbWVzc2FnZV9wdXJnZShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2csCisJCSAgICAgICB1MzIgc3JjY2xzKTsKKworLyoqCisgKiBpdWN2X21lc3NhZ2VfcmVjZWl2ZQorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQG1zZzogYWRkcmVzcyBvZiBpdWN2IG1zZyBzdHJ1Y3R1cmUKKyAqIEBmbGFnczogZmxhZ3MgdGhhdCBhZmZlY3QgaG93IHRoZSBtZXNzYWdlIGlzIHJlY2VpdmVkIChJVUNWX0lQQlVGTFNUKQorICogQGJ1ZmZlcjogYWRkcmVzcyBvZiBkYXRhIGJ1ZmZlciBvciBhZGRyZXNzIG9mIHN0cnVjdCBpdWN2X2FycmF5CisgKiBAc2l6ZTogbGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgKiBAcmVzaWR1YWw6CisgKgorICogVGhpcyBmdW5jdGlvbiByZWNlaXZlcyBtZXNzYWdlcyB0aGF0IGFyZSBiZWluZyBzZW50IHRvIHlvdSBvdmVyCisgKiBlc3RhYmxpc2hlZCBwYXRocy4gVGhpcyBmdW5jdGlvbiB3aWxsIGRlYWwgd2l0aCBSTURBVEEgbWVzc2FnZXMKKyAqIGVtYmVkZGVkIGluIHN0cnVjdCBpdWN2X21lc3NhZ2UgYXMgd2VsbC4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgZnJvbSB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9tZXNzYWdlX3JlY2VpdmUoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnLAorCQkJIHU4IGZsYWdzLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBzaXplX3QgKnJlc2lkdWFsKTsKKworLyoqCisgKiBpdWN2X21lc3NhZ2VfcmVqZWN0CisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAbXNnOiBhZGRyZXNzIG9mIGl1Y3YgbXNnIHN0cnVjdHVyZQorICoKKyAqIFRoZSByZWplY3QgZnVuY3Rpb24gcmVmdXNlcyBhIHNwZWNpZmllZCBtZXNzYWdlLiBCZXR3ZWVuIHRoZSB0aW1lIHlvdQorICogYXJlIG5vdGlmaWVkIG9mIGEgbWVzc2FnZSBhbmQgdGhlIHRpbWUgdGhhdCB5b3UgY29tcGxldGUgdGhlIG1lc3NhZ2UsCisgKiB0aGUgbWVzc2FnZSBtYXkgYmUgcmVqZWN0ZWQuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfbWVzc2FnZV9yZWplY3Qoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnKTsKKworLyoqCisgKiBpdWN2X21lc3NhZ2VfcmVwbHkKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEBtc2c6IGFkZHJlc3Mgb2YgaXVjdiBtc2cgc3RydWN0dXJlCisgKiBAZmxhZ3M6IGhvdyB0aGUgcmVwbHkgaXMgc2VudCAoSVVDVl9JUFJNREFUQSwgSVVDVl9JUFBSVFksIElVQ1ZfSVBCVUZMU1QpCisgKiBAcmVwbHk6IGFkZHJlc3Mgb2YgZGF0YSBidWZmZXIgb3IgYWRkcmVzcyBvZiBzdHJ1Y3QgaXVjdl9hcnJheQorICogQHNpemU6IGxlbmd0aCBvZiByZXBseSBkYXRhIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzcG9uZHMgdG8gdGhlIHR3by13YXkgbWVzc2FnZXMgdGhhdCB5b3UgcmVjZWl2ZS4gWW91CisgKiBtdXN0IGlkZW50aWZ5IGNvbXBsZXRlbHkgdGhlIG1lc3NhZ2UgdG8gd2hpY2ggeW91IHdpc2ggdG8gcmVwbHkuIGllLAorICogcGF0aGlkLCBtc2dpZCwgYW5kIHRyZ2Nscy4gUHJtbXNnIHNpZ25pZmllcyB0aGUgZGF0YSBpcyBtb3ZlZCBpbnRvCisgKiB0aGUgcGFyYW1ldGVyIGxpc3QuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfbWVzc2FnZV9yZXBseShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2csCisJCSAgICAgICB1OCBmbGFncywgdm9pZCAqcmVwbHksIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBpdWN2X21lc3NhZ2Vfc2VuZAorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQG1zZzogYWRkcmVzcyBvZiBpdWN2IG1zZyBzdHJ1Y3R1cmUKKyAqIEBmbGFnczogaG93IHRoZSBtZXNzYWdlIGlzIHNlbnQgKElVQ1ZfSVBSTURBVEEsIElVQ1ZfSVBQUlRZLCBJVUNWX0lQQlVGTFNUKQorICogQHNyY2Nsczogc291cmNlIGNsYXNzIG9mIG1lc3NhZ2UKKyAqIEBidWZmZXI6IGFkZHJlc3Mgb2YgZGF0YSBidWZmZXIgb3IgYWRkcmVzcyBvZiBzdHJ1Y3QgaXVjdl9hcnJheQorICogQHNpemU6IGxlbmd0aCBvZiBzZW5kIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJhbnNtaXRzIGRhdGEgdG8gYW5vdGhlciBhcHBsaWNhdGlvbi4gRGF0YSB0byBiZQorICogdHJhbnNtaXR0ZWQgaXMgaW4gYSBidWZmZXIgYW5kIHRoaXMgaXMgYSBvbmUtd2F5IG1lc3NhZ2UgYW5kIHRoZQorICogcmVjZWl2ZXIgd2lsbCBub3QgcmVwbHkgdG8gdGhlIG1lc3NhZ2UuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfbWVzc2FnZV9zZW5kKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZywKKwkJICAgICAgdTggZmxhZ3MsIHUzMiBzcmNjbHMsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisvKioKKyAqIGl1Y3ZfbWVzc2FnZV9zZW5kMndheQorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQG1zZzogYWRkcmVzcyBvZiBpdWN2IG1zZyBzdHJ1Y3R1cmUKKyAqIEBmbGFnczogaG93IHRoZSBtZXNzYWdlIGlzIHNlbnQgYW5kIHRoZSByZXBseSBpcyByZWNlaXZlZAorICoJICAgKElVQ1ZfSVBSTURBVEEsIElVQ1ZfSVBCVUZMU1QsIElVQ1ZfSVBQUlRZLCBJVUNWX0FOU0xTVCkKKyAqIEBzcmNjbHM6IHNvdXJjZSBjbGFzcyBvZiBtZXNzYWdlCisgKiBAYnVmZmVyOiBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyIG9yIGFkZHJlc3Mgb2Ygc3RydWN0IGl1Y3ZfYXJyYXkKKyAqIEBzaXplOiBsZW5ndGggb2Ygc2VuZCBidWZmZXIKKyAqIEBhbnNidWY6IGFkZHJlc3Mgb2YgYW5zd2VyIGJ1ZmZlciBvciBhZGRyZXNzIG9mIHN0cnVjdCBpdWN2X2FycmF5CisgKiBAYXNpemU6IHNpemUgb2YgcmVwbHkgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiB0cmFuc21pdHMgZGF0YSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLiBEYXRhIHRvIGJlCisgKiB0cmFuc21pdHRlZCBpcyBpbiBhIGJ1ZmZlci4gVGhlIHJlY2VpdmVyIG9mIHRoZSBzZW5kIGlzIGV4cGVjdGVkIHRvCisgKiByZXBseSB0byB0aGUgbWVzc2FnZSBhbmQgYSBidWZmZXIgaXMgcHJvdmlkZWQgaW50byB3aGljaCBJVUNWIG1vdmVzCisgKiB0aGUgcmVwbHkgdG8gdGhpcyBtZXNzYWdlLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBmcm9tIHRoZSBDUCBJVUNWIGNhbGwuCisgKi8KK2ludCBpdWN2X21lc3NhZ2Vfc2VuZDJ3YXkoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnLAorCQkJICB1OCBmbGFncywgdTMyIHNyY2Nscywgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwKKwkJCSAgdm9pZCAqYW5zd2VyLCBzaXplX3QgYXNpemUsIHNpemVfdCAqcmVzaWR1YWwpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCmluZGV4IGJkMDFiNDYuLjY4ZWMyNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyMy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5oPgogCiAvKiBwZXIgY29ubnRyYWNrOiBhcHBsaWNhdGlvbiBoZWxwZXIgcHJpdmF0ZSBkYXRhICovCiB1bmlvbiBuZl9jb25udHJhY2tfaGVscCB7CkBAIC01Miw2ICs1Myw3IEBACiAJc3RydWN0IG5mX2N0X2Z0cF9tYXN0ZXIgY3RfZnRwX2luZm87CiAJc3RydWN0IG5mX2N0X3BwdHBfbWFzdGVyIGN0X3BwdHBfaW5mbzsKIAlzdHJ1Y3QgbmZfY3RfaDMyM19tYXN0ZXIgY3RfaDMyM19pbmZvOworCXN0cnVjdCBuZl9jdF9zYW5lX21hc3RlciBjdF9zYW5lX2luZm87CiB9OwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXQuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXQuaAppbmRleCA2MWM2MjA2Li5iYzU3ZGQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0LmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdC5oCkBAIC0xNiw2ICsxNiw3IEBACiAKICNkZWZpbmUgSVBfTkFUX1JBTkdFX01BUF9JUFMgMQogI2RlZmluZSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEIDIKKyNkZWZpbmUgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSA0CiAKIC8qIE5BVCBzZXF1ZW5jZSBudW1iZXIgbW9kaWZpY2F0aW9ucyAqLwogc3RydWN0IG5mX25hdF9zZXEgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcm91dGUuaCBiL2luY2x1ZGUvbmV0L3JvdXRlLmgKaW5kZXggNDg2ZTM3YS4uMTQ0MGJkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcm91dGUuaAorKysgYi9pbmNsdWRlL25ldC9yb3V0ZS5oCkBAIC0xNDYsNyArMTQ2LDggQEAKIAogc3RhdGljIGlubGluZSBpbnQgaXBfcm91dGVfY29ubmVjdChzdHJ1Y3QgcnRhYmxlICoqcnAsIF9fYmUzMiBkc3QsCiAJCQkJICAgX19iZTMyIHNyYywgdTMyIHRvcywgaW50IG9pZiwgdTggcHJvdG9jb2wsCi0JCQkJICAgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQsIHN0cnVjdCBzb2NrICpzaykKKwkJCQkgICBfX2JlMTYgc3BvcnQsIF9fYmUxNiBkcG9ydCwgc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5vaWYgPSBvaWYsCiAJCQkgICAgLm5sX3UgPSB7IC5pcDRfdSA9IHsgLmRhZGRyID0gZHN0LApAQCAtMTY4LDcgKzE2OSw3IEBACiAJCSpycCA9IE5VTEw7CiAJfQogCXNlY3VyaXR5X3NrX2NsYXNzaWZ5X2Zsb3coc2ssICZmbCk7Ci0JcmV0dXJuIGlwX3JvdXRlX291dHB1dF9mbG93KHJwLCAmZmwsIHNrLCAwKTsKKwlyZXR1cm4gaXBfcm91dGVfb3V0cHV0X2Zsb3cocnAsICZmbCwgc2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaXBfcm91dGVfbmV3cG9ydHMoc3RydWN0IHJ0YWJsZSAqKnJwLCB1OCBwcm90b2NvbCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjcC5oIGIvaW5jbHVkZS9uZXQvdGNwLmgKaW5kZXggY2Q4ZmEwYy4uNWM0NzJmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNwLmgKKysrIGIvaW5jbHVkZS9uZXQvdGNwLmgKQEAgLTgwMiw5ICs4MDIsOCBAQAogLyoKICAqIENhbGN1bGF0ZSgvY2hlY2spIFRDUCBjaGVja3N1bQogICovCi1zdGF0aWMgaW5saW5lIF9fc3VtMTYgdGNwX3Y0X2NoZWNrKHN0cnVjdCB0Y3BoZHIgKnRoLCBpbnQgbGVuLAotCQkJICAgICAgIF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAotCQkJICAgICAgIF9fd3N1bSBiYXNlKQorc3RhdGljIGlubGluZSBfX3N1bTE2IHRjcF92NF9jaGVjayhpbnQgbGVuLCBfX2JlMzIgc2FkZHIsCisJCQkJICAgX19iZTMyIGRhZGRyLCBfX3dzdW0gYmFzZSkKIHsKIAlyZXR1cm4gY3N1bV90Y3B1ZHBfbWFnaWMoc2FkZHIsZGFkZHIsbGVuLElQUFJPVE9fVENQLGJhc2UpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQveDI1LmggYi9pbmNsdWRlL25ldC94MjUuaAppbmRleCBlNDdmZTQ0Li5mYzNmMDNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94MjUuaAorKysgYi9pbmNsdWRlL25ldC94MjUuaApAQCAtMTYxLDYgKzE2MSwxNCBAQAogCXVuc2lnbmVkIGxvbmcgCQl2Y19mYWNpbF9tYXNrOwkvKiBpbmNfY2FsbCBmYWNpbGl0aWVzIG1hc2sgKi8KIH07CiAKK3N0cnVjdCB4MjVfZm9yd2FyZCB7CisJc3RydWN0IGxpc3RfaGVhZAlub2RlOworCXVuc2lnbmVkIGludAkJbGNpOworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXYxOworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXYyOworCWF0b21pY190CQlyZWZjbnQ7Cit9OworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB4MjVfc29jayAqeDI1X3NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKIHsKIAlyZXR1cm4gKHN0cnVjdCB4MjVfc29jayAqKXNrOwpAQCAtMTcyLDYgKzE4MCw3IEBACiBleHRlcm4gaW50ICBzeXNjdGxfeDI1X3Jlc2V0X3JlcXVlc3RfdGltZW91dDsKIGV4dGVybiBpbnQgIHN5c2N0bF94MjVfY2xlYXJfcmVxdWVzdF90aW1lb3V0OwogZXh0ZXJuIGludCAgc3lzY3RsX3gyNV9hY2tfaG9sZGJhY2tfdGltZW91dDsKK2V4dGVybiBpbnQgIHN5c2N0bF94MjVfZm9yd2FyZDsKIAogZXh0ZXJuIGludCAgeDI1X2FkZHJfbnRvYSh1bnNpZ25lZCBjaGFyICosIHN0cnVjdCB4MjVfYWRkcmVzcyAqLAogCQkJICBzdHJ1Y3QgeDI1X2FkZHJlc3MgKik7CkBAIC0xOTgsNiArMjA3LDEzIEBACiAJCQkJc3RydWN0IHgyNV9kdGVfZmFjaWxpdGllcyAqKTsKIGV4dGVybiB2b2lkIHgyNV9saW1pdF9mYWNpbGl0aWVzKHN0cnVjdCB4MjVfZmFjaWxpdGllcyAqLCBzdHJ1Y3QgeDI1X25laWdoICopOwogCisvKiB4MjVfZm9yd2FyZC5jICovCitleHRlcm4gdm9pZCB4MjVfY2xlYXJfZm9yd2FyZF9ieV9sY2kodW5zaWduZWQgaW50IGxjaSk7CitleHRlcm4gdm9pZCB4MjVfY2xlYXJfZm9yd2FyZF9ieV9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKik7CitleHRlcm4gaW50IHgyNV9mb3J3YXJkX2RhdGEoaW50LCBzdHJ1Y3QgeDI1X25laWdoICosIHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIGludCB4MjVfZm9yd2FyZF9jYWxsKHN0cnVjdCB4MjVfYWRkcmVzcyAqLCBzdHJ1Y3QgeDI1X25laWdoICosCisJCQkJc3RydWN0IHNrX2J1ZmYgKiwgaW50KTsKKwogLyogeDI1X2luLmMgKi8KIGV4dGVybiBpbnQgIHgyNV9wcm9jZXNzX3J4X2ZyYW1lKHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopOwogZXh0ZXJuIGludCAgeDI1X2JhY2tsb2dfcmN2KHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopOwpAQCAtMjgyLDYgKzI5OCw4IEBACiBleHRlcm4gcndsb2NrX3QgeDI1X2xpc3RfbG9jazsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHgyNV9yb3V0ZV9saXN0OwogZXh0ZXJuIHJ3bG9ja190IHgyNV9yb3V0ZV9saXN0X2xvY2s7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCB4MjVfZm9yd2FyZF9saXN0OworZXh0ZXJuIHJ3bG9ja190IHgyNV9mb3J3YXJkX2xpc3RfbG9jazsKIAogZXh0ZXJuIGludCB4MjVfcHJvY19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgeDI1X3Byb2NfZXhpdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3hmcm0uaCBiL2luY2x1ZGUvbmV0L3hmcm0uaAppbmRleCBlNDc2NTQxLi4xNjkyNGNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQveGZybS5oCkBAIC0yNTIsMTAgKzI1MiwxMyBAQAogCQkJCQkJeGZybV9hZGRyZXNzX3QgKmRhZGRyLCB4ZnJtX2FkZHJlc3NfdCAqc2FkZHIpOwogCWludAkJCSgqdG1wbF9zb3J0KShzdHJ1Y3QgeGZybV90bXBsICoqZHN0LCBzdHJ1Y3QgeGZybV90bXBsICoqc3JjLCBpbnQgbik7CiAJaW50CQkJKCpzdGF0ZV9zb3J0KShzdHJ1Y3QgeGZybV9zdGF0ZSAqKmRzdCwgc3RydWN0IHhmcm1fc3RhdGUgKipzcmMsIGludCBuKTsKKwlpbnQJCQkoKm91dHB1dCkoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB9OwogCiBleHRlcm4gaW50IHhmcm1fc3RhdGVfcmVnaXN0ZXJfYWZpbmZvKHN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqYWZpbmZvKTsKIGV4dGVybiBpbnQgeGZybV9zdGF0ZV91bnJlZ2lzdGVyX2FmaW5mbyhzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKmFmaW5mbyk7CitleHRlcm4gc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvICp4ZnJtX3N0YXRlX2dldF9hZmluZm8odW5zaWduZWQgc2hvcnQgZmFtaWx5KTsKK2V4dGVybiB2b2lkIHhmcm1fc3RhdGVfcHV0X2FmaW5mbyhzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKmFmaW5mbyk7CiAKIGV4dGVybiB2b2lkIHhmcm1fc3RhdGVfZGVsZXRlX3R1bm5lbChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCk7CiAKQEAgLTM1OSw2ICszNjIsMTkgQEAKIAlzdHJ1Y3QgeGZybV90bXBsICAgICAgIAl4ZnJtX3ZlY1tYRlJNX01BWF9ERVBUSF07CiB9OwogCitzdHJ1Y3QgeGZybV9taWdyYXRlIHsKKwl4ZnJtX2FkZHJlc3NfdAkJb2xkX2RhZGRyOworCXhmcm1fYWRkcmVzc190CQlvbGRfc2FkZHI7CisJeGZybV9hZGRyZXNzX3QJCW5ld19kYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAkJbmV3X3NhZGRyOworCXU4CQkJcHJvdG87CisJdTgJCQltb2RlOworCXUxNgkJCXJlc2VydmVkOworCXUzMgkJCXJlcWlkOworCXUxNgkJCW9sZF9mYW1pbHk7CisJdTE2CQkJbmV3X2ZhbWlseTsKK307CisKICNkZWZpbmUgWEZSTV9LTV9USU1FT1VUICAgICAgICAgICAgICAgIDMwCiAvKiB3aGljaCBzZXFubyAqLwogI2RlZmluZSBYRlJNX1JFUExBWV9TRVEJCTEKQEAgLTM4NSw2ICs0MDEsNyBAQAogCWludAkJCSgqbmV3X21hcHBpbmcpKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCB4ZnJtX2FkZHJlc3NfdCAqaXBhZGRyLCBfX2JlMTYgc3BvcnQpOwogCWludAkJCSgqbm90aWZ5X3BvbGljeSkoc3RydWN0IHhmcm1fcG9saWN5ICp4LCBpbnQgZGlyLCBzdHJ1Y3Qga21fZXZlbnQgKmMpOwogCWludAkJCSgqcmVwb3J0KSh1OCBwcm90bywgc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgeGZybV9hZGRyZXNzX3QgKmFkZHIpOworCWludAkJCSgqbWlncmF0ZSkoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLCBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX2J1bmRsZXMpOwogfTsKIAogZXh0ZXJuIGludCB4ZnJtX3JlZ2lzdGVyX2ttKHN0cnVjdCB4ZnJtX21nciAqa20pOwpAQCAtOTg1LDYgKzEwMDIsMTYgQEAKIAkJCSAgc3RydWN0IGZsb3dpICpmbCwgaW50IGZhbWlseSwgaW50IHN0cmljdCk7CiBleHRlcm4gdm9pZCB4ZnJtX2luaXRfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogCisjaWZkZWYgQ09ORklHX1hGUk1fTUlHUkFURQorZXh0ZXJuIGludCBrbV9taWdyYXRlKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHU4IGRpciwgdTggdHlwZSwKKwkJICAgICAgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgaW50IG51bV9idW5kbGVzKTsKK2V4dGVybiBzdHJ1Y3QgeGZybV9zdGF0ZSAqIHhmcm1fbWlncmF0ZV9zdGF0ZV9maW5kKHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0pOworZXh0ZXJuIHN0cnVjdCB4ZnJtX3N0YXRlICogeGZybV9zdGF0ZV9taWdyYXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4LAorCQkJCQkgICAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptKTsKK2V4dGVybiBpbnQgeGZybV9taWdyYXRlKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHU4IGRpciwgdTggdHlwZSwKKwkJCXN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fYnVuZGxlcyk7CisjZW5kaWYKKwogZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IGttX3dhaXRxOwogZXh0ZXJuIGludCBrbV9uZXdfbWFwcGluZyhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgeGZybV9hZGRyZXNzX3QgKmlwYWRkciwgX19iZTE2IHNwb3J0KTsKIGV4dGVybiB2b2lkIGttX3BvbGljeV9leHBpcmVkKHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sLCBpbnQgZGlyLCBpbnQgaGFyZCwgdTMyIHBpZCk7CkBAIC0xMDUwLDUgKzEwNzcsMjUgQEAKIAkJeGZybV9yZXBsYXlfbm90aWZ5KHgsIFhGUk1fUkVQTEFZX1VQREFURSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfWEZSTV9NSUdSQVRFCitzdGF0aWMgaW5saW5lIHN0cnVjdCB4ZnJtX2FsZ28gKnhmcm1fYWxnb19jbG9uZShzdHJ1Y3QgeGZybV9hbGdvICpvcmlnKQoreworCXJldHVybiAoc3RydWN0IHhmcm1fYWxnbyAqKWttZW1kdXAob3JpZywgc2l6ZW9mKCpvcmlnKSArIG9yaWctPmFsZ19rZXlfbGVuLCBHRlBfS0VSTkVMKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhmcm1fc3RhdGVzX3B1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqKnN0YXRlcywgaW50IG4pCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJeGZybV9zdGF0ZV9wdXQoKihzdGF0ZXMgKyBpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnJtX3N0YXRlc19kZWxldGUoc3RydWN0IHhmcm1fc3RhdGUgKipzdGF0ZXMsIGludCBuKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCXhmcm1fc3RhdGVfZGVsZXRlKCooc3RhdGVzICsgaSkpOworfQorI2VuZGlmCiAKICNlbmRpZgkvKiBfTkVUX1hGUk1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2lzY3NpX3Byb3RvLmggYi9pbmNsdWRlL3Njc2kvaXNjc2lfcHJvdG8uaAppbmRleCAwMmY2ZTRiLi40YTQ0Mjc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvaXNjc2lfcHJvdG8uaAorKysgYi9pbmNsdWRlL3Njc2kvaXNjc2lfcHJvdG8uaApAQCAtNDAsNiArNDAsMTQgQEAKIH0KICNkZWZpbmUgemVyb19kYXRhKHApIHtwWzBdPTA7cFsxXT0wO3BbMl09MDt9CiAKKy8qIGluaXRpYXRvciB0YWdzOyBvcGFxdWUgZm9yIHRhcmdldCAqLwordHlwZWRlZiB1aW50MzJfdCBfX2JpdHdpc2VfXyBpdHRfdDsKKy8qIGJlbG93IG1ha2VzIHNlbnNlIG9ubHkgZm9yIGluaXRpYXRvciB0aGF0IGNyZWF0ZWQgdGhpcyB0YWcgKi8KKyNkZWZpbmUgYnVpbGRfaXR0KGl0dCwgaWQsIGFnZSkgKChfX2ZvcmNlIGl0dF90KVwKKwkoKGl0dCkgfCAoKGlkKSA8PCBJU0NTSV9DSURfU0hJRlQpIHwgKChhZ2UpIDw8IElTQ1NJX0FHRV9TSElGVCkpKQorI2RlZmluZSBnZXRfaXR0KGl0dCkgKChfX2ZvcmNlIHVpbnQzMl90KShpdHRfdCkoaXR0KSAmIElTQ1NJX0lUVF9NQVNLKQorI2RlZmluZSBSRVNFUlZFRF9JVFQgKChfX2ZvcmNlIGl0dF90KTB4ZmZmZmZmZmYpCisKIC8qCiAgKiBpU0NTSSBUZW1wbGF0ZSBNZXNzYWdlIEhlYWRlcgogICovCkBAIC01MCw3ICs1OCw3IEBACiAJdWludDhfdAkJaGxlbmd0aDsJLyogQUhTcyB0b3RhbCBsZW5ndGggKi8KIAl1aW50OF90CQlkbGVuZ3RoWzNdOwkvKiBEYXRhIGxlbmd0aCAqLwogCXVpbnQ4X3QJCWx1bls4XTsKLQlfX2JlMzIJCWl0dDsJCS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLworCWl0dF90CQlpdHQ7CQkvKiBJbml0aWF0b3IgVGFzayBUYWcsIG9wYXF1ZSBmb3IgdGFyZ2V0ICovCiAJX19iZTMyCQl0dHQ7CQkvKiBUYXJnZXQgVGFzayBUYWcgKi8KIAlfX2JlMzIJCXN0YXRzbjsKIAlfX2JlMzIJCWV4cF9zdGF0c247CkBAIC0xMTEsNyArMTE5LDcgQEAKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgbHVuWzhdOwotCV9fYmUzMiBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLworCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwogCV9fYmUzMiBkYXRhX2xlbmd0aDsKIAlfX2JlMzIgY21kc247CiAJX19iZTMyIGV4cF9zdGF0c247CkBAIC0xNDgsNyArMTU2LDcgQEAKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgcnN2ZFs4XTsKLQlfX2JlMzIJaXR0OwkvKiBJbml0aWF0b3IgVGFzayBUYWcgKi8KKwlpdHRfdAkgaXR0OwkvKiBJbml0aWF0b3IgVGFzayBUYWcgKi8KIAlfX2JlMzIJcnN2ZDE7CiAJX19iZTMyCXN0YXRzbjsKIAlfX2JlMzIJZXhwX2NtZHNuOwpAQCAtMjA2LDcgKzIxNCw3IEBACiAJdWludDhfdCByc3ZkMzsKIAl1aW50OF90IGRsZW5ndGhbM107CiAJdWludDhfdCBsdW5bOF07Ci0JX19iZTMyCWl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCisJaXR0X3QJIGl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCiAJX19iZTMyCXR0dDsJLyogVGFyZ2V0IFRyYW5zZmVyIFRhZyAqLwogCV9fYmUzMgljbWRzbjsKIAlfX2JlMzIJZXhwX3N0YXRzbjsKQEAgLTIyMSw3ICsyMjksNyBAQAogCXVpbnQ4X3QgcnN2ZDM7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgbHVuWzhdOwotCV9fYmUzMglpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLworCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwogCV9fYmUzMgl0dHQ7CS8qIFRhcmdldCBUcmFuc2ZlciBUYWcgKi8KIAlfX2JlMzIJc3RhdHNuOwogCV9fYmUzMglleHBfY21kc247CkBAIC0yMzcsOCArMjQ1LDggQEAKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgbHVuWzhdOwotCV9fYmUzMglpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwotCV9fYmUzMglydHQ7CS8qIFJlZmVyZW5jZSBUYXNrIFRhZyAqLworCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLworCWl0dF90CSBydHQ7CS8qIFJlZmVyZW5jZSBUYXNrIFRhZyAqLwogCV9fYmUzMgljbWRzbjsKIAlfX2JlMzIJZXhwX3N0YXRzbjsKIAlfX2JlMzIJcmVmY21kc247CkBAIC0yNjcsOCArMjc1LDggQEAKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgcnN2ZDJbOF07Ci0JX19iZTMyCWl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCi0JX19iZTMyCXJ0dDsJLyogUmVmZXJlbmNlIFRhc2sgVGFnICovCisJaXR0X3QJIGl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCisJaXR0X3QJIHJ0dDsJLyogUmVmZXJlbmNlIFRhc2sgVGFnICovCiAJX19iZTMyCXN0YXRzbjsKIAlfX2JlMzIJZXhwX2NtZHNuOwogCV9fYmUzMgltYXhfY21kc247CkBAIC0yOTMsNyArMzAxLDcgQEAKIAl1aW50OF90CWhsZW5ndGg7CiAJdWludDhfdAlkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgbHVuWzhdOwotCV9fYmUzMglpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLworCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwogCV9fYmUzMgl0dHQ7CS8qIFRhcmdldCBUcmFuc2ZlciBUYWcgKi8KIAlfX2JlMzIJc3RhdHNuOwogCV9fYmUzMglleHBfY21kc247CkBAIC0zMTEsNyArMzE5LDcgQEAKIAl1aW50OF90IHJzdmQzOwogCXVpbnQ4X3QgZGxlbmd0aFszXTsKIAl1aW50OF90IGx1bls4XTsKLQlfX2JlMzIJaXR0OworCWl0dF90CSBpdHQ7CiAJX19iZTMyCXR0dDsKIAlfX2JlMzIJcnN2ZDQ7CiAJX19iZTMyCWV4cF9zdGF0c247CkBAIC0zMzEsNyArMzM5LDcgQEAKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgbHVuWzhdOwotCV9fYmUzMglpdHQ7CisJaXR0X3QJIGl0dDsKIAlfX2JlMzIJdHR0OwogCV9fYmUzMglzdGF0c247CiAJX19iZTMyCWV4cF9jbWRzbjsKQEAgLTM1NSw3ICszNjMsNyBAQAogCXVpbnQ4X3QgaGxlbmd0aDsKIAl1aW50OF90IGRsZW5ndGhbM107CiAJdWludDhfdCByc3ZkNFs4XTsKLQlfX2JlMzIJaXR0OworCWl0dF90CSBpdHQ7CiAJX19iZTMyCXR0dDsKIAlfX2JlMzIJY21kc247CiAJX19iZTMyCWV4cF9zdGF0c247CkBAIC0zNzMsNyArMzgxLDcgQEAKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgcnN2ZDRbOF07Ci0JX19iZTMyCWl0dDsKKwlpdHRfdAkgaXR0OwogCV9fYmUzMgl0dHQ7CiAJX19iZTMyCXN0YXRzbjsKIAlfX2JlMzIJZXhwX2NtZHNuOwpAQCAtMzkyLDcgKzQwMCw3IEBACiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgaXNpZFs2XTsJLyogSW5pdGlhdG9yIFNlc3Npb24gSUQgKi8KIAlfX2JlMTYJdHNpaDsJLyogVGFyZ2V0IFNlc3Npb24gSGFuZGxlICovCi0JX19iZTMyCWl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCisJaXR0X3QJIGl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCiAJX19iZTE2CWNpZDsKIAlfX2JlMTYJcnN2ZDM7CiAJX19iZTMyCWNtZHNuOwpAQCAtNDIxLDcgKzQyOSw3IEBACiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgaXNpZFs2XTsJLyogSW5pdGlhdG9yIFNlc3Npb24gSUQgKi8KIAlfX2JlMTYJdHNpaDsJLyogVGFyZ2V0IFNlc3Npb24gSGFuZGxlICovCi0JX19iZTMyCWl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCisJaXR0X3QJIGl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCiAJX19iZTMyCXJzdmQzOwogCV9fYmUzMglzdGF0c247CiAJX19iZTMyCWV4cF9jbWRzbjsKQEAgLTQ3OCw3ICs0ODYsNyBAQAogCXVpbnQ4X3QgaGxlbmd0aDsKIAl1aW50OF90IGRsZW5ndGhbM107CiAJdWludDhfdCByc3ZkMls4XTsKLQlfX2JlMzIJaXR0OwkvKiBJbml0aWF0b3IgVGFzayBUYWcgKi8KKwlpdHRfdAkgaXR0OwkvKiBJbml0aWF0b3IgVGFzayBUYWcgKi8KIAlfX2JlMTYJY2lkOwogCXVpbnQ4X3QgcnN2ZDNbMl07CiAJX19iZTMyCWNtZHNuOwpAQCAtNTA1LDcgKzUxMyw3IEBACiAJdWludDhfdCBobGVuZ3RoOwogCXVpbnQ4X3QgZGxlbmd0aFszXTsKIAl1aW50OF90IHJzdmQzWzhdOwotCV9fYmUzMglpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLworCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwogCV9fYmUzMglyc3ZkNDsKIAlfX2JlMzIJc3RhdHNuOwogCV9fYmUzMglleHBfY21kc247CkBAIC01MjgsNyArNTM2LDcgQEAKIAl1aW50OF90IG9wY29kZTsKIAl1aW50OF90IGZsYWdzOwogCXVpbnQ4X3QgcnN2ZDJbMTRdOwotCV9fYmUzMglpdHQ7CisJaXR0X3QJIGl0dDsKIAlfX2JlMzIJYmVncnVuOwogCV9fYmUzMglydW5sZW5ndGg7CiAJX19iZTMyCWV4cF9zdGF0c247CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2FjOTdfY29kZWMuaCBiL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oCmluZGV4IDMzNzIwMzkuLjI0NmFjMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oCisrKyBiL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oCkBAIC0zNzUsNiArMzc1LDcgQEAKICNkZWZpbmUgQUM5N19TQ0FQX0RFVEVDVF9CWV9WRU5ET1IgKDE8PDgpIC8qIHVzZSB2ZW5kb3IgcmVnaXN0ZXJzIGZvciByZWFkIHRlc3RzICovCiAjZGVmaW5lIEFDOTdfU0NBUF9OT19TUERJRgkoMTw8OSkJLyogZG9uJ3QgYnVpbGQgU1BESUYgY29udHJvbHMgKi8KICNkZWZpbmUgQUM5N19TQ0FQX0VBUERfTEVECSgxPDwxMCkJLyogRUFQRCBhcyBtdXRlIExFRCAqLworI2RlZmluZSBBQzk3X1NDQVBfUE9XRVJfU0FWRQkoMTw8MTEpCS8qIGNhcGFibGUgZm9yIGFnZ3Jlc2l2ZSBwb3dlci1zYXZpbmcgKi8KIAogLyogYWM5Ny0+ZmxhZ3MgKi8KICNkZWZpbmUgQUM5N19IQVNfUENfQkVFUAkoMTw8MCkJLyogZm9yY2UgUEMgU3BlYWtlciB1c2FnZSAqLwpAQCAtNDI1LDYgKzQyNiw3IEBACiAKIHN0cnVjdCBzbmRfYWM5N19idXNfb3BzIHsKIAl2b2lkICgqcmVzZXQpIChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpOworCXZvaWQgKCp3YXJtX3Jlc2V0KShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpOwogCXZvaWQgKCp3cml0ZSkgKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWwpOwogCXVuc2lnbmVkIHNob3J0ICgqcmVhZCkgKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnKTsKIAl2b2lkICgqd2FpdCkgKHN0cnVjdCBzbmRfYWM5NyAqYWM5Nyk7CkBAIC01MDEsNiArNTAzLDcgQEAKIAkJCXVuc2lnbmVkIHNob3J0IGlkWzNdOwkJLy8gY29kZWMgSURzIChsb3dlciAxNi1iaXQgd29yZCkKIAkJCXVuc2lnbmVkIHNob3J0IHBjbXJlZ1szXTsJLy8gUENNIHJlZ2lzdGVycwogCQkJdW5zaWduZWQgc2hvcnQgY29kZWNfY2ZnWzNdOwkvLyBDT0RFQ19DRkcgYml0cworCQkJdW5zaWduZWQgY2hhciBzd2FwX21pY19saW5laW47CS8vIEFEMTk4Ni9BRDE5ODZBIG9ubHkKIAkJfSBhZDE4eHg7CiAJCXVuc2lnbmVkIGludCBkZXZfZmxhZ3M7CQkvKiBkZXZpY2Ugc3BlY2lmaWMgKi8KIAl9IHNwZWM7CkBAIC01MTAsNyArNTEzLDYgQEAKIAogI2lmZGVmIENPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFCiAJdW5zaWduZWQgaW50IHBvd2VyX3VwOwkvKiBwb3dlciBzdGF0ZXMgKi8KLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcG93ZXJfd29ya3E7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBwb3dlcl93b3JrOwogI2VuZGlmCiAJc3RydWN0IGRldmljZSBkZXY7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2FkMTg0OC5oIGIvaW5jbHVkZS9zb3VuZC9hZDE4NDguaAppbmRleCBjOGRlNmY4Li5iMmMzZjAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2FkMTg0OC5oCisrKyBiL2luY2x1ZGUvc291bmQvYWQxODQ4LmgKQEAgLTE4NSw3ICsxODUsNyBAQAogCWludCBpbmRleDsKIAlpbnQgdHlwZTsKIAl1bnNpZ25lZCBsb25nIHByaXZhdGVfdmFsdWU7Ci0JdW5zaWduZWQgaW50ICp0bHY7CisJY29uc3QgdW5zaWduZWQgaW50ICp0bHY7CiB9OwogCiAjZGVmaW5lIEFEMTg0OF9TSU5HTEUoeG5hbWUsIHhpbmRleCwgcmVnLCBzaGlmdCwgbWFzaywgaW52ZXJ0KSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2FrNDExNC5oIGIvaW5jbHVkZS9zb3VuZC9hazQxMTQuaAppbmRleCAyZWUwNjE2Li5jMTQ5ZDNiMjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvYWs0MTE0LmgKKysrIGIvaW5jbHVkZS9zb3VuZC9hazQxMTQuaApAQCAtMTgxLDcgKzE4MSw2IEBACiAJdW5zaWduZWQgbG9uZyBjY3JjX2Vycm9yczsKIAl1bnNpZ25lZCBjaGFyIHJjczA7CiAJdW5zaWduZWQgY2hhciByY3MxOwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7CiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCXZvaWQgKmNoYW5nZV9jYWxsYmFja19wcml2YXRlOwogCXZvaWQgKCpjaGFuZ2VfY2FsbGJhY2spKHN0cnVjdCBhazQxMTQgKmFrNDExNCwgdW5zaWduZWQgY2hhciBjMCwgdW5zaWduZWQgY2hhciBjMSk7CkBAIC0xODksNyArMTg4LDcgQEAKIAogaW50IHNuZF9hazQxMTRfY3JlYXRlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKIAkJICAgICAgYWs0MTE0X3JlYWRfdCAqcmVhZCwgYWs0MTE0X3dyaXRlX3QgKndyaXRlLAotCQkgICAgICB1bnNpZ25lZCBjaGFyIHBnbVs3XSwgdW5zaWduZWQgY2hhciB0eGNzYls1XSwKKwkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBwZ21bN10sIGNvbnN0IHVuc2lnbmVkIGNoYXIgdHhjc2JbNV0sCiAJCSAgICAgIHZvaWQgKnByaXZhdGVfZGF0YSwgc3RydWN0IGFrNDExNCAqKnJfYWs0MTE0KTsKIHZvaWQgc25kX2FrNDExNF9yZWdfd3JpdGUoc3RydWN0IGFrNDExNCAqYWs0MTE0LCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciBtYXNrLCB1bnNpZ25lZCBjaGFyIHZhbCk7CiB2b2lkIHNuZF9hazQxMTRfcmVpbml0KHN0cnVjdCBhazQxMTQgKmFrNDExNCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2FrNDExNy5oIGIvaW5jbHVkZS9zb3VuZC9hazQxMTcuaAppbmRleCAyYjk2YzMyLi5kNjUwZDUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2FrNDExNy5oCisrKyBiL2luY2x1ZGUvc291bmQvYWs0MTE3LmgKQEAgLTE3OCw3ICsxNzgsNyBAQAogfTsKIAogaW50IHNuZF9hazQxMTdfY3JlYXRlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgYWs0MTE3X3JlYWRfdCAqcmVhZCwgYWs0MTE3X3dyaXRlX3QgKndyaXRlLAotCQkgICAgICB1bnNpZ25lZCBjaGFyIHBnbVs1XSwgdm9pZCAqcHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgYWs0MTE3ICoqcl9hazQxMTcpOworCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIHBnbVs1XSwgdm9pZCAqcHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgYWs0MTE3ICoqcl9hazQxMTcpOwogdm9pZCBzbmRfYWs0MTE3X3JlZ193cml0ZShzdHJ1Y3QgYWs0MTE3ICphazQxMTcsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIG1hc2ssIHVuc2lnbmVkIGNoYXIgdmFsKTsKIHZvaWQgc25kX2FrNDExN19yZWluaXQoc3RydWN0IGFrNDExNyAqYWs0MTE3KTsKIGludCBzbmRfYWs0MTE3X2J1aWxkKHN0cnVjdCBhazQxMTcgKmFrNDExNywgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpjYXB0dXJlX3N1YnN0cmVhbSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2FrNHh4eC1hZGRhLmggYi9pbmNsdWRlL3NvdW5kL2FrNHh4eC1hZGRhLmgKaW5kZXggZDBkZWNhNi4uYWE0OWRkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9hazR4eHgtYWRkYS5oCisrKyBiL2luY2x1ZGUvc291bmQvYWs0eHh4LWFkZGEuaApAQCAtNTAsNiArNTAsOCBAQAogCWNoYXIgKm5hbWU7CQkvKiBjYXB0dXJlIGdhaW4gdm9sdW1lIGxhYmVsICovCiAJY2hhciAqc3dpdGNoX25hbWU7CS8qIGNhcHR1cmUgc3dpdGNoICovCiAJdW5zaWduZWQgaW50IG51bV9jaGFubmVsczsKKwljaGFyICpzZWxlY3Rvcl9uYW1lOwkvKiBjYXB0dXJlIHNvdXJjZSBzZWxlY3QgbGFiZWwgKi8KKwljb25zdCBjaGFyICoqaW5wdXRfbmFtZXM7IC8qIGNhcHR1cmUgc291cmNlIG5hbWVzIChOVUxMIHRlcm1pbmF0ZWQpICovCiB9OwogCiBzdHJ1Y3Qgc25kX2FrbTR4eHggewpAQCAtNjksOCArNzEsOCBAQAogCX0gdHlwZTsKIAogCS8qIChhcnJheSkgaW5mb3JtYXRpb24gb2YgY29tYmluZWQgY29kZWNzICovCi0Jc3RydWN0IHNuZF9ha200eHh4X2RhY19jaGFubmVsICpkYWNfaW5mbzsKLQlzdHJ1Y3Qgc25kX2FrbTR4eHhfYWRjX2NoYW5uZWwgKmFkY19pbmZvOworCWNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eF9kYWNfY2hhbm5lbCAqZGFjX2luZm87CisJY29uc3Qgc3RydWN0IHNuZF9ha200eHh4X2FkY19jaGFubmVsICphZGNfaW5mbzsKIAogCXN0cnVjdCBzbmRfYWs0eHh4X29wcyBvcHM7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9jb250cm9sLmggYi9pbmNsdWRlL3NvdW5kL2NvbnRyb2wuaAppbmRleCAxZGUxNDhiLi43MmU3NTlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2NvbnRyb2wuaAorKysgYi9pbmNsdWRlL3NvdW5kL2NvbnRyb2wuaApAQCAtNDksNyArNDksNyBAQAogCXNuZF9rY29udHJvbF9wdXRfdCAqcHV0OwogCXVuaW9uIHsKIAkJc25kX2tjb250cm9sX3Rsdl9yd190ICpjOwotCQl1bnNpZ25lZCBpbnQgKnA7CisJCWNvbnN0IHVuc2lnbmVkIGludCAqcDsKIAl9IHRsdjsKIAl1bnNpZ25lZCBsb25nIHByaXZhdGVfdmFsdWU7CiB9OwpAQCAtNjksNyArNjksNyBAQAogCXNuZF9rY29udHJvbF9wdXRfdCAqcHV0OwogCXVuaW9uIHsKIAkJc25kX2tjb250cm9sX3Rsdl9yd190ICpjOwotCQl1bnNpZ25lZCBpbnQgKnA7CisJCWNvbnN0IHVuc2lnbmVkIGludCAqcDsKIAl9IHRsdjsKIAl1bnNpZ25lZCBsb25nIHByaXZhdGVfdmFsdWU7CiAJdm9pZCAqcHJpdmF0ZV9kYXRhOwpAQCAtMTA4LDcgKzEwOCw2IEBACiAKIHZvaWQgc25kX2N0bF9ub3RpZnkoc3RydWN0IHNuZF9jYXJkICogY2FyZCwgdW5zaWduZWQgaW50IG1hc2ssIHN0cnVjdCBzbmRfY3RsX2VsZW1faWQgKiBpZCk7CiAKLXN0cnVjdCBzbmRfa2NvbnRyb2wgKnNuZF9jdGxfbmV3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKiBrY29udHJvbCwgdW5zaWduZWQgaW50IGFjY2Vzcyk7CiBzdHJ1Y3Qgc25kX2tjb250cm9sICpzbmRfY3RsX25ldzEoY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKiBrY29udHJvbG5ldywgdm9pZCAqIHByaXZhdGVfZGF0YSk7CiB2b2lkIHNuZF9jdGxfZnJlZV9vbmUoc3RydWN0IHNuZF9rY29udHJvbCAqIGtjb250cm9sKTsKIGludCBzbmRfY3RsX2FkZChzdHJ1Y3Qgc25kX2NhcmQgKiBjYXJkLCBzdHJ1Y3Qgc25kX2tjb250cm9sICoga2NvbnRyb2wpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9jb3JlLmggYi9pbmNsdWRlL3NvdW5kL2NvcmUuaAppbmRleCA1MjFmMDM2Li40YjllNjA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2NvcmUuaAorKysgYi9pbmNsdWRlL3NvdW5kL2NvcmUuaApAQCAtMjExLDkgKzIxMSw0MCBAQAogCiB2b2lkIHNuZF9yZXF1ZXN0X2NhcmQoaW50IGNhcmQpOwogCi1pbnQgc25kX3JlZ2lzdGVyX2RldmljZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2LAotCQkJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZl9vcHMsIHZvaWQgKnByaXZhdGVfZGF0YSwKLQkJCWNvbnN0IGNoYXIgKm5hbWUpOworaW50IHNuZF9yZWdpc3Rlcl9kZXZpY2VfZm9yX2RldihpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLAorCQkJCWludCBkZXYsCisJCQkJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZl9vcHMsCisJCQkJdm9pZCAqcHJpdmF0ZV9kYXRhLAorCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQkJc3RydWN0IGRldmljZSAqZGV2aWNlKTsKKworLyoqCisgKiBzbmRfcmVnaXN0ZXJfZGV2aWNlIC0gUmVnaXN0ZXIgdGhlIEFMU0EgZGV2aWNlIGZpbGUgZm9yIHRoZSBjYXJkCisgKiBAdHlwZTogdGhlIGRldmljZSB0eXBlLCBTTkRSVl9ERVZJQ0VfVFlQRV9YWFgKKyAqIEBjYXJkOiB0aGUgY2FyZCBpbnN0YW5jZQorICogQGRldjogdGhlIGRldmljZSBpbmRleAorICogQGZfb3BzOiB0aGUgZmlsZSBvcGVyYXRpb25zCisgKiBAcHJpdmF0ZV9kYXRhOiB1c2VyIHBvaW50ZXIgZm9yIGZfb3BzLT5vcGVuKCkKKyAqIEBuYW1lOiB0aGUgZGV2aWNlIGZpbGUgbmFtZQorICoKKyAqIFJlZ2lzdGVycyBhbiBBTFNBIGRldmljZSBmaWxlIGZvciB0aGUgZ2l2ZW4gY2FyZC4KKyAqIFRoZSBvcGVyYXRvcnMgaGF2ZSB0byBiZSBzZXQgaW4gcmVnIHBhcmFtZXRlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGNhcmQncyBkZXZpY2UgcG9pbnRlciB0byBsaW5rIHRvIHRoZQorICogY29ycmVjdCAmc3RydWN0IGRldmljZS4KKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9yZWdpc3Rlcl9kZXZpY2UoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmX29wcywKKwkJCQkgICAgICB2b2lkICpwcml2YXRlX2RhdGEsCisJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gc25kX3JlZ2lzdGVyX2RldmljZV9mb3JfZGV2KHR5cGUsIGNhcmQsIGRldiwgZl9vcHMsCisJCQkJCSAgIHByaXZhdGVfZGF0YSwgbmFtZSwKKwkJCQkJICAgc25kX2NhcmRfZ2V0X2RldmljZV9saW5rKGNhcmQpKTsKK30KKwogaW50IHNuZF91bnJlZ2lzdGVyX2RldmljZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2KTsKIHZvaWQgKnNuZF9sb29rdXBfbWlub3JfZGF0YSh1bnNpZ25lZCBpbnQgbWlub3IsIGludCB0eXBlKTsKIGludCBzbmRfYWRkX2RldmljZV9zeXNmc19maWxlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCkBAIC0zOTYsNiArNDI3LDI5IEBACiAjZW5kaWYKICNlbmRpZgogCi0jaW5jbHVkZSAidHlwZWRlZnMuaCIKKy8qIFBDSSBxdWlyayBsaXN0IGhlbHBlciAqLworc3RydWN0IHNuZF9wY2lfcXVpcmsgeworCXVuc2lnbmVkIHNob3J0IHN1YnZlbmRvcjsJLyogUENJIHN1YnZlbmRvciBJRCAqLworCXVuc2lnbmVkIHNob3J0IHN1YmRldmljZTsJLyogUENJIHN1YmRldmljZSBJRCAqLworCWludCB2YWx1ZTsJCQkvKiB2YWx1ZSAqLworI2lmZGVmIENPTkZJR19TTkRfREVCVUdfREVURUNUCisJY29uc3QgY2hhciAqbmFtZTsJCS8qIG5hbWUgb2YgdGhlIGRldmljZSAob3B0aW9uYWwpICovCisjZW5kaWYKK307CisKKyNkZWZpbmUgX1NORF9QQ0lfUVVJUktfSUQodmVuZCxkZXYpIFwKKwkuc3VidmVuZG9yID0gKHZlbmQpLCAuc3ViZGV2aWNlID0gKGRldikKKyNkZWZpbmUgU05EX1BDSV9RVUlSS19JRCh2ZW5kLGRldikge19TTkRfUENJX1FVSVJLX0lEKHZlbmQsIGRldil9CisjaWZkZWYgQ09ORklHX1NORF9ERUJVR19ERVRFQ1QKKyNkZWZpbmUgU05EX1BDSV9RVUlSSyh2ZW5kLGRldix4bmFtZSx2YWwpIFwKKwl7X1NORF9QQ0lfUVVJUktfSUQodmVuZCwgZGV2KSwgLnZhbHVlID0gKHZhbCksIC5uYW1lID0gKHhuYW1lKX0KKyNlbHNlCisjZGVmaW5lIFNORF9QQ0lfUVVJUksodmVuZCxkZXYseG5hbWUsdmFsKSBcCisJe19TTkRfUENJX1FVSVJLX0lEKHZlbmQsIGRldiksIC52YWx1ZSA9ICh2YWwpfQorI2VuZGlmCisKK2NvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICoKK3NuZF9wY2lfcXVpcmtfbG9va3VwKHN0cnVjdCBwY2lfZGV2ICpwY2ksIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICpsaXN0KTsKKwogCiAjZW5kaWYgLyogX19TT1VORF9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvZW11MTBrMS5oIGIvaW5jbHVkZS9zb3VuZC9lbXUxMGsxLmgKaW5kZXggM2QzYzE1MS4uZWI3Y2U5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9lbXUxMGsxLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9lbXUxMGsxLmgKQEAgLTE4OCw3ICsxODgsMzUgQEAKICNkZWZpbmUgSENGR19MRUdBQ1lJTlQJCTB4MDAyMDAwMDAJLyogMSA9IGxlZ2FjeSBldmVudCBjYXB0dXJlZC4gV3JpdGUgMSB0byBjbGVhci4JKi8KIAkJCQkJCS8qIE5PVEU6IFRoZSByZXN0IG9mIHRoZSBiaXRzIGluIHRoaXMgcmVnaXN0ZXIJKi8KIAkJCQkJCS8qIF9hcmVfIHJlbGV2YW50IHVuZGVyIExpbnV4LgkJCSovCi0jZGVmaW5lIEhDRkdfQ09ERUNGT1JNQVRfTUFTSwkweDAwMDcwMDAwCS8qIENPREVDIGZvcm1hdAkJCQkJKi8KKyNkZWZpbmUgSENGR19QVVNIX0JVVFRPTl9FTkFCTEUgMHgwMDEwMDAwMAkvKiBFbmFibGVzIFZvbHVtZSBJbmMvRGVjIGFuZCBNdXRlIGZ1bmN0aW9ucyAgICAqLworI2RlZmluZSBIQ0ZHX0JBVURfUkFURQkJMHgwMDA4MDAwMAkvKiAwID0gNDhrSHosIDEgPSA0NC4xa0h6CQkJKi8KKyNkZWZpbmUgSENGR19FWFBBTkRFRF9NRU0JMHgwMDA0MDAwMAkvKiAxID0gYW55IDE2TSBvZiA0RyBhZGRyLCAwID0gMzJNIG9mIDJHIGFkZHIJKi8KKyNkZWZpbmUgSENGR19DT0RFQ0ZPUk1BVF9NQVNLCTB4MDAwMzAwMDAJLyogQ09ERUMgZm9ybWF0CQkJCQkqLworCisvKiBTcGVjaWZpYyB0byBBbGljZTIsIENBMDEwMiAqLworI2RlZmluZSBIQ0ZHX0NPREVDRk9STUFUX0FDOTdfMQkweDAwMDAwMDAwCS8qIEFDOTcgQ09ERUMgZm9ybWF0IC0tIFZlciAxLjAzCQkqLworI2RlZmluZSBIQ0ZHX0NPREVDRk9STUFUX0FDOTdfMgkweDAwMDEwMDAwCS8qIEFDOTcgQ09ERUMgZm9ybWF0IC0tIFZlciAyLjEJCQkqLworI2RlZmluZSBIQ0ZHX0FVVE9NVVRFX0FTWU5DCTB4MDAwMDgwMDAJLyogV2hlbiBzZXQsIHRoZSBhc3luYyBzYW1wbGUgcmF0ZSBjb252ZXJ0b3JzCSovCisJCQkJCQkvKiB3aWxsIGF1dG9tYXRpY2FsbHkgbXV0ZSB0aGVpciBvdXRwdXQgd2hlbgkqLworCQkJCQkJLyogdGhleSBhcmUgbm90IHJhdGUtbG9ja2VkIHRvIHRoZSBleHRlcm5hbAkqLworCQkJCQkJLyogYXN5bmMgYXVkaW8gc291cmNlICAJCQkJKi8KKyNkZWZpbmUgSENGR19BVVRPTVVURV9TUERJRgkweDAwMDA0MDAwCS8qIFdoZW4gc2V0LCB0aGUgYXN5bmMgc2FtcGxlIHJhdGUgY29udmVydG9ycwkqLworCQkJCQkJLyogd2lsbCBhdXRvbWF0aWNhbGx5IG11dGUgdGhlaXIgb3V0cHV0IHdoZW4JKi8KKwkJCQkJCS8qIHRoZSBTUERJRiBWLWJpdCBpbmRpY2F0ZXMgaW52YWxpZCBhdWRpbwkqLworI2RlZmluZSBIQ0ZHX0VNVTMyX1NMQVZFCTB4MDAwMDIwMDAJLyogMCA9IE1hc3RlciwgMSA9IFNsYXZlLiBTbGF2ZSBmb3IgRU1VMTAxMAkqLworI2RlZmluZSBIQ0ZHX1NMT1dfUkFNUAkJMHgwMDAwMTAwMAkvKiBJbmNyZWFzZXMgU2VuZCBTbW9vdGhpbmcgdGltZSBjb25zdGFudAkqLworLyogMHgwMDAwMDgwMCBub3QgdXNlZCBvbiBBbGljZTIgKi8KKyNkZWZpbmUgSENGR19QSEFTRV9UUkFDS19NQVNLCTB4MDAwMDA3MDAJLyogV2hlbiBzZXQsIGZvcmNlcyBjb3JyZXNwb25kaW5nIGlucHV0IHRvCSovCisJCQkJCQkvKiBwaGFzZSB0cmFjayB0aGUgcHJldmlvdXMgaW5wdXQuCQkqLworCQkJCQkJLyogSTJTMCBjYW4gcGhhc2UgdHJhY2sgdGhlIGxhc3QgUy9QRElGIGlucHV0CSovCisjZGVmaW5lIEhDRkdfSTJTX0FTUkNfRU5BQkxFCTB4MDAwMDAwNzAJLyogV2hlbiBzZXQsIGVuYWJsZXMgYXN5bmNocm9ub3VzIHNhbXBsZSByYXRlICAgKi8KKwkJCQkJCS8qIGNvbnZlcnNpb24gZm9yIHRoZSBjb3JyZXNwb25kaW5nCQkqLworIAkJCQkJCS8qIEkyUyBmb3JtYXQgaW5wdXQJCQkJKi8KKy8qIFJlc3Qgb2YgSENGRyAweDAwMDAwMDBmIHNhbWUgYXMgYmVsb3cuIExPQ0tTT1VORENBQ0hFIGV0Yy4gICovCisKKworCisvKiBPbGRlciBjaGlwcyAqLwogI2RlZmluZSBIQ0ZHX0NPREVDRk9STUFUX0FDOTcJMHgwMDAwMDAwMAkvKiBBQzk3IENPREVDIGZvcm1hdCAtLSBQcmltYXJ5IE91dHB1dAkJKi8KICNkZWZpbmUgSENGR19DT0RFQ0ZPUk1BVF9JMlMJMHgwMDAxMDAwMAkvKiBJMlMgQ09ERUMgZm9ybWF0IC0tIFNlY29uZGFyeSAoUmVhcikgT3V0cHV0CSovCiAjZGVmaW5lIEhDRkdfR1BJTlBVVDAJCTB4MDAwMDQwMDAJLyogRXh0ZXJuYWwgcGluMTEyCQkJCSovCkBAIC00MzIsNiArNDYwLDcgQEAKICNkZWZpbmUgRlhSVF9DSEFOTkVMQwkJMHgwZjAwMDAwMAkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBDCSovCiAjZGVmaW5lIEZYUlRfQ0hBTk5FTEQJCTB4ZjAwMDAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgRAkqLwogCisjZGVmaW5lIEFfSFIJCQkweDBiCS8qIEhpZ2ggUmVzb2x1dGlvbi4gMjRiaXQgcGxheWJhY2sgZnJvbSBob3N0IHRvIERTUC4gKi8KICNkZWZpbmUgTUFQQQkJCTB4MGMJCS8qIENhY2hlIG1hcCBBCQkJCQkJKi8KIAogI2RlZmluZSBNQVBCCQkJMHgwZAkJLyogQ2FjaGUgbWFwIEIJCQkJCQkqLwpAQCAtNDM5LDYgKzQ2OCw4IEBACiAjZGVmaW5lIE1BUF9QVEVfTUFTSwkJMHhmZmZmZTAwMAkvKiBUaGUgMTkgTVNCcyBvZiB0aGUgUFRFIGluZGV4ZWQgYnkgdGhlIFBUSQkJKi8KICNkZWZpbmUgTUFQX1BUSV9NQVNLCQkweDAwMDAxZmZmCS8qIFRoZSAxMyBiaXQgaW5kZXggdG8gb25lIG9mIHRoZSA4MTkyIFBURSBkd29yZHMgICAgICAJKi8KIAorLyogMHgwZSwgMHgwZjogTm90IHVzZWQgKi8KKwogI2RlZmluZSBFTlZWT0wJCQkweDEwCQkvKiBWb2x1bWUgZW52ZWxvcGUgcmVnaXN0ZXIJCQkJKi8KICNkZWZpbmUgRU5WVk9MX01BU0sJCTB4MDAwMGZmZmYJLyogQ3VycmVudCB2YWx1ZSBvZiB2b2x1bWUgZW52ZWxvcGUgc3RhdGUgdmFyaWFibGUJKi8gIAogCQkJCQkJLyogMHg4MDAwLW4gPT0gNjY2Km4gdXNlYyBkZWxheQkgICAgICAgCQkJKi8KQEAgLTUyNyw3ICs1NTgsNyBAQAogCQkJCQkJLyogTk9URTogQWxsIGNoYW5uZWxzIGNvbnRhaW4gaW50ZXJuYWwgdmFyaWFibGVzOyBkbwkqLwogCQkJCQkJLyogbm90IHdyaXRlIHRvIHRoZXNlIGxvY2F0aW9ucy4JCQkqLwogCi0vKiAxZiBzb21ldGhpbmcgKi8KKy8qIDB4MWY6IG5vdCB1c2VkICovCiAKICNkZWZpbmUgQ0QwCQkJMHgyMAkJLyogQ2FjaGUgZGF0YSAwIHJlZ2lzdGVyCQkJCSovCiAjZGVmaW5lIENEMQkJCTB4MjEJCS8qIENhY2hlIGRhdGEgMSByZWdpc3RlcgkJCQkqLwpAQCAtNTk3LDYgKzYyOCw4IEBACiAjZGVmaW5lIEZYV0NfU1BESUZMRUZUICAgICAgICAgICgxPDwyMikJCS8qIDB4MDA0MDAwMDAgKi8KICNkZWZpbmUgRlhXQ19TUERJRlJJR0hUICAgICAgICAgKDE8PDIzKQkJLyogMHgwMDgwMDAwMCAqLwogCisjZGVmaW5lIEFfVEJMU1oJYAkJMHg0MwkvKiBFZmZlY3RzIFRhbmsgSW50ZXJuYWwgVGFibGUgU2l6ZS4gT25seSBsb3cgYnl0ZSBvciByZWdpc3RlciB1c2VkICovCisKICNkZWZpbmUgVENCUwkJCTB4NDQJCS8qIFRhbmsgY2FjaGUgYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkqLwogI2RlZmluZSBUQ0JTX01BU0sJCTB4MDAwMDAwMDcJLyogVGFuayBjYWNoZSBidWZmZXIgc2l6ZSBmaWVsZAkJCQkqLwogI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzE2SwkweDAwMDAwMDAwCkBAIC02MTcsNyArNjUwLDcgQEAKICNkZWZpbmUgRlhCQQkJCTB4NDcJCS8qIEZYIEJ1ZmZlciBBZGRyZXNzICovCiAjZGVmaW5lIEZYQkFfTUFTSwkJMHhmZmZmZjAwMAkvKiAyMCBiaXQgYmFzZSBhZGRyZXNzCQkJCQkqLwogCi0vKiAweDQ4IHNvbWV0aGluZyAtIHdvcmQgYWNjZXNzLCBkZWZhdWx0cyB0byAzZiAqLworI2RlZmluZSBBX0hXTQkJCTB4NDgJLyogSGlnaCBQQ0kgV2F0ZXIgTWFyayAtIHdvcmQgYWNjZXNzLCBkZWZhdWx0cyB0byAzZiAqLwogCiAjZGVmaW5lIE1JQ0JTCQkJMHg0OQkJLyogTWljcm9waG9uZSBidWZmZXIgc2l6ZSByZWdpc3RlcgkJCSovCiAKQEAgLTY2MSw2ICs2OTQsMTggQEAKICNkZWZpbmUgQURDQlNfQlVGU0laRV81NzM0NAkweDAwMDAwMDFlCiAjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNjU1MzYJMHgwMDAwMDAxZgogCisvKiBDdXJyZW50IFNlbmQgQiwgQSBBbW91bnRzICovCisjZGVmaW5lIEFfQ1NCQQkJCTB4NGMKKworLyogQ3VycmVudCBTZW5kIEQsIEMgQW1vdW50cyAqLworI2RlZmluZSBBX0NTREMJCQkweDRkCisKKy8qIEN1cnJlbnQgU2VuZCBGLCBFIEFtb3VudHMgKi8KKyNkZWZpbmUgQV9DU0ZFCQkJMHg0ZQorCisvKiBDdXJyZW50IFNlbmQgSCwgRyBBbW91bnRzICovCisjZGVmaW5lIEFfQ1NIRwkJCTB4NGYKKwogCiAjZGVmaW5lIENEQ1MJCQkweDUwCQkvKiBDRC1ST00gZGlnaXRhbCBjaGFubmVsIHN0YXR1cyByZWdpc3RlcgkqLwogCkBAIC02NjgsNiArNzEzLDkgQEAKIAogI2RlZmluZSBEQkcJCQkweDUyCQkvKiBETyBOT1QgUFJPR1JBTSBUSElTIFJFR0lTVEVSISEhIE1BWSBERVNUUk9ZIENISVAgKi8KIAorLyogUy9QRElGIElucHV0IEMgQ2hhbm5lbCBTdGF0dXMgKi8KKyNkZWZpbmUgQV9TUFNDCQkJMHg1MgorCiAjZGVmaW5lIFJFRzUzCQkJMHg1MwkJLyogRE8gTk9UIFBST0dSQU0gVEhJUyBSRUdJU1RFUiEhISBNQVkgREVTVFJPWSBDSElQICovCiAKICNkZWZpbmUgQV9EQkcJCQkgMHg1MwpAQCAtNzA4LDYgKzc1Niw4IEBACiAjZGVmaW5lIFNQQ1NfTk9UQVVESU9EQVRBCTB4MDAwMDAwMDIJLyogMCA9IERpZ2l0YWwgYXVkaW8sIDEgPSBub3QgYXVkaW8JCSovCiAjZGVmaW5lIFNQQ1NfUFJPRkVTU0lPTkFMCTB4MDAwMDAwMDEJLyogMCA9IENvbnN1bWVyIChJRUMtOTU4KSwgMSA9IHBybyAoQUVTMy0xOTkyKQkqLwogCisvKiAweDU3OiBOb3QgdXNlZCAqLworCiAvKiBUaGUgMzItYml0IENMSXggYW5kIFNPTHggcmVnaXN0ZXJzIGFsbCBoYXZlIG9uZSBiaXQgcGVyIGNoYW5uZWwgY29udHJvbC9zdGF0dXMgICAgICAJCSovCiAjZGVmaW5lIENMSUVMCQkJMHg1OAkJLyogQ2hhbm5lbCBsb29wIGludGVycnVwdCBlbmFibGUgbG93IHJlZ2lzdGVyCSovCiAKQEAgLTczMyw2ICs3ODMsOSBAQAogI2RlZmluZSBBQzk3U0xPVF9DTlRSCQkweDEwICAgICAgICAgICAgLyogQ2VudGVyIGVuYWJsZSAqLwogI2RlZmluZSBBQzk3U0xPVF9MRkUJCTB4MjAgICAgICAgICAgICAvKiBMRkUgZW5hYmxlICovCiAKKy8qIFBDQiBSZXZpc2lvbiAqLworI2RlZmluZSBBX1BDQgkJCTB4NWYKKwogLy8gTk9URTogMHg2MCw2MSw2MjogNjQtYml0CiAjZGVmaW5lIENEU1JDUwkJCTB4NjAJCS8qIENELVJPTSBTYW1wbGUgUmF0ZSBDb252ZXJ0ZXIgc3RhdHVzIHJlZ2lzdGVyCSovCiAKQEAgLTc4MCw5ICs4MzMsMTggQEAKIAogI2RlZmluZSBITElQSAkJCTB4NjkJCS8qIENoYW5uZWwgaGFsZiBsb29wIGludGVycnVwdCBwZW5kaW5nIGhpZ2ggcmVnaXN0ZXIJKi8KIAotLy8gMHg2YSw2Yiw2YyB1c2VkIGZvciBzb21lIHJlY29yZGluZwotLy8gMHg2ZCB1bnVzZWQKLS8vIDB4NmUsNmYgLSB0YW5rdGFibGUgYmFzZSAvIG9mZnNldAorLyogUy9QRElGIEhvc3QgUmVjb3JkIEluZGV4IChieXBhc3NlcyBTUkMpICovCisjZGVmaW5lIEFfU1BSSQkJCTB4NmEKKy8qIFMvUERJRiBIb3N0IFJlY29yZCBBZGRyZXNzICovCisjZGVmaW5lIEFfU1BSQQkJCTB4NmIKKy8qIFMvUERJRiBIb3N0IFJlY29yZCBDb250cm9sICovCisjZGVmaW5lIEFfU1BSQwkJCTB4NmMKKy8qIERlbGF5ZWQgSW50ZXJydXB0IENvdW50ZXIgJiBFbmFibGUgKi8KKyNkZWZpbmUgQV9ESUNFCQkJMHg2ZAorLyogVGFuayBUYWJsZSBCYXNlICovCisjZGVmaW5lIEFfVFRCCQkJMHg2ZQorLyogVGFuayBEZWxheSBPZmZzZXQgKi8KKyNkZWZpbmUgQV9URE9GCQkJMHg2ZgogCiAvKiBUaGlzIGlzIHRoZSBNUFUgcG9ydCBvbiB0aGUgY2FyZCAodmlhIHRoZSBnYW1lIHBvcnQpCQkJCQkJKi8KICNkZWZpbmUgQV9NVURBVEExCQkweDcwCkBAIC04MDAsNiArODYyLDcgQEAKICNkZWZpbmUgQV9GWFdDMQkJCTB4NzQgICAgICAgICAgICAvKiBTZWxlY3RzIDB4N2YtMHg2MCBmb3IgRlggcmVjb3JkaW5nICAgICAgICAgICAqLwogI2RlZmluZSBBX0ZYV0MyCQkJMHg3NQkJLyogU2VsZWN0cyAweDlmLTB4ODAgZm9yIEZYIHJlY29yZGluZyAgICAgICAgICAgKi8KIAorLyogRXh0ZW5kZWQgSGFyZHdhcmUgQ29udHJvbCAqLwogI2RlZmluZSBBX1NQRElGX1NBTVBMRVJBVEUJMHg3NgkJLyogU2V0IHRoZSBzYW1wbGUgcmF0ZSBvZiBTUERJRiBvdXRwdXQJCSovCiAjZGVmaW5lIEFfU0FNUExFX1JBVEUJCTB4NzYJCS8qIFZhcmlvdXMgc2FtcGxlIHJhdGUgc2V0dGluZ3MuICovCiAjZGVmaW5lIEFfU0FNUExFX1JBVEVfTk9UX1VTRUQgIDB4MGZmYzExMWUJLyogQml0cyB0aGF0IGFyZSBub3QgdXNlZCBhbmQgY2Fubm90IGJlIHNldC4gCSovCkBAIC04MjIsOCArODg1LDIwIEBACiAjZGVmaW5lIEFfUENNXzk2MDAwCQkweDAwMDA0MDAwCiAjZGVmaW5lIEFfUENNXzQ0MTAwCQkweDAwMDA4MDAwCiAKLS8qIDB4NzcsMHg3OCwweDc5ICJzb21ldGhpbmcgaTJzLXJlbGF0ZWQiIC0gZGVmYXVsdCB0byAweDAxMDgwMDAwIG9uIG15IGF1ZGlneSAyIFpTIC0tcmxyZXZlbGwJKi8KLS8qIDB4N2EsIDB4N2IgLSBsb29rdXAgdGFibGVzICovCisvKiBJMlMwIFNhbXBsZSBSYXRlIFRyYWNrZXIgU3RhdHVzICovCisjZGVmaW5lIEFfU1JUMwkJCTB4NzcKKworLyogSTJTMSBTYW1wbGUgUmF0ZSBUcmFja2VyIFN0YXR1cyAqLworI2RlZmluZSBBX1NSVDQJCQkweDc4CisKKy8qIEkyUzIgU2FtcGxlIFJhdGUgVHJhY2tlciBTdGF0dXMgKi8KKyNkZWZpbmUgQV9TUlQ1CQkJMHg3OQorLyogLSBkZWZhdWx0IHRvIDB4MDEwODAwMDAgb24gbXkgYXVkaWd5IDIgWlMgLS1ybHJldmVsbAkqLworCisvKiBUYW5rIFRhYmxlIERNQSBBZGRyZXNzICovCisjZGVmaW5lIEFfVFREQQkJCTB4N2EKKy8qIFRhbmsgVGFibGUgRE1BIERhdGEgKi8KKyNkZWZpbmUgQV9UVERECQkJMHg3YgogCiAjZGVmaW5lIEFfRlhSVDIJCQkweDdjCiAjZGVmaW5lIEFfRlhSVF9DSEFOTkVMRQkJMHgwMDAwMDAzZgkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBFCSovCkBAIC04NDUsNyArOTIwLDcgQEAKICNkZWZpbmUgQV9GWFJUX0NIQU5ORUxDCQkweDAwM2YwMDAwCiAjZGVmaW5lIEFfRlhSVF9DSEFOTkVMRAkJMHgzZjAwMDAwMAogCi0KKy8qIDB4N2Y6IE5vdCB1c2VkICovCiAvKiBFYWNoIEZYIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpcyAzMiBiaXRzIGluIGxlbmd0aCwgYWxsIGJpdHMgYXJlIHVzZWQJCQkqLwogI2RlZmluZSBGWEdQUkVHQkFTRQkJMHgxMDAJCS8qIEZYIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgYmFzZSAgICAgICAJKi8KICNkZWZpbmUgQV9GWEdQUkVHQkFTRQkJMHg0MDAJCS8qIEF1ZGlneSBHUFJzLCAweDQwMCB0byAweDVmZgkJCSovCkBAIC04ODYsNiArOTYxLDI5MyBAQAogI2RlZmluZSBBX0hJV09SRF9SRVNVTFRfTUFTSwkweDAwN2ZmMDAwCiAjZGVmaW5lIEFfSElXT1JEX09QQV9NQVNLCTB4MDAwMDA3ZmYKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVNVTEwMTBtIEhBTkEgRlBHQSByZWdpc3RlcnMJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRU1VX0hBTkFfREVTVEhJCQkweDAwCS8qIDAwMDB4eHggIDMgYml0cyBMaW5rIERlc3RpbmF0aW9uICovCisjZGVmaW5lIEVNVV9IQU5BX0RFU1RMTwkJMHgwMQkvKiAwMHh4eHh4ICA1IGJpdHMgKi8KKyNkZWZpbmUgRU1VX0hBTkFfU1JDSEkJCTB4MDIJLyogMDAwMHh4eCAgMyBiaXRzIExpbmsgU291cmNlICovCisjZGVmaW5lIEVNVV9IQU5BX1NSQ0xPCQkweDAzCS8qIDAweHh4eHggIDUgYml0cyAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX1BXUgkweDA0CS8qIDAwMDAwMHggIDEgYml0cyBBdWRpbyBEb2NrIHBvd2VyICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfUFdSX09OCQkweDAxIC8qIEF1ZGlvIERvY2sgcG93ZXIgb24gKi8KKyNkZWZpbmUgRU1VX0hBTkFfV0NMT0NLCQkweDA1CS8qIDAwMDB4eHggIDMgYml0cyBXb3JkIENsb2NrIHNvdXJjZSBzZWxlY3QgICovCisJCQkJCS8qIE11c3QgYmUgd3JpdHRlbiBhZnRlciBwb3dlciBvbiB0byByZXNldCBETEwgKi8KKwkJCQkJLyogT25lIGlzIHVuYWJsZSB0byBkZXRlY3QgdGhlIEF1ZGlvIGRvY2sgd2l0aG91dCB0aGlzICovCisjZGVmaW5lIEVNVV9IQU5BX1dDTE9DS19TUkNfTUFTSwkweDA3CisjZGVmaW5lIEVNVV9IQU5BX1dDTE9DS19JTlRfNDhLCQkweDAwCisjZGVmaW5lIEVNVV9IQU5BX1dDTE9DS19JTlRfNDRfMUsJMHgwMQorI2RlZmluZSBFTVVfSEFOQV9XQ0xPQ0tfSEFOQV9TUERJRl9JTgkweDAyCisjZGVmaW5lIEVNVV9IQU5BX1dDTE9DS19IQU5BX0FEQVRfSU4JMHgwMworI2RlZmluZSBFTVVfSEFOQV9XQ0xPQ0tfU1lOQ19CTkNOCTB4MDQKKyNkZWZpbmUgRU1VX0hBTkFfV0NMT0NLXzJORF9IQU5BCTB4MDUKKyNkZWZpbmUgRU1VX0hBTkFfV0NMT0NLX1NSQ19SRVNFUlZFRAkweDA2CisjZGVmaW5lIEVNVV9IQU5BX1dDTE9DS19PRkYJCTB4MDcgLyogRm9yIHRlc3RpbmcsIGZvcmNlcyBmYWxsYmFjayB0byBERUZDTE9DSyAqLworI2RlZmluZSBFTVVfSEFOQV9XQ0xPQ0tfTVVMVF9NQVNLCTB4MTgKKyNkZWZpbmUgRU1VX0hBTkFfV0NMT0NLXzFYCQkweDAwCisjZGVmaW5lIEVNVV9IQU5BX1dDTE9DS18yWAkJMHgwOAorI2RlZmluZSBFTVVfSEFOQV9XQ0xPQ0tfNFgJCTB4MTAKKyNkZWZpbmUgRU1VX0hBTkFfV0NMT0NLX01VTFRfUkVTRVJWRUQJMHgxOAorCisjZGVmaW5lIEVNVV9IQU5BX0RFRkNMT0NLCTB4MDYJLyogMDAwMDAweCAgMSBiaXRzIERlZmF1bHQgV29yZCBDbG9jayAgKi8KKyNkZWZpbmUgRU1VX0hBTkFfREVGQ0xPQ0tfNDhLCQkweDAwCisjZGVmaW5lIEVNVV9IQU5BX0RFRkNMT0NLXzQ0XzFLCQkweDAxCisKKyNkZWZpbmUgRU1VX0hBTkFfVU5NVVRFCQkweDA3CS8qIDAwMDAwMHggIDEgYml0cyBNdXRlIGFsbCBhdWRpbyBvdXRwdXRzICAqLworI2RlZmluZSBFTVVfTVVURQkJCTB4MDAKKyNkZWZpbmUgRU1VX1VOTVVURQkJCTB4MDEKKworI2RlZmluZSBFTVVfSEFOQV9GUEdBX0NPTkZJRwkweDA4CS8qIDAwMDAweHggIDIgYml0cyBDb25maWcgY29udHJvbCBvZiBGUEdBcyAgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRlBHQV9DT05GSUdfQVVESU9ET0NLCTB4MDEgLyogU2V0IGluIG9yZGVyIHRvIHByb2dyYW0gRlBHQSBvbiBBdWRpbyBEb2NrICovCisjZGVmaW5lIEVNVV9IQU5BX0ZQR0FfQ09ORklHX0hBTkEJMHgwMiAvKiBTZXQgaW4gb3JkZXIgdG8gcHJvZ3JhbSBGUEdBIG9uIEhhbmEgKi8KKworI2RlZmluZSBFTVVfSEFOQV9JUlFfRU5BQkxFCTB4MDkJLyogMDAweHh4eCAgNCBiaXRzIElSUSBFbmFibGUgICovCisjZGVmaW5lIEVNVV9IQU5BX0lSUV9XQ0xLX0NIQU5HRUQJMHgwMQorI2RlZmluZSBFTVVfSEFOQV9JUlFfQURBVAkJMHgwMgorI2RlZmluZSBFTVVfSEFOQV9JUlFfRE9DSwkJMHgwNAorI2RlZmluZSBFTVVfSEFOQV9JUlFfRE9DS19MT1NUCQkweDA4CisKKyNkZWZpbmUgRU1VX0hBTkFfU1BESUZfTU9ERQkweDBhCS8qIDAweHh4eHggIDUgYml0cyBTUERJRiBNT0RFICAqLworI2RlZmluZSBFTVVfSEFOQV9TUERJRl9NT0RFX1RYX0NPTVNVTUVSCTB4MDAKKyNkZWZpbmUgRU1VX0hBTkFfU1BESUZfTU9ERV9UWF9QUk8JMHgwMQorI2RlZmluZSBFTVVfSEFOQV9TUERJRl9NT0RFX1RYX05PQ09QWQkweDAyCisjZGVmaW5lIEVNVV9IQU5BX1NQRElGX01PREVfUlhfQ09NU1VNRVIJMHgwMAorI2RlZmluZSBFTVVfSEFOQV9TUERJRl9NT0RFX1JYX1BSTwkweDA0CisjZGVmaW5lIEVNVV9IQU5BX1NQRElGX01PREVfUlhfTk9DT1BZCTB4MDgKKyNkZWZpbmUgRU1VX0hBTkFfU1BESUZfTU9ERV9SWF9JTlZBTElECTB4MTAKKworI2RlZmluZSBFTVVfSEFOQV9PUFRJQ0FMX1RZUEUJMHgwYgkvKiAwMDAwMHh4ICAyIGJpdHMgQURBVCBvciBTUERJRiBpbi9vdXQgICovCisjZGVmaW5lIEVNVV9IQU5BX09QVElDQUxfSU5fU1BESUYJMHgwMAorI2RlZmluZSBFTVVfSEFOQV9PUFRJQ0FMX0lOX0FEQVQJMHgwMQorI2RlZmluZSBFTVVfSEFOQV9PUFRJQ0FMX09VVF9TUERJRgkweDAwCisjZGVmaW5lIEVNVV9IQU5BX09QVElDQUxfT1VUX0FEQVQJMHgwMgorCisjZGVmaW5lIEVNVV9IQU5BX01JRElfSU4JCTB4MGMJLyogMDAwMDAweCAgMSBiaXQgIENvbnRyb2wgTUlESSAgKi8KKyNkZWZpbmUgRU1VX0hBTkFfTUlESV9JTl9GUk9NX0hBTU9BCTB4MDAgLyogSEFNT0EgTUlESSBpbiB0byBBbGljZSAyIE1JREkgQiAqLworI2RlZmluZSBFTVVfSEFOQV9NSURJX0lOX0ZST01fRE9DSwkweDAxIC8qIEF1ZGlvIERvY2sgTUlESSBpbiB0byBBbGljZSAyIE1JREkgQiAqLworCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18xCTB4MGQJLyogMDAweHh4eCAgNCBiaXQgIEF1ZGlvIERvY2sgTEVEcyAgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzFfTUlESTEJMHgwMQkvKiBNSURJIDEgTEVEIG9uICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18xX01JREkyCTB4MDIJLyogTUlESSAyIExFRCBvbiAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0xFRFNfMV9TTVBURV9JTgkweDA0CS8qIFNNUFRFIElOIExFRCBvbiAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0xFRFNfMV9TTVBURV9PVVQJMHgwOAkvKiBTTVBURSBPVVQgTEVEIG9uICovCisKKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzIJMHgwZQkvKiAweHh4eHh4ICA2IGJpdCAgQXVkaW8gRG9jayBMRURzICAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0xFRFNfMl80NEsJMHgwMQkvKiA0NC4xIGtIeiBMRUQgb24gKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzJfNDhLCTB4MDIJLyogNDgga0h6IExFRCBvbiAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0xFRFNfMl85NksJMHgwNAkvKiA5NiBrSHogTEVEIG9uICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18yXzE5MksJMHgwOAkvKiAxOTIga0h6IExFRCBvbiAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0xFRFNfMl9MT0NLCTB4MTAJLyogTE9DSyBMRUQgb24gKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzJfRVhUCTB4MjAJLyogRVhUIExFRCBvbiAqLworCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18zCTB4MGYJLyogMHh4eHh4eCAgNiBiaXQgIEF1ZGlvIERvY2sgTEVEcyAgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzNfQ0xJUF9BCTB4MDEJLyogTWljIEEgQ2xpcCBMRUQgb24gKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzNfQ0xJUF9CCTB4MDIJLyogTWljIEIgQ2xpcCBMRUQgb24gKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzNfU0lHTkFMX0EJMHgwNAkvKiBTaWduYWwgQSBDbGlwIExFRCBvbiAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0xFRFNfM19TSUdOQUxfQgkweDA4CS8qIFNpZ25hbCBCIENsaXAgTEVEIG9uICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18zX01BTlVBTF9DTElQCTB4MTAJLyogTWFudWFsIENsaXAgZGV0ZWN0aW9uICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18zX01BTlVBTF9TSUdOQUwJMHgyMAkvKiBNYW51YWwgU2lnbmFsIGRldGVjdGlvbiAqLworCisjZGVmaW5lIEVNVV9IQU5BX0FEQ19QQURTCTB4MTAJLyogMDAwMHh4eCAgMyBiaXQgIEF1ZGlvIERvY2sgQURDIDE0ZEIgcGFkcyAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0FEQ19QQUQxCTB4MDEJLyogMTRkQiBBdHRlbnVhdGlvbiBvbiBBdWRpbyBEb2NrIEFEQyAxICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfQURDX1BBRDIJMHgwMgkvKiAxNGRCIEF0dGVudWF0aW9uIG9uIEF1ZGlvIERvY2sgQURDIDIgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19BRENfUEFEMwkweDA0CS8qIDE0ZEIgQXR0ZW51YXRpb24gb24gQXVkaW8gRG9jayBBREMgMyAqLworI2RlZmluZSBFTVVfSEFOQV8wMjAyX0FEQ19QQUQxCTB4MDgJLyogMTRkQiBBdHRlbnVhdGlvbiBvbiAwMjAyIEFEQyAxICovCisKKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19NSVNDCTB4MTEJLyogMHh4eHh4eCAgNiBiaXQgIEF1ZGlvIERvY2sgbWlzYyBiaXRzICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfREFDMV9NVVRFCTB4MDEJLyogREFDIDEgTXV0ZSAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0RBQzJfTVVURQkweDAyCS8qIERBQyAyIE11dGUgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19EQUMzX01VVEUJMHgwNAkvKiBEQUMgMyBNdXRlICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfREFDNF9NVVRFCTB4MDgJLyogREFDIDQgTXV0ZSAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX1BIT05FU18xOTJfREFDMQkweDAwCS8qIERBQyAxIEhlYWRwaG9uZXMgc291cmNlIGF0IDE5MmtIeiAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX1BIT05FU18xOTJfREFDMgkweDEwCS8qIERBQyAyIEhlYWRwaG9uZXMgc291cmNlIGF0IDE5MmtIeiAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX1BIT05FU18xOTJfREFDMwkweDIwCS8qIERBQyAzIEhlYWRwaG9uZXMgc291cmNlIGF0IDE5MmtIeiAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX1BIT05FU18xOTJfREFDNAkweDMwCS8qIERBQyA0IEhlYWRwaG9uZXMgc291cmNlIGF0IDE5MmtIeiAqLworCisjZGVmaW5lIEVNVV9IQU5BX01JRElfT1VUCTB4MTIJLyogMDB4eHh4eCAgNSBiaXQgIFNvdXJjZSBmb3IgZWFjaCBNSURJIG91dCBwb3J0ICovCisjZGVmaW5lIEVNVV9IQU5BX01JRElfT1VUXzAyMDIJMHgwMSAvKiAwMjAyIE1JREkgZnJvbSBBbGljZSAyLiAwID0gQSwgMSA9IEIgKi8KKyNkZWZpbmUgRU1VX0hBTkFfTUlESV9PVVRfRE9DSzEJMHgwMiAvKiBBdWRpbyBEb2NrIE1JREkxIGZyb250LCBmcm9tIEFsaWNlIDIuIDAgPSBBLCAxID0gQiAqLworI2RlZmluZSBFTVVfSEFOQV9NSURJX09VVF9ET0NLMgkweDA0IC8qIEF1ZGlvIERvY2sgTUlESTIgcmVhciwgZnJvbSBBbGljZSAyLiAwID0gQSwgMSA9IEIgKi8KKyNkZWZpbmUgRU1VX0hBTkFfTUlESV9PVVRfU1lOQzIJMHgwOCAvKiBTeW5jIGNhcmQuIE5vdCB0aGUgYWN0dWFsIE1JREkgb3V0IGphY2suIDAgPSBBLCAxID0gQiAqLworI2RlZmluZSBFTVVfSEFOQV9NSURJX09VVF9MT09QCTB4MTAgLyogMCA9IGJpdHMgKDM6MCkgbm9ybWFsLiAxID0gTUlESSBsb29wYmFjayBlbmFibGVkLiAqLworCisjZGVmaW5lIEVNVV9IQU5BX0RBQ19QQURTCTB4MTMJLyogMDB4eHh4eCAgNSBiaXQgIERBQyAxNGRCIGF0dGVudWF0aW9uIHBhZHMgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19EQUNfUEFEMQkweDAxCS8qIDE0ZEIgQXR0ZW51YXRpb24gb24gQXVkaW9Eb2NrIERBQyAxLiBMZWZ0IGFuZCBSaWdodCAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0RBQ19QQUQyCTB4MDIJLyogMTRkQiBBdHRlbnVhdGlvbiBvbiBBdWRpb0RvY2sgREFDIDIuIExlZnQgYW5kIFJpZ2h0ICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfREFDX1BBRDMJMHgwNAkvKiAxNGRCIEF0dGVudWF0aW9uIG9uIEF1ZGlvRG9jayBEQUMgMy4gTGVmdCBhbmQgUmlnaHQgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19EQUNfUEFENAkweDA4CS8qIDE0ZEIgQXR0ZW51YXRpb24gb24gQXVkaW9Eb2NrIERBQyA0LiBMZWZ0IGFuZCBSaWdodCAqLworI2RlZmluZSBFTVVfSEFOQV8wMjAyX0RBQ19QQUQxCTB4MTAJLyogMTRkQiBBdHRlbnVhdGlvbiBvbiAwMjAyIERBQyAxLiBMZWZ0IGFuZCBSaWdodCAqLworCisvKiAweDE0IC0gMHgxZiBVbnVzZWQgUi9XIHJlZ2lzdGVycyAqLworI2RlZmluZSBFTVVfSEFOQV9JUlFfU1RBVFVTCTB4MjAJLyogMDAweHh4eCAgNCBiaXRzIElSUSBTdGF0dXMgICovCisjaWYgMCAgLyogQWxyZWFkeSBkZWZpbmVkIGZvciByZWcgMHgwOSBJUlFfRU5BQkxFICovCisjZGVmaW5lIEVNVV9IQU5BX0lSUV9XQ0xLX0NIQU5HRUQJMHgwMQorI2RlZmluZSBFTVVfSEFOQV9JUlFfQURBVAkJMHgwMgorI2RlZmluZSBFTVVfSEFOQV9JUlFfRE9DSwkJMHgwNAorI2RlZmluZSBFTVVfSEFOQV9JUlFfRE9DS19MT1NUCQkweDA4CisjZW5kaWYKKworI2RlZmluZSBFTVVfSEFOQV9PUFRJT05fQ0FSRFMJMHgyMQkvKiAwMDB4eHh4ICA0IGJpdHMgUHJlc2VuY2Ugb2Ygb3B0aW9uIGNhcmRzICovCisjZGVmaW5lIEVNVV9IQU5BX09QVElPTl9IQU1PQQkweDAxCS8qIEhBTU9BIGNhcmQgcHJlc2VudCAqLworI2RlZmluZSBFTVVfSEFOQV9PUFRJT05fU1lOQwkweDAyCS8qIFN5bmMgY2FyZCBwcmVzZW50ICovCisjZGVmaW5lIEVNVV9IQU5BX09QVElPTl9ET0NLX09OTElORQkweDA0CS8qIEF1ZGlvIERvY2sgb25saW5lIGFuZCBGUEdBIGNvbmZpZ3VyZWQgKi8KKyNkZWZpbmUgRU1VX0hBTkFfT1BUSU9OX0RPQ0tfT0ZGTElORQkweDA4CS8qIEF1ZGlvIERvY2sgb25saW5lIGFuZCBGUEdBIG5vdCBjb25maWd1cmVkICovCisKKyNkZWZpbmUgRU1VX0hBTkFfSUQJCTB4MjIJLyogMTAxMDEwMSAgNyBiaXRzIElEIGJ5dGUgJiAweDdmID0gMHg1NSAqLworCisjZGVmaW5lIEVNVV9IQU5BX01BSk9SX1JFVgkweDIzCS8qIDAwMDB4eHggIDMgYml0ICBIYW5hIEZQR0EgTWFqb3IgcmV2ICovCisjZGVmaW5lIEVNVV9IQU5BX01JTk9SX1JFVgkweDI0CS8qIDAwMDB4eHggIDMgYml0ICBIYW5hIEZQR0EgTWlub3IgcmV2ICovCisKKyNkZWZpbmUgRU1VX0RPQ0tfTUFKT1JfUkVWCTB4MjUJLyogMDAwMHh4eCAgMyBiaXQgIEF1ZGlvIERvY2sgRlBHQSBNYWpvciByZXYgKi8KKyNkZWZpbmUgRU1VX0RPQ0tfTUlOT1JfUkVWCTB4MjYJLyogMDAwMHh4eCAgMyBiaXQgIEF1ZGlvIERvY2sgRlBHQSBNaW5vciByZXYgKi8KKworI2RlZmluZSBFTVVfRE9DS19CT0FSRF9JRAkweDI3CS8qIDAwMDAweHggIDIgYml0cyBBdWRpbyBEb2NrIElEIHBpbnMgKi8KKyNkZWZpbmUgRU1VX0RPQ0tfQk9BUkRfSUQwCTB4MDAJLyogSUQgYml0IDAgKi8KKyNkZWZpbmUgRU1VX0RPQ0tfQk9BUkRfSUQxCTB4MDMJLyogSUQgYml0IDEgKi8KKworI2RlZmluZSBFTVVfSEFOQV9XQ19TUERJRl9ISQkweDI4CS8qIDB4eHh4eHggIDYgYml0ICBTUERJRiBJTiBXb3JkIGNsb2NrLCB1cHBlciA2IGJpdHMgKi8KKyNkZWZpbmUgRU1VX0hBTkFfV0NfU1BESUZfTE8JMHgyOQkvKiAweHh4eHh4ICA2IGJpdCAgU1BESUYgSU4gV29yZCBjbG9jaywgbG93ZXIgNiBiaXRzICovCisKKyNkZWZpbmUgRU1VX0hBTkFfV0NfQURBVF9ISQkweDJhCS8qIDB4eHh4eHggIDYgYml0ICBBREFUIElOIFdvcmQgY2xvY2ssIHVwcGVyIDYgYml0cyAqLworI2RlZmluZSBFTVVfSEFOQV9XQ19BREFUX0xPCTB4MmIJLyogMHh4eHh4eCAgNiBiaXQgIEFEQVQgSU4gV29yZCBjbG9jaywgbG93ZXIgNiBiaXRzICovCisKKyNkZWZpbmUgRU1VX0hBTkFfV0NfQk5DX0xPCTB4MmMJLyogMHh4eHh4eCAgNiBiaXQgIEJOQyBJTiBXb3JkIGNsb2NrLCBsb3dlciA2IGJpdHMgKi8KKyNkZWZpbmUgRU1VX0hBTkFfV0NfQk5DX0hJCTB4MmQJLyogMHh4eHh4eCAgNiBiaXQgIEJOQyBJTiBXb3JkIGNsb2NrLCB1cHBlciA2IGJpdHMgKi8KKworI2RlZmluZSBFTVVfSEFOQTJfV0NfU1BESUZfSEkJMHgyZQkvKiAweHh4eHh4ICA2IGJpdCAgSEFOQTIgU1BESUYgSU4gV29yZCBjbG9jaywgdXBwZXIgNiBiaXRzICovCisjZGVmaW5lIEVNVV9IQU5BMl9XQ19TUERJRl9MTwkweDJmCS8qIDB4eHh4eHggIDYgYml0ICBIQU5BMiBTUERJRiBJTiBXb3JkIGNsb2NrLCBsb3dlciA2IGJpdHMgKi8KKy8qIDB4MzAgLSAweDNmIFVudXNlZCBSZWFkIG9ubHkgcmVnaXN0ZXJzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFTVUxMDEwbSBIQU5BIERlc3RpbmF0aW9ucwkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl8wCTB4MDAwZgkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl8xCTB4MDAwMAkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl8yCTB4MDAwMQkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl8zCTB4MDAwMgkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl80CTB4MDAwMwkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl81CTB4MDAwNAkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl82CTB4MDAwNQkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl83CTB4MDAwNgkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl84CTB4MDAwNwkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl85CTB4MDAwOAkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl9BCTB4MDAwOQkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl9CCTB4MDAwYQkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl9DCTB4MDAwYgkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl9ECTB4MDAwYwkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl9FCTB4MDAwZAkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFMl9FTVUzMl9GCTB4MDAwZQkvKiAxNiBFTVUzMiBjaGFubmVscyB0byBBbGljZTIgKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDMV9MRUZUMQkweDAxMDAJLyogQXVkaW8gRG9jayBEQUMxIExlZnQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMxX0xFRlQyCTB4MDEwMQkvKiBBdWRpbyBEb2NrIERBQzEgTGVmdCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMxX0xFRlQzCTB4MDEwMgkvKiBBdWRpbyBEb2NrIERBQzEgTGVmdCwgM3JkIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDMV9MRUZUNAkweDAxMDMJLyogQXVkaW8gRG9jayBEQUMxIExlZnQsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzFfUklHSFQxCTB4MDEwNAkvKiBBdWRpbyBEb2NrIERBQzEgUmlnaHQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMxX1JJR0hUMgkweDAxMDUJLyogQXVkaW8gRG9jayBEQUMxIFJpZ2h0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzFfUklHSFQzCTB4MDEwNgkvKiBBdWRpbyBEb2NrIERBQzEgUmlnaHQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzFfUklHSFQ0CTB4MDEwNwkvKiBBdWRpbyBEb2NrIERBQzEgUmlnaHQsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzJfTEVGVDEJMHgwMTA4CS8qIEF1ZGlvIERvY2sgREFDMiBMZWZ0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDMl9MRUZUMgkweDAxMDkJLyogQXVkaW8gRG9jayBEQUMyIExlZnQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDMl9MRUZUMwkweDAxMGEJLyogQXVkaW8gRG9jayBEQUMyIExlZnQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzJfTEVGVDQJMHgwMTBiCS8qIEF1ZGlvIERvY2sgREFDMiBMZWZ0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMyX1JJR0hUMQkweDAxMGMJLyogQXVkaW8gRG9jayBEQUMyIFJpZ2h0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDMl9SSUdIVDIJMHgwMTBkCS8qIEF1ZGlvIERvY2sgREFDMiBSaWdodCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMyX1JJR0hUMwkweDAxMGUJLyogQXVkaW8gRG9jayBEQUMyIFJpZ2h0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMyX1JJR0hUNAkweDAxMGYJLyogQXVkaW8gRG9jayBEQUMyIFJpZ2h0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMzX0xFRlQxCTB4MDExMAkvKiBBdWRpbyBEb2NrIERBQzEgTGVmdCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzNfTEVGVDIJMHgwMTExCS8qIEF1ZGlvIERvY2sgREFDMSBMZWZ0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzNfTEVGVDMJMHgwMTEyCS8qIEF1ZGlvIERvY2sgREFDMSBMZWZ0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMzX0xFRlQ0CTB4MDExMwkvKiBBdWRpbyBEb2NrIERBQzEgTGVmdCwgNHRoIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfUEhPTkVTX0xFRlQxCTB4MDExMgkvKiBBdWRpbyBEb2NrIFBIT05FUyBMZWZ0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfUEhPTkVTX0xFRlQyCTB4MDExMwkvKiBBdWRpbyBEb2NrIFBIT05FUyBMZWZ0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzNfUklHSFQxCTB4MDExNAkvKiBBdWRpbyBEb2NrIERBQzEgUmlnaHQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMzX1JJR0hUMgkweDAxMTUJLyogQXVkaW8gRG9jayBEQUMxIFJpZ2h0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzNfUklHSFQzCTB4MDExNgkvKiBBdWRpbyBEb2NrIERBQzEgUmlnaHQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzNfUklHSFQ0CTB4MDExNwkvKiBBdWRpbyBEb2NrIERBQzEgUmlnaHQsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX1BIT05FU19SSUdIVDEJMHgwMTE2CS8qIEF1ZGlvIERvY2sgUEhPTkVTIFJpZ2h0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfUEhPTkVTX1JJR0hUMgkweDAxMTcJLyogQXVkaW8gRG9jayBQSE9ORVMgUmlnaHQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDNF9MRUZUMQkweDAxMTgJLyogQXVkaW8gRG9jayBEQUMyIExlZnQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUM0X0xFRlQyCTB4MDExOQkvKiBBdWRpbyBEb2NrIERBQzIgTGVmdCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUM0X0xFRlQzCTB4MDExYQkvKiBBdWRpbyBEb2NrIERBQzIgTGVmdCwgM3JkIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDNF9MRUZUNAkweDAxMWIJLyogQXVkaW8gRG9jayBEQUMyIExlZnQsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX1NQRElGX0xFRlQxCTB4MDExYQkvKiBBdWRpbyBEb2NrIFNQRElGIExlZnQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19TUERJRl9MRUZUMgkweDAxMWIJLyogQXVkaW8gRG9jayBTUERJRiBMZWZ0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzRfUklHSFQxCTB4MDExYwkvKiBBdWRpbyBEb2NrIERBQzIgUmlnaHQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUM0X1JJR0hUMgkweDAxMWQJLyogQXVkaW8gRG9jayBEQUMyIFJpZ2h0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzRfUklHSFQzCTB4MDExZQkvKiBBdWRpbyBEb2NrIERBQzIgUmlnaHQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzRfUklHSFQ0CTB4MDExZgkvKiBBdWRpbyBEb2NrIERBQzIgUmlnaHQsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX1NQRElGX1JJR0hUMQkweDAxMWUJLyogQXVkaW8gRG9jayBTUERJRiBSaWdodCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX1NQRElGX1JJR0hUMgkweDAxMWYJLyogQXVkaW8gRG9jayBTUERJRiBSaWdodCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfSEFOQV9TUERJRl9MRUZUMQkweDAyMDAJLyogSGFuYSBTUERJRiBMZWZ0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0hBTkFfU1BESUZfTEVGVDIJMHgwMjAyCS8qIEhhbmEgU1BESUYgTGVmdCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfSEFOQV9TUERJRl9SSUdIVDEJMHgwMjAxCS8qIEhhbmEgU1BESUYgUmlnaHQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9EU1RfSEFOQV9TUERJRl9SSUdIVDIJMHgwMjAzCS8qIEhhbmEgU1BESUYgUmlnaHQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0hBTU9BX0RBQ19MRUZUMQkweDAzMDAJLyogSGFtb2EgREFDIExlZnQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9EU1RfSEFNT0FfREFDX0xFRlQyCTB4MDMwMgkvKiBIYW1vYSBEQUMgTGVmdCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfSEFNT0FfREFDX0xFRlQzCTB4MDMwNAkvKiBIYW1vYSBEQUMgTGVmdCwgM3JkIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0hBTU9BX0RBQ19MRUZUNAkweDAzMDYJLyogSGFtb2EgREFDIExlZnQsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9IQU1PQV9EQUNfUklHSFQxCTB4MDMwMQkvKiBIYW1vYSBEQUMgUmlnaHQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9EU1RfSEFNT0FfREFDX1JJR0hUMgkweDAzMDMJLyogSGFtb2EgREFDIFJpZ2h0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9IQU1PQV9EQUNfUklHSFQzCTB4MDMwNQkvKiBIYW1vYSBEQUMgUmlnaHQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9IQU1PQV9EQUNfUklHSFQ0CTB4MDMwNwkvKiBIYW1vYSBEQUMgUmlnaHQsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9IQU5BX0FEQVQJMHgwNDAwCS8qIEhhbmEgQURBVCA4IGNoYW5uZWwgb3V0ICswIHRvICs3ICovCisjZGVmaW5lIEVNVV9EU1RfQUxJQ0VfSTJTMF9MRUZUCQkweDA1MDAJLyogQWxpY2UyIEkyUzAgTGVmdCAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFX0kyUzBfUklHSFQJMHgwNTAxCS8qIEFsaWNlMiBJMlMwIFJpZ2h0ICovCisjZGVmaW5lIEVNVV9EU1RfQUxJQ0VfSTJTMV9MRUZUCQkweDA2MDAJLyogQWxpY2UyIEkyUzEgTGVmdCAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFX0kyUzFfUklHSFQJMHgwNjAxCS8qIEFsaWNlMiBJMlMxIFJpZ2h0ICovCisjZGVmaW5lIEVNVV9EU1RfQUxJQ0VfSTJTMl9MRUZUCQkweDA3MDAJLyogQWxpY2UyIEkyUzIgTGVmdCAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFX0kyUzJfUklHSFQJMHgwNzAxCS8qIEFsaWNlMiBJMlMyIFJpZ2h0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFTVUxMDEwbSBIQU5BIFNvdXJjZXMJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRU1VX1NSQ19TSUxFTkNFCQkweDAwMDAJLyogU2lsZW5jZSAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfTUlDX0ExCTB4MDEwMAkvKiBBdWRpbyBEb2NrIE1pYyBBLCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfTUlDX0EyCTB4MDEwMQkvKiBBdWRpbyBEb2NrIE1pYyBBLCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX01JQ19BMwkweDAxMDIJLyogQXVkaW8gRG9jayBNaWMgQSwgM3JkIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfTUlDX0E0CTB4MDEwMwkvKiBBdWRpbyBEb2NrIE1pYyBBLCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19NSUNfQjEJMHgwMTA0CS8qIEF1ZGlvIERvY2sgTWljIEIsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19NSUNfQjIJMHgwMTA1CS8qIEF1ZGlvIERvY2sgTWljIEIsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfTUlDX0IzCTB4MDEwNgkvKiBBdWRpbyBEb2NrIE1pYyBCLCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19NSUNfQjQJMHgwMTA3CS8qIEF1ZGlvIERvY2sgTWljIEIsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzFfTEVGVDEJMHgwMTA4CS8qIEF1ZGlvIERvY2sgQURDMSBMZWZ0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDMV9MRUZUMgkweDAxMDkJLyogQXVkaW8gRG9jayBBREMxIExlZnQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDMV9MRUZUMwkweDAxMGEJLyogQXVkaW8gRG9jayBBREMxIExlZnQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzFfTEVGVDQJMHgwMTBiCS8qIEF1ZGlvIERvY2sgQURDMSBMZWZ0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMxX1JJR0hUMQkweDAxMGMJLyogQXVkaW8gRG9jayBBREMxIFJpZ2h0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDMV9SSUdIVDIJMHgwMTBkCS8qIEF1ZGlvIERvY2sgQURDMSBSaWdodCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMxX1JJR0hUMwkweDAxMGUJLyogQXVkaW8gRG9jayBBREMxIFJpZ2h0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMxX1JJR0hUNAkweDAxMGYJLyogQXVkaW8gRG9jayBBREMxIFJpZ2h0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMyX0xFRlQxCTB4MDExMAkvKiBBdWRpbyBEb2NrIEFEQzIgTGVmdCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzJfTEVGVDIJMHgwMTExCS8qIEF1ZGlvIERvY2sgQURDMiBMZWZ0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzJfTEVGVDMJMHgwMTEyCS8qIEF1ZGlvIERvY2sgQURDMiBMZWZ0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMyX0xFRlQ0CTB4MDExMwkvKiBBdWRpbyBEb2NrIEFEQzIgTGVmdCwgNHRoIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDMl9SSUdIVDEJMHgwMTE0CS8qIEF1ZGlvIERvY2sgQURDMiBSaWdodCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzJfUklHSFQyCTB4MDExNQkvKiBBdWRpbyBEb2NrIEFEQzIgUmlnaHQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDMl9SSUdIVDMJMHgwMTE2CS8qIEF1ZGlvIERvY2sgQURDMiBSaWdodCwgM3JkIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDMl9SSUdIVDQJMHgwMTE3CS8qIEF1ZGlvIERvY2sgQURDMiBSaWdodCwgNHRoIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDM19MRUZUMQkweDAxMTgJLyogQXVkaW8gRG9jayBBREMzIExlZnQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMzX0xFRlQyCTB4MDExOQkvKiBBdWRpbyBEb2NrIEFEQzMgTGVmdCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMzX0xFRlQzCTB4MDExYQkvKiBBdWRpbyBEb2NrIEFEQzMgTGVmdCwgM3JkIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDM19MRUZUNAkweDAxMWIJLyogQXVkaW8gRG9jayBBREMzIExlZnQsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzNfUklHSFQxCTB4MDExYwkvKiBBdWRpbyBEb2NrIEFEQzMgUmlnaHQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMzX1JJR0hUMgkweDAxMWQJLyogQXVkaW8gRG9jayBBREMzIFJpZ2h0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzNfUklHSFQzCTB4MDExZQkvKiBBdWRpbyBEb2NrIEFEQzMgUmlnaHQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzNfUklHSFQ0CTB4MDExZgkvKiBBdWRpbyBEb2NrIEFEQzMgUmlnaHQsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19IQU1PQV9BRENfTEVGVDEJMHgwMjAwCS8qIEhhbW9hIEFEQyBMZWZ0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfU1JDX0hBTU9BX0FEQ19MRUZUMgkweDAyMDIJLyogSGFtb2EgQURDIExlZnQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0hBTU9BX0FEQ19MRUZUMwkweDAyMDQJLyogSGFtb2EgQURDIExlZnQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19IQU1PQV9BRENfTEVGVDQJMHgwMjA2CS8qIEhhbW9hIEFEQyBMZWZ0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfSEFNT0FfQURDX1JJR0hUMQkweDAyMDEJLyogSGFtb2EgQURDIFJpZ2h0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfU1JDX0hBTU9BX0FEQ19SSUdIVDIJMHgwMjAzCS8qIEhhbW9hIEFEQyBSaWdodCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9TUkNfSEFNT0FfQURDX1JJR0hUMwkweDAyMDUJLyogSGFtb2EgQURDIFJpZ2h0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfSEFNT0FfQURDX1JJR0hUNAkweDAyMDcJLyogSGFtb2EgQURDIFJpZ2h0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfQUxJQ0VfRU1VMzJBCQkweDAzMDAJLyogQWxpY2UyIEVNVTMyYSAxNiBvdXRwdXRzLiArMCB0byArMHhmICovCisjZGVmaW5lIEVNVV9TUkNfQUxJQ0VfRU1VMzJCCQkweDAzMTAJLyogQWxpY2UyIEVNVTMyYiAxNiBvdXRwdXRzLiArMCB0byArMHhmICovCisjZGVmaW5lIEVNVV9TUkNfSEFOQV9BREFUCTB4MDQwMAkvKiBIYW5hIEFEQVQgOCBjaGFubmVsIGluICswIHRvICs3ICovCisjZGVmaW5lIEVNVV9TUkNfSEFOQV9TUERJRl9MRUZUMQkweDA1MDAJLyogSGFuYSBTUERJRiBMZWZ0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfU1JDX0hBTkFfU1BESUZfTEVGVDIJMHgwNTAyCS8qIEhhbmEgU1BESUYgTGVmdCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9TUkNfSEFOQV9TUERJRl9SSUdIVDEJMHgwNTAxCS8qIEhhbmEgU1BESUYgUmlnaHQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9TUkNfSEFOQV9TUERJRl9SSUdIVDIJMHgwNTAzCS8qIEhhbmEgU1BESUYgUmlnaHQsIDJuZCBvciA5NmtIeiAqLworLyogMHg2MDAgYW5kIDB4NzAwIG5vIHVzZWQgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBTVFJVQ1RVUkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTEwNjMsNyArMTQyNSw3IEBACiAJdW5zaWduZWQgY2hhciBzcGRpZl9idWc7ICAgIC8qIEhhcyBTcGRpZiBwaGFzaW5nIGJ1ZyAqLwogCXVuc2lnbmVkIGNoYXIgYWM5N19jaGlwOyAgICAvKiBIYXMgYW4gQUM5NyBjaGlwOiAxID0gbWFuZGF0b3J5LCAyID0gb3B0aW9uYWwgKi8KIAl1bnNpZ25lZCBjaGFyIGVjYXJkOyAgICAgICAgLyogQVBTIEVFUFJPTSAqLwotCXVuc2lnbmVkIGNoYXIgZW11MTIxMm07ICAgICAvKiBFTVUgMTIxMm0gY2FyZCAqLworCXVuc2lnbmVkIGNoYXIgZW11MTAxMDsgICAgIC8qIEVNVSAxMDEwbSBjYXJkICovCiAJdW5zaWduZWQgY2hhciBzcGlfZGFjOyAgICAgIC8qIFNQSSBpbnRlcmZhY2UgZm9yIERBQyAqLwogCXVuc2lnbmVkIGNoYXIgaTJjX2FkYzsgICAgICAvKiBJMkMgaW50ZXJmYWNlIGZvciBBREMgKi8KIAl1bnNpZ25lZCBjaGFyIGFkY18xMzYxdDsgICAgLyogVXNlIFBoaWxpcHMgMTM2MVQgQURDICovCkBAIC0xMDcyLDYgKzE0MzQsMTQgQEAKIAljb25zdCBjaGFyICppZDsJCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IC0gY2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZCAqLwogfTsKIAorc3RydWN0IHNuZF9lbXUxMDEwIHsKKwl1bnNpZ25lZCBpbnQgb3V0cHV0X3NvdXJjZVs2NF07CisJdW5zaWduZWQgaW50IGlucHV0X3NvdXJjZVs2NF07CisJdW5zaWduZWQgaW50IGFkY19wYWRzOyAvKiBiaXQgbWFzayAqLworCXVuc2lnbmVkIGludCBkYWNfcGFkczsgLyogYml0IG1hc2sgKi8KKwl1bnNpZ25lZCBpbnQgaW50ZXJuYWxfY2xvY2s7IC8qIDQ0MTAwIG9yIDQ4MDAwICovCit9OworCiBzdHJ1Y3Qgc25kX2VtdTEwazEgewogCWludCBpcnE7CiAKQEAgLTEwNzksNiArMTQ0OSw3IEBACiAJdW5zaWduZWQgaW50IHRvc19saW5rOiAxLAkJLyogdG9zIGxpbmsgZGV0ZWN0ZWQgKi8KIAkJcmVhcl9hYzk3OiAxLAkJCS8qIHJlYXIgY2hhbm5lbHMgYXJlIG9uIEFDJzk3ICovCiAJCWVuYWJsZV9pcjogMTsKKwl1bnNpZ25lZCBpbnQgc3VwcG9ydF90bHYgOjE7CiAJLyogQ29udGFpbnMgcHJvZmlsZSBvZiBjYXJkIGNhcGFiaWxpdGllcyAqLwogCWNvbnN0IHN0cnVjdCBzbmRfZW11X2NoaXBfZGV0YWlscyAqY2FyZF9jYXBhYmlsaXRpZXM7CiAJdW5zaWduZWQgaW50IGF1ZGlneTsJCQkvKiBpcyBBdWRpZ3k/ICovCkBAIC0xMTA0LDYgKzE0NzUsOCBAQAogCXNwaW5sb2NrX3QgbWVtYmxrX2xvY2s7CiAKIAl1bnNpZ25lZCBpbnQgc3BkaWZfYml0c1szXTsJCS8qIHMvcGRpZiBvdXQgc2V0dXAgKi8KKwl1bnNpZ25lZCBpbnQgaTJjX2NhcHR1cmVfc291cmNlOworCXU4IGkyY19jYXB0dXJlX3ZvbHVtZVs0XVsyXTsKIAogCXN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTAgZng4MDEwOwkJLyogRlg4MDEwIGluZm8gKi8KIAlpbnQgZ3ByX2Jhc2U7CkBAIC0xMTMyLDYgKzE1MDUsNyBAQAogCWludCBwMTZ2X2RldmljZV9vZmZzZXQ7CiAJdTMyIHAxNnZfY2FwdHVyZV9zb3VyY2U7CiAJdTMyIHAxNnZfY2FwdHVyZV9jaGFubmVsOworICAgICAgICBzdHJ1Y3Qgc25kX2VtdTEwMTAgZW11MTAxMDsKIAlzdHJ1Y3Qgc25kX2VtdTEwazFfcGNtX21peGVyIHBjbV9taXhlclszMl07CiAJc3RydWN0IHNuZF9lbXUxMGsxX3BjbV9taXhlciBlZnhfcGNtX21peGVyW05VTV9FRlhfUExBWUJBQ0tdOwogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bF9zZW5kX3JvdXRpbmc7CkBAIC0xMjA4LDYgKzE1ODIsMTAgQEAKIHVuc2lnbmVkIGludCBzbmRfZW11MTBrMV9wdHIyMF9yZWFkKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IGNobik7CiB2b2lkIHNuZF9lbXUxMGsxX3B0cjIwX3dyaXRlKHN0cnVjdCBzbmRfZW11MTBrMSAqZW11LCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgY2huLCB1bnNpZ25lZCBpbnQgZGF0YSk7CiBpbnQgc25kX2VtdTEwazFfc3BpX3dyaXRlKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgdW5zaWduZWQgaW50IGRhdGEpOworaW50IHNuZF9lbXUxMGsxX2kyY193cml0ZShzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwgdTMyIHJlZywgdTMyIHZhbHVlKTsKK2ludCBzbmRfZW11MTAxMF9mcGdhX3dyaXRlKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgaW50IHJlZywgaW50IHZhbHVlKTsKK2ludCBzbmRfZW11MTAxMF9mcGdhX3JlYWQoc3RydWN0IHNuZF9lbXUxMGsxICogZW11LCBpbnQgcmVnLCBpbnQgKnZhbHVlKTsKK2ludCBzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUsIGludCBkc3QsIGludCBzcmMpOwogdW5zaWduZWQgaW50IHNuZF9lbXUxMGsxX2VmeF9yZWFkKHN0cnVjdCBzbmRfZW11MTBrMSAqZW11LCB1bnNpZ25lZCBpbnQgcGMpOwogdm9pZCBzbmRfZW11MTBrMV9pbnRyX2VuYWJsZShzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwgdW5zaWduZWQgaW50IGludHJlbmIpOwogdm9pZCBzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoc3RydWN0IHNuZF9lbXUxMGsxICplbXUsIHVuc2lnbmVkIGludCBpbnRyZW5iKTsKQEAgLTE1MjQsMTEgKzE5MDIsMjAgQEAKIAl1bnNpZ25lZCBpbnQgdmFsdWVbMzJdOwkJLyogaW5pdGlhbCB2YWx1ZXMgKi8KIAl1bnNpZ25lZCBpbnQgbWluOwkJLyogbWluaW11bSByYW5nZSAqLwogCXVuc2lnbmVkIGludCBtYXg7CQkvKiBtYXhpbXVtIHJhbmdlICovCi0JdW5pb24gewotCQlzbmRfa2NvbnRyb2xfdGx2X3J3X3QgKmM7Ci0JCXVuc2lnbmVkIGludCAqcDsKLQl9IHRsdjsKIAl1bnNpZ25lZCBpbnQgdHJhbnNsYXRpb247CS8qIHRyYW5zbGF0aW9uIHR5cGUgKEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OKikgKi8KKwljb25zdCB1bnNpZ25lZCBpbnQgKnRsdjsKK307CisKKy8qIG9sZCBBQkkgd2l0aG91dCBUTFYgc3VwcG9ydCAqLworc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX29sZF9ncHIgeworCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgaWQ7CisJdW5zaWduZWQgaW50IHZjb3VudDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgc2hvcnQgZ3ByWzMyXTsKKwl1bnNpZ25lZCBpbnQgdmFsdWVbMzJdOworCXVuc2lnbmVkIGludCBtaW47CisJdW5zaWduZWQgaW50IG1heDsKKwl1bnNpZ25lZCBpbnQgdHJhbnNsYXRpb247CiB9OwogCiBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvZGUgewpAQCAtMTU3OSw2ICsxOTY2LDggQEAKIAl1bnNpZ25lZCBpbnQgcmVzMjsJCS8qIHJlc2VydmVkICovCiB9OwogCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfVkVSU0lPTgkJU05EUlZfUFJPVE9DT0xfVkVSU0lPTigxLCAwLCAxKQorCiAjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfSU5GTwlfSU9SICgnSCcsIDB4MTAsIHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfaW5mbykKICNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9DT0RFX1BPS0UJX0lPVyAoJ0gnLCAweDExLCBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvZGUpCiAjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfQ09ERV9QRUVLCV9JT1dSKCdIJywgMHgxMiwgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb2RlKQpAQCAtMTU4Nyw2ICsxOTc2LDcgQEAKICNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9UUkFNX1BFRUsJX0lPV1IoJ0gnLCAweDIyLCBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX3RyYW0pCiAjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfUENNX1BPS0UJX0lPVyAoJ0gnLCAweDMwLCBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX3BjbV9yZWMpCiAjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfUENNX1BFRUsJX0lPV1IoJ0gnLCAweDMxLCBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX3BjbV9yZWMpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfUFZFUlNJT04JX0lPUiAoJ0gnLCAweDQwLCBpbnQpCiAjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfU1RPUAlfSU8gICgnSCcsIDB4ODApCiAjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfQ09OVElOVUUJX0lPICAoJ0gnLCAweDgxKQogI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1pFUk9fVFJBTV9DT1VOVEVSIF9JTyAoJ0gnLCAweDgyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9wY20uaCBiL2luY2x1ZGUvc291bmQvcGNtLmgKaW5kZXggMmY2NDVkZi4uZWU2YmMyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9wY20uaAorKysgYi9pbmNsdWRlL3NvdW5kL3BjbS5oCkBAIC01Niw2ICs1Niw4IEBACiAJc2l6ZV90IGZpZm9fc2l6ZTsJCS8qIGZpZm8gc2l6ZSBpbiBieXRlcyAqLwogfTsKIAorc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtOworCiBzdHJ1Y3Qgc25kX3BjbV9vcHMgewogCWludCAoKm9wZW4pKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIAlpbnQgKCpjbG9zZSkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pOwpAQCAtMzg0LDYgKzM4Niw3IEBACiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpwcm9jX3N3X3BhcmFtc19lbnRyeTsKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnByb2Nfc3RhdHVzX2VudHJ5OwogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqcHJvY19wcmVhbGxvY19lbnRyeTsKKwlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnByb2NfcHJlYWxsb2NfbWF4X2VudHJ5OwogI2VuZGlmCiAJLyogbWlzYyBmbGFncyAqLwogCXVuc2lnbmVkIGludCBod19vcGVuZWQ6IDE7CkBAIC00MjcsNiArNDMwLDcgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CiAJdm9pZCAqcHJpdmF0ZV9kYXRhOwogCXZvaWQgKCpwcml2YXRlX2ZyZWUpIChzdHJ1Y3Qgc25kX3BjbSAqcGNtKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7IC8qIGFjdHVhbCBodyBkZXZpY2UgdGhpcyBiZWxvbmdzIHRvICovCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9QQ01fT1NTX01PRFVMRSkKIAlzdHJ1Y3Qgc25kX3BjbV9vc3Mgb3NzOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3B0MjI1OC5oIGIvaW5jbHVkZS9zb3VuZC9wdDIyNTguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBmODEyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9wdDIyNTguaApAQCAtMCwwICsxLDM3IEBACisvKgorICogICBBTFNBIERyaXZlciBmb3IgdGhlIFBUMjI1OCB2b2x1bWUgY29udHJvbGxlci4KKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDYgIEpvY2hlbiBWb3NzIDx2b3NzQHNlZWh1aG4uZGU+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLyAgICAgIAorCisjaWZuZGVmIF9fU09VTkRfUFQyMjU4X0gKKyNkZWZpbmUgX19TT1VORF9QVDIyNThfSAorCitzdHJ1Y3Qgc25kX3B0MjI1OCB7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOworCXN0cnVjdCBzbmRfaTJjX2J1cyAqaTJjX2J1czsKKwlzdHJ1Y3Qgc25kX2kyY19kZXZpY2UgKmkyY19kZXY7CisKKwl1bnNpZ25lZCBjaGFyIHZvbHVtZVs2XTsKKwlpbnQgbXV0ZTsKK307CisKK2V4dGVybiBpbnQgc25kX3B0MjI1OF9yZXNldChzdHJ1Y3Qgc25kX3B0MjI1OCAqcHQpOworZXh0ZXJuIGludCBzbmRfcHQyMjU4X2J1aWxkX2NvbnRyb2xzKHN0cnVjdCBzbmRfcHQyMjU4ICpwdCk7CisKKyNlbmRpZiAvKiBfX1NPVU5EX1BUMjI1OF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NiMTZfY3NwLmggYi9pbmNsdWRlL3NvdW5kL3NiMTZfY3NwLmgKaW5kZXggY2FmNmZlMi4uNzM2ZWFjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zYjE2X2NzcC5oCisrKyBiL2luY2x1ZGUvc291bmQvc2IxNl9jc3AuaApAQCAtMTE0LDkgKzExNCwyMSBAQAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlICJzYi5oIgogI2luY2x1ZGUgImh3ZGVwLmgiCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAogc3RydWN0IHNuZF9zYl9jc3A7CiAKKy8qIGluZGljZXMgZm9yIHRoZSBrbm93biBDU1AgcHJvZ3JhbXMgKi8KK2VudW0geworCUNTUF9QUk9HUkFNX01VTEFXLAorCUNTUF9QUk9HUkFNX0FMQVcsCisJQ1NQX1BST0dSQU1fQURQQ01fSU5JVCwKKwlDU1BfUFJPR1JBTV9BRFBDTV9QTEFZQkFDSywKKwlDU1BfUFJPR1JBTV9BRFBDTV9DQVBUVVJFLAorCisJQ1NQX1BST0dSQU1fQ09VTlQKK307CisKIC8qCiAgKiBDU1Agb3BlcmF0b3JzCiAgKi8KQEAgLTE1OSw2ICsxNzEsOCBAQAogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKnFzb3VuZF9zcGFjZTsKIAogCXN0cnVjdCBtdXRleCBhY2Nlc3NfbXV0ZXg7CS8qIGxvY2tpbmcgKi8KKworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqY3NwX3Byb2dyYW1zW0NTUF9QUk9HUkFNX0NPVU5UXTsKIH07CiAKIGludCBzbmRfc2JfY3NwX25ldyhzdHJ1Y3Qgc25kX3NiICpjaGlwLCBpbnQgZGV2aWNlLCBzdHJ1Y3Qgc25kX2h3ZGVwICoqIHJod2RlcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NuZF93YXZlZnJvbnQuaCBiL2luY2x1ZGUvc291bmQvc25kX3dhdmVmcm9udC5oCmluZGV4IDBiOWU1ZGUuLjk2ODhkNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc25kX3dhdmVmcm9udC5oCisrKyBiL2luY2x1ZGUvc291bmQvc25kX3dhdmVmcm9udC5oCkBAIC04NSw2ICs4NSw3IEBACiAJY2hhciBod192ZXJzaW9uWzJdOyAgICAgICAgICAgICAgICAvKiBtYWpvciA9IFswXSwgbWlub3IgPSBbMV0gKi8KIAljaGFyIGlzcmF3OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWRzIE1vdG9yb2xhIG1pY3JvY29kZSAqLwogCWNoYXIgaGFzX2Z4OyAgICAgICAgICAgICAgICAgICAgICAgLyogaGFzIEZYIHByb2Nlc3NvciAoVHJvcGV6KykgKi8KKwljaGFyIGZ4X2luaXRpYWxpemVkOyAgICAgICAgICAgICAgIC8qIEZYJ3MgcmVnaXN0ZXIgcGFnZXMgaW5pdGlhbGl6ZWQgKi8KIAljaGFyIHByb2dfc3RhdHVzW1dGX01BWF9QUk9HUkFNXTsgIC8qIFdGX1NMT1RfKiAqLwogCWNoYXIgcGF0Y2hfc3RhdHVzW1dGX01BWF9QQVRDSF07ICAgLyogV0ZfU0xPVF8qICovCiAJY2hhciBzYW1wbGVfc3RhdHVzW1dGX01BWF9TQU1QTEVdOyAvKiBXRl9TVF8qIHwgV0ZfU0xPVF8qICovCkBAIC05NCw2ICs5NSw3IEBACiAJc3BpbmxvY2tfdCBpcnFfbG9jazsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBpbnRlcnJ1cHRfc2xlZXBlcjsgCiAJc25kX3dhdmVmcm9udF9taWRpX3QgbWlkaTsgICAgICAgICAvKiBJQ1MyMTE1IE1JREkgaW50ZXJmYWNlICovCisJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogfTsKIAogc3RydWN0IF9zbmRfd2F2ZWZyb250X2NhcmQgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oIGIvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWFlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiBsaW51eC9zb3VuZC9zb2MtZGFwbS5oIC0tIEFMU0EgU29DIER5bmFtaWMgQXVkaW8gUG93ZXIgTWFuYWdlbWVudAorICoKKyAqIEF1dGhvcjoJCUxpYW0gR2lyZHdvb2QKKyAqIENyZWF0ZWQ6CQlBdWcgMTF0aCAyMDA1CisgKiBDb3B5cmlnaHQ6CVdvbGZzb24gTWljcm9lbGVjdHJvbmljcy4gUExDLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1NORF9TT0NfREFQTV9ICisjZGVmaW5lIF9fTElOVVhfU05EX1NPQ19EQVBNX0gKKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisvKiB3aWRnZXQgaGFzIG5vIFBNIHJlZ2lzdGVyIGJpdCAqLworI2RlZmluZSBTTkRfU09DX05PUE0JLTEKKworLyoKKyAqIFNvQyBkeW5hbWljIGF1ZGlvIHBvd2VyIG1hbmFnbWVudAorICoKKyAqIFdlIGNhbiBoYXZlIHVwdG8gNCBwb3dlciBkb21haW5zCisgKiAJMS4gQ29kZWMgZG9tYWluIC0gVlJFRiwgVk1JRAorICogICAgIFVzdWFsbHkgY29udHJvbGxlZCBhdCBjb2RlYyBwcm9iZS9yZW1vdmUsIGFsdGhvdWdoIGNhbiBiZSBzZXQKKyAqICAgICBhdCBzdHJlYW0gdGltZSBpZiBwb3dlciBpcyBub3QgbmVlZGVkIGZvciBzaWRldG9uZSwgZXRjLgorICogIDIuIFBsYXRmb3JtL01hY2hpbmUgZG9tYWluIC0gcGh5c2ljYWxseSBjb25uZWN0ZWQgaW5wdXRzIGFuZCBvdXRwdXRzCisgKiAgICAgSXMgcGxhdGZvcm0vbWFjaGluZSBhbmQgdXNlciBhY3Rpb24gc3BlY2lmaWMsIGlzIHNldCBpbiB0aGUgbWFjaGluZQorICogICAgIGRyaXZlciBhbmQgYnkgdXNlcnNwYWNlIGUuZyB3aGVuIEhQIGFyZSBpbnNlcnRlZAorICogIDMuIFBhdGggZG9tYWluIC0gSW50ZXJuYWwgY29kZWMgcGF0aCBtaXhlcnMKKyAqICAgICBBcmUgYXV0b21hdGljYWxseSBzZXQgd2hlbiBtaXhlciBhbmQgbXV4IHNldHRpbmdzIGFyZQorICogICAgIGNoYW5nZWQgYnkgdGhlIHVzZXIuCisgKiAgNC4gU3RyZWFtIGRvbWFpbiAtIERBQydzIGFuZCBBREMncy4KKyAqICAgICBFbmFibGVkIHdoZW4gc3RyZWFtIHBsYXliYWNrL2NhcHR1cmUgaXMgc3RhcnRlZC4KKyAqLworCisvKiBjb2RlYyBkb21haW4gKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1ZNSUQod25hbWUpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX3ZtaWQsIC5uYW1lID0gd25hbWUsIC5rY29udHJvbHMgPSBOVUxMLCBcCisJLm51bV9rY29udHJvbHMgPSAwfQorCisvKiBwbGF0Zm9ybSBkb21haW4gKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX0lOUFVUKHduYW1lKSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9pbnB1dCwgLm5hbWUgPSB3bmFtZSwgLmtjb250cm9scyA9IE5VTEwsIFwKKwkubnVtX2tjb250cm9scyA9IDB9CisjZGVmaW5lIFNORF9TT0NfREFQTV9PVVRQVVQod25hbWUpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX291dHB1dCwgLm5hbWUgPSB3bmFtZSwgLmtjb250cm9scyA9IE5VTEwsIFwKKwkubnVtX2tjb250cm9scyA9IDB9CisjZGVmaW5lIFNORF9TT0NfREFQTV9NSUMod25hbWUsIHdldmVudCkgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fbWljLCAubmFtZSA9IHduYW1lLCAua2NvbnRyb2xzID0gTlVMTCwgXAorCS5udW1fa2NvbnRyb2xzID0gMCwgLmV2ZW50ID0gd2V2ZW50LCBcCisJLmV2ZW50X2ZsYWdzID0gU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUR9CisjZGVmaW5lIFNORF9TT0NfREFQTV9IUCh3bmFtZSwgd2V2ZW50KSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9ocCwgLm5hbWUgPSB3bmFtZSwgLmtjb250cm9scyA9IE5VTEwsIFwKKwkubnVtX2tjb250cm9scyA9IDAsIC5ldmVudCA9IHdldmVudCwgXAorCS5ldmVudF9mbGFncyA9IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EfQorI2RlZmluZSBTTkRfU09DX0RBUE1fU1BLKHduYW1lLCB3ZXZlbnQpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX3NwaywgLm5hbWUgPSB3bmFtZSwgLmtjb250cm9scyA9IE5VTEwsIFwKKwkubnVtX2tjb250cm9scyA9IDAsIC5ldmVudCA9IHdldmVudCwgXAorCS5ldmVudF9mbGFncyA9IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EfQorI2RlZmluZSBTTkRfU09DX0RBUE1fTElORSh3bmFtZSwgd2V2ZW50KSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9saW5lLCAubmFtZSA9IHduYW1lLCAua2NvbnRyb2xzID0gTlVMTCwgXAorCS5udW1fa2NvbnRyb2xzID0gMCwgLmV2ZW50ID0gd2V2ZW50LCBcCisJLmV2ZW50X2ZsYWdzID0gU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUR9CisKKy8qIHBhdGggZG9tYWluICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9QR0Eod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCxcCisJIHdjb250cm9scywgd25jb250cm9scykgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fcGdhLCAubmFtZSA9IHduYW1lLCAucmVnID0gd3JlZywgLnNoaWZ0ID0gd3NoaWZ0LCBcCisJLmludmVydCA9IHdpbnZlcnQsIC5rY29udHJvbHMgPSB3Y29udHJvbHMsIC5udW1fa2NvbnRyb2xzID0gd25jb250cm9sc30KKyNkZWZpbmUgU05EX1NPQ19EQVBNX01JWEVSKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIFwKKwkgd2NvbnRyb2xzLCB3bmNvbnRyb2xzKVwKK3sJLmlkID0gc25kX3NvY19kYXBtX21peGVyLCAubmFtZSA9IHduYW1lLCAucmVnID0gd3JlZywgLnNoaWZ0ID0gd3NoaWZ0LCBcCisJLmludmVydCA9IHdpbnZlcnQsIC5rY29udHJvbHMgPSB3Y29udHJvbHMsIC5udW1fa2NvbnRyb2xzID0gd25jb250cm9sc30KKyNkZWZpbmUgU05EX1NPQ19EQVBNX01JQ0JJQVMod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCkgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fbWljYmlhcywgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXAorCS5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gTlVMTCwgLm51bV9rY29udHJvbHMgPSAwfQorI2RlZmluZSBTTkRfU09DX0RBUE1fU1dJVENIKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scykgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fc3dpdGNoLCAubmFtZSA9IHduYW1lLCAucmVnID0gd3JlZywgLnNoaWZ0ID0gd3NoaWZ0LCBcCisJLmludmVydCA9IHdpbnZlcnQsIC5rY29udHJvbHMgPSB3Y29udHJvbHMsIC5udW1fa2NvbnRyb2xzID0gMX0KKyNkZWZpbmUgU05EX1NPQ19EQVBNX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX211eCwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXAorCS5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDF9CisKKy8qIHBhdGggZG9tYWluIHdpdGggZXZlbnQgLSBldmVudCBoYW5kbGVyIG11c3QgcmV0dXJuIDAgZm9yIHN1Y2Nlc3MgKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1BHQV9FKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scywgXAorCXduY29udHJvbHMsIHdldmVudCwgd2ZsYWdzKSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9wZ2EsIC5uYW1lID0gd25hbWUsIC5yZWcgPSB3cmVnLCAuc2hpZnQgPSB3c2hpZnQsIFwKKwkuaW52ZXJ0ID0gd2ludmVydCwgLmtjb250cm9scyA9IHdjb250cm9scywgLm51bV9rY29udHJvbHMgPSB3bmNvbnRyb2xzLCBcCisJLmV2ZW50ID0gd2V2ZW50LCAuZXZlbnRfZmxhZ3MgPSB3ZmxhZ3N9CisjZGVmaW5lIFNORF9TT0NfREFQTV9NSVhFUl9FKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scywgXAorCXduY29udHJvbHMsIHdldmVudCwgd2ZsYWdzKSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9taXhlciwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXAorCS5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IHduY29udHJvbHMsIFwKKwkuZXZlbnQgPSB3ZXZlbnQsIC5ldmVudF9mbGFncyA9IHdmbGFnc30KKyNkZWZpbmUgU05EX1NPQ19EQVBNX01JQ0JJQVNfRSh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3ZXZlbnQsIHdmbGFncykgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fbWljYmlhcywgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXAorCS5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gTlVMTCwgLm51bV9rY29udHJvbHMgPSAwLCBcCisJLmV2ZW50ID0gd2V2ZW50LCAuZXZlbnRfZmxhZ3MgPSB3ZmxhZ3N9CisjZGVmaW5lIFNORF9TT0NfREFQTV9TV0lUQ0hfRSh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMsIFwKKwl3ZXZlbnQsIHdmbGFncykgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fc3dpdGNoLCAubmFtZSA9IHduYW1lLCAucmVnID0gd3JlZywgLnNoaWZ0ID0gd3NoaWZ0LCBcCisJLmludmVydCA9IHdpbnZlcnQsIC5rY29udHJvbHMgPSB3Y29udHJvbHMsIC5udW1fa2NvbnRyb2xzID0gMSBcCisJLmV2ZW50ID0gd2V2ZW50LCAuZXZlbnRfZmxhZ3MgPSB3ZmxhZ3N9CisjZGVmaW5lIFNORF9TT0NfREFQTV9NVVhfRSh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMsIFwKKwl3ZXZlbnQsIHdmbGFncykgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fbXV4LCAubmFtZSA9IHduYW1lLCAucmVnID0gd3JlZywgLnNoaWZ0ID0gd3NoaWZ0LCBcCisJLmludmVydCA9IHdpbnZlcnQsIC5rY29udHJvbHMgPSB3Y29udHJvbHMsIC5udW1fa2NvbnRyb2xzID0gMSwgXAorCS5ldmVudCA9IHdldmVudCwgLmV2ZW50X2ZsYWdzID0gd2ZsYWdzfQorCisvKiBldmVudHMgdGhhdCBhcmUgcHJlIGFuZCBwb3N0IERBUE0gKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1BSRSh3bmFtZSwgd2V2ZW50KSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9wcmUsIC5uYW1lID0gd25hbWUsIC5rY29udHJvbHMgPSBOVUxMLCBcCisJLm51bV9rY29udHJvbHMgPSAwLCAuZXZlbnQgPSB3ZXZlbnQsIFwKKwkuZXZlbnRfZmxhZ3MgPSBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EfQorI2RlZmluZSBTTkRfU09DX0RBUE1fUE9TVCh3bmFtZSwgd2V2ZW50KSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9wb3N0LCAubmFtZSA9IHduYW1lLCAua2NvbnRyb2xzID0gTlVMTCwgXAorCS5udW1fa2NvbnRyb2xzID0gMCwgLmV2ZW50ID0gd2V2ZW50LCBcCisJLmV2ZW50X2ZsYWdzID0gU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EfQorCisvKiBzdHJlYW0gZG9tYWluICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9EQUMod25hbWUsIHN0bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0KSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9kYWMsIC5uYW1lID0gd25hbWUsIC5zbmFtZSA9IHN0bmFtZSwgLnJlZyA9IHdyZWcsIFwKKwkuc2hpZnQgPSB3c2hpZnQsIC5pbnZlcnQgPSB3aW52ZXJ0fQorI2RlZmluZSBTTkRfU09DX0RBUE1fQURDKHduYW1lLCBzdG5hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCkgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fYWRjLCAubmFtZSA9IHduYW1lLCAuc25hbWUgPSBzdG5hbWUsIC5yZWcgPSB3cmVnLCBcCisJLnNoaWZ0ID0gd3NoaWZ0LCAuaW52ZXJ0ID0gd2ludmVydH0KKworLyogZGFwbSBrY29udHJvbCB0eXBlcyAqLworI2RlZmluZSBTT0NfREFQTV9TSU5HTEUoeG5hbWUsIHJlZywgc2hpZnQsIG1hc2ssIGludmVydCkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCisJLmdldCA9IHNuZF9zb2NfZGFwbV9nZXRfdm9sc3csIC5wdXQgPSBzbmRfc29jX2RhcG1fcHV0X3ZvbHN3LCBcCisJLnByaXZhdGVfdmFsdWUgPSAgU09DX1NJTkdMRV9WQUxVRShyZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQpIH0KKyNkZWZpbmUgU09DX0RBUE1fRE9VQkxFKHhuYW1lLCByZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXNrLCBpbnZlcnQsIFwKKwlwb3dlcikgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSAoeG5hbWUpLCBcCisJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIFwKKyAJLmdldCA9IHNuZF9zb2NfZGFwbV9nZXRfdm9sc3csIC5wdXQgPSBzbmRfc29jX2RhcG1fcHV0X3ZvbHN3LCBcCisgCS5wcml2YXRlX3ZhbHVlID0gKHJlZykgfCAoKHNoaWZ0X2xlZnQpIDw8IDgpIHwgKChzaGlmdF9yaWdodCkgPDwgMTIpIHxcCisgCQkgKChtYXNrKSA8PCAxNikgfCAoKGludmVydCkgPDwgMjQpIH0KKyNkZWZpbmUgU09DX0RBUE1fRU5VTSh4bmFtZSwgeGVudW0pIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXAorIAkuZ2V0ID0gc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwgXAorIAkucHV0ID0gc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZSwgXAorICAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQorCisvKiBkYXBtIHN0cmVhbSBvcGVyYXRpb25zICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QCQkJMHgwCisjZGVmaW5lIFNORF9TT0NfREFQTV9TVFJFQU1fU1RBUlQJCTB4MQorI2RlZmluZSBTTkRfU09DX0RBUE1fU1RSRUFNX1NUT1AJCTB4MgorI2RlZmluZSBTTkRfU09DX0RBUE1fU1RSRUFNX1NVU1BFTkQJCTB4NAorI2RlZmluZSBTTkRfU09DX0RBUE1fU1RSRUFNX1JFU1VNRQkJMHg4CisjZGVmaW5lIFNORF9TT0NfREFQTV9TVFJFQU1fUEFVU0VfUFVTSAkweDEwCisjZGVmaW5lIFNORF9TT0NfREFQTV9TVFJFQU1fUEFVU0VfUkVMRUFTRQkweDIwCisKKy8qIGRhcG0gZXZlbnQgdHlwZXMgKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1BSRV9QTVUJMHgxIAkvKiBiZWZvcmUgd2lkZ2V0IHBvd2VyIHVwICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9QT1NUX1BNVQkweDIJCS8qIGFmdGVyIHdpZGdldCBwb3dlciB1cCAqLworI2RlZmluZSBTTkRfU09DX0RBUE1fUFJFX1BNRAkweDQgCS8qIGJlZm9yZSB3aWRnZXQgcG93ZXIgZG93biAqLworI2RlZmluZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQJMHg4CQkvKiBhZnRlciB3aWRnZXQgcG93ZXIgZG93biAqLworI2RlZmluZSBTTkRfU09DX0RBUE1fUFJFX1JFRwkweDEwCS8qIGJlZm9yZSBhdWRpbyBwYXRoIHNldHVwICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9QT1NUX1JFRwkweDIwCS8qIGFmdGVyIGF1ZGlvIHBhdGggc2V0dXAgKi8KKworLyogY29udmVuaWVuY2UgZXZlbnQgdHlwZSBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX0VWRU5UX09OKGUpCVwKKwkoZSAmIChTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSkpCisjZGVmaW5lIFNORF9TT0NfREFQTV9FVkVOVF9PRkYoZSkJXAorCShlICYgKFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSkKKworc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQ7CitlbnVtIHNuZF9zb2NfZGFwbV90eXBlOworc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoOworc3RydWN0IHNuZF9zb2NfZGFwbV9waW47CisKKy8qIGRhcG0gY29udHJvbHMgKi8KK2ludCBzbmRfc29jX2RhcG1fcHV0X3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK2ludCBzbmRfc29jX2RhcG1fZ2V0X3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK2ludCBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK2ludCBzbmRfc29jX2RhcG1fcHV0X2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK2ludCBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQpOworCisvKiBkYXBtIHBhdGggc2V0dXAgKi8KK2ludCBzbmRfc29jX2RhcG1fY29ubmVjdF9pbnB1dChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJY29uc3QgY2hhciAqc2lua19uYW1lLCBjb25zdCBjaGFyICpjb250cm9sX25hbWUsIGNvbnN0IGNoYXIgKnNyY19uYW1lKTsKK2ludCBzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK3ZvaWQgc25kX3NvY19kYXBtX2ZyZWUoc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYpOworCisvKiBkYXBtIGV2ZW50cyAqLworaW50IHNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBjaGFyICpzdHJlYW0sCisJaW50IGV2ZW50KTsKKworLyogZGFwbSBzeXMgZnMgLSB1c2VkIGJ5IHRoZSBjb3JlICovCitpbnQgc25kX3NvY19kYXBtX3N5c19hZGQoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyogZGFwbSBhdWRpbyBlbmRwb2ludCBjb250cm9sICovCitpbnQgc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJY2hhciAqcGluLCBpbnQgc3RhdHVzKTsKK2ludCBzbmRfc29jX2RhcG1fc3luY19lbmRwb2ludHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKKworLyogZGFwbSB3aWRnZXQgdHlwZXMgKi8KK2VudW0gc25kX3NvY19kYXBtX3R5cGUgeworCXNuZF9zb2NfZGFwbV9pbnB1dCA9IDAsCQkvKiBpbnB1dCBwaW4gKi8KKwlzbmRfc29jX2RhcG1fb3V0cHV0LAkJLyogb3V0cHV0IHBpbiAqLworCXNuZF9zb2NfZGFwbV9tdXgsCQkJLyogc2VsZWN0cyAxIGFuYWxvZyBzaWduYWwgZnJvbSBtYW55IGlucHV0cyAqLworCXNuZF9zb2NfZGFwbV9taXhlciwJCQkvKiBtaXhlcyBzZXZlcmFsIGFuYWxvZyBzaWduYWxzIHRvZ2V0aGVyICovCisJc25kX3NvY19kYXBtX3BnYSwJCQkvKiBwcm9ncmFtbWFibGUgZ2Fpbi9hdHRlbnVhdGlvbiAodm9sdW1lKSAqLworCXNuZF9zb2NfZGFwbV9hZGMsCQkJLyogYW5hbG9nIHRvIGRpZ2l0YWwgY29udmVydGVyICovCisJc25kX3NvY19kYXBtX2RhYywJCQkvKiBkaWdpdGFsIHRvIGFuYWxvZyBjb252ZXJ0ZXIgKi8KKwlzbmRfc29jX2RhcG1fbWljYmlhcywJCS8qIG1pY3JvcGhvbmUgYmlhcyAocG93ZXIpICovCisJc25kX3NvY19kYXBtX21pYywJCQkvKiBtaWNyb3Bob25lICovCisJc25kX3NvY19kYXBtX2hwLAkJCS8qIGhlYWRwaG9uZXMgKi8KKwlzbmRfc29jX2RhcG1fc3BrLAkJCS8qIHNwZWFrZXIgKi8KKwlzbmRfc29jX2RhcG1fbGluZSwJCQkvKiBsaW5lIGlucHV0L291dHB1dCAqLworCXNuZF9zb2NfZGFwbV9zd2l0Y2gsCQkvKiBhbmFsb2cgc3dpdGNoICovCisJc25kX3NvY19kYXBtX3ZtaWQsCQkJLyogY29kZWMgYmlhcy92bWlkIC0gdG8gbWluaW1pc2UgcG9wcyAqLworCXNuZF9zb2NfZGFwbV9wcmUsCQkJLyogbWFjaGluZSBzcGVjaWZpYyBwcmUgd2lkZ2V0IC0gZXhlYyBmaXJzdCAqLworCXNuZF9zb2NfZGFwbV9wb3N0LAkJCS8qIG1hY2hpbmUgc3BlY2lmaWMgcG9zdCB3aWRnZXQgLSBleGVjIGxhc3QgKi8KK307CisKKy8qIGRhcG0gYXVkaW8gcGF0aCBiZXR3ZWVuIHR3byB3aWRnZXRzICovCitzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggeworCWNoYXIgKm5hbWU7CisJY2hhciAqbG9uZ19uYW1lOworCisJLyogc291cmNlIChpbnB1dCkgYW5kIHNpbmsgKG91dHB1dCkgd2lkZ2V0cyAqLworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzb3VyY2U7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbms7CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2w7CisKKwkvKiBzdGF0dXMgKi8KKwl1MzIgY29ubmVjdDoxOwkvKiBzb3VyY2UgYW5kIHNpbmsgd2lkZ2V0cyBhcmUgY29ubmVjdGVkICovCisJdTMyIHdhbGtlZDoxOwkvKiBwYXRoIGhhcyBiZWVuIHdhbGtlZCAqLworCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X3NvdXJjZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Rfc2luazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisvKiBkYXBtIHdpZGdldCAqLworc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgeworCWVudW0gc25kX3NvY19kYXBtX3R5cGUgaWQ7CisJY2hhciAqbmFtZTsJCS8qIHdpZGdldCBuYW1lICovCisJY2hhciAqc25hbWU7CS8qIHN0cmVhbSBuYW1lICovCisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCS8qIGRhcG0gY29udHJvbCAqLworCXNob3J0IHJlZzsJCQkJCQkvKiBuZWdhdGl2ZSByZWcgPSBubyBkaXJlY3QgZGFwbSAqLworCXVuc2lnbmVkIGNoYXIgc2hpZnQ7CQkJLyogYml0cyB0byBzaGlmdCAqLworCXVuc2lnbmVkIGludCBzYXZlZF92YWx1ZTsJCS8qIHdpZGdldCBzYXZlZCB2YWx1ZSAqLworCXVuc2lnbmVkIGludCB2YWx1ZTsJCQkJLyogd2lkZ2V0IGN1cnJlbnQgdmFsdWUgKi8KKwl1bnNpZ25lZCBjaGFyIHBvd2VyOjE7CQkJLyogYmxvY2sgcG93ZXIgc3RhdHVzICovCisJdW5zaWduZWQgY2hhciBpbnZlcnQ6MTsJCQkvKiBpbnZlcnQgdGhlIHBvd2VyIGJpdCAqLworCXVuc2lnbmVkIGNoYXIgYWN0aXZlOjE7CQkJLyogYWN0aXZlIHN0cmVhbSBvbiBEQUMsIEFEQydzICovCisJdW5zaWduZWQgY2hhciBjb25uZWN0ZWQ6MTsJCS8qIGNvbm5lY3RlZCBjb2RlYyBwaW4gKi8KKwl1bnNpZ25lZCBjaGFyIG5ldzoxOwkJCS8qIGNuZXcgY29tcGxldGUgKi8KKwl1bnNpZ25lZCBjaGFyIGV4dDoxOwkJCS8qIGhhcyBleHRlcm5hbCB3aWRnZXRzICovCisJdW5zaWduZWQgY2hhciBtdXRlZDoxOwkJCS8qIG11dGVkIGZvciBwb3AgcmVkdWN0aW9uICovCisJdW5zaWduZWQgY2hhciBzdXNwZW5kOjE7CQkvKiB3YXMgYWN0aXZlIGJlZm9yZSBzdXNwZW5kICovCisJdW5zaWduZWQgY2hhciBwbWRvd246MTsJCQkvKiB3YWl0aW5nIGZvciB0aW1lb3V0ICovCisKKwkvKiBleHRlcm5hbCBldmVudHMgKi8KKwl1bnNpZ25lZCBzaG9ydCBldmVudF9mbGFnczsJCS8qIGZsYWdzIHRvIHNwZWNpZnkgZXZlbnQgdHlwZXMgKi8KKwlpbnQgKCpldmVudCkoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQqLCBpbnQpOworCisJLyoga2NvbnRyb2xzIHRoYXQgcmVsYXRlIHRvIHRoaXMgd2lkZ2V0ICovCisJaW50IG51bV9rY29udHJvbHM7CisJY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjb250cm9sczsKKworCS8qIHdpZGdldCBpbnB1dCBhbmQgb3V0cHV0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgc291cmNlczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNpbmtzOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy5oIGIvaW5jbHVkZS9zb3VuZC9zb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRjMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2MuaApAQCAtMCwwICsxLDQ2MSBAQAorLyoKKyAqIGxpbnV4L3NvdW5kL3NvYy5oIC0tIEFMU0EgU29DIExheWVyCisgKgorICogQXV0aG9yOgkJTGlhbSBHaXJkd29vZAorICogQ3JlYXRlZDoJCUF1ZyAxMXRoIDIwMDUKKyAqIENvcHlyaWdodDoJV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzLiBQTEMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfU05EX1NPQ19ICisjZGVmaW5lIF9fTElOVVhfU05EX1NPQ19ICisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorCisjZGVmaW5lIFNORF9TT0NfVkVSU0lPTiAiMC4xMy4wIgorCisvKgorICogQ29udmVuaWVuY2Uga2NvbnRyb2wgYnVpbGRlcnMKKyAqLworI2RlZmluZSBTT0NfU0lOR0xFX1ZBTFVFKHJlZyxzaGlmdCxtYXNrLGludmVydCkgKChyZWcpIHwgKChzaGlmdCkgPDwgOCkgfFwKKwkoKHNoaWZ0KSA8PCAxMikgfCAoKG1hc2spIDw8IDE2KSB8ICgoaW52ZXJ0KSA8PCAyNCkpCisjZGVmaW5lIFNPQ19TSU5HTEVfVkFMVUVfRVhUKHJlZyxtYXNrLGludmVydCkgKChyZWcpIHwgKChtYXNrKSA8PCAxNikgfFwKKwkoKGludmVydCkgPDwgMzEpKQorI2RlZmluZSBTT0NfU0lOR0xFKHhuYW1lLCByZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3LFwKKwkucHV0ID0gc25kX3NvY19wdXRfdm9sc3csIFwKKwkucHJpdmF0ZV92YWx1ZSA9ICBTT0NfU0lOR0xFX1ZBTFVFKHJlZywgc2hpZnQsIG1hc2ssIGludmVydCkgfQorI2RlZmluZSBTT0NfRE9VQkxFKHhuYW1lLCByZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXNrLCBpbnZlcnQpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCisJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIC5nZXQgPSBzbmRfc29jX2dldF92b2xzdywgXAorCS5wdXQgPSBzbmRfc29jX3B1dF92b2xzdywgXAorCS5wcml2YXRlX3ZhbHVlID0gKHJlZykgfCAoKHNoaWZ0X2xlZnQpIDw8IDgpIHwgXAorCQkoKHNoaWZ0X3JpZ2h0KSA8PCAxMikgfCAoKG1hc2spIDw8IDE2KSB8ICgoaW52ZXJ0KSA8PCAyNCkgfQorI2RlZmluZSBTT0NfRE9VQkxFX1IoeG5hbWUsIHJlZ19sZWZ0LCByZWdfcmlnaHQsIHNoaWZ0LCBtYXNrLCBpbnZlcnQpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3XzJyLCBcCisJLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3XzJyLCAucHV0ID0gc25kX3NvY19wdXRfdm9sc3dfMnIsIFwKKwkucHJpdmF0ZV92YWx1ZSA9IChyZWdfbGVmdCkgfCAoKHNoaWZ0KSA8PCA4KSAgfCBcCisJCSgobWFzaykgPDwgMTIpIHwgKChpbnZlcnQpIDw8IDIwKSB8ICgocmVnX3JpZ2h0KSA8PCAyNCkgfQorI2RlZmluZSBTT0NfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4bWFzaywgeHRleHRzKSBcCit7CS5yZWcgPSB4cmVnLCAuc2hpZnRfbCA9IHhzaGlmdF9sLCAuc2hpZnRfciA9IHhzaGlmdF9yLCBcCisJLm1hc2sgPSB4bWFzaywgLnRleHRzID0geHRleHRzIH0KKyNkZWZpbmUgU09DX0VOVU1fU0lOR0xFKHhyZWcsIHhzaGlmdCwgeG1hc2ssIHh0ZXh0cykgXAorCVNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnQsIHhzaGlmdCwgeG1hc2ssIHh0ZXh0cykKKyNkZWZpbmUgU09DX0VOVU1fU0lOR0xFX0VYVCh4bWFzaywgeHRleHRzKSBcCit7CS5tYXNrID0geG1hc2ssIC50ZXh0cyA9IHh0ZXh0cyB9CisjZGVmaW5lIFNPQ19FTlVNKHhuYW1lLCB4ZW51bSkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSxcCisJLmluZm8gPSBzbmRfc29jX2luZm9fZW51bV9kb3VibGUsIFwKKwkuZ2V0ID0gc25kX3NvY19nZXRfZW51bV9kb3VibGUsIC5wdXQgPSBzbmRfc29jX3B1dF9lbnVtX2RvdWJsZSwgXAorCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KKyNkZWZpbmUgU09DX1NJTkdMRV9FWFQoeG5hbWUsIHhyZWcsIHhzaGlmdCwgeG1hc2ssIHhpbnZlcnQsXAorCSB4aGFuZGxlcl9nZXQsIHhoYW5kbGVyX3B1dCkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCisJLmdldCA9IHhoYW5kbGVyX2dldCwgLnB1dCA9IHhoYW5kbGVyX3B1dCwgXAorCS5wcml2YXRlX3ZhbHVlID0gU09DX1NJTkdMRV9WQUxVRSh4cmVnLCB4c2hpZnQsIHhtYXNrLCB4aW52ZXJ0KSB9CisjZGVmaW5lIFNPQ19TSU5HTEVfQk9PTF9FWFQoeG5hbWUsIHhkYXRhLCB4aGFuZGxlcl9nZXQsIHhoYW5kbGVyX3B1dCkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX2Jvb2xfZXh0LCBcCisJLmdldCA9IHhoYW5kbGVyX2dldCwgLnB1dCA9IHhoYW5kbGVyX3B1dCwgXAorCS5wcml2YXRlX3ZhbHVlID0geGRhdGEgfQorI2RlZmluZSBTT0NfRU5VTV9FWFQoeG5hbWUsIHhlbnVtLCB4aGFuZGxlcl9nZXQsIHhoYW5kbGVyX3B1dCkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX2VudW1fZXh0LCBcCisJLmdldCA9IHhoYW5kbGVyX2dldCwgLnB1dCA9IHhoYW5kbGVyX3B1dCwgXAorCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KKworLyoKKyAqIERpZ2l0YWwgQXVkaW8gSW50ZXJmYWNlIChEQUkpIHR5cGVzCisgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlfQUM5NwkweDEKKyNkZWZpbmUgU05EX1NPQ19EQUlfSTJTCQkweDIKKyNkZWZpbmUgU05EX1NPQ19EQUlfUENNCQkweDQKKworLyoKKyAqIERBSSBoYXJkd2FyZSBhdWRpbyBmb3JtYXRzCisgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfSTJTCQkwCS8qIEkyUyBtb2RlICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX1JJR0hUX0oJMQkvKiBSaWdodCBqdXN0aWZpZWQgbW9kZSAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9MRUZUX0oJMgkvKiBMZWZ0IEp1c3RpZmllZCBtb2RlICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0RTUF9BCTMJLyogTCBkYXRhIG1zYiBhZnRlciBGUk0gb3IgTFJDICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0RTUF9CCTQJLyogTCBkYXRhIG1zYiBkdXJpbmcgRlJNIG9yIExSQyAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9BQzk3CQk1CS8qIEFDOTcgKi8KKworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9NU0IgCVNORF9TT0NfREFJRk1UX0xFRlRfSgorI2RlZmluZSBTTkRfU09DX0RBSUZNVF9MU0IJU05EX1NPQ19EQUlGTVRfUklHSFRfSgorCisvKgorICogREFJIEdhdGluZworICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0NPTlQJCQkoMCA8PCA0KQkvKiBjb250aW51b3VzIGNsb2NrICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0dBVEVECQkoMSA8PCA0KQkvKiBjbG9jayBpcyBnYXRlZCB3aGVuIG5vdCBUeC9SeCAqLworCisvKgorICogREFJIGhhcmR3YXJlIHNpZ25hbCBpbnZlcnNpb25zCisgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfTkJfTkYJCSgwIDw8IDgpCS8qIG5vcm1hbCBiaXQgY2xvY2sgKyBmcmFtZSAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9OQl9JRgkJKDEgPDwgOCkJLyogbm9ybWFsIGJjbGsgKyBpbnYgZnJtICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0lCX05GCQkoMiA8PCA4KQkvKiBpbnZlcnQgYmNsayArIG5vciBmcm0gKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfSUJfSUYJCSgzIDw8IDgpCS8qIGludmVydCBiY2xrICsgZnJtICovCisKKy8qCisgKiBEQUkgaGFyZHdhcmUgY2xvY2sgbWFzdGVycworICogVGhpcyBpcyB3cnQgdGhlIGNvZGVjLCB0aGUgaW52ZXJzZSBpcyB0cnVlIGZvciB0aGUgaW50ZXJmYWNlCisgKiBpLmUuIGlmIHRoZSBjb2RlYyBpcyBjbGsgYW5kIGZybSBtYXN0ZXIgdGhlbiB0aGUgaW50ZXJmYWNlIGlzCisgKiBjbGsgYW5kIGZyYW1lIHNsYXZlLgorICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0NCTV9DRk0JKDAgPDwgMTIpIC8qIGNvZGVjIGNsayAmIGZybSBtYXN0ZXIgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfQ0JTX0NGTQkoMSA8PCAxMikgLyogY29kZWMgY2xrIHNsYXZlICYgZnJtIG1hc3RlciAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZTCSgyIDw8IDEyKSAvKiBjb2RlYyBjbGsgbWFzdGVyICYgZnJhbWUgc2xhdmUgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUwkoMyA8PCAxMikgLyogY29kZWMgY2xrICYgZnJtIHNsYXZlICovCisKKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0sJCTB4MDAwZgorI2RlZmluZSBTTkRfU09DX0RBSUZNVF9DTE9DS19NQVNLCQkweDAwZjAKKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfSU5WX01BU0sJCQkweDBmMDAKKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0sJCTB4ZjAwMAorCisKKy8qCisgKiBNYXN0ZXIgQ2xvY2sgRGlyZWN0aW9ucworICovCisjZGVmaW5lIFNORF9TT0NfQ0xPQ0tfSU4JMAorI2RlZmluZSBTTkRfU09DX0NMT0NLX09VVAkxCisKKy8qCisgKiBBQzk3IGNvZGVjIElEJ3MgYml0bWFzaworICovCisjZGVmaW5lIFNORF9TT0NfREFJX0FDOTdfSUQwCSgxIDw8IDApCisjZGVmaW5lIFNORF9TT0NfREFJX0FDOTdfSUQxCSgxIDw8IDEpCisjZGVmaW5lIFNORF9TT0NfREFJX0FDOTdfSUQyCSgxIDw8IDIpCisjZGVmaW5lIFNORF9TT0NfREFJX0FDOTdfSUQzCSgxIDw8IDMpCisKK3N0cnVjdCBzbmRfc29jX2RldmljZTsKK3N0cnVjdCBzbmRfc29jX3BjbV9zdHJlYW07CitzdHJ1Y3Qgc25kX3NvY19vcHM7CitzdHJ1Y3Qgc25kX3NvY19kYWlfbW9kZTsKK3N0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lOworc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpOworc3RydWN0IHNuZF9zb2NfY3B1X2RhaTsKK3N0cnVjdCBzbmRfc29jX2NvZGVjOworc3RydWN0IHNuZF9zb2NfbWFjaGluZV9jb25maWc7CitzdHJ1Y3Qgc29jX2VudW07CitzdHJ1Y3Qgc25kX3NvY19hYzk3X29wczsKK3N0cnVjdCBzbmRfc29jX2Nsb2NrX2luZm87CisKK3R5cGVkZWYgaW50ICgqaHdfd3JpdGVfdCkodm9pZCAqLGNvbnN0IGNoYXIqICxpbnQpOwordHlwZWRlZiBpbnQgKCpod19yZWFkX3QpKHZvaWQgKixjaGFyKiAsaW50KTsKKworZXh0ZXJuIHN0cnVjdCBzbmRfYWM5N19idXNfb3BzIHNvY19hYzk3X29wczsKKworLyogcGNtIDwtPiBEQUkgY29ubmVjdCAqLwordm9pZCBzbmRfc29jX2ZyZWVfcGNtcyhzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2Rldik7CitpbnQgc25kX3NvY19uZXdfcGNtcyhzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiwgaW50IGlkeCwgY29uc3QgY2hhciAqeGlkKTsKK2ludCBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYpOworCisvKiBzZXQgcnVudGltZSBodyBwYXJhbXMgKi8KK2ludCBzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCWNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlICpodyk7CisKKy8qIGNvZGVjIElPICovCisjZGVmaW5lIHNuZF9zb2NfcmVhZChjb2RlYywgcmVnKSBjb2RlYy0+cmVhZChjb2RlYywgcmVnKQorI2RlZmluZSBzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlKSBjb2RlYy0+d3JpdGUoY29kZWMsIHJlZywgdmFsdWUpCisKKy8qIGNvZGVjIHJlZ2lzdGVyIGJpdCBhY2Nlc3MgKi8KK2ludCBzbmRfc29jX3VwZGF0ZV9iaXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCXVuc2lnbmVkIHNob3J0IG1hc2ssIHVuc2lnbmVkIHNob3J0IHZhbHVlKTsKK2ludCBzbmRfc29jX3Rlc3RfYml0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIHNob3J0IHJlZywKKwkJCQl1bnNpZ25lZCBzaG9ydCBtYXNrLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSk7CisKK2ludCBzbmRfc29jX25ld19hYzk3X2NvZGVjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwlzdHJ1Y3Qgc25kX2FjOTdfYnVzX29wcyAqb3BzLCBpbnQgbnVtKTsKK3ZvaWQgc25kX3NvY19mcmVlX2FjOTdfY29kZWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKKworLyoKKyAqQ29udHJvbHMKKyAqLworc3RydWN0IHNuZF9rY29udHJvbCAqc25kX3NvY19jbmV3KGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpfdGVtcGxhdGUsCisJdm9pZCAqZGF0YSwgY2hhciAqbG9uZ19uYW1lKTsKK2ludCBzbmRfc29jX2luZm9fZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7CitpbnQgc25kX3NvY19pbmZvX2VudW1fZXh0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOworaW50IHNuZF9zb2NfZ2V0X2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK2ludCBzbmRfc29jX3B1dF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19pbmZvX3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOworaW50IHNuZF9zb2NfaW5mb192b2xzd19leHQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7CitpbnQgc25kX3NvY19pbmZvX2Jvb2xfZXh0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOworaW50IHNuZF9zb2NfZ2V0X3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK2ludCBzbmRfc29jX3B1dF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19pbmZvX3ZvbHN3XzJyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOworaW50IHNuZF9zb2NfZ2V0X3ZvbHN3XzJyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK2ludCBzbmRfc29jX3B1dF92b2xzd18ycihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CisKKy8qIFNvQyBQQ00gc3RyZWFtIGluZm9ybWF0aW9uICovCitzdHJ1Y3Qgc25kX3NvY19wY21fc3RyZWFtIHsKKwljaGFyICpzdHJlYW1fbmFtZTsKKwl1NjQgZm9ybWF0czsJCQkvKiBTTkRSVl9QQ01fRk1UQklUXyogKi8KKwl1bnNpZ25lZCBpbnQgcmF0ZXM7CQkvKiBTTkRSVl9QQ01fUkFURV8qICovCisJdW5zaWduZWQgaW50IHJhdGVfbWluOwkJLyogbWluIHJhdGUgKi8KKwl1bnNpZ25lZCBpbnQgcmF0ZV9tYXg7CQkvKiBtYXggcmF0ZSAqLworCXVuc2lnbmVkIGludCBjaGFubmVsc19taW47CS8qIG1pbiBjaGFubmVscyAqLworCXVuc2lnbmVkIGludCBjaGFubmVsc19tYXg7CS8qIG1heCBjaGFubmVscyAqLworCXVuc2lnbmVkIGludCBhY3RpdmU6MTsJCS8qIHN0cmVhbSBpcyBpbiB1c2UgKi8KK307CisKKy8qIFNvQyBhdWRpbyBvcHMgKi8KK3N0cnVjdCBzbmRfc29jX29wcyB7CisJaW50ICgqc3RhcnR1cCkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopOworCXZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopOworCWludCAoKmh3X3BhcmFtcykoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICosIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqKTsKKwlpbnQgKCpod19mcmVlKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKik7CisJaW50ICgqcHJlcGFyZSkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopOworCWludCAoKnRyaWdnZXIpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqLCBpbnQpOworfTsKKworLyogQVNvQyBjb2RlYyBEQUkgb3BzICovCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19vcHMgeworCS8qIGNvZGVjIERBSSBjbG9ja2luZyBjb25maWd1cmF0aW9uICovCisJaW50ICgqc2V0X3N5c2Nsaykoc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWksCisJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKTsKKwlpbnQgKCpzZXRfcGxsKShzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSwKKwkJaW50IHBsbF9pZCwgdW5zaWduZWQgaW50IGZyZXFfaW4sIHVuc2lnbmVkIGludCBmcmVxX291dCk7CisJaW50ICgqc2V0X2Nsa2Rpdikoc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWksCisJCWludCBkaXZfaWQsIGludCBkaXYpOworCisJLyogQ1BVIERBSSBmb3JtYXQgY29uZmlndXJhdGlvbiAqLworCWludCAoKnNldF9mbXQpKHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KTsKKwlpbnQgKCpzZXRfdGRtX3Nsb3QpKHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpLAorCQl1bnNpZ25lZCBpbnQgbWFzaywgaW50IHNsb3RzKTsKKwlpbnQgKCpzZXRfdHJpc3RhdGUpKHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqLCBpbnQgdHJpc3RhdGUpOworCisJLyogZGlnaXRhbCBtdXRlICovCisJaW50ICgqZGlnaXRhbF9tdXRlKShzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKiwgaW50IG11dGUpOworfTsKKworLyogQVNvQyBjcHUgREFJIG9wcyAqLworc3RydWN0IHNuZF9zb2NfY3B1X29wcyB7CisJLyogQ1BVIERBSSBjbG9ja2luZyBjb25maWd1cmF0aW9uICovCisJaW50ICgqc2V0X3N5c2Nsaykoc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSwKKwkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpOworCWludCAoKnNldF9jbGtkaXYpKHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWksCisJCWludCBkaXZfaWQsIGludCBkaXYpOworCWludCAoKnNldF9wbGwpKHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWksCisJCWludCBwbGxfaWQsIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpOworCisJLyogQ1BVIERBSSBmb3JtYXQgY29uZmlndXJhdGlvbiAqLworCWludCAoKnNldF9mbXQpKHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWksCisJCXVuc2lnbmVkIGludCBmbXQpOworCWludCAoKnNldF90ZG1fc2xvdCkoc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSwKKwkJdW5zaWduZWQgaW50IG1hc2ssIGludCBzbG90cyk7CisJaW50ICgqc2V0X3RyaXN0YXRlKShzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICosIGludCB0cmlzdGF0ZSk7Cit9OworCisvKiBTb0MgQ29kZWMgREFJICovCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgeworCWNoYXIgKm5hbWU7CisJaW50IGlkOworCisJLyogREFJIGNhcGFiaWxpdGllcyAqLworCXN0cnVjdCBzbmRfc29jX3BjbV9zdHJlYW0gcGxheWJhY2s7CisJc3RydWN0IHNuZF9zb2NfcGNtX3N0cmVhbSBjYXB0dXJlOworCisJLyogREFJIHJ1bnRpbWUgaW5mbyAqLworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwl1bnNpZ25lZCBpbnQgYWN0aXZlOworCXVuc2lnbmVkIGNoYXIgcG9wX3dhaXQ6MTsKKworCS8qIG9wcyAqLworCXN0cnVjdCBzbmRfc29jX29wcyBvcHM7CisJc3RydWN0IHNuZF9zb2NfY29kZWNfb3BzIGRhaV9vcHM7CisKKwkvKiBEQUkgcHJpdmF0ZSBkYXRhICovCisJdm9pZCAqcHJpdmF0ZV9kYXRhOworfTsKKworLyogU29DIENQVSBEQUkgKi8KK3N0cnVjdCBzbmRfc29jX2NwdV9kYWkgeworCisJLyogREFJIGRlc2NyaXB0aW9uICovCisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJdW5zaWduZWQgY2hhciB0eXBlOworCisJLyogREFJIGNhbGxiYWNrcyAqLworCWludCAoKnByb2JlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpKTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkpOworCisJLyogb3BzICovCisJc3RydWN0IHNuZF9zb2Nfb3BzIG9wczsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfb3BzIGRhaV9vcHM7CisKKwkvKiBEQUkgY2FwYWJpbGl0aWVzICovCisJc3RydWN0IHNuZF9zb2NfcGNtX3N0cmVhbSBjYXB0dXJlOworCXN0cnVjdCBzbmRfc29jX3BjbV9zdHJlYW0gcGxheWJhY2s7CisKKwkvKiBEQUkgcnVudGltZSBpbmZvICovCisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKKwl1bnNpZ25lZCBjaGFyIGFjdGl2ZToxOworCXZvaWQgKmRtYV9kYXRhOworCisJLyogREFJIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKnByaXZhdGVfZGF0YTsKK307CisKKy8qIFNvQyBBdWRpbyBDb2RlYyAqLworc3RydWN0IHNuZF9zb2NfY29kZWMgeworCWNoYXIgKm5hbWU7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJc3RydWN0IG11dGV4IG11dGV4OworCisJLyogY2FsbGJhY2tzICovCisJaW50ICgqZGFwbV9ldmVudCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZXZlbnQpOworCisJLyogcnVudGltZSAqLworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTc7ICAvKiBmb3IgYWQtaG9jIGFjOTcgZGV2aWNlcyAqLworCXVuc2lnbmVkIGludCBhY3RpdmU7CisJdW5zaWduZWQgaW50IHBjbV9kZXZzOworCXZvaWQgKnByaXZhdGVfZGF0YTsKKworCS8qIGNvZGVjIElPICovCisJdm9pZCAqY29udHJvbF9kYXRhOyAvKiBjb2RlYyBjb250cm9sIChpMmMvM3dpcmUpIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQgKCpyZWFkKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCB1bnNpZ25lZCBpbnQpOworCWludCAoKndyaXRlKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CisJaHdfd3JpdGVfdCBod193cml0ZTsKKwlod19yZWFkX3QgaHdfcmVhZDsKKwl2b2lkICpyZWdfY2FjaGU7CisJc2hvcnQgcmVnX2NhY2hlX3NpemU7CisJc2hvcnQgcmVnX2NhY2hlX3N0ZXA7CisKKwkvKiBkYXBtICovCisJc3RydWN0IGxpc3RfaGVhZCBkYXBtX3dpZGdldHM7CisJc3RydWN0IGxpc3RfaGVhZCBkYXBtX3BhdGhzOworCXVuc2lnbmVkIGludCBkYXBtX3N0YXRlOworCXVuc2lnbmVkIGludCBzdXNwZW5kX2RhcG1fc3RhdGU7CisJc3RydWN0IGRlbGF5ZWRfd29yayBkZWxheWVkX3dvcms7CisKKwkvKiBjb2RlYyBEQUkncyAqLworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqZGFpOworCXVuc2lnbmVkIGludCBudW1fZGFpOworfTsKKworLyogY29kZWMgZGV2aWNlICovCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2UgeworCWludCAoKnByb2JlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwlpbnQgKCpyZW1vdmUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCWludCAoKnN1c3BlbmQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICgqcmVzdW1lKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKK307CisKKy8qIFNvQyBwbGF0Zm9ybSBpbnRlcmZhY2UgKi8KK3N0cnVjdCBzbmRfc29jX3BsYXRmb3JtIHsKKwljaGFyICpuYW1lOworCisJaW50ICgqcHJvYmUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCWludCAoKnJlbW92ZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJaW50ICgqc3VzcGVuZCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSk7CisJaW50ICgqcmVzdW1lKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpKTsKKworCS8qIHBjbSBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KKwlpbnQgKCpwY21fbmV3KShzdHJ1Y3Qgc25kX2NhcmQgKiwgc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICosCisJCXN0cnVjdCBzbmRfcGNtICopOworCXZvaWQgKCpwY21fZnJlZSkoc3RydWN0IHNuZF9wY20gKik7CisKKwkvKiBwbGF0Zm9ybSBzdHJlYW0gb3BzICovCisJc3RydWN0IHNuZF9wY21fb3BzICpwY21fb3BzOworfTsKKworLyogU29DIG1hY2hpbmUgREFJIGNvbmZpZ3VyYXRpb24sIGdsdWVzIGEgY29kZWMgYW5kIGNwdSBEQUkgdG9nZXRoZXIgKi8KK3N0cnVjdCBzbmRfc29jX2RhaV9saW5rICB7CisJY2hhciAqbmFtZTsJCQkvKiBDb2RlYyBuYW1lICovCisJY2hhciAqc3RyZWFtX25hbWU7CQkvKiBTdHJlYW0gbmFtZSAqLworCisJLyogREFJICovCisJc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaTsKKworCS8qIG1hY2hpbmUgc3RyZWFtIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3Qgc25kX3NvY19vcHMgKm9wczsKKworCS8qIGNvZGVjL21hY2hpbmUgc3BlY2lmaWMgaW5pdCAtIGUuZy4gYWRkIG1hY2hpbmUgY29udHJvbHMgKi8KKwlpbnQgKCppbml0KShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworfTsKKworLyogU29DIG1hY2hpbmUgKi8KK3N0cnVjdCBzbmRfc29jX21hY2hpbmUgeworCWNoYXIgKm5hbWU7CisKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKworCS8qIHRoZSBwcmUgYW5kIHBvc3QgUE0gZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGRvIGFueSBQTSB3b3JrIGJlZm9yZSBhbmQKKwkgKiBhZnRlciB0aGUgY29kZWMgYW5kIERBSSdzIGRvIGFueSBQTSB3b3JrLiAqLworCWludCAoKnN1c3BlbmRfcHJlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludCAoKnN1c3BlbmRfcG9zdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpyZXN1bWVfcHJlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwlpbnQgKCpyZXN1bWVfcG9zdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisKKwkvKiBDUFUgPC0tPiBDb2RlYyBEQUkgbGlua3MgICovCisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOworCWludCBudW1fbGlua3M7Cit9OworCisvKiBTb0MgRGV2aWNlIC0gdGhlIGF1ZGlvIHN1YnN5c3RlbSAqLworc3RydWN0IHNuZF9zb2NfZGV2aWNlIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHNuZF9zb2NfbWFjaGluZSAqbWFjaGluZTsKKwlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm07CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSAqY29kZWNfZGV2OworCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF93b3JrOworCXZvaWQgKmNvZGVjX2RhdGE7Cit9OworCisvKiBydW50aW1lIGNoYW5uZWwgZGF0YSAqLworc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgeworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWk7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXY7Cit9OworCisvKiBlbnVtZXJhdGVkIGtjb250cm9sICovCitzdHJ1Y3Qgc29jX2VudW0geworCXVuc2lnbmVkIHNob3J0IHJlZzsKKwl1bnNpZ25lZCBzaG9ydCByZWcyOworCXVuc2lnbmVkIGNoYXIgc2hpZnRfbDsKKwl1bnNpZ25lZCBjaGFyIHNoaWZ0X3I7CisJdW5zaWduZWQgaW50IG1hc2s7CisJY29uc3QgY2hhciAqKnRleHRzOworCXZvaWQgKmRhcG07Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvdHlwZWRlZnMuaCBiL2luY2x1ZGUvc291bmQvdHlwZWRlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1NGIwMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3NvdW5kL3R5cGVkZWZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoKLSAqIFR5cGVkZWYncyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAoZm9yIG91dC1vZi1rZXJuZWwgZHJpdmVycykKLSAqCi0gKiBUaGlzIGZpbGUgd2lsbCBiZSByZW1vdmVkIHNvb24gaW4gZnV0dXJlCi0gKi8KLQotLyogY29yZSBzdHVmZiAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2NhcmQgc25kX2NhcmRfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9kZXZpY2Ugc25kX2RldmljZV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgc25kX2RldmljZV9vcHNfdDsKLXR5cGVkZWYgZW51bSBzbmRfY2FyZF90eXBlIHNuZF9jYXJkX3R5cGVfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9taW5vciBzbmRfbWlub3JfdDsKLQotLyogaW5mbyAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2luZm9fZW50cnkgc25kX2luZm9fZW50cnlfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciBzbmRfaW5mb19idWZmZXJfdDsKLQotLyogY29udHJvbCAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2N0bF9maWxlIHNuZF9jdGxfZmlsZV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2tjb250cm9sIHNuZF9rY29udHJvbF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfa2NvbnRyb2xfbmV3X3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfa2NvbnRyb2xfdm9sYXRpbGUgc25kX2tjb250cm9sX3ZvbGF0aWxlX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfa2N0bF9ldmVudCBzbmRfa2N0bF9ldmVudF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2Flc19pZWM5NTggc25kX2Flc19pZWM5NThfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9jdGxfY2FyZF9pbmZvIHNuZF9jdGxfY2FyZF9pbmZvX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfY3RsX2VsZW1faWQgc25kX2N0bF9lbGVtX2lkX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfY3RsX2VsZW1fbGlzdCBzbmRfY3RsX2VsZW1fbGlzdF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gc25kX2N0bF9lbGVtX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSBzbmRfY3RsX2VsZW1fdmFsdWVfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9jdGxfZXZlbnQgc25kX2N0bF9ldmVudF90OwotI2lmIGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1NfTU9EVUxFKQotdHlwZWRlZiBzdHJ1Y3Qgc25kX21peGVyX29zcyBzbmRfbWl4ZXJfb3NzX3Q7Ci0jZW5kaWYKLQotLyogdGltZXIgKi8KLXR5cGVkZWYgc3RydWN0IHNuZF90aW1lciBzbmRfdGltZXJfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSBzbmRfdGltZXJfaW5zdGFuY2VfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF90aW1lcl9pZCBzbmRfdGltZXJfaWRfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF90aW1lcl9naW5mbyBzbmRfdGltZXJfZ2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHNuZF90aW1lcl9ncGFyYW1zIHNuZF90aW1lcl9ncGFyYW1zX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfdGltZXJfZ3N0YXR1cyBzbmRfdGltZXJfZ3N0YXR1c190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3RpbWVyX3NlbGVjdCBzbmRfdGltZXJfc2VsZWN0X3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfdGltZXJfaW5mbyBzbmRfdGltZXJfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3RpbWVyX3BhcmFtcyBzbmRfdGltZXJfcGFyYW1zX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfdGltZXJfc3RhdHVzIHNuZF90aW1lcl9zdGF0dXNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF90aW1lcl9yZWFkIHNuZF90aW1lcl9yZWFkX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfdGltZXJfdHJlYWQgc25kX3RpbWVyX3RyZWFkX3Q7Ci0KLS8qIFBDTSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbSBzbmRfcGNtX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcGNtX3N0ciBzbmRfcGNtX3N0cl90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gc25kX3BjbV9zdWJzdHJlYW1fdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21faW5mbyBzbmRfcGNtX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zIHNuZF9wY21faHdfcGFyYW1zX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcGNtX3N3X3BhcmFtcyBzbmRfcGNtX3N3X3BhcmFtc190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9jaGFubmVsX2luZm8gc25kX3BjbV9jaGFubmVsX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21fc3RhdHVzIHNuZF9wY21fc3RhdHVzX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcGNtX21tYXBfc3RhdHVzIHNuZF9wY21fbW1hcF9zdGF0dXNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21fbW1hcF9jb250cm9sIHNuZF9wY21fbW1hcF9jb250cm9sX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfbWFzayBzbmRfbWFza190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NnX2J1ZiBzbmRfcGNtX3NnYnVmX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHNuZF9pbnRlcnZhbCBzbmRfaW50ZXJ2YWxfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF94ZmVyaSBzbmRfeGZlcmlfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF94ZmVybiBzbmRfeGZlcm5fdDsKLXR5cGVkZWYgc3RydWN0IHNuZF94ZmVydiBzbmRfeGZlcnZfdDsKLQotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9maWxlIHNuZF9wY21fZmlsZV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lIHNuZF9wY21fcnVudGltZV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfcGNtX2hhcmR3YXJlX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcGNtX29wc190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9od19ydWxlIHNuZF9wY21faHdfcnVsZV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50cyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRzX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcmF0bnVtIHJhdG51bV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3JhdGRlbiByYXRkZW5fdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9yYXRudW1zIHNuZF9wY21faHdfY29uc3RyYWludF9yYXRudW1zX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcmF0ZGVucyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcmF0ZGVuc190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3RfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21fZ3JvdXAgc25kX3BjbV9ncm91cF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9ub3RpZnkgc25kX3BjbV9ub3RpZnlfdDsKLQotLyogcmF3bWlkaSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3Jhd21pZGkgc25kX3Jhd21pZGlfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9yYXdtaWRpX2luZm8gc25kX3Jhd21pZGlfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3Jhd21pZGlfcGFyYW1zIHNuZF9yYXdtaWRpX3BhcmFtc190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3Jhd21pZGlfc3RhdHVzIHNuZF9yYXdtaWRpX3N0YXR1c190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3Jhd21pZGlfcnVudGltZSBzbmRfcmF3bWlkaV9ydW50aW1lX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gc25kX3Jhd21pZGlfc3Vic3RyZWFtX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcmF3bWlkaV9zdHIgc25kX3Jhd21pZGlfc3RyX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcmF3bWlkaV9vcHMgc25kX3Jhd21pZGlfb3BzX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcmF3bWlkaV9nbG9iYWxfb3BzIHNuZF9yYXdtaWRpX2dsb2JhbF9vcHNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9yYXdtaWRpX2ZpbGUgc25kX3Jhd21pZGlfZmlsZV90OwotCi0vKiBod2RlcCAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2h3ZGVwIHNuZF9od2RlcF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2h3ZGVwX2luZm8gc25kX2h3ZGVwX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9od2RlcF9kc3Bfc3RhdHVzIHNuZF9od2RlcF9kc3Bfc3RhdHVzX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfaHdkZXBfZHNwX2ltYWdlIHNuZF9od2RlcF9kc3BfaW1hZ2VfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9od2RlcF9vcHMgc25kX2h3ZGVwX29wc190OwotCi0vKiBzZXF1ZW5jZXIgKi8KLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvIHNuZF9zZXFfcG9ydF9pbmZvX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZlbnQgc25kX3NlcV9ldmVudF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9hZGRyIHNuZF9zZXFfYWRkcl90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9ldl92b2x1bWUgc25kX3NlcV9ldl92b2x1bWVfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZfbG9vcCBzbmRfc2VxX2V2X2xvb3BfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfcmVtb3ZlX2V2ZW50cyBzbmRfc2VxX3JlbW92ZV9ldmVudHNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfcXVlcnlfc3VicyBzbmRfc2VxX3F1ZXJ5X3N1YnNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfc3lzdGVtX2luZm8gc25kX3NlcV9zeXN0ZW1faW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfaW5mbyBzbmRfc2VxX2NsaWVudF9pbmZvX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8gc25kX3NlcV9xdWV1ZV9pbmZvX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX3N0YXR1cyBzbmRfc2VxX3F1ZXVlX3N0YXR1c190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90ZW1wbyBzbmRfc2VxX3F1ZXVlX3RlbXBvX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX293bmVyIHNuZF9zZXFfcXVldWVfb3duZXJfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfcXVldWVfdGltZXIgc25kX3NlcV9xdWV1ZV90aW1lcl90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9jbGllbnQgc25kX3NlcV9xdWV1ZV9jbGllbnRfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfY2xpZW50X3Bvb2wgc25kX3NlcV9jbGllbnRfcG9vbF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9pbnN0ciBzbmRfc2VxX2luc3RyX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2luc3RyX2RhdGEgc25kX3NlcV9pbnN0cl9kYXRhX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2luc3RyX2hlYWRlciBzbmRfc2VxX2luc3RyX2hlYWRlcl90OwotCi10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3VzZXJfY2xpZW50IHVzZXJfY2xpZW50X3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2tlcm5lbF9jbGllbnQga2VybmVsX2NsaWVudF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgY2xpZW50X3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3F1ZXVlIHF1ZXVlX3Q7Ci0KLS8qIHNlcV9kZXZpY2UgKi8KLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfZGV2aWNlIHNuZF9zZXFfZGV2aWNlX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2Rldl9vcHMgc25kX3NlcV9kZXZfb3BzX3Q7Ci0KLS8qIHNlcV9taWRpICovCi10eXBlZGVmIHN0cnVjdCBzbmRfbWlkaV9ldmVudCBzbmRfbWlkaV9ldmVudF90OwotCi0vKiBzZXFfbWlkaV9lbXVsICovCi10eXBlZGVmIHN0cnVjdCBzbmRfbWlkaV9jaGFubmVsIHNuZF9taWRpX2NoYW5uZWxfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9taWRpX2NoYW5uZWxfc2V0IHNuZF9taWRpX2NoYW5uZWxfc2V0X3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfbWlkaV9vcCBzbmRfbWlkaV9vcF90OwotCi0vKiBzZXFfb3NzICovCi10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX29zc19hcmcgc25kX3NlcV9vc3NfYXJnX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX29zc19jYWxsYmFjayBzbmRfc2VxX29zc19jYWxsYmFja190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9vc3NfcmVnIHNuZF9zZXFfb3NzX3JlZ190OwotCi0vKiB2aXJtaWRpICovCi10eXBlZGVmIHN0cnVjdCBzbmRfdmlybWlkaV9kZXYgc25kX3Zpcm1pZGlfZGV2X3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfdmlybWlkaSBzbmRfdmlybWlkaV90OwotCi0vKiBzZXFfaW5zdHIgKi8KLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfa2NsdXN0ZXIgc25kX3NlcV9rY2x1c3Rlcl90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9raW5zdHJfb3BzIHNuZF9zZXFfa2luc3RyX29wc190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9raW5zdHIgc25kX3NlcV9raW5zdHJfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfa2luc3RyX2xpc3Qgc25kX3NlcV9raW5zdHJfbGlzdF90OwotCi0vKiBhYzk3ICovCi10eXBlZGVmIHN0cnVjdCBzbmRfYWM5N19idXMgYWM5N19idXNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgYWM5N19idXNfb3BzX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfYWM5N190ZW1wbGF0ZSBhYzk3X3RlbXBsYXRlX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfYWM5NyBhYzk3X3Q7Ci0KLS8qIG9wbDMvNCAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX29wbDMgb3BsM190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX29wbDQgb3BsNF90OwotCi0vKiBtcHU0MDEgKi8KLXR5cGVkZWYgc3RydWN0IHNuZF9tcHU0MDEgbXB1NDAxX3Q7Ci0KLS8qIGkyYyAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2kyY19kZXZpY2Ugc25kX2kyY19kZXZpY2VfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9pMmNfYnVzIHNuZF9pMmNfYnVzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHNuZF9hazQ1MzEgYWs0NTMxX3Q7Ci0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oIGIvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmgKaW5kZXggMjBmN2JhYi4uYzM5YjM4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmgKKysrIGIvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmgKQEAgLTEsMyArMSwzIEBACiAvKiBpbmNsdWRlL3ZlcnNpb24uaC4gIEdlbmVyYXRlZCBieSBhbHNhL2tzeW5jIHNjcmlwdC4gICovCi0jZGVmaW5lIENPTkZJR19TTkRfVkVSU0lPTiAiMS4wLjE0cmMxIgotI2RlZmluZSBDT05GSUdfU05EX0RBVEUgIiAoVHVlIEphbiAwOSAwOTo1NjoxNyAyMDA3IFVUQykiCisjZGVmaW5lIENPTkZJR19TTkRfVkVSU0lPTiAiMS4wLjE0cmMyIgorI2RlZmluZSBDT05GSUdfU05EX0RBVEUgIiAoRnJpIEZlYiAwOSAxMzo1MDoxMCAyMDA3IFVUQykiCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3Z4X2NvcmUuaCBiL2luY2x1ZGUvc291bmQvdnhfY29yZS5oCmluZGV4IDIxNzM5NDYuLjQ4MzA2NTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvdnhfY29yZS5oCisrKyBiL2luY2x1ZGUvc291bmQvdnhfY29yZS5oCkBAIC0xMjgsNyArMTI4LDcgQEAKIAl1bnNpZ25lZCBpbnQgbnVtX2luczsKIAl1bnNpZ25lZCBpbnQgbnVtX291dHM7CiAJdW5zaWduZWQgaW50IG91dHB1dF9sZXZlbF9tYXg7Ci0JdW5zaWduZWQgaW50ICpvdXRwdXRfbGV2ZWxfZGJfc2NhbGU7CisJY29uc3QgdW5zaWduZWQgaW50ICpvdXRwdXRfbGV2ZWxfZGJfc2NhbGU7CiB9OwogCiAvKiBod2RlcCBpZCBzdHJpbmcgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQveW1mcGNpLmggYi9pbmNsdWRlL3NvdW5kL3ltZnBjaS5oCmluZGV4IGYzNTE0ZWUuLjIwM2QyYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQveW1mcGNpLmgKKysrIGIvaW5jbHVkZS9zb3VuZC95bWZwY2kuaApAQCAtMjcwLDYgKzI3MCw3IEBACiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJc3RydWN0IHNuZF95bWZwY2lfdm9pY2UgKnZvaWNlc1syXTsJLyogcGxheWJhY2sgb25seSAqLwogCXVuc2lnbmVkIGludCBydW5uaW5nOiAxLAorCQkgICAgIHVzZV80NDFfc2xvdDogMSwKIAkgICAgICAgICAgICAgb3V0cHV0X2Zyb250OiAxLAogCSAgICAgICAgICAgICBvdXRwdXRfcmVhcjogMSwKIAkgICAgICAgICAgICAgc3dhcF9yZWFyOiAxOwpAQCAtMzI0LDYgKzMyNSw3IEBACiAKIAl1MzIgYWN0aXZlX2Jhbms7CiAJc3RydWN0IHNuZF95bWZwY2lfdm9pY2Ugdm9pY2VzWzY0XTsKKwlpbnQgc3JjNDQxX3VzZWQ7CiAKIAlzdHJ1Y3Qgc25kX2FjOTdfYnVzICphYzk3X2J1czsKIAlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTc7CkBAIC0zNDYsNyArMzQ4LDcgQEAKIAlpbnQgbW9kZV9kdXA0Y2g7CiAJaW50IHJlYXJfb3BlbmVkOwogCWludCBzcGRpZl9vcGVuZWQ7Ci0Jc3RydWN0IHsKKwlzdHJ1Y3Qgc25kX3ltZnBjaV9wY21fbWl4ZXIgewogCQl1MTYgbGVmdDsKIAkJdTE2IHJpZ2h0OwogCQlzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGw7CkBAIC0zNTcsNiArMzU5LDggQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBpbnRlcnJ1cHRfc2xlZXA7CiAJYXRvbWljX3QgaW50ZXJydXB0X3NsZWVwX2NvdW50OwogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqcHJvY19lbnRyeTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmRzcF9taWNyb2NvZGU7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpjb250cm9sbGVyX21pY3JvY29kZTsKIAogI2lmZGVmIENPTkZJR19QTQogCXUzMiAqc2F2ZWRfcmVnczsKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCA4MzMyYzc3Li5mMzBlZjI4IDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC02MDYsMjYgKzYwNiw2IEBACiBFWFBPUlRfU1lNQk9MKGZpbmRfZ2V0X3BhZ2UpOwogCiAvKioKLSAqIGZpbmRfdHJ5bG9ja19wYWdlIC0gZmluZCBhbmQgbG9jayBhIHBhZ2UKLSAqIEBtYXBwaW5nOiB0aGUgYWRkcmVzc19zcGFjZSB0byBzZWFyY2gKLSAqIEBvZmZzZXQ6IHRoZSBwYWdlIGluZGV4Ci0gKgotICogU2FtZSBhcyBmaW5kX2dldF9wYWdlKCksIGJ1dCB0cnlsb2NrIGl0IGluc3RlYWQgb2YgaW5jcmVtZW50aW5nIHRoZSBjb3VudC4KLSAqLwotc3RydWN0IHBhZ2UgKmZpbmRfdHJ5bG9ja19wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQotCXJlYWRfbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7Ci0JcGFnZSA9IHJhZGl4X3RyZWVfbG9va3VwKCZtYXBwaW5nLT5wYWdlX3RyZWUsIG9mZnNldCk7Ci0JaWYgKHBhZ2UgJiYgVGVzdFNldFBhZ2VMb2NrZWQocGFnZSkpCi0JCXBhZ2UgPSBOVUxMOwotCXJlYWRfdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKLQlyZXR1cm4gcGFnZTsKLX0KLUVYUE9SVF9TWU1CT0woZmluZF90cnlsb2NrX3BhZ2UpOwotCi0vKioKICAqIGZpbmRfbG9ja19wYWdlIC0gbG9jYXRlLCBwaW4gYW5kIGxvY2sgYSBwYWdlY2FjaGUgcGFnZQogICogQG1hcHBpbmc6IHRoZSBhZGRyZXNzX3NwYWNlIHRvIHNlYXJjaAogICogQG9mZnNldDogdGhlIHBhZ2UgaW5kZXgKZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuYwppbmRleCBjYjM2MmY3Li4zNmRiMDEyIDEwMDY0NAotLS0gYS9tbS9odWdldGxiLmMKKysrIGIvbW0vaHVnZXRsYi5jCkBAIC0zODksNiArMzg5LDggQEAKIAkJCWNvbnRpbnVlOwogCiAJCXBhZ2UgPSBwdGVfcGFnZShwdGUpOworCQlpZiAocHRlX2RpcnR5KHB0ZSkpCisJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKIAkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJnBhZ2VfbGlzdCk7CiAJfQogCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKZGlmZiAtLWdpdCBhL21tL21tYXAuYyBiL21tL21tYXAuYwppbmRleCBjYzNhMjA4Li5lYjUwOWFlIDEwMDY0NAotLS0gYS9tbS9tbWFwLmMKKysrIGIvbW0vbW1hcC5jCkBAIC0yMTAxLDMgKzIxMDEsNzUgQEAKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CisKKworc3RhdGljIHN0cnVjdCBwYWdlICpzcGVjaWFsX21hcHBpbmdfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCAqdHlwZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCisJQlVHX09OKGFkZHJlc3MgPCB2bWEtPnZtX3N0YXJ0IHx8IGFkZHJlc3MgPj0gdm1hLT52bV9lbmQpOworCisJYWRkcmVzcyAtPSB2bWEtPnZtX3N0YXJ0OworCWZvciAocGFnZXMgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsgYWRkcmVzcyA+IDAgJiYgKnBhZ2VzOyArK3BhZ2VzKQorCQlhZGRyZXNzIC09IFBBR0VfU0laRTsKKworCWlmICgqcGFnZXMpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSAqcGFnZXM7CisJCWdldF9wYWdlKHBhZ2UpOworCQlyZXR1cm4gcGFnZTsKKwl9CisKKwlyZXR1cm4gTk9QQUdFX1NJR0JVUzsKK30KKworLyoKKyAqIEhhdmluZyBhIGNsb3NlIGhvb2sgcHJldmVudHMgdm1hIG1lcmdpbmcgcmVnYXJkbGVzcyBvZiBmbGFncy4KKyAqLworc3RhdGljIHZvaWQgc3BlY2lhbF9tYXBwaW5nX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNwZWNpYWxfbWFwcGluZ192bW9wcyA9IHsKKwkuY2xvc2UgPSBzcGVjaWFsX21hcHBpbmdfY2xvc2UsCisJLm5vcGFnZQk9IHNwZWNpYWxfbWFwcGluZ19ub3BhZ2UsCit9OworCisvKgorICogQ2FsbGVkIHdpdGggbW0tPm1tYXBfc2VtIGhlbGQgZm9yIHdyaXRpbmcuCisgKiBJbnNlcnQgYSBuZXcgdm1hIGNvdmVyaW5nIHRoZSBnaXZlbiByZWdpb24sIHdpdGggdGhlIGdpdmVuIGZsYWdzLgorICogSXRzIHBhZ2VzIGFyZSBzdXBwbGllZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3RydWN0IHBhZ2UgKi4KKyAqIFRoZSBhcnJheSBjYW4gYmUgc2hvcnRlciB0aGFuIGxlbiA+PiBQQUdFX1NISUZUIGlmIGl0J3MgbnVsbC10ZXJtaW5hdGVkLgorICogVGhlIHJlZ2lvbiBwYXN0IHRoZSBsYXN0IHBhZ2Ugc3VwcGxpZWQgd2lsbCBhbHdheXMgcHJvZHVjZSBTSUdCVVMuCisgKiBUaGUgYXJyYXkgcG9pbnRlciBhbmQgdGhlIHBhZ2VzIGl0IHBvaW50cyB0byBhcmUgYXNzdW1lZCB0byBzdGF5IGFsaXZlCisgKiBmb3IgYXMgbG9uZyBhcyB0aGlzIG1hcHBpbmcgbWlnaHQgZXhpc3QuCisgKi8KK2ludCBpbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgdm1fZmxhZ3MsIHN0cnVjdCBwYWdlICoqcGFnZXMpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisKKwl2bWEgPSBrbWVtX2NhY2hlX3phbGxvYyh2bV9hcmVhX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KHZtYSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2bWEtPnZtX21tID0gbW07CisJdm1hLT52bV9zdGFydCA9IGFkZHI7CisJdm1hLT52bV9lbmQgPSBhZGRyICsgbGVuOworCisJdm1hLT52bV9mbGFncyA9IHZtX2ZsYWdzIHwgbW0tPmRlZl9mbGFnczsKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHByb3RlY3Rpb25fbWFwW3ZtYS0+dm1fZmxhZ3MgJiA3XTsKKworCXZtYS0+dm1fb3BzID0gJnNwZWNpYWxfbWFwcGluZ192bW9wczsKKwl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IHBhZ2VzOworCisJaWYgKHVubGlrZWx5KGluc2VydF92bV9zdHJ1Y3QobW0sIHZtYSkpKSB7CisJCWttZW1fY2FjaGVfZnJlZSh2bV9hcmVhX2NhY2hlcCwgdm1hKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbW0tPnRvdGFsX3ZtICs9IGxlbiA+PiBQQUdFX1NISUZUOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggMmM2MDZjYy4uZjEyMDUyZCAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtMTU3OSw4ICsxNTc5LDggQEAKIAogCWdldF96b25lX2NvdW50cygmYWN0aXZlLCAmaW5hY3RpdmUsICZmcmVlKTsKIAotCXByaW50aygiQWN0aXZlOiVsdSBpbmFjdGl2ZTolbHUgZGlydHk6JWx1IHdyaXRlYmFjazolbHUgIgotCQkidW5zdGFibGU6JWx1IGZyZWU6JXUgc2xhYjolbHUgbWFwcGVkOiVsdSBwYWdldGFibGVzOiVsdVxuIiwKKwlwcmludGsoIkFjdGl2ZTolbHUgaW5hY3RpdmU6JWx1IGRpcnR5OiVsdSB3cml0ZWJhY2s6JWx1IHVuc3RhYmxlOiVsdVxuIgorCQkiIGZyZWU6JXUgc2xhYjolbHUgbWFwcGVkOiVsdSBwYWdldGFibGVzOiVsdSBib3VuY2U6JWx1XG4iLAogCQlhY3RpdmUsCiAJCWluYWN0aXZlLAogCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKSwKQEAgLTE1OTAsNyArMTU5MCw4IEBACiAJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX1NMQUJfUkVDTEFJTUFCTEUpICsKIAkJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX1NMQUJfVU5SRUNMQUlNQUJMRSksCiAJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfTUFQUEVEKSwKLQkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfUEFHRVRBQkxFKSk7CisJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX1BBR0VUQUJMRSksCisJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX0JPVU5DRSkpOwogCiAJZm9yX2VhY2hfem9uZSh6b25lKSB7CiAJCWludCBpOwpkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2NvbmZpZwppbmRleCA3ZGZjOTQ5Li45MTU2NTc4IDEwMDY0NAotLS0gYS9uZXQvS2NvbmZpZworKysgYi9uZXQvS2NvbmZpZwpAQCAtMzcsNiArMzcsNyBAQAogc291cmNlICJuZXQvcGFja2V0L0tjb25maWciCiBzb3VyY2UgIm5ldC91bml4L0tjb25maWciCiBzb3VyY2UgIm5ldC94ZnJtL0tjb25maWciCitzb3VyY2UgIm5ldC9pdWN2L0tjb25maWciCiAKIGNvbmZpZyBJTkVUCiAJYm9vbCAiVENQL0lQIG5ldHdvcmtpbmciCmRpZmYgLS1naXQgYS9uZXQvTWFrZWZpbGUgYi9uZXQvTWFrZWZpbGUKaW5kZXggYWQ0ZDE0Zi4uNDg1NGFjNSAxMDA2NDQKLS0tIGEvbmV0L01ha2VmaWxlCisrKyBiL25ldC9NYWtlZmlsZQpAQCAtNDcsNiArNDcsNyBAQAogb2JqLSQoQ09ORklHX0lFRUU4MDIxMSkJCSs9IGllZWU4MDIxMS8KIG9iai0kKENPTkZJR19USVBDKQkJKz0gdGlwYy8KIG9iai0kKENPTkZJR19ORVRMQUJFTCkJCSs9IG5ldGxhYmVsLworb2JqLSQoQ09ORklHX0lVQ1YpCQkrPSBpdWN2LwogCiBpZmVxICgkKENPTkZJR19ORVQpLHkpCiBvYmotJChDT05GSUdfU1lTQ1RMKQkJKz0gc3lzY3RsX25ldC5vCmRpZmYgLS1naXQgYS9uZXQvYXRtL2NvbW1vbi5jIGIvbmV0L2F0bS9jb21tb24uYwppbmRleCBmYmFiZmY0Li5hMjg3OGU5IDEwMDY0NAotLS0gYS9uZXQvYXRtL2NvbW1vbi5jCisrKyBiL25ldC9hdG0vY29tbW9uLmMKQEAgLTgxNiw3ICs4MTYsOCBAQAogCXByb3RvX3VucmVnaXN0ZXIoJnZjY19wcm90byk7CiB9CiAKLW1vZHVsZV9pbml0KGF0bV9pbml0KTsKK3N1YnN5c19pbml0Y2FsbChhdG1faW5pdCk7CisKIG1vZHVsZV9leGl0KGF0bV9leGl0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oaWRwL2hpZHAuaCBiL25ldC9ibHVldG9vdGgvaGlkcC9oaWRwLmgKaW5kZXggYzI3NzVmNS4uYzhkZmFjZCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oaWRwL2hpZHAuaAorKysgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oCkBAIC04Niw3ICs4Niw3IEBACiAJaW50ICAgaW50cl9zb2NrOwkvLyBDb25udGV0ZWQgaW50ZXJydXB0IHNvY2tldAogCV9fdTE2IHBhcnNlcjsKIAlfX3UxNiByZF9zaXplOwotCV9fdTggKnJkX2RhdGE7CisJX191OCBfX3VzZXIgKnJkX2RhdGE7CiAJX191OCAgY291bnRyeTsKIAlfX3U4ICBzdWJjbGFzczsKIAlfX3UxNiB2ZW5kb3I7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvc29jay5jIGIvbmV0L2JsdWV0b290aC9oaWRwL3NvY2suYwppbmRleCA0MDdmYmE0Li45M2NmOWU1IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hpZHAvc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9zb2NrLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCiAJCXVjYSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdWNhKSk7CiAKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjYSwgKHZvaWQgKikgYXJnLCBzaXplb2YoY2EpKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjYSwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKGNhKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQlpZiAocHV0X3VzZXIoY2EuY3RybF9zb2NrLCAmdWNhLT5jdHJsX3NvY2spIHx8CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwppbmRleCBlYTMzMzdhLi5hMjVmYThjIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKQEAgLTk0OSw0NCArOTQ5LDI5IEBACiB9OwogI2VuZGlmCiAKLWludCBicl9uZXRmaWx0ZXJfaW5pdCh2b2lkKQoraW50IF9faW5pdCBicl9uZXRmaWx0ZXJfaW5pdCh2b2lkKQogewotCWludCBpOworCWludCByZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShicl9uZl9vcHMpOyBpKyspIHsKLQkJaW50IHJldDsKLQotCQlpZiAoKHJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmJyX25mX29wc1tpXSkpID49IDApCi0JCQljb250aW51ZTsKLQotCQl3aGlsZSAoaS0tKQotCQkJbmZfdW5yZWdpc3Rlcl9ob29rKCZicl9uZl9vcHNbaV0pOwotCisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9va3MoYnJfbmZfb3BzLCBBUlJBWV9TSVpFKGJyX25mX29wcykpOworCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCX0KLQogI2lmZGVmIENPTkZJR19TWVNDVEwKIAlicm5mX3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoYnJuZl9uZXRfdGFibGUsIDApOwogCWlmIChicm5mX3N5c2N0bF9oZWFkZXIgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiYnJfbmV0ZmlsdGVyOiBjYW4ndCByZWdpc3RlciB0byBzeXNjdGwuXG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnJfbmZfb3BzKTsgaSsrKQotCQkJbmZfdW5yZWdpc3Rlcl9ob29rKCZicl9uZl9vcHNbaV0pOwotCQlyZXR1cm4gLUVGQVVMVDsKKwkJbmZfdW5yZWdpc3Rlcl9ob29rcyhicl9uZl9vcHMsIEFSUkFZX1NJWkUoYnJfbmZfb3BzKSk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KICNlbmRpZgotCiAJcHJpbnRrKEtFUk5fTk9USUNFICJCcmlkZ2UgZmlyZXdhbGxpbmcgcmVnaXN0ZXJlZFxuIik7Ci0KIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBicl9uZXRmaWx0ZXJfZmluaSh2b2lkKQogewotCWludCBpOwotCi0JZm9yIChpID0gQVJSQVlfU0laRShicl9uZl9vcHMpIC0gMTsgaSA+PSAwOyBpLS0pCi0JCW5mX3VucmVnaXN0ZXJfaG9vaygmYnJfbmZfb3BzW2ldKTsKKwluZl91bnJlZ2lzdGVyX2hvb2tzKGJyX25mX29wcywgQVJSQVlfU0laRShicl9uZl9vcHMpKTsKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoYnJuZl9zeXNjdGxfaGVhZGVyKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYwppbmRleCBhOTEzOTY4Li43ZDY4YjI0IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYworKysgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYwpAQCAtNDUsNyArNDUsNyBAQAogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKmhkciksIGZsYWdzKTsKIAlpZiAobmxoID09IE5VTEwpCi0JCXJldHVybiAtRU5PQlVGUzsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCWhkciA9IG5sbXNnX2RhdGEobmxoKTsKIAloZHItPmlmaV9mYW1pbHkgPSBBRl9CUklER0U7CkBAIC03Miw3ICs3Miw4IEBACiAJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CiAKIG5sYV9wdXRfZmFpbHVyZToKLQlyZXR1cm4gbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKIC8qCkBAIC04OSw5ICs5MCwxMiBAQAogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IGJyX2ZpbGxfaWZpbmZvKHNrYiwgcG9ydCwgMCwgMCwgZXZlbnQsIDApOwotCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gYnJfbmxtc2dfc2l6ZSgpICovCi0JQlVHX09OKGVyciA8IDApOwotCisJaWYgKGVyciA8IDApIHsKKwkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIGJyX25sbXNnX3NpemUoKSAqLworCQlXQVJOX09OKGVyciA9PSAtRU1TR1NJWkUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJZ290byBlcnJvdXQ7CisJfQogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgMCwgUlROTEdSUF9MSU5LLCBOVUxMLCBHRlBfQVRPTUlDKTsKIGVycm91dDoKIAlpZiAoZXJyIDwgMCkKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9pcC5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwLmMKaW5kZXggZTRjNjQyNC4uNmFmYTRkMCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwLmMKQEAgLTkzLDYgKzkzLDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoaW5mby0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1AgJiYKIAkJICAgIGluZm8tPnByb3RvY29sICE9IElQUFJPVE9fVURQICYmCisJCSAgICBpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX1VEUExJVEUgJiYKIAkJICAgIGluZm8tPnByb3RvY29sICE9IElQUFJPVE9fU0NUUCAmJgogCQkgICAgaW5mby0+cHJvdG9jb2wgIT0gSVBQUk9UT19EQ0NQKQogCQkJIHJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCmluZGV4IGExODRmODcuLjk4NWRmODIgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKQEAgLTk2LDYgKzk2LDcgQEAKIAkJICAgICAgIE5JUFFVQUQoaWgtPmRhZGRyKSwgaWgtPnRvcywgaWgtPnByb3RvY29sKTsKIAkJaWYgKGloLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCB8fAogCQkgICAgaWgtPnByb3RvY29sID09IElQUFJPVE9fVURQIHx8CisJCSAgICBpaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFBMSVRFIHx8CiAJCSAgICBpaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19TQ1RQIHx8CiAJCSAgICBpaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19EQ0NQKSB7CiAJCQlzdHJ1Y3QgdGNwdWRwaGRyIF9wb3J0cywgKnBwdHI7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXYuYyBiL25ldC9jb3JlL2Rldi5jCmluZGV4IDQ1NWQ1ODkuLjFlOTRhMWIgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC0zMjQ3LDcgKzMyNDcsNyBAQAogICoJdW5yZWdpc3Rlcl9uZXRkZXYoKSBpbnN0ZWFkIG9mIHRoaXMuCiAgKi8KIAotaW50IHVucmVnaXN0ZXJfbmV0ZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIHVucmVnaXN0ZXJfbmV0ZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmQsICoqZHA7CiAKQEAgLTMyNTgsNyArMzI1OCw5IEBACiAJaWYgKGRldi0+cmVnX3N0YXRlID09IE5FVFJFR19VTklOSVRJQUxJWkVEKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJ1bnJlZ2lzdGVyX25ldGRldmljZTogZGV2aWNlICVzLyVwIG5ldmVyICIKIAkJCQkgICJ3YXMgcmVnaXN0ZXJlZFxuIiwgZGV2LT5uYW1lLCBkZXYpOwotCQlyZXR1cm4gLUVOT0RFVjsKKworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CiAJfQogCiAJQlVHX09OKGRldi0+cmVnX3N0YXRlICE9IE5FVFJFR19SRUdJU1RFUkVEKTsKQEAgLTMyODAsMTEgKzMyODIsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYgKCFkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidW5yZWdpc3RlciBuZXRfZGV2aWNlOiAnJXMnIG5vdCBmb3VuZFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KKwlCVUdfT04oIWQpOwogCiAJZGV2LT5yZWdfc3RhdGUgPSBORVRSRUdfVU5SRUdJU1RFUklORzsKIApAQCAtMzMxNiw3ICszMzE0LDYgQEAKIAlzeW5jaHJvbml6ZV9uZXQoKTsKIAogCWRldl9wdXQoZGV2KTsKLQlyZXR1cm4gMDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvY29yZS9kc3QuYyBiL25ldC9jb3JlL2RzdC5jCmluZGV4IDgzNmVjNjYuLjFhNTNmYjMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2RzdC5jCisrKyBiL25ldC9jb3JlL2RzdC5jCkBAIC05OSw3ICs5OSwxNCBAQAogCXByaW50aygiZHN0X3RvdGFsOiAlZC8lZCAlbGRcbiIsCiAJICAgICAgIGF0b21pY19yZWFkKCZkc3RfdG90YWwpLCBkZWxheWVkLCAgZHN0X2djX3RpbWVyX2V4cGlyZXMpOwogI2VuZGlmCi0JbW9kX3RpbWVyKCZkc3RfZ2NfdGltZXIsIGppZmZpZXMgKyBkc3RfZ2NfdGltZXJfZXhwaXJlcyk7CisJLyogaWYgdGhlIG5leHQgZGVzaXJlZCB0aW1lciBpcyBtb3JlIHRoYW4gNCBzZWNvbmRzIGluIHRoZSBmdXR1cmUKKwkgKiB0aGVuIHJvdW5kIHRoZSB0aW1lciB0byB3aG9sZSBzZWNvbmRzCisJICovCisJaWYgKGRzdF9nY190aW1lcl9leHBpcmVzID4gNCpIWikKKwkJbW9kX3RpbWVyKCZkc3RfZ2NfdGltZXIsCisJCQlyb3VuZF9qaWZmaWVzKGppZmZpZXMgKyBkc3RfZ2NfdGltZXJfZXhwaXJlcykpOworCWVsc2UKKwkJbW9kX3RpbWVyKCZkc3RfZ2NfdGltZXIsIGppZmZpZXMgKyBkc3RfZ2NfdGltZXJfZXhwaXJlcyk7CiAKIG91dDoKIAlzcGluX3VubG9jaygmZHN0X2xvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmliX3J1bGVzLmMgYi9uZXQvY29yZS9maWJfcnVsZXMuYwppbmRleCAxZGY2Y2Q0NS4uMjE1ZjFiZmYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2ZpYl9ydWxlcy5jCisrKyBiL25ldC9jb3JlL2ZpYl9ydWxlcy5jCkBAIC0zMzEsNyArMzMxLDcgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCB0eXBlLCBzaXplb2YoKmZyaCksIGZsYWdzKTsKIAlpZiAobmxoID09IE5VTEwpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCWZyaCA9IG5sbXNnX2RhdGEobmxoKTsKIAlmcmgtPnRhYmxlID0gcnVsZS0+dGFibGU7CkBAIC0zNTksNyArMzU5LDggQEAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAogbmxhX3B1dF9mYWlsdXJlOgotCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogaW50IGZpYl9ydWxlc19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwgaW50IGZhbWlseSkKQEAgLTQwNSw5ICs0MDYsMTIgQEAKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBmaWJfbmxfZmlsbF9ydWxlKHNrYiwgcnVsZSwgcGlkLCBubGgtPm5sbXNnX3NlcSwgZXZlbnQsIDAsIG9wcyk7Ci0JLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBmaWJfcnVsZV9ubG1zZ19zaXplKCkgKi8KLQlCVUdfT04oZXJyIDwgMCk7Ci0KKwlpZiAoZXJyIDwgMCkgeworCQkvKiAtRU1TR1NJWkUgaW1wbGllcyBCVUcgaW4gZmliX3J1bGVfbmxtc2dfc2l6ZSgpICovCisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIGVycm91dDsKKwl9CiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCBwaWQsIG9wcy0+bmxncm91cCwgbmxoLCBHRlBfS0VSTkVMKTsKIGVycm91dDoKIAlpZiAoZXJyIDwgMCkKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25laWdoYm91ci5jIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKaW5kZXggZTczMDBiNi4uMDU0ZDQ2NCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMKKysrIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKQEAgLTY5Niw3ICs2OTYsMTAgQEAKIAlpZiAoIWV4cGlyZSkKIAkJZXhwaXJlID0gMTsKIAotIAltb2RfdGltZXIoJnRibC0+Z2NfdGltZXIsIG5vdyArIGV4cGlyZSk7CisJaWYgKGV4cGlyZT5IWikKKwkJbW9kX3RpbWVyKCZ0YmwtPmdjX3RpbWVyLCByb3VuZF9qaWZmaWVzKG5vdyArIGV4cGlyZSkpOworCWVsc2UKKwkJbW9kX3RpbWVyKCZ0YmwtPmdjX3RpbWVyLCBub3cgKyBleHBpcmUpOwogCiAJd3JpdGVfdW5sb2NrKCZ0YmwtPmxvY2spOwogfQpAQCAtMTYzNyw3ICsxNjQwLDcgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCB0eXBlLCBzaXplb2YoKm5kdG1zZyksIGZsYWdzKTsKIAlpZiAobmxoID09IE5VTEwpCi0JCXJldHVybiAtRU5PQlVGUzsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCW5kdG1zZyA9IG5sbXNnX2RhdGEobmxoKTsKIApAQCAtMTcwNiw3ICsxNzA5LDggQEAKIAogbmxhX3B1dF9mYWlsdXJlOgogCXJlYWRfdW5sb2NrX2JoKCZ0YmwtPmxvY2spOwotCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogc3RhdGljIGludCBuZWlnaHRibF9maWxsX3BhcmFtX2luZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTE3MjAsNyArMTcyNCw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgdHlwZSwgc2l6ZW9mKCpuZHRtc2cpLCBmbGFncyk7CiAJaWYgKG5saCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0JVRlM7CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAluZHRtc2cgPSBubG1zZ19kYXRhKG5saCk7CiAKQEAgLTE3MzcsNyArMTc0MSw4IEBACiAJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CiBlcnJvdXQ6CiAJcmVhZF91bmxvY2tfYmgoJnRibC0+bG9jayk7Ci0JcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmVpZ2hfcGFybXMgKmxvb2t1cF9uZWlnaF9wYXJhbXMoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsCkBAIC0xOTU1LDcgKzE5NjAsNyBAQAogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIHR5cGUsIHNpemVvZigqbmRtKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9CVUZTOworCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJbmRtID0gbmxtc2dfZGF0YShubGgpOwogCW5kbS0+bmRtX2ZhbWlseQkgPSBuZWlnaC0+b3BzLT5mYW1pbHk7CkBAIC0xOTg3LDcgKzE5OTIsOCBAQAogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwogCiBubGFfcHV0X2ZhaWx1cmU6Ci0JcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogCiAKQEAgLTI0MjksOSArMjQzNSwxMiBAQAogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IG5laWdoX2ZpbGxfaW5mbyhza2IsIG4sIDAsIDAsIHR5cGUsIGZsYWdzKTsKLQkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIG5laWdoX25sbXNnX3NpemUoKSAqLwotCUJVR19PTihlcnIgPCAwKTsKLQorCWlmIChlcnIgPCAwKSB7CisJCS8qIC1FTVNHU0laRSBpbXBsaWVzIEJVRyBpbiBuZWlnaF9ubG1zZ19zaXplKCkgKi8KKwkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3V0OworCX0KIAllcnIgPSBydG5sX25vdGlmeShza2IsIDAsIFJUTkxHUlBfTkVJR0gsIE5VTEwsIEdGUF9BVE9NSUMpOwogZXJyb3V0OgogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwppbmRleCBlNzY1MzlhLi45YmY5YWUwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9ydG5ldGxpbmsuYworKysgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwpAQCAtMzIwLDcgKzMyMCw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgdHlwZSwgc2l6ZW9mKCppZm0pLCBmbGFncyk7CiAJaWYgKG5saCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0JVRlM7CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlpZm0gPSBubG1zZ19kYXRhKG5saCk7CiAJaWZtLT5pZmlfZmFtaWx5ID0gQUZfVU5TUEVDOwpAQCAtMzg0LDcgKzM4NCw4IEBACiAJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CiAKIG5sYV9wdXRfZmFpbHVyZToKLQlyZXR1cm4gbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKIHN0YXRpYyBpbnQgcnRubF9kdW1wX2lmaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCkBAIC02MzMsOSArNjM0LDEyIEBACiAKIAllcnIgPSBydG5sX2ZpbGxfaWZpbmZvKG5za2IsIGRldiwgaXcsIGl3X2J1Zl9sZW4sIFJUTV9ORVdMSU5LLAogCQkJICAgICAgIE5FVExJTktfQ0Ioc2tiKS5waWQsIG5saC0+bmxtc2dfc2VxLCAwLCAwKTsKLQkvKiBmYWlsdXJlIGltcGlsaWVzIEJVRyBpbiBpZl9ubG1zZ19zaXplIG9yIHdpcmVsZXNzX3J0bmV0bGlua19nZXQgKi8KLQlCVUdfT04oZXJyIDwgMCk7Ci0KKwlpZiAoZXJyIDwgMCkgeworCQkvKiAtRU1TR1NJWkUgaW1wbGllcyBCVUcgaW4gaWZfbmxtc2dfc2l6ZSAqLworCQlXQVJOX09OKGVyciA9PSAtRU1TR1NJWkUpOworCQlrZnJlZV9za2IobnNrYik7CisJCWdvdG8gZXJyb3V0OworCX0KIAllcnIgPSBydG5sX3VuaWNhc3QobnNrYiwgTkVUTElOS19DQihza2IpLnBpZCk7CiBlcnJvdXQ6CiAJa2ZyZWUoaXdfYnVmKTsKQEAgLTY3OCw5ICs2ODIsMTIgQEAKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBydG5sX2ZpbGxfaWZpbmZvKHNrYiwgZGV2LCBOVUxMLCAwLCB0eXBlLCAwLCAwLCBjaGFuZ2UsIDApOwotCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gaWZfbmxtc2dfc2l6ZSgpICovCi0JQlVHX09OKGVyciA8IDApOwotCisJaWYgKGVyciA8IDApIHsKKwkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIGlmX25sbXNnX3NpemUoKSAqLworCQlXQVJOX09OKGVyciA9PSAtRU1TR1NJWkUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJZ290byBlcnJvdXQ7CisJfQogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgMCwgUlROTEdSUF9MSU5LLCBOVUxMLCBHRlBfS0VSTkVMKTsKIGVycm91dDoKIAlpZiAoZXJyIDwgMCkKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCmluZGV4IDQwNDAyYzUuLjVjNDUyYTMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYwpAQCAtNDc5LDcgKzQ3OSw4IEBACiAKIAkJCWNjaWQzX3ByX2RlYnVnKCIlcyglcCksIHM9JXUsIHdfaW5pdD0lbGx1LCAiCiAJCQkJICAgICAgICJSX3NhbXBsZT0lZHVzLCBYPSV1XG4iLCBkY2NwX3JvbGUoc2spLAotCQkJCSAgICAgICBzaywgaGN0eC0+Y2NpZDNoY3R4X3MsIHdfaW5pdCwKKwkJCQkgICAgICAgc2ssIGhjdHgtPmNjaWQzaGN0eF9zLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXdfaW5pdCwKIAkJCQkgICAgICAgKGludClyX3NhbXBsZSwKIAkJCQkgICAgICAgKHVuc2lnbmVkKShoY3R4LT5jY2lkM2hjdHhfeCA+PiA2KSk7CiAKQEAgLTEwMDUsNyArMTAwNiw3IEBACiAJCURDQ1BfQlVHX09OKHJfc2FtcGxlIDwgMCk7CiAJCWlmICh1bmxpa2VseShyX3NhbXBsZSA8PSB0X2VsYXBzZWQpKQogCQkJRENDUF9XQVJOKCJyX3NhbXBsZT0lbGR1cywgdF9lbGFwc2VkPSVsZHVzXG4iLAotCQkJCSAgcl9zYW1wbGUsIHRfZWxhcHNlZCk7CisJCQkJICAobG9uZylyX3NhbXBsZSwgKGxvbmcpdF9lbGFwc2VkKTsKIAkJZWxzZQogCQkJcl9zYW1wbGUgLT0gdF9lbGFwc2VkOwogCQlDQ0lEM19SVFRfU0FOSVRZX0NIRUNLKHJfc2FtcGxlKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2lwdjQuYyBiL25ldC9kY2NwL2lwdjQuYwppbmRleCA5MGM3NGI0Li5mYTJjOTgyIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pcHY0LmMKKysrIGIvbmV0L2RjY3AvaXB2NC5jCkBAIC03Miw3ICs3Miw3IEBACiAJdG1wID0gaXBfcm91dGVfY29ubmVjdCgmcnQsIG5leHRob3AsIGluZXQtPnNhZGRyLAogCQkJICAgICAgIFJUX0NPTk5fRkxBR1Moc2spLCBzay0+c2tfYm91bmRfZGV2X2lmLAogCQkJICAgICAgIElQUFJPVE9fRENDUCwKLQkJCSAgICAgICBpbmV0LT5zcG9ydCwgdXNpbi0+c2luX3BvcnQsIHNrKTsKKwkJCSAgICAgICBpbmV0LT5zcG9ydCwgdXNpbi0+c2luX3BvcnQsIHNrLCAxKTsKIAlpZiAodG1wIDwgMCkKIAkJcmV0dXJuIHRtcDsKIApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvaXB2Ni5jIGIvbmV0L2RjY3AvaXB2Ni5jCmluZGV4IDZiOTFhOWQuLjc5MTQwYjMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lwdjYuYworKysgYi9uZXQvZGNjcC9pcHY2LmMKQEAgLTEwNDEsNyArMTA0MSw3IEBACiAJaWYgKGZpbmFsX3ApCiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBmaW5hbF9wKTsKIAotCWVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApOworCWVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDEpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGZhaWx1cmU7CiAKZGlmZiAtLWdpdCBhL25ldC9kY2NwL3Byb3RvLmMgYi9uZXQvZGNjcC9wcm90by5jCmluZGV4IDYzYjNmYTIuLjQ4NDM4NTYgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL3Byb3RvLmMKKysrIGIvbmV0L2RjY3AvcHJvdG8uYwpAQCAtMTAyNCw3ICsxMDI0LDYgQEAKIAlkbyB7CiAJCWRjY3BfaGFzaGluZm8uZWhhc2hfc2l6ZSA9ICgxVUwgPDwgZWhhc2hfb3JkZXIpICogUEFHRV9TSVpFIC8KIAkJCQkJc2l6ZW9mKHN0cnVjdCBpbmV0X2VoYXNoX2J1Y2tldCk7Ci0JCWRjY3BfaGFzaGluZm8uZWhhc2hfc2l6ZSA+Pj0gMTsKIAkJd2hpbGUgKGRjY3BfaGFzaGluZm8uZWhhc2hfc2l6ZSAmCiAJCSAgICAgICAoZGNjcF9oYXNoaW5mby5laGFzaF9zaXplIC0gMSkpCiAJCQlkY2NwX2hhc2hpbmZvLmVoYXNoX3NpemUtLTsKQEAgLTEwMzcsOSArMTAzNiwxMCBAQAogCQlnb3RvIG91dF9mcmVlX2JpbmRfYnVja2V0X2NhY2hlcDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgKGRjY3BfaGFzaGluZm8uZWhhc2hfc2l6ZSA8PCAxKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGRjY3BfaGFzaGluZm8uZWhhc2hfc2l6ZTsgaSsrKSB7CiAJCXJ3bG9ja19pbml0KCZkY2NwX2hhc2hpbmZvLmVoYXNoW2ldLmxvY2spOwogCQlJTklUX0hMSVNUX0hFQUQoJmRjY3BfaGFzaGluZm8uZWhhc2hbaV0uY2hhaW4pOworCQlJTklUX0hMSVNUX0hFQUQoJmRjY3BfaGFzaGluZm8uZWhhc2hbaV0udHdjaGFpbik7CiAJfQogCiAJYmhhc2hfb3JkZXIgPSBlaGFzaF9vcmRlcjsKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fZGV2LmMgYi9uZXQvZGVjbmV0L2RuX2Rldi5jCmluZGV4IGVkMDgzYWIuLjkwYjNkZmQgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fZGV2LmMKKysrIGIvbmV0L2RlY25ldC9kbl9kZXYuYwpAQCAtNzQ5LDcgKzc0OSw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqaWZtKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9CVUZTOworCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJaWZtID0gbmxtc2dfZGF0YShubGgpOwogCWlmbS0+aWZhX2ZhbWlseSA9IEFGX0RFQ25ldDsKQEAgLTc2OCw3ICs3NjgsOCBAQAogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwogCiBubGFfcHV0X2ZhaWx1cmU6Ci0JcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogCiBzdGF0aWMgdm9pZCBkbl9pZmFkZHJfbm90aWZ5KGludCBldmVudCwgc3RydWN0IGRuX2lmYWRkciAqaWZhKQpAQCAtNzgxLDkgKzc4MiwxMiBAQAogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IGRuX25sX2ZpbGxfaWZhZGRyKHNrYiwgaWZhLCAwLCAwLCBldmVudCwgMCk7Ci0JLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBkbl9pZmFkZHJfbmxtc2dfc2l6ZSgpICovCi0JQlVHX09OKGVyciA8IDApOwotCisJaWYgKGVyciA8IDApIHsKKwkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIGRuX2lmYWRkcl9ubG1zZ19zaXplKCkgKi8KKwkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3V0OworCX0KIAllcnIgPSBydG5sX25vdGlmeShza2IsIDAsIFJUTkxHUlBfREVDbmV0X0lGQUREUiwgTlVMTCwgR0ZQX0tFUk5FTCk7CiBlcnJvdXQ6CiAJaWYgKGVyciA8IDApCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3RhYmxlLmMgYi9uZXQvZGVjbmV0L2RuX3RhYmxlLmMKaW5kZXggMTNiMjQyMS4uYzFmMGNjMSAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl90YWJsZS5jCisrKyBiL25ldC9kZWNuZXQvZG5fdGFibGUuYwpAQCAtMzUwLDcgKzM1MCw3IEBACiBubG1zZ19mYWlsdXJlOgogcnRhdHRyX2ZhaWx1cmU6CiAgICAgICAgIHNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogCkBAIC0zNjgsOSArMzY4LDEyIEBACiAgICAgICAgIGVyciA9IGRuX2ZpYl9kdW1wX2luZm8oc2tiLCBwaWQsIG5saC0+bmxtc2dfc2VxLCBldmVudCwgdGJfaWQsCiAJCQkgICAgICAgZi0+Zm5fdHlwZSwgZi0+Zm5fc2NvcGUsICZmLT5mbl9rZXksIHosCiAJCQkgICAgICAgRE5fRklCX0lORk8oZiksIDApOwotCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gZG5fZmliX25sbXNnX3NpemUoKSAqLwotCUJVR19PTihlcnIgPCAwKTsKLQorCWlmIChlcnIgPCAwKSB7CisJCS8qIC1FTVNHU0laRSBpbXBsaWVzIEJVRyBpbiBkbl9maWJfbmxtc2dfc2l6ZSgpICovCisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIGVycm91dDsKKwl9CiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCBwaWQsIFJUTkxHUlBfREVDbmV0X1JPVVRFLCBubGgsIEdGUF9LRVJORUwpOwogZXJyb3V0OgogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYWZfaW5ldC5jIGIvbmV0L2lwdjQvYWZfaW5ldC5jCmluZGV4IDg2NDAwOTYuLjU3NTBhMmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2FmX2luZXQuYworKysgYi9uZXQvaXB2NC9hZl9pbmV0LmMKQEAgLTEwMDcsNyArMTAwNyw3IEBACiAJCQkgICAgICAgUlRfQ09OTl9GTEFHUyhzayksCiAJCQkgICAgICAgc2stPnNrX2JvdW5kX2Rldl9pZiwKIAkJCSAgICAgICBzay0+c2tfcHJvdG9jb2wsCi0JCQkgICAgICAgaW5ldC0+c3BvcnQsIGluZXQtPmRwb3J0LCBzayk7CisJCQkgICAgICAgaW5ldC0+c3BvcnQsIGluZXQtPmRwb3J0LCBzaywgMCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZGF0YWdyYW0uYyBiL25ldC9pcHY0L2RhdGFncmFtLmMKaW5kZXggN2IwNjhhOC4uMDA3MmQ3OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZGF0YWdyYW0uYworKysgYi9uZXQvaXB2NC9kYXRhZ3JhbS5jCkBAIC00OSw3ICs0OSw3IEBACiAJZXJyID0gaXBfcm91dGVfY29ubmVjdCgmcnQsIHVzaW4tPnNpbl9hZGRyLnNfYWRkciwgc2FkZHIsCiAJCQkgICAgICAgUlRfQ09OTl9GTEFHUyhzayksIG9pZiwKIAkJCSAgICAgICBzay0+c2tfcHJvdG9jb2wsCi0JCQkgICAgICAgaW5ldC0+c3BvcnQsIHVzaW4tPnNpbl9wb3J0LCBzayk7CisJCQkgICAgICAgaW5ldC0+c3BvcnQsIHVzaW4tPnNpbl9wb3J0LCBzaywgMSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAlpZiAoKHJ0LT5ydF9mbGFncyAmIFJUQ0ZfQlJPQURDQVNUKSAmJiAhc29ja19mbGFnKHNrLCBTT0NLX0JST0FEQ0FTVCkpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2RldmluZXQuYyBiL25ldC9pcHY0L2RldmluZXQuYwppbmRleCA0ODBhY2U5Li5jNDAyMDM2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9kZXZpbmV0LmMKKysrIGIvbmV0L2lwdjQvZGV2aW5ldC5jCkBAIC0xMTQwLDcgKzExNDAsNyBAQAogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKmlmbSksIGZsYWdzKTsKIAlpZiAobmxoID09IE5VTEwpCi0JCXJldHVybiAtRU5PQlVGUzsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCWlmbSA9IG5sbXNnX2RhdGEobmxoKTsKIAlpZm0tPmlmYV9mYW1pbHkgPSBBRl9JTkVUOwpAQCAtMTE2Nyw3ICsxMTY3LDggQEAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAogbmxhX3B1dF9mYWlsdXJlOgotCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogc3RhdGljIGludCBpbmV0X2R1bXBfaWZhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKQEAgLTEyMjUsOSArMTIyNiwxMiBAQAogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IGluZXRfZmlsbF9pZmFkZHIoc2tiLCBpZmEsIHBpZCwgc2VxLCBldmVudCwgMCk7Ci0JLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBpbmV0X25sbXNnX3NpemUoKSAqLwotCUJVR19PTihlcnIgPCAwKTsKLQorCWlmIChlcnIgPCAwKSB7CisJCS8qIC1FTVNHU0laRSBpbXBsaWVzIEJVRyBpbiBpbmV0X25sbXNnX3NpemUoKSAqLworCQlXQVJOX09OKGVyciA9PSAtRU1TR1NJWkUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJZ290byBlcnJvdXQ7CisJfQogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgcGlkLCBSVE5MR1JQX0lQVjRfSUZBRERSLCBubGgsIEdGUF9LRVJORUwpOwogZXJyb3V0OgogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jIGIvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCmluZGV4IGU2M2I4YTkuLmJlMTAyOGMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYworKysgYi9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMKQEAgLTMxNCw5ICszMTQsMTIgQEAKIAllcnIgPSBmaWJfZHVtcF9pbmZvKHNrYiwgaW5mby0+cGlkLCBzZXEsIGV2ZW50LCB0Yl9pZCwKIAkJCSAgICBmYS0+ZmFfdHlwZSwgZmEtPmZhX3Njb3BlLCBrZXksIGRzdF9sZW4sCiAJCQkgICAgZmEtPmZhX3RvcywgZmEtPmZhX2luZm8sIDApOwotCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gZmliX25sbXNnX3NpemUoKSAqLwotCUJVR19PTihlcnIgPCAwKTsKLQorCWlmIChlcnIgPCAwKSB7CisJCS8qIC1FTVNHU0laRSBpbXBsaWVzIEJVRyBpbiBmaWJfbmxtc2dfc2l6ZSgpICovCisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIGVycm91dDsKKwl9CiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCBpbmZvLT5waWQsIFJUTkxHUlBfSVBWNF9ST1VURSwKIAkJCSAgaW5mby0+bmxoLCBHRlBfS0VSTkVMKTsKIGVycm91dDoKQEAgLTk2MCw3ICs5NjMsNyBAQAogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnJ0bSksIGZsYWdzKTsKIAlpZiAobmxoID09IE5VTEwpCi0JCXJldHVybiAtRU5PQlVGUzsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCXJ0bSA9IG5sbXNnX2RhdGEobmxoKTsKIAlydG0tPnJ0bV9mYW1pbHkgPSBBRl9JTkVUOwpAQCAtMTAzMSw3ICsxMDM0LDggQEAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAogbmxhX3B1dF9mYWlsdXJlOgotCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lnbXAuYyBiL25ldC9pcHY0L2lnbXAuYwppbmRleCAwMDE3Y2NiLi4wMjRhZTU2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pZ21wLmMKKysrIGIvbmV0L2lwdjQvaWdtcC5jCkBAIC00NTUsNiArNDU1LDggQEAKIAkJCXNrYiA9IGFkZF9ncmhlYWQoc2tiLCBwbWMsIHR5cGUsICZwZ3IpOwogCQkJZmlyc3QgPSAwOwogCQl9CisJCWlmICghc2tiKQorCQkJcmV0dXJuIE5VTEw7CiAJCXBzcmMgPSAoX19iZTMyICopc2tiX3B1dChza2IsIHNpemVvZihfX2JlMzIpKTsKIAkJKnBzcmMgPSBwc2YtPnNmX2luYWRkcjsKIAkJc2NvdW50Kys7IHN0b3RhbCsrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF9kaWFnLmMgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwppbmRleCA3Nzc2MWFjLi44YWE3ZDUxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2RpYWcuYworKysgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwpAQCAtMTUzLDcgKzE1Myw3IEBACiBydGF0dHJfZmFpbHVyZToKIG5sbXNnX2ZhaWx1cmU6CiAJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogc3RhdGljIGludCBpbmV0X3R3c2tfZGlhZ19maWxsKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3LApAQCAtMjA5LDcgKzIwOSw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogbmxtc2dfZmFpbHVyZToKIAlza2JfdHJpbShza2IsIHByZXZpb3VzX3RhaWwgLSBza2ItPmRhdGEpOwotCXJldHVybiAtMTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogCiBzdGF0aWMgaW50IHNrX2RpYWdfZmlsbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCkBAIC0yNzQsMTEgKzI3NCwxNCBAQAogCWlmICghcmVwKQogCQlnb3RvIG91dDsKIAotCWlmIChza19kaWFnX2ZpbGwoc2ssIHJlcCwgcmVxLT5pZGlhZ19leHQsCi0JCQkgTkVUTElOS19DQihpbl9za2IpLnBpZCwKLQkJCSBubGgtPm5sbXNnX3NlcSwgMCwgbmxoKSA8PSAwKQotCQlCVUcoKTsKLQorCWVyciA9IHNrX2RpYWdfZmlsbChzaywgcmVwLCByZXEtPmlkaWFnX2V4dCwKKwkJCSAgIE5FVExJTktfQ0IoaW5fc2tiKS5waWQsCisJCQkgICBubGgtPm5sbXNnX3NlcSwgMCwgbmxoKTsKKwlpZiAoZXJyIDwgMCkgeworCQlXQVJOX09OKGVyciA9PSAtRU1TR1NJWkUpOworCQlrZnJlZV9za2IocmVwKTsKKwkJZ290byBvdXQ7CisJfQogCWVyciA9IG5ldGxpbmtfdW5pY2FzdChpZGlhZ25sLCByZXAsIE5FVExJTktfQ0IoaW5fc2tiKS5waWQsCiAJCQkgICAgICBNU0dfRE9OVFdBSVQpOwogCWlmIChlcnIgPiAwKQpAQCAtNzc1LDcgKzc3OCw3IEBACiAJCQlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dzsKIAogCQkJaW5ldF90d3NrX2Zvcl9lYWNoKHR3LCBub2RlLAotCQkJCSAgICAmaGFzaGluZm8tPmVoYXNoW2kgKyBoYXNoaW5mby0+ZWhhc2hfc2l6ZV0uY2hhaW4pIHsKKwkJCQkgICAgJmhlYWQtPnR3Y2hhaW4pIHsKIAogCQkJCWlmIChudW0gPCBzX251bSkKIAkJCQkJZ290byBuZXh0X2R5aW5nOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF9oYXNodGFibGVzLmMgYi9uZXQvaXB2NC9pbmV0X2hhc2h0YWJsZXMuYwppbmRleCA4Yzc5YzhhLi4xNTBhY2UxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2hhc2h0YWJsZXMuYworKysgYi9uZXQvaXB2NC9pbmV0X2hhc2h0YWJsZXMuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJd3JpdGVfbG9jaygmaGVhZC0+bG9jayk7CiAKIAkvKiBDaGVjayBUSU1FLVdBSVQgc29ja2V0cyBmaXJzdC4gKi8KLQlza19mb3JfZWFjaChzazIsIG5vZGUsICYoaGVhZCArIGhpbmZvLT5laGFzaF9zaXplKS0+Y2hhaW4pIHsKKwlza19mb3JfZWFjaChzazIsIG5vZGUsICZoZWFkLT50d2NoYWluKSB7CiAJCXR3ID0gaW5ldF90d3NrKHNrMik7CiAKIAkJaWYgKElORVRfVFdfTUFUQ0goc2syLCBoYXNoLCBhY29va2llLCBzYWRkciwgZGFkZHIsIHBvcnRzLCBkaWYpKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X3RpbWV3YWl0X3NvY2suYyBiL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jCmluZGV4IDlmNDE0ZTMuLmE3M2NmOTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jCisrKyBiL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jCkBAIC03OCw4ICs3OCw4IEBACiAJaWYgKF9fc2tfZGVsX25vZGVfaW5pdChzaykpCiAJCXNvY2tfcHJvdF9kZWNfdXNlKHNrLT5za19wcm90KTsKIAotCS8qIFN0ZXAgMzogSGFzaCBUVyBpbnRvIFRJTUVXQUlUIGhhbGYgb2YgZXN0YWJsaXNoZWQgaGFzaCB0YWJsZS4gKi8KLQlpbmV0X3R3c2tfYWRkX25vZGUodHcsICYoZWhlYWQgKyBoYXNoaW5mby0+ZWhhc2hfc2l6ZSktPmNoYWluKTsKKwkvKiBTdGVwIDM6IEhhc2ggVFcgaW50byBUSU1FV0FJVCBjaGFpbi4gKi8KKwlpbmV0X3R3c2tfYWRkX25vZGUodHcsICZlaGVhZC0+dHdjaGFpbik7CiAJYXRvbWljX2luYygmdHctPnR3X3JlZmNudCk7CiAKIAl3cml0ZV91bmxvY2soJmVoZWFkLT5sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2dyZS5jIGIvbmV0L2lwdjQvaXBfZ3JlLmMKaW5kZXggNDc2Y2I2MC4uNTFjODM1MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZ3JlLmMKKysrIGIvbmV0L2lwdjQvaXBfZ3JlLmMKQEAgLTEwMDgsNyArMTAwOCw4IEBACiAJCQkJZ290byBkb25lOwogCQkJZGV2ID0gdC0+ZGV2OwogCQl9Ci0JCWVyciA9IHVucmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CisJCWVyciA9IDA7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwaXAuYyBiL25ldC9pcHY0L2lwaXAuYwppbmRleCA5ZDcxOWQ2Li5kYThiYmQyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGlwLmMKKysrIGIvbmV0L2lwdjQvaXBpcC5jCkBAIC03NTQsNyArNzU0LDggQEAKIAkJCQlnb3RvIGRvbmU7CiAJCQlkZXYgPSB0LT5kZXY7CiAJCX0KLQkJZXJyID0gdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwkJZXJyID0gMDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCA0N2JkM2FkMS4uOWIwOGU3YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTM2MSwzMiArMzYxLDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUF9ORl9UQVJHRVRfVENQTVNTCi0JdHJpc3RhdGUgIlRDUE1TUyB0YXJnZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBUQ1BNU1MnIHRhcmdldCwgd2hpY2ggYWxsb3dzIHlvdSB0byBhbHRlciB0aGUKLQkgIE1TUyB2YWx1ZSBvZiBUQ1AgU1lOIHBhY2tldHMsIHRvIGNvbnRyb2wgdGhlIG1heGltdW0gc2l6ZSBmb3IgdGhhdAotCSAgY29ubmVjdGlvbiAodXN1YWxseSBsaW1pdGluZyBpdCB0byB5b3VyIG91dGdvaW5nIGludGVyZmFjZSdzIE1UVQotCSAgbWludXMgNDApLgotCi0JICBUaGlzIGlzIHVzZWQgdG8gb3ZlcmNvbWUgY3JpbWluYWxseSBicmFpbmRlYWQgSVNQcyBvciBzZXJ2ZXJzIHdoaWNoCi0JICBibG9jayBJQ01QIEZyYWdtZW50YXRpb24gTmVlZGVkIHBhY2tldHMuICBUaGUgc3ltcHRvbXMgb2YgdGhpcwotCSAgcHJvYmxlbSBhcmUgdGhhdCBldmVyeXRoaW5nIHdvcmtzIGZpbmUgZnJvbSB5b3VyIExpbnV4Ci0JICBmaXJld2FsbC9yb3V0ZXIsIGJ1dCBtYWNoaW5lcyBiZWhpbmQgaXQgY2FuIG5ldmVyIGV4Y2hhbmdlIGxhcmdlCi0JICBwYWNrZXRzOgotCSAgCTEpIFdlYiBicm93c2VycyBjb25uZWN0LCB0aGVuIGhhbmcgd2l0aCBubyBkYXRhIHJlY2VpdmVkLgotCSAgCTIpIFNtYWxsIG1haWwgd29ya3MgZmluZSwgYnV0IGxhcmdlIGVtYWlscyBoYW5nLgotCSAgCTMpIHNzaCB3b3JrcyBmaW5lLCBidXQgc2NwIGhhbmdzIGFmdGVyIGluaXRpYWwgaGFuZHNoYWtpbmcuCi0KLQkgIFdvcmthcm91bmQ6IGFjdGl2YXRlIHRoaXMgb3B0aW9uIGFuZCBhZGQgYSBydWxlIHRvIHlvdXIgZmlyZXdhbGwKLQkgIGNvbmZpZ3VyYXRpb24gbGlrZToKLQotCSAgaXB0YWJsZXMgLUEgRk9SV0FSRCAtcCB0Y3AgLS10Y3AtZmxhZ3MgU1lOLFJTVCBTWU4gXAotCSAgCQkgLWogVENQTVNTIC0tY2xhbXAtbXNzLXRvLXBtdHUKLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KICMgTkFUICsgc3BlY2lmaWMgdGFyZ2V0czogaXBfY29ubnRyYWNrCiBjb25maWcgSVBfTkZfTkFUCiAJdHJpc3RhdGUgIkZ1bGwgTkFUIgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IDE2ZDE3N2IuLjY2MjVlYzYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTEwMyw3ICsxMDMsNiBAQAogb2JqLSQoQ09ORklHX0lQX05GX05BVF9TTk1QX0JBU0lDKSArPSBpcF9uYXRfc25tcF9iYXNpYy5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX0xPRykgKz0gaXB0X0xPRy5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX1VMT0cpICs9IGlwdF9VTE9HLm8KLW9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfVENQTVNTKSArPSBpcHRfVENQTVNTLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfQ0xVU1RFUklQKSArPSBpcHRfQ0xVU1RFUklQLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfVFRMKSArPSBpcHRfVFRMLm8KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b190Y3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdGNwLmMKaW5kZXggMDZlNGU4YS4uYzM0ZjQ4ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b190Y3AuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3RjcC5jCkBAIC01MCwxMiArNTAsOSBAQAogICAgIElmIGl0J3Mgbm9uLXplcm8sIHdlIG1hcmsgb25seSBvdXQgb2Ygd2luZG93IFJTVCBzZWdtZW50cyBhcyBJTlZBTElELiAqLwogaW50IGlwX2N0X3RjcF9iZV9saWJlcmFsIF9fcmVhZF9tb3N0bHkgPSAwOwogCi0vKiBXaGVuIGNvbm5lY3Rpb24gaXMgcGlja2VkIHVwIGZyb20gdGhlIG1pZGRsZSwgaG93IG1hbnkgcGFja2V0cyBhcmUgcmVxdWlyZWQKLSAgIHRvIHBhc3MgaW4gZWFjaCBkaXJlY3Rpb24gd2hlbiB3ZSBhc3N1bWUgd2UgYXJlIGluIHN5bmMgLSBpZiBhbnkgc2lkZSB1c2VzCi0gICB3aW5kb3cgc2NhbGluZywgd2UgbG9zdCB0aGUgZ2FtZS4gCi0gICBJZiBpdCBpcyBzZXQgdG8gemVybywgd2UgZGlzYWJsZSBwaWNraW5nIHVwIGFscmVhZHkgZXN0YWJsaXNoZWQgCisvKiBJZiBpdCBpcyBzZXQgdG8gemVybywgd2UgZGlzYWJsZSBwaWNraW5nIHVwIGFscmVhZHkgZXN0YWJsaXNoZWQKICAgIGNvbm5lY3Rpb25zLiAqLwotaW50IGlwX2N0X3RjcF9sb29zZSBfX3JlYWRfbW9zdGx5ID0gMzsKK2ludCBpcF9jdF90Y3BfbG9vc2UgX19yZWFkX21vc3RseSA9IDE7CiAKIC8qIE1heCBudW1iZXIgb2YgdGhlIHJldHJhbnNtaXR0ZWQgcGFja2V0cyB3aXRob3V0IHJlY2VpdmluZyBhbiAoYWNjZXB0YWJsZSkgCiAgICBBQ0sgZnJvbSB0aGUgZGVzdGluYXRpb24uIElmIHRoaXMgbnVtYmVyIGlzIHJlYWNoZWQsIGEgc2hvcnRlciB0aW1lciAKQEAgLTY5NCwxMSArNjkxLDEwIEBACiAJICAgIAliZWZvcmUoc2FjaywgcmVjZWl2ZXItPnRkX2VuZCArIDEpLAogCSAgICAJYWZ0ZXIoYWNrLCByZWNlaXZlci0+dGRfZW5kIC0gTUFYQUNLV0lORE9XKHNlbmRlcikpKTsKIAkKLQlpZiAoc2VuZGVyLT5sb29zZSB8fCByZWNlaXZlci0+bG9vc2UgfHwKLQkgICAgKGJlZm9yZShzZXEsIHNlbmRlci0+dGRfbWF4ZW5kICsgMSkgJiYKLQkgICAgIGFmdGVyKGVuZCwgc2VuZGVyLT50ZF9lbmQgLSByZWNlaXZlci0+dGRfbWF4d2luIC0gMSkgJiYKLQkgICAgIGJlZm9yZShzYWNrLCByZWNlaXZlci0+dGRfZW5kICsgMSkgJiYKLQkgICAgIGFmdGVyKGFjaywgcmVjZWl2ZXItPnRkX2VuZCAtIE1BWEFDS1dJTkRPVyhzZW5kZXIpKSkpIHsKKwlpZiAoYmVmb3JlKHNlcSwgc2VuZGVyLT50ZF9tYXhlbmQgKyAxKSAmJgorCSAgICBhZnRlcihlbmQsIHNlbmRlci0+dGRfZW5kIC0gcmVjZWl2ZXItPnRkX21heHdpbiAtIDEpICYmCisJICAgIGJlZm9yZShzYWNrLCByZWNlaXZlci0+dGRfZW5kICsgMSkgJiYKKwkgICAgYWZ0ZXIoYWNrLCByZWNlaXZlci0+dGRfZW5kIC0gTUFYQUNLV0lORE9XKHNlbmRlcikpKSB7CiAJICAgIAkvKgogCQkgKiBUYWtlIGludG8gYWNjb3VudCB3aW5kb3cgc2NhbGluZyAoUkZDIDEzMjMpLgogCQkgKi8KQEAgLTc0MywxNSArNzM5LDEzIEBACiAJCQkJc3RhdGUtPnJldHJhbnMgPSAwOwogCQkJfQogCQl9Ci0JCS8qCi0JCSAqIENsb3NlIHRoZSB3aW5kb3cgb2YgZGlzYWJsZWQgd2luZG93IHRyYWNraW5nIDotKQotCQkgKi8KLQkJaWYgKHNlbmRlci0+bG9vc2UpCi0JCQlzZW5kZXItPmxvb3NlLS07Ci0JCQogCQlyZXMgPSAxOwogCX0gZWxzZSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCisJCXJlcyA9IDA7CisJCWlmIChzZW5kZXItPmZsYWdzICYgSVBfQ1RfVENQX0ZMQUdfQkVfTElCRVJBTCB8fAorCQkgICAgaXBfY3RfdGNwX2JlX2xpYmVyYWwpCisJCQlyZXMgPSAxOworCQlpZiAoIXJlcyAmJiBMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCiAJCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJCSJpcF9jdF90Y3A6ICVzICIsCiAJCQliZWZvcmUoc2VxLCBzZW5kZXItPnRkX21heGVuZCArIDEpID8KQEAgLTc2Miw4ICs3NTYsNiBAQAogCQkJOiAiQUNLIGlzIG92ZXIgdGhlIHVwcGVyIGJvdW5kIChBQ0tlZCBkYXRhIG5vdCBzZWVuIHlldCkiCiAJCQk6ICJTRVEgaXMgdW5kZXIgdGhlIGxvd2VyIGJvdW5kIChhbHJlYWR5IEFDS2VkIGRhdGEgcmV0cmFuc21pdHRlZCkiCiAJCQk6ICJTRVEgaXMgb3ZlciB0aGUgdXBwZXIgYm91bmQgKG92ZXIgdGhlIHdpbmRvdyBvZiB0aGUgcmVjZWl2ZXIpIik7Ci0KLQkJcmVzID0gaXBfY3RfdGNwX2JlX2xpYmVyYWw7CiAgIAl9CiAgIAogCURFQlVHUCgidGNwX2luX3dpbmRvdzogcmVzPSVpIHNlbmRlciBlbmQ9JXUgbWF4ZW5kPSV1IG1heHdpbj0ldSAiCkBAIC0xMTA1LDggKzEwOTcsNiBAQAogCiAJCXRjcF9vcHRpb25zKHNrYiwgaXBoLCB0aCwgJmNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0pOwogCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLmZsYWdzID0gMDsKLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS5sb29zZSA9IAotCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLmxvb3NlID0gMDsKIAl9IGVsc2UgaWYgKGlwX2N0X3RjcF9sb29zZSA9PSAwKSB7CiAJCS8qIERvbid0IHRyeSB0byBwaWNrIHVwIGNvbm5lY3Rpb25zLiAqLwogCQlyZXR1cm4gMDsKQEAgLTExMjcsMTEgKzExMTcsMTEgQEAKIAkJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfbWF4d2luOwogCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX3NjYWxlID0gMDsKIAotCQkvKiBXZSBhc3N1bWUgU0FDSy4gU2hvdWxkIHdlIGFzc3VtZSB3aW5kb3cgc2NhbGluZyB0b28/ICovCisJCS8qIFdlIGFzc3VtZSBTQUNLIGFuZCBsaWJlcmFsIHdpbmRvdyBjaGVja2luZyB0byBoYW5kbGUKKwkJICogd2luZG93IHNjYWxpbmcgKi8KIAkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS5mbGFncyA9Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0uZmxhZ3MgPSBJUF9DVF9UQ1BfRkxBR19TQUNLX1BFUk07Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0ubG9vc2UgPSAKLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS5sb29zZSA9IGlwX2N0X3RjcF9sb29zZTsKKwkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS5mbGFncyA9IElQX0NUX1RDUF9GTEFHX1NBQ0tfUEVSTSB8CisJCQkJCQkgICAgIElQX0NUX1RDUF9GTEFHX0JFX0xJQkVSQUw7CiAJfQogICAgIAogCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0udGRfZW5kID0gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfY29yZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9jb3JlLmMKaW5kZXggOWQxYTUxNy4uNWUwOGMyYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9jb3JlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9jb3JlLmMKQEAgLTI0Niw4ICsyNDYsOSBAQAogCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykgewogCQlpZiAoZmluZF9hcHByb3ByaWF0ZV9zcmMob3JpZ190dXBsZSwgdHVwbGUsIHJhbmdlKSkgewogCQkJREVCVUdQKCJnZXRfdW5pcXVlX3R1cGxlOiBGb3VuZCBjdXJyZW50IHNyYyBtYXBcbiIpOwotCQkJaWYgKCFpcF9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY29ubnRyYWNrKSkKLQkJCQlyZXR1cm47CisJCQlpZiAoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKSkKKwkJCQlpZiAoIWlwX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjb25udHJhY2spKQorCQkJCQlyZXR1cm47CiAJCX0KIAl9CiAKQEAgLTI2MSw2ICsyNjIsMTMgQEAKIAogCXByb3RvID0gaXBfbmF0X3Byb3RvX2ZpbmRfZ2V0KG9yaWdfdHVwbGUtPmRzdC5wcm90b251bSk7CiAKKwkvKiBDaGFuZ2UgcHJvdG9jb2wgaW5mbyB0byBoYXZlIHNvbWUgcmFuZG9taXphdGlvbiAqLworCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKSB7CisJCXByb3RvLT51bmlxdWVfdHVwbGUodHVwbGUsIHJhbmdlLCBtYW5pcHR5cGUsIGNvbm50cmFjayk7CisJCWlwX25hdF9wcm90b19wdXQocHJvdG8pOworCQlyZXR1cm47CisJfQorCiAJLyogT25seSBib3RoZXIgbWFwcGluZyBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHJhbmdlIGFuZCB1bmlxdWUgKi8KIAlpZiAoKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkKIAkgICAgIHx8IHByb3RvLT5pbl9yYW5nZSh0dXBsZSwgbWFuaXB0eXBlLCAmcmFuZ2UtPm1pbiwgJnJhbmdlLT5tYXgpKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyLmMKaW5kZXggZWU4MGZlYi4uMmU1YzRiYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlci5jCkBAIC0xODMsNyArMTgzLDcgQEAKIAlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gaXBoLT5paGwqNDsKIAlpZiAoKCpwc2tiKS0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpIHsKIAkJdGNwaC0+Y2hlY2sgPSAwOwotCQl0Y3BoLT5jaGVjayA9IHRjcF92NF9jaGVjayh0Y3BoLCBkYXRhbGVuLAorCQl0Y3BoLT5jaGVjayA9IHRjcF92NF9jaGVjayhkYXRhbGVuLAogCQkJCQkgICBpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAogCQkJCQkgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil0Y3BoLAogCQkJCQkgICAJCWRhdGFsZW4sIDApKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3RjcC5jCmluZGV4IGI1ODZkMTguLjE0ZmYyNGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdGNwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b190Y3AuYwpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CkBAIC03NSw2ICs3NiwxMCBAQAogCQlyYW5nZV9zaXplID0gbnRvaHMocmFuZ2UtPm1heC50Y3AucG9ydCkgLSBtaW4gKyAxOwogCX0KIAorCS8qIFN0YXJ0IGZyb20gcmFuZG9tIHBvcnQgdG8gYXZvaWQgcHJlZGljdGlvbiAqLworCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKQorCQlwb3J0ID0gIG5ldF9yYW5kb20oKTsKKwogCWZvciAoaSA9IDA7IGkgPCByYW5nZV9zaXplOyBpKyssIHBvcnQrKykgewogCQkqcG9ydHB0ciA9IGh0b25zKG1pbiArIHBvcnQgJSByYW5nZV9zaXplKTsKIAkJaWYgKCFpcF9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY29ubnRyYWNrKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191ZHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdWRwLmMKaW5kZXggNWNlZDA4Ny4uZGZkNTIxNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191ZHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3VkcC5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KQEAgLTc0LDYgKzc1LDEwIEBACiAJCXJhbmdlX3NpemUgPSBudG9ocyhyYW5nZS0+bWF4LnVkcC5wb3J0KSAtIG1pbiArIDE7CiAJfQogCisJLyogU3RhcnQgZnJvbSByYW5kb20gcG9ydCB0byBhdm9pZCBwcmVkaWN0aW9uICovCisJaWYgKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pCisJCXBvcnQgPSBuZXRfcmFuZG9tKCk7CisKIAlmb3IgKGkgPSAwOyBpIDwgcmFuZ2Vfc2l6ZTsgaSsrLCBwb3J0KyspIHsKIAkJKnBvcnRwdHIgPSBodG9ucyhtaW4gKyBwb3J0ICUgcmFuZ2Vfc2l6ZSk7CiAJCWlmICghaXBfbmF0X3VzZWRfdHVwbGUodHVwbGUsIGNvbm50cmFjaykpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcnVsZS5jCmluZGV4IGExNzZhYTMuLmUxYzhhMDUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcnVsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcnVsZS5jCkBAIC04Niw3ICs4Niw3IEBACiAgICAgfQogfTsKIAotc3RhdGljIHN0cnVjdCBpcHRfdGFibGUgbmF0X3RhYmxlID0geworc3RhdGljIHN0cnVjdCB4dF90YWJsZSBuYXRfdGFibGUgPSB7CiAJLm5hbWUJCT0gIm5hdCIsCiAJLnZhbGlkX2hvb2tzCT0gTkFUX1ZBTElEX0hPT0tTLAogCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCkBAIC05OSw3ICs5OSw3IEBACiAJCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKIAkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKIAkJCQkgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQsCisJCQkJICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKIAkJCQkgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCiB7CiAJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CkBAIC0xNDEsNyArMTQxLDcgQEAKIAkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCQkJCSAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCQkgICAgY29uc3Qgc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAogCQkJCSAgICBjb25zdCB2b2lkICp0YXJnaW5mbykKIHsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKQEAgLTE2Niw3ICsxNjYsNyBAQAogCiBzdGF0aWMgaW50IGlwdF9zbmF0X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAogCQkJICAgICAgIGNvbnN0IHZvaWQgKmVudHJ5LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAogCQkJICAgICAgIHZvaWQgKnRhcmdpbmZvLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CkBAIC0xODIsNyArMTgyLDcgQEAKIAogc3RhdGljIGludCBpcHRfZG5hdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKIAkJCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X3RhcmdldCAqdGFyZ2V0LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKIAkJCSAgICAgICB2b2lkICp0YXJnaW5mbywKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewpAQCAtMTkzLDYgKzE5MywxMCBAQAogCQlwcmludGsoIkROQVQ6IG11bHRpcGxlIHJhbmdlcyBubyBsb25nZXIgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQorCWlmIChtci0+cmFuZ2VbMF0uZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKSB7CisJCXByaW50aygiRE5BVDogcG9ydCByYW5kb21pemF0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTI1Nyw4ICsyNjEsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfc25hdF9yZWcgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfc25hdF9yZWcgPSB7CiAJLm5hbWUJCT0gIlNOQVQiLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudGFyZ2V0CQk9IGlwdF9zbmF0X3RhcmdldCwKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCiAJLnRhYmxlCQk9ICJuYXQiLApAQCAtMjY2LDggKzI3MSw5IEBACiAJLmNoZWNrZW50cnkJPSBpcHRfc25hdF9jaGVja2VudHJ5LAogfTsKIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9kbmF0X3JlZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF9kbmF0X3JlZyA9IHsKIAkubmFtZQkJPSAiRE5BVCIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS50YXJnZXQJCT0gaXB0X2RuYXRfdGFyZ2V0LAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKIAkudGFibGUJCT0gIm5hdCIsCkBAIC0yODIsMjcgKzI4OCwyNyBAQAogCXJldCA9IGlwdF9yZWdpc3Rlcl90YWJsZSgmbmF0X3RhYmxlLCAmbmF0X2luaXRpYWxfdGFibGUucmVwbCk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwotCXJldCA9IGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7CisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfc25hdF9yZWcpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byB1bnJlZ2lzdGVyX3RhYmxlOwogCi0JcmV0ID0gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X2RuYXRfcmVnKTsKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9kbmF0X3JlZyk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIHVucmVnaXN0ZXJfc25hdDsKIAogCXJldHVybiByZXQ7CiAKICB1bnJlZ2lzdGVyX3NuYXQ6Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfc25hdF9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfc25hdF9yZWcpOwogIHVucmVnaXN0ZXJfdGFibGU6Ci0JaXB0X3VucmVnaXN0ZXJfdGFibGUoJm5hdF90YWJsZSk7CisJeHRfdW5yZWdpc3Rlcl90YWJsZSgmbmF0X3RhYmxlKTsKIAogCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgaXBfbmF0X3J1bGVfY2xlYW51cCh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X2RuYXRfcmVnKTsKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9kbmF0X3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7CiAJaXB0X3VucmVnaXN0ZXJfdGFibGUoJm5hdF90YWJsZSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKaW5kZXggZmMxZjE1My4uNWE3YjNhMzQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKQEAgLTIxNiw3ICsyMTYsNyBAQAogCSAgICAgdW5zaWduZWQgaW50IGhvb2ssCiAJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgICAgc3RydWN0IGlwdF90YWJsZSAqdGFibGUpCisJICAgICBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKQogewogCXN0YXRpYyBjb25zdCBjaGFyIG51bGxkZXZuYW1lW0lGTkFNU0laXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKHNpemVvZihsb25nKSkpKTsKIAl1X2ludDE2X3Qgb2Zmc2V0OwpAQCAtNTA3LDcgKzUwNyw3IEBACiBzdGF0aWMgaW5saW5lIGludCBjaGVja19tYXRjaChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLCBjb25zdCBjaGFyICpuYW1lLAogCQkJCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLCB1bnNpZ25lZCBpbnQgaG9va21hc2spCiB7Ci0Jc3RydWN0IGlwdF9tYXRjaCAqbWF0Y2g7CisJc3RydWN0IHh0X21hdGNoICptYXRjaDsKIAlpbnQgcmV0OwogCiAJbWF0Y2ggPSBtLT51Lmtlcm5lbC5tYXRjaDsKQEAgLTUzMSw3ICs1MzEsNyBAQAogCSAgICB1bnNpZ25lZCBpbnQgaG9va21hc2ssCiAJICAgIHVuc2lnbmVkIGludCAqaSkKIHsKLQlzdHJ1Y3QgaXB0X21hdGNoICptYXRjaDsKKwlzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoOwogCWludCByZXQ7CiAKIAltYXRjaCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfbWF0Y2goQUZfSU5FVCwgbS0+dS51c2VyLm5hbWUsCkBAIC01NTcsNyArNTU3LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3RhcmdldChzdHJ1Y3QgaXB0X2VudHJ5ICplLCBjb25zdCBjaGFyICpuYW1lKQogewogIAlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdDsKLSAJc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldDsKKwlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CiAgCWludCByZXQ7CiAKIAl0ID0gaXB0X2dldF90YXJnZXQoZSk7CkBAIC01ODAsNyArNTgwLDcgQEAKIAkgICAgdW5zaWduZWQgaW50ICppKQogewogCXN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0OwotCXN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQ7CisJc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0OwogCWludCByZXQ7CiAJdW5zaWduZWQgaW50IGo7CiAKQEAgLTgxOCw3ICs4MTgsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgeHRfY291bnRlcnMgKiBhbGxvY19jb3VudGVycyhzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHh0X2NvdW50ZXJzICogYWxsb2NfY291bnRlcnMoc3RydWN0IHh0X3RhYmxlICp0YWJsZSkKIHsKIAl1bnNpZ25lZCBpbnQgY291bnRlcnNpemU7CiAJc3RydWN0IHh0X2NvdW50ZXJzICpjb3VudGVyczsKQEAgLTg0Myw3ICs4NDMsNyBAQAogCiBzdGF0aWMgaW50CiBjb3B5X2VudHJpZXNfdG9fdXNlcih1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZSwKLQkJICAgICBzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSwKKwkJICAgICBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAogCQkgICAgIHZvaWQgX191c2VyICp1c2VycHRyKQogewogCXVuc2lnbmVkIGludCBvZmYsIG51bTsKQEAgLTEwNDYsNyArMTA0Niw3IEBACiBzdGF0aWMgaW50IGdldF9pbmZvKHZvaWQgX191c2VyICp1c2VyLCBpbnQgKmxlbiwgaW50IGNvbXBhdCkKIHsKIAljaGFyIG5hbWVbSVBUX1RBQkxFX01BWE5BTUVMRU5dOwotCXN0cnVjdCBpcHRfdGFibGUgKnQ7CisJc3RydWN0IHh0X3RhYmxlICp0OwogCWludCByZXQ7CiAKIAlpZiAoKmxlbiAhPSBzaXplb2Yoc3RydWN0IGlwdF9nZXRpbmZvKSkgewpAQCAtMTEwNyw3ICsxMTA3LDcgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBpcHRfZ2V0X2VudHJpZXMgZ2V0OwotCXN0cnVjdCBpcHRfdGFibGUgKnQ7CisJc3RydWN0IHh0X3RhYmxlICp0OwogCiAJaWYgKCpsZW4gPCBzaXplb2YoZ2V0KSkgewogCQlkdXByaW50ZigiZ2V0X2VudHJpZXM6ICV1IDwgJWRcbiIsICpsZW4sCkBAIC0xMTUxLDcgKzExNTEsNyBAQAogCQl2b2lkIF9fdXNlciAqY291bnRlcnNfcHRyKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGlwdF90YWJsZSAqdDsKKwlzdHJ1Y3QgeHRfdGFibGUgKnQ7CiAJc3RydWN0IHh0X3RhYmxlX2luZm8gKm9sZGluZm87CiAJc3RydWN0IHh0X2NvdW50ZXJzICpjb3VudGVyczsKIAl2b2lkICpsb2NfY3B1X29sZF9lbnRyeTsKQEAgLTEzMDIsNyArMTMwMiw3IEBACiAJY2hhciAqbmFtZTsKIAlpbnQgc2l6ZTsKIAl2b2lkICpwdG1wOwotCXN0cnVjdCBpcHRfdGFibGUgKnQ7CisJc3RydWN0IHh0X3RhYmxlICp0OwogCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOwogCWludCByZXQgPSAwOwogCXZvaWQgKmxvY19jcHVfZW50cnk7CkBAIC0xNDM3LDcgKzE0MzcsNyBAQAogCSAgICB1bnNpZ25lZCBpbnQgaG9va21hc2ssCiAJICAgIGludCAqc2l6ZSwgaW50ICppKQogewotCXN0cnVjdCBpcHRfbWF0Y2ggKm1hdGNoOworCXN0cnVjdCB4dF9tYXRjaCAqbWF0Y2g7CiAKIAltYXRjaCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfbWF0Y2goQUZfSU5FVCwgbS0+dS51c2VyLm5hbWUsCiAJCQkJCQkgICBtLT51LnVzZXIucmV2aXNpb24pLApAQCAtMTQ2Niw3ICsxNDY2LDcgQEAKIAkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQ7Ci0Jc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldDsKKwlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CiAJdW5zaWduZWQgaW50IGVudHJ5X29mZnNldDsKIAlpbnQgcmV0LCBvZmYsIGgsIGo7CiAKQEAgLTE1NTAsNyArMTU1MCw3IEBACiAJc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sIHVuc2lnbmVkIGNoYXIgKmJhc2UpCiB7CiAJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQ7Ci0Jc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldDsKKwlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CiAJc3RydWN0IGlwdF9lbnRyeSAqZGU7CiAJdW5zaWduZWQgaW50IG9yaWdzaXplOwogCWludCByZXQsIGg7CkBAIC0xNzk1LDcgKzE3OTUsNyBAQAogfTsKIAogc3RhdGljIGludCBjb21wYXRfY29weV9lbnRyaWVzX3RvX3VzZXIodW5zaWduZWQgaW50IHRvdGFsX3NpemUsCi0JCSAgICAgc3RydWN0IGlwdF90YWJsZSAqdGFibGUsIHZvaWQgX191c2VyICp1c2VycHRyKQorCQkgICAgIHN0cnVjdCB4dF90YWJsZSAqdGFibGUsIHZvaWQgX191c2VyICp1c2VycHRyKQogewogCXVuc2lnbmVkIGludCBvZmYsIG51bTsKIAlzdHJ1Y3QgY29tcGF0X2lwdF9lbnRyeSBlOwpAQCAtMTg2OSw3ICsxODY5LDcgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBjb21wYXRfaXB0X2dldF9lbnRyaWVzIGdldDsKLQlzdHJ1Y3QgaXB0X3RhYmxlICp0OworCXN0cnVjdCB4dF90YWJsZSAqdDsKIAogCiAJaWYgKCpsZW4gPCBzaXplb2YoZ2V0KSkgewpAQCAtMjA1Miw3ICsyMDUyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpcHRfdW5yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSkKK3ZvaWQgaXB0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSkKIHsKIAlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwpAQCAtMjEyNCw3ICsyMTI0LDcgQEAKIH0KIAogLyogVGhlIGJ1aWx0LWluIHRhcmdldHM6IHN0YW5kYXJkIChOVUxMKSBhbmQgZXJyb3IuICovCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X3N0YW5kYXJkX3RhcmdldCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF9zdGFuZGFyZF90YXJnZXQgPSB7CiAJLm5hbWUJCT0gSVBUX1NUQU5EQVJEX1RBUkdFVCwKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihpbnQpLAogCS5mYW1pbHkJCT0gQUZfSU5FVCwKQEAgLTIxMzUsNyArMjEzNSw3IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfZXJyb3JfdGFyZ2V0ID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X2Vycm9yX3RhcmdldCA9IHsKIAkubmFtZQkJPSBJUFRfRVJST1JfVEFSR0VULAogCS50YXJnZXQJCT0gaXB0X2Vycm9yLAogCS50YXJnZXRzaXplCT0gSVBUX0ZVTkNUSU9OX01BWE5BTUVMRU4sCkBAIC0yMTU4LDcgKzIxNTgsNyBAQAogI2VuZGlmCiB9OwogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBpY21wX21hdGNoc3RydWN0ID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBpY21wX21hdGNoc3RydWN0ID0gewogCS5uYW1lCQk9ICJpY21wIiwKIAkubWF0Y2gJCT0gaWNtcF9tYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfaWNtcCksCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYwppbmRleCBiMWMxMTE2Li4zNDNjMmFiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKQEAgLTI2LDYgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAuaD4KIAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTFVTVEVSSVAuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KQEAgLTI0Nyw2ICsyNDgsNyBAQAogCXN3aXRjaCAoaXBoLT5wcm90b2NvbCkgewogCWNhc2UgSVBQUk9UT19UQ1A6CiAJY2FzZSBJUFBST1RPX1VEUDoKKwljYXNlIElQUFJPVE9fVURQTElURToKIAljYXNlIElQUFJPVE9fU0NUUDoKIAljYXNlIElQUFJPVE9fRENDUDoKIAljYXNlIElQUFJPVE9fSUNNUDoKQEAgLTMyOSw3ICszMzEsNyBAQAogCWlmICgoKnBza2IpLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fSUNNUAogCSAgICAmJiAoY3RpbmZvID09IElQX0NUX1JFTEFURUQgCiAJCXx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEK0lQX0NUX0lTX1JFUExZKSkKLQkJcmV0dXJuIElQVF9DT05USU5VRTsKKwkJcmV0dXJuIFhUX0NPTlRJTlVFOwogCiAJLyogaXBfY29ubnRyYWNrX2ljbXAgZ3VhcmFudGVlcyB1cyB0aGF0IHdlIG9ubHkgaGF2ZSBJQ01QX0VDSE8sIAogCSAqIFRJTUVTVEFNUCwgSU5GT19SRVFVRVNUIG9yIEFERFJFU1MgdHlwZSBpY21wIHBhY2tldHMgZnJvbSBoZXJlCkBAIC0zNjcsNyArMzY5LDcgQEAKIAkgKiBhY3R1YWxseSBhIHVuaWNhc3QgSVAgcGFja2V0LiBUQ1AgZG9lc24ndCBsaWtlIFBBQ0tFVF9NVUxUSUNBU1QgKi8KIAkoKnBza2IpLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwogCi0JcmV0dXJuIElQVF9DT05USU5VRTsKKwlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQ3MCw4ICs0NzIsOSBAQAogCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dCh0YXJnZXQtPmZhbWlseSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBjbHVzdGVyaXBfdGd0ID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgY2x1c3RlcmlwX3RndCA9IHsKIAkubmFtZQkJPSAiQ0xVU1RFUklQIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnRhcmdldAkJPSB0YXJnZXQsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF9jbHVzdGVyaXBfdGd0X2luZm8pLAogCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKQEAgLTcyNyw3ICs3MzAsNyBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZjbHVzdGVyaXBfdGd0KTsKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoJmNsdXN0ZXJpcF90Z3QpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC03NTMsNyArNzU2LDcgQEAKIAluZl91bnJlZ2lzdGVyX2hvb2soJmNpcF9hcnBfb3BzKTsKICNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogY2xlYW51cF90YXJnZXQ6Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZjbHVzdGVyaXBfdGd0KTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmY2x1c3RlcmlwX3RndCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzY1LDcgKzc2OCw3IEBACiAJcmVtb3ZlX3Byb2NfZW50cnkoY2x1c3RlcmlwX3Byb2NkaXItPm5hbWUsIGNsdXN0ZXJpcF9wcm9jZGlyLT5wYXJlbnQpOwogI2VuZGlmCiAJbmZfdW5yZWdpc3Rlcl9ob29rKCZjaXBfYXJwX29wcyk7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZjbHVzdGVyaXBfdGd0KTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmY2x1c3RlcmlwX3RndCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwdF9jbHVzdGVyaXBfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYwppbmRleCBiNTVkNjcwLi5iNWNhNTkzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMKQEAgLTksMTIgKzksMTQgQEAKICAqIGlwdF9FQ04uYyx2IDEuNSAyMDAyLzA4LzE4IDE5OjM2OjUxIGxhZm9yZ2UgRXhwCiAqLwogCisjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0VDTi5oPgogCkBAIC05NSw3ICs5Nyw3IEBACiAJCWlmICghc2V0X2VjdF90Y3AocHNrYiwgZWluZm8pKQogCQkJcmV0dXJuIE5GX0RST1A7CiAKLQlyZXR1cm4gSVBUX0NPTlRJTlVFOworCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludApAQCAtMTE5LDcgKzEyMSw3IEBACiAJCXJldHVybiAwOwogCX0KIAlpZiAoKGVpbmZvLT5vcGVyYXRpb24gJiAoSVBUX0VDTl9PUF9TRVRfRUNFfElQVF9FQ05fT1BfU0VUX0NXUikpCi0JICAgICYmIChlLT5pcC5wcm90byAhPSBJUFBST1RPX1RDUCB8fCAoZS0+aXAuaW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkpIHsKKwkgICAgJiYgKGUtPmlwLnByb3RvICE9IElQUFJPVE9fVENQIHx8IChlLT5pcC5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVDTjogY2Fubm90IHVzZSBUQ1Agb3BlcmF0aW9ucyBvbiBhICIKIAkJICAgICAgICJub24tdGNwIHJ1bGVcbiIpOwogCQlyZXR1cm4gMDsKQEAgLTEyNyw4ICsxMjksOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X2Vjbl9yZWcgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfZWNuX3JlZyA9IHsKIAkubmFtZQkJPSAiRUNOIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnRhcmdldAkJPSB0YXJnZXQsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF9FQ05faW5mbyksCiAJLnRhYmxlCQk9ICJtYW5nbGUiLApAQCAtMTM4LDEyICsxNDEsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXB0X2Vjbl9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9lY25fcmVnKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfZWNuX3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHRfZWNuX2Zpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9lY25fcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X2Vjbl9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChpcHRfZWNuX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKaW5kZXggYzk2ZGUxNi4uZjY4MzcwZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTE9HLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTQzMiw3ICs0MzIsNyBAQAogCiAJaXB0X2xvZ19wYWNrZXQoUEZfSU5FVCwgaG9va251bSwgKnBza2IsIGluLCBvdXQsICZsaSwKIAkgICAgICAgICAgICAgICBsb2dpbmZvLT5wcmVmaXgpOwotCXJldHVybiBJUFRfQ09OVElOVUU7CisJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50IGlwdF9sb2dfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCkBAIC00NTUsOCArNDU1LDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9sb2dfcmVnID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X2xvZ19yZWcgPSB7CiAJLm5hbWUJCT0gIkxPRyIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS50YXJnZXQJCT0gaXB0X2xvZ190YXJnZXQsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF9sb2dfaW5mbyksCiAJLmNoZWNrZW50cnkJPSBpcHRfbG9nX2NoZWNrZW50cnksCkBAIC00NzEsOCArNDcyLDExIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdF9sb2dfaW5pdCh2b2lkKQogewotCWlmIChpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbG9nX3JlZykpCi0JCXJldHVybiAtRUlOVkFMOworCWludCByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9sb2dfcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAlpZiAobmZfbG9nX3JlZ2lzdGVyKFBGX0lORVQsICZpcHRfbG9nX2xvZ2dlcikgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImlwdF9MT0c6IG5vdCBsb2dnaW5nIHZpYSBzeXN0ZW0gY29uc29sZSAiCiAJCSAgICAgICAic2luY2Ugc29tZWJvZHkgZWxzZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIFBGX0lORVRcbiIpOwpAQCAtNDg2LDcgKzQ5MCw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X2xvZ19maW5pKHZvaWQpCiB7CiAJbmZfbG9nX3VucmVnaXN0ZXJfbG9nZ2VyKCZpcHRfbG9nX2xvZ2dlcik7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbG9nX3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9sb2dfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X2xvZ19pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKaW5kZXggZDY2OTY4NS4uOTFjNDJlZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNlbHNlCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KICNlbmRpZgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOwpAQCAtMTkwLDggKzE5MCw5IEBACiAJLm5vdGlmaWVyX2NhbGwJPSBtYXNxX2luZXRfZXZlbnQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgbWFzcXVlcmFkZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IG1hc3F1ZXJhZGUgPSB7CiAJLm5hbWUJCT0gIk1BU1FVRVJBREUiLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudGFyZ2V0CQk9IG1hc3F1ZXJhZGVfdGFyZ2V0LAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKIAkudGFibGUJCT0gIm5hdCIsCkBAIC0yMDQsNyArMjA1LDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gaXB0X3JlZ2lzdGVyX3RhcmdldCgmbWFzcXVlcmFkZSk7CisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KCZtYXNxdWVyYWRlKTsKIAogCWlmIChyZXQgPT0gMCkgewogCQkvKiBSZWdpc3RlciBmb3IgZGV2aWNlIGRvd24gcmVwb3J0cyAqLwpAQCAtMjE4LDcgKzIxOSw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHRfbWFzcXVlcmFkZV9maW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZtYXNxdWVyYWRlKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmbWFzcXVlcmFkZSk7CiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm1hc3FfZGV2X25vdGlmaWVyKTsKIAl1bnJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZtYXNxX2luZXRfbm90aWZpZXIpOwkKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jCmluZGV4IDkzOTBlOTAuLmI0YWNjMjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmg+CiAjZWxzZQpAQCAtODgsOCArODksOSBAQAogCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBob29rbnVtKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IHRhcmdldF9tb2R1bGUgPSB7IAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgdGFyZ2V0X21vZHVsZSA9IHsKIAkubmFtZSAJCT0gTU9EVUxFTkFNRSwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnRhcmdldCAJPSB0YXJnZXQsIAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKIAkudGFibGUJCT0gIm5hdCIsCkBAIC0xMDEsMTIgKzEwMywxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHRfbmV0bWFwX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX3RhcmdldCgmdGFyZ2V0X21vZHVsZSk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmdGFyZ2V0X21vZHVsZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHRfbmV0bWFwX2Zpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJnRhcmdldF9tb2R1bGUpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZ0YXJnZXRfbW9kdWxlKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X25ldG1hcF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYwppbmRleCA0NjJlY2ViLi41NGNkMDIxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KICNlbHNlCkBAIC0xMDQsOCArMTA1LDkgQEAKIAlyZXR1cm4gaXBfbmF0X3NldHVwX2luZm8oY3QsICZuZXdyYW5nZSwgaG9va251bSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCByZWRpcmVjdF9yZWcgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCByZWRpcmVjdF9yZWcgPSB7CiAJLm5hbWUJCT0gIlJFRElSRUNUIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnRhcmdldAkJPSByZWRpcmVjdF90YXJnZXQsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQpLAogCS50YWJsZQkJPSAibmF0IiwKQEAgLTExNiwxMiArMTE4LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdF9yZWRpcmVjdF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl90YXJnZXQoJnJlZGlyZWN0X3JlZyk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmcmVkaXJlY3RfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwdF9yZWRpcmVjdF9maW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZyZWRpcmVjdF9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZyZWRpcmVjdF9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChpcHRfcmVkaXJlY3RfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYwppbmRleCBmMDMxOWU1Li5lNGExZGRiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L2RzdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9SRUpFQ1QuaD4KICNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgpAQCAtMTE2LDcgKzExNyw3IEBACiAKIAkvKiBBZGp1c3QgVENQIGNoZWNrc3VtICovCiAJdGNwaC0+Y2hlY2sgPSAwOwotCXRjcGgtPmNoZWNrID0gdGNwX3Y0X2NoZWNrKHRjcGgsIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSwKKwl0Y3BoLT5jaGVjayA9IHRjcF92NF9jaGVjayhzaXplb2Yoc3RydWN0IHRjcGhkciksCiAJCQkJICAgbnNrYi0+bmguaXBoLT5zYWRkciwKIAkJCQkgICBuc2tiLT5uaC5pcGgtPmRhZGRyLAogCQkJCSAgIGNzdW1fcGFydGlhbCgoY2hhciAqKXRjcGgsCkBAIC0yMzAsNyArMjMxLDcgQEAKIAl9IGVsc2UgaWYgKHJlamluZm8tPndpdGggPT0gSVBUX1RDUF9SRVNFVCkgewogCQkvKiBNdXN0IHNwZWNpZnkgdGhhdCBpdCdzIGEgVENQIHBhY2tldCAqLwogCQlpZiAoZS0+aXAucHJvdG8gIT0gSVBQUk9UT19UQ1AKLQkJICAgIHx8IChlLT5pcC5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pKSB7CisJCSAgICB8fCAoZS0+aXAuaW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pKSB7CiAJCQlERUJVR1AoIlJFSkVDVDogVENQX1JFU0VUIGludmFsaWQgZm9yIG5vbi10Y3BcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTIzOCw4ICsyMzksOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X3JlamVjdF9yZWcgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfcmVqZWN0X3JlZyA9IHsKIAkubmFtZQkJPSAiUkVKRUNUIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnRhcmdldAkJPSByZWplY3QsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF9yZWplY3RfaW5mbyksCiAJLnRhYmxlCQk9ICJmaWx0ZXIiLApAQCAtMjUxLDEyICsyNTMsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXB0X3JlamVjdF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9yZWplY3RfcmVnKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfcmVqZWN0X3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHRfcmVqZWN0X2Zpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9yZWplY3RfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X3JlamVjdF9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChpcHRfcmVqZWN0X2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYwppbmRleCAzZGNmMjk0Li5hMWNkZDEyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmg+CiAjZWxzZQpAQCAtMTg2LDggKzE4Nyw5IEBACiAJcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGN0LCAmbmV3cmFuZ2UsIGhvb2tudW0pOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgc2FtZV9yZWcgPSB7IAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgc2FtZV9yZWcgPSB7CiAJLm5hbWUJCT0gIlNBTUUiLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudGFyZ2V0CQk9IHNhbWVfdGFyZ2V0LAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfc2FtZV9pbmZvKSwKIAkudGFibGUJCT0gIm5hdCIsCkBAIC0xOTksMTIgKzIwMSwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHRfc2FtZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl90YXJnZXQoJnNhbWVfcmVnKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0KCZzYW1lX3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHRfc2FtZV9maW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZzYW1lX3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJnNhbWVfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X3NhbWVfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RDUE1TUy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UQ1BNU1MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlYjVjMy4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RDUE1TUy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qCi0gKiBUaGlzIGlzIGEgbW9kdWxlIHdoaWNoIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIE1TUyBvcHRpb24gaW4gVENQIHBhY2tldHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVENQTVNTLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBUQ1AgTVNTIG1vZGlmaWNhdGlvbiBtb2R1bGUiKTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLW9wdGxlbihjb25zdCB1X2ludDhfdCAqb3B0LCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCS8qIEJld2FyZSB6ZXJvLWxlbmd0aCBvcHRpb25zOiBtYWtlIGZpbml0ZSBwcm9ncmVzcyAqLwotCWlmIChvcHRbb2Zmc2V0XSA8PSBUQ1BPUFRfTk9QIHx8IG9wdFtvZmZzZXQrMV0gPT0gMCkKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gb3B0W29mZnNldCsxXTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotaXB0X3RjcG1zc190YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKLQkJICBjb25zdCB2b2lkICp0YXJnaW5mbykKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X3RjcG1zc19pbmZvICp0Y3Btc3NpbmZvID0gdGFyZ2luZm87Ci0Jc3RydWN0IHRjcGhkciAqdGNwaDsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKLQl1X2ludDE2X3QgdGNwbGVuLCBuZXdtc3M7Ci0JX19iZTE2IG5ld3RvdGxlbiwgb2xkdmFsOwotCXVuc2lnbmVkIGludCBpOwotCXVfaW50OF90ICpvcHQ7Ci0KLQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsICgqcHNrYiktPmxlbikpCi0JCXJldHVybiBORl9EUk9QOwotCi0JaXBoID0gKCpwc2tiKS0+bmguaXBoOwotCXRjcGxlbiA9ICgqcHNrYiktPmxlbiAtIGlwaC0+aWhsKjQ7Ci0JdGNwaCA9ICh2b2lkICopaXBoICsgaXBoLT5paGwqNDsKLQotCS8qIFNpbmNlIGl0IHBhc3NlZCBmbGFncyB0ZXN0IGluIHRjcCBtYXRjaCwgd2Uga25vdyBpdCBpcyBpcwotCSAgIG5vdCBhIGZyYWdtZW50LCBhbmQgaGFzIGRhdGEgPj0gdGNwIGhlYWRlciBsZW5ndGguICBTWU4KLQkgICBwYWNrZXRzIHNob3VsZCBub3QgY29udGFpbiBkYXRhOiBpZiB0aGV5IGRpZCwgdGhlbiB3ZSByaXNrCi0JICAgcnVubmluZyBvdmVyIE1UVSwgc2VuZGluZyBGcmFnIE5lZWRlZCBhbmQgYnJlYWtpbmcgdGhpbmdzCi0JICAgYmFkbHkuIC0tUlIgKi8KLQlpZiAodGNwbGVuICE9IHRjcGgtPmRvZmYqNCkgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImlwdF90Y3Btc3NfdGFyZ2V0OiBiYWQgbGVuZ3RoICglZCBieXRlcylcbiIsCi0JCQkgICAgICAgKCpwc2tiKS0+bGVuKTsKLQkJcmV0dXJuIE5GX0RST1A7Ci0JfQotCi0JaWYgKHRjcG1zc2luZm8tPm1zcyA9PSBJUFRfVENQTVNTX0NMQU1QX1BNVFUpIHsKLQkJaWYgKGRzdF9tdHUoKCpwc2tiKS0+ZHN0KSA8PSBzaXplb2Yoc3RydWN0IGlwaGRyKSArCi0JCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKSB7Ci0JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCXByaW50ayhLRVJOX0VSUiAiaXB0X3RjcG1zc190YXJnZXQ6ICIKLQkJCQkgICAgICAgInVua25vd24gb3IgaW52YWxpZCBwYXRoLU1UVSAoJWQpXG4iLAotCQkJCSAgICAgICBkc3RfbXR1KCgqcHNrYiktPmRzdCkpOwotCQkJcmV0dXJuIE5GX0RST1A7IC8qIG9yIElQVF9DT05USU5VRSA/PyAqLwotCQl9Ci0KLQkJbmV3bXNzID0gZHN0X210dSgoKnBza2IpLT5kc3QpIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgLQotCQkJCQkJIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKLQl9IGVsc2UKLQkJbmV3bXNzID0gdGNwbXNzaW5mby0+bXNzOwotCi0gCW9wdCA9ICh1X2ludDhfdCAqKXRjcGg7Ci0JZm9yIChpID0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOyBpIDwgdGNwaC0+ZG9mZio0OyBpICs9IG9wdGxlbihvcHQsIGkpKSB7Ci0JCWlmIChvcHRbaV0gPT0gVENQT1BUX01TUyAmJiB0Y3BoLT5kb2ZmKjQgLSBpID49IFRDUE9MRU5fTVNTICYmCi0JCSAgICBvcHRbaSsxXSA9PSBUQ1BPTEVOX01TUykgewotCQkJdV9pbnQxNl90IG9sZG1zczsKLQotCQkJb2xkbXNzID0gKG9wdFtpKzJdIDw8IDgpIHwgb3B0W2krM107Ci0KLQkJCWlmICh0Y3Btc3NpbmZvLT5tc3MgPT0gSVBUX1RDUE1TU19DTEFNUF9QTVRVICYmCi0JCQkgICAgb2xkbXNzIDw9IG5ld21zcykKLQkJCQlyZXR1cm4gSVBUX0NPTlRJTlVFOwotCi0JCQlvcHRbaSsyXSA9IChuZXdtc3MgJiAweGZmMDApID4+IDg7Ci0JCQlvcHRbaSszXSA9IChuZXdtc3MgJiAweDAwZmYpOwotCi0JCQluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZ0Y3BoLT5jaGVjaywgKnBza2IsCi0JCQkJCQlodG9ucyhvbGRtc3MpLCBodG9ucyhuZXdtc3MpLCAwKTsKLQkJCXJldHVybiBJUFRfQ09OVElOVUU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE1TUyBPcHRpb24gbm90IGZvdW5kID8hIGFkZCBpdC4uCi0JICovCi0JaWYgKHNrYl90YWlscm9vbSgoKnBza2IpKSA8IFRDUE9MRU5fTVNTKSB7Ci0JCXN0cnVjdCBza19idWZmICpuZXdza2I7Ci0KLQkJbmV3c2tiID0gc2tiX2NvcHlfZXhwYW5kKCpwc2tiLCBza2JfaGVhZHJvb20oKnBza2IpLAotCQkJCQkgVENQT0xFTl9NU1MsIEdGUF9BVE9NSUMpOwotCQlpZiAoIW5ld3NrYikKLQkJCXJldHVybiBORl9EUk9QOwotCQlrZnJlZV9za2IoKnBza2IpOwotCQkqcHNrYiA9IG5ld3NrYjsKLQkJaXBoID0gKCpwc2tiKS0+bmguaXBoOwotCQl0Y3BoID0gKHZvaWQgKilpcGggKyBpcGgtPmlobCo0OwotCX0KLQotCXNrYl9wdXQoKCpwc2tiKSwgVENQT0xFTl9NU1MpOwotCi0gCW9wdCA9ICh1X2ludDhfdCAqKXRjcGggKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7Ci0JbWVtbW92ZShvcHQgKyBUQ1BPTEVOX01TUywgb3B0LCB0Y3BsZW4gLSBzaXplb2Yoc3RydWN0IHRjcGhkcikpOwotCi0JbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssICpwc2tiLAotCQkJCWh0b25zKHRjcGxlbiksIGh0b25zKHRjcGxlbiArIFRDUE9MRU5fTVNTKSwgMSk7Ci0Jb3B0WzBdID0gVENQT1BUX01TUzsKLQlvcHRbMV0gPSBUQ1BPTEVOX01TUzsKLQlvcHRbMl0gPSAobmV3bXNzICYgMHhmZjAwKSA+PiA4OwotCW9wdFszXSA9IChuZXdtc3MgJiAweDAwZmYpOwotCi0JbmZfcHJvdG9fY3N1bV9yZXBsYWNlNCgmdGNwaC0+Y2hlY2ssICpwc2tiLCAwLCAqKChfX2JlMzIgKilvcHQpLCAwKTsKLQotCW9sZHZhbCA9ICgoX19iZTE2ICopdGNwaClbNl07Ci0JdGNwaC0+ZG9mZiArPSBUQ1BPTEVOX01TUy80OwotCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJnRjcGgtPmNoZWNrLCAqcHNrYiwKLQkJCQlvbGR2YWwsICgoX19iZTE2ICopdGNwaClbNl0sIDApOwotCi0JbmV3dG90bGVuID0gaHRvbnMobnRvaHMoaXBoLT50b3RfbGVuKSArIFRDUE9MRU5fTVNTKTsKLQluZl9jc3VtX3JlcGxhY2UyKCZpcGgtPmNoZWNrLCBpcGgtPnRvdF9sZW4sIG5ld3RvdGxlbik7Ci0JaXBoLT50b3RfbGVuID0gbmV3dG90bGVuOwotCXJldHVybiBJUFRfQ09OVElOVUU7Ci19Ci0KLSNkZWZpbmUgVEhfU1lOIDB4MDIKLQotc3RhdGljIGlubGluZSBpbnQgZmluZF9zeW5fbWF0Y2goY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSkKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X3RjcCAqdGNwaW5mbyA9IChjb25zdCBzdHJ1Y3QgaXB0X3RjcCAqKW0tPmRhdGE7Ci0KLQlpZiAoc3RyY21wKG0tPnUua2VybmVsLm1hdGNoLT5uYW1lLCAidGNwIikgPT0gMCAmJgotCSAgICB0Y3BpbmZvLT5mbGdfY21wICYgVEhfU1lOICYmCi0JICAgICEodGNwaW5mby0+aW52ZmxhZ3MgJiBJUFRfVENQX0lOVl9GTEFHUykpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIE11c3Qgc3BlY2lmeSAtcCB0Y3AgLS1zeW4vLS10Y3AtZmxhZ3MgU1lOICovCi1zdGF0aWMgaW50Ci1pcHRfdGNwbXNzX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICAgICBjb25zdCB2b2lkICplX3ZvaWQsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKLQkJICAgICAgdm9pZCAqdGFyZ2luZm8sCi0JCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JY29uc3Qgc3RydWN0IGlwdF90Y3Btc3NfaW5mbyAqdGNwbXNzaW5mbyA9IHRhcmdpbmZvOwotCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUgPSBlX3ZvaWQ7Ci0KLQlpZiAodGNwbXNzaW5mby0+bXNzID09IElQVF9UQ1BNU1NfQ0xBTVBfUE1UVSAmJgotCSAgICAoaG9va19tYXNrICYgfigoMSA8PCBORl9JUF9GT1JXQVJEKSB8Ci0JCQkgICAoMSA8PCBORl9JUF9MT0NBTF9PVVQpIHwKLQkJCSAgICgxIDw8IE5GX0lQX1BPU1RfUk9VVElORykpKSAhPSAwKSB7Ci0JCXByaW50aygiVENQTVNTOiBwYXRoLU1UVSBjbGFtcGluZyBvbmx5IHN1cHBvcnRlZCBpbiAiCi0JCSAgICAgICAiRk9SV0FSRCwgT1VUUFVUIGFuZCBQT1NUUk9VVElORyBob29rc1xuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChJUFRfTUFUQ0hfSVRFUkFURShlLCBmaW5kX3N5bl9tYXRjaCkpCi0JCXJldHVybiAxOwotCXByaW50aygiVENQTVNTOiBPbmx5IHdvcmtzIG9uIFRDUCBTWU4gcGFja2V0c1xuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfdGNwbXNzX3JlZyA9IHsKLQkubmFtZQkJPSAiVENQTVNTIiwKLQkudGFyZ2V0CQk9IGlwdF90Y3Btc3NfdGFyZ2V0LAotCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfdGNwbXNzX2luZm8pLAotCS5wcm90bwkJPSBJUFBST1RPX1RDUCwKLQkuY2hlY2tlbnRyeQk9IGlwdF90Y3Btc3NfY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpcHRfdGNwbXNzX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X3RjcG1zc19yZWcpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXB0X3RjcG1zc19maW5pKHZvaWQpCi17Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfdGNwbXNzX3JlZyk7Ci19Ci0KLW1vZHVsZV9pbml0KGlwdF90Y3Btc3NfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcHRfdGNwbXNzX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVE9TLmMKaW5kZXggMThlNzRhYy4uMjliMDVhNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RPUy5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9UT1MuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtNDAsNyArNDAsNyBAQAogCQlpcGgtPnRvcyA9IChpcGgtPnRvcyAmIElQVE9TX1BSRUNfTUFTSykgfCB0b3NpbmZvLT50b3M7CiAJCW5mX2NzdW1fcmVwbGFjZTIoJmlwaC0+Y2hlY2ssIGh0b25zKG9sZHRvcyksIGh0b25zKGlwaC0+dG9zKSk7CiAJfQotCXJldHVybiBJUFRfQ09OVElOVUU7CisJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50CkBAIC02Myw4ICs2Myw5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfdG9zX3JlZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF90b3NfcmVnID0gewogCS5uYW1lCQk9ICJUT1MiLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudGFyZ2V0CQk9IHRhcmdldCwKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X3Rvc190YXJnZXRfaW5mbyksCiAJLnRhYmxlCQk9ICJtYW5nbGUiLApAQCAtNzQsMTIgKzc1LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdF90b3NfaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfdG9zX3JlZyk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X3Rvc19yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X3Rvc19maW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfdG9zX3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF90b3NfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X3Rvc19pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RUTC5jCmluZGV4IGZmZmU1Y2EuLmQyYjZmYTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UVEwuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVFRMLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOwpAQCAtNTksNyArNTksNyBAQAogCQlpcGgtPnR0bCA9IG5ld190dGw7CiAJfQogCi0JcmV0dXJuIElQVF9DT05USU5VRTsKKwlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgaXB0X3R0bF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKQEAgLTgwLDggKzgwLDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9UVEwgPSB7IAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X1RUTCA9IHsKIAkubmFtZSAJCT0gIlRUTCIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS50YXJnZXQgCT0gaXB0X3R0bF90YXJnZXQsIAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfVFRMX2luZm8pLAogCS50YWJsZQkJPSAibWFuZ2xlIiwKQEAgLTkxLDEyICs5MiwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHRfdHRsX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X1RUTCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X1RUTCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHRfdHRsX2Zpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9UVEwpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfVFRMKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X3R0bF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKaW5kZXggZGJkMzQ3OC4uN2FmNTdhMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKQEAgLTU3LDcgKzU3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1VMT0cuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpAQCAtMTMyLDcgKzEzMiw2IEBACiAJdWItPnFsZW4gPSAwOwogCXViLT5za2IgPSBOVUxMOwogCXViLT5sYXN0bmxoID0gTlVMTDsKLQogfQogCiAKQEAgLTMxNCw3ICszMTMsNyBAQAogCiAJaXB0X3Vsb2dfcGFja2V0KGhvb2tudW0sICpwc2tiLCBpbiwgb3V0LCBsb2dpbmZvLCBOVUxMKTsKICAKLSAJcmV0dXJuIElQVF9DT05USU5VRTsKKwlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAgCiBzdGF0aWMgdm9pZCBpcHRfbG9nZm4odW5zaWduZWQgaW50IHBmLApAQCAtMzYzLDggKzM2Miw5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfdWxvZ19yZWcgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfdWxvZ19yZWcgPSB7CiAJLm5hbWUJCT0gIlVMT0ciLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudGFyZ2V0CQk9IGlwdF91bG9nX3RhcmdldCwKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X3Vsb2dfaW5mbyksCiAJLmNoZWNrZW50cnkJPSBpcHRfdWxvZ19jaGVja2VudHJ5LApAQCAtMzc5LDcgKzM3OSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdF91bG9nX2luaXQodm9pZCkKIHsKLQlpbnQgaTsKKwlpbnQgcmV0LCBpOwogCiAJREVCVUdQKCJpcHRfVUxPRzogaW5pdCBtb2R1bGVcbiIpOwogCkBAIC00MDAsOSArNDAwLDEwIEBACiAJaWYgKCFuZmxvZ25sKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfdWxvZ19yZWcpICE9IDApIHsKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoJmlwdF91bG9nX3JlZyk7CisJaWYgKHJldCA8IDApIHsKIAkJc29ja19yZWxlYXNlKG5mbG9nbmwtPnNrX3NvY2tldCk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gcmV0OwogCX0KIAlpZiAobmZsb2cpCiAJCW5mX2xvZ19yZWdpc3RlcihQRl9JTkVULCAmaXB0X3Vsb2dfbG9nZ2VyKTsKQEAgLTQxOSw3ICs0MjAsNyBAQAogCiAJaWYgKG5mbG9nKQogCQluZl9sb2dfdW5yZWdpc3Rlcl9sb2dnZXIoJmlwdF91bG9nX2xvZ2dlcik7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfdWxvZ19yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfdWxvZ19yZWcpOwogCXNvY2tfcmVsZWFzZShuZmxvZ25sLT5za19zb2NrZXQpOwogCiAJLyogcmVtb3ZlIHBlbmRpbmcgdGltZXJzIGFuZCBmcmVlIGFsbG9jYXRlZCBza2IncyAqLwpAQCAtNDM1LDcgKzQzNiw2IEBACiAJCQl1Yi0+c2tiID0gTlVMTDsKIAkJfQogCX0KLQogfQogCiBtb2R1bGVfaW5pdChpcHRfdWxvZ19pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWRkcnR5cGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWRkcnR5cGUuYwppbmRleCA3YjYwZWI3Li42NDhmNTU1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FkZHJ0eXBlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jCkBAIC0xNiw3ICsxNiw3IEBACiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfYWRkcnR5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7CkBAIC00NCw4ICs0NCw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggYWRkcnR5cGVfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGFkZHJ0eXBlX21hdGNoID0gewogCS5uYW1lCQk9ICJhZGRydHlwZSIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS5tYXRjaAkJPSBtYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfYWRkcnR5cGVfaW5mbyksCiAJLm1lCQk9IFRISVNfTU9EVUxFCkBAIC01MywxMiArNTQsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXB0X2FkZHJ0eXBlX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZhZGRydHlwZV9tYXRjaCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZhZGRydHlwZV9tYXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHRfYWRkcnR5cGVfZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZhZGRydHlwZV9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmYWRkcnR5cGVfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpcHRfYWRkcnR5cGVfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FoLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FoLmMKaW5kZXggMTc5OGY4Ni4uNDJmNDEyMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9haC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWguYwpAQCAtNiwxMiArNiwxMyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9haC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJZb24gVXJpYXJ0ZSA8eW9uQGFzdGFyby5kZT4iKTsKQEAgLTg2LDggKzg3LDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggYWhfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGFoX21hdGNoID0gewogCS5uYW1lCQk9ICJhaCIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS5tYXRjaAkJPSBtYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfYWgpLAogCS5wcm90bwkJPSBJUFBST1RPX0FILApAQCAtOTcsMTIgKzk5LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdF9haF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmYWhfbWF0Y2gpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmYWhfbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X2FoX2Zpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmYWhfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmFoX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X2FoX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMKaW5kZXggZGFmYmRlYy4uMzc1MDhiMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCkBAIC05LDEwICs5LDEzIEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Vjbi5oPgogCkBAIC0xMDksOCArMTEyLDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggZWNuX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBlY25fbWF0Y2ggPSB7CiAJLm5hbWUJCT0gImVjbiIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS5tYXRjaAkJPSBtYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfZWNuX2luZm8pLAogCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKQEAgLTExOSwxMiArMTIzLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdF9lY25faW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJmVjbl9tYXRjaCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZlY25fbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X2Vjbl9maW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJmVjbl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmZWNuX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X2Vjbl9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9pcHJhbmdlLmMKaW5kZXggNTIwMmVkZC4uMDVkZTU5MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9pcHJhbmdlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9pcHJhbmdlLmMKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9pcHJhbmdlLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTYzLDIyICs2MywyMiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBpcHJhbmdlX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBpcHJhbmdlX21hdGNoID0gewogCS5uYW1lCQk9ICJpcHJhbmdlIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLm1hdGNoCQk9IG1hdGNoLAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF9pcHJhbmdlX2luZm8pLAotCS5kZXN0cm95CT0gTlVMTCwKIAkubWUJCT0gVEhJU19NT0RVTEUKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdF9pcHJhbmdlX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZpcHJhbmdlX21hdGNoKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJmlwcmFuZ2VfbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X2lwcmFuZ2VfZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZpcHJhbmdlX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZpcHJhbmdlX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X2lwcmFuZ2VfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X293bmVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X293bmVyLmMKaW5kZXggNzhjMzM2ZjEuLjlmNDk2YWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfb3duZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X293bmVyLmMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X293bmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOwpAQCAtNjgsOCArNjgsOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBvd25lcl9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggb3duZXJfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gIm93bmVyIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLm1hdGNoCQk9IG1hdGNoLAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF9vd25lcl9pbmZvKSwKIAkuaG9va3MJCT0gKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSB8ICgxIDw8IE5GX0lQX1BPU1RfUk9VVElORyksCkBAIC03OSwxMiArODAsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXB0X293bmVyX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZvd25lcl9tYXRjaCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZvd25lcl9tYXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHRfb3duZXJfZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZvd25lcl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmb3duZXJfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpcHRfb3duZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYwppbmRleCA0ZGIwZTczLi42Yjk3YjY3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcmVjZW50LmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqIENvcHlyaWdodCAyMDAyLTIwMDMsIFN0ZXBoZW4gRnJvc3QsIDIuNS54IHBvcnQgYnkgbGFmb3JnZUBuZXRmaWx0ZXIub3JnCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtMjQsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWNlbnQuaD4KIAogTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7CkBAIC00NjIsOCArNDYzLDkgQEAKIH07CiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggcmVjZW50X21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCByZWNlbnRfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gInJlY2VudCIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS5tYXRjaAkJPSBpcHRfcmVjZW50X21hdGNoLAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF9yZWNlbnRfaW5mbyksCiAJLmNoZWNrZW50cnkJPSBpcHRfcmVjZW50X2NoZWNrZW50cnksCkBAIC00NzksMTMgKzQ4MSwxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpcF9saXN0X2hhc2hfc2l6ZSA9IDEgPDwgZmxzKGlwX2xpc3RfdG90KTsKIAotCWVyciA9IGlwdF9yZWdpc3Rlcl9tYXRjaCgmcmVjZW50X21hdGNoKTsKKwllcnIgPSB4dF9yZWdpc3Rlcl9tYXRjaCgmcmVjZW50X21hdGNoKTsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJcHJvY19kaXIgPSBwcm9jX21rZGlyKCJpcHRfcmVjZW50IiwgcHJvY19uZXQpOwogCWlmIChwcm9jX2RpciA9PSBOVUxMKSB7Ci0JCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZyZWNlbnRfbWF0Y2gpOworCQl4dF91bnJlZ2lzdGVyX21hdGNoKCZyZWNlbnRfbWF0Y2gpOwogCQllcnIgPSAtRU5PTUVNOwogCX0KICNlbmRpZgpAQCAtNDk1LDcgKzQ5Nyw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X3JlY2VudF9leGl0KHZvaWQpCiB7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZ0YWJsZXMpKTsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmcmVjZW50X21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZyZWNlbnRfbWF0Y2gpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJcmVtb3ZlX3Byb2NfZW50cnkoImlwdF9yZWNlbnQiLCBwcm9jX25ldCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdG9zLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3Rvcy5jCmluZGV4IDU1NDljMzkuLjVkMzNiNTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdG9zLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90b3MuYwpAQCAtOCwxMSArOCwxMiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfdG9zLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgVE9TIG1hdGNoIG1vZHVsZSIpOwpAQCAtMzIsOCArMzMsOSBAQAogCXJldHVybiAoc2tiLT5uaC5pcGgtPnRvcyA9PSBpbmZvLT50b3MpIF4gaW5mby0+aW52ZXJ0OwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCB0b3NfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHRvc19tYXRjaCA9IHsKIAkubmFtZQkJPSAidG9zIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLm1hdGNoCQk9IG1hdGNoLAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF90b3NfaW5mbyksCiAJLm1lCQk9IFRISVNfTU9EVUxFLApAQCAtNDEsMTIgKzQzLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdF9tdWx0aXBvcnRfaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJnRvc19tYXRjaCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZ0b3NfbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X211bHRpcG9ydF9maW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnRvc19tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmdG9zX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X211bHRpcG9ydF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdHRsLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jCmluZGV4IGE1MjQzYmQuLmQ1Y2Q5ODRlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdHRsLmMKQEAgLTksMTEgKzksMTIgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3R0bC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogCiBNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIFRUTCBtYXRjaGluZyBtb2R1bGUiKTsKQEAgLTQ4LDggKzQ5LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggdHRsX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB0dGxfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gInR0bCIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS5tYXRjaAkJPSBtYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfdHRsX2luZm8pLAogCS5tZQkJPSBUSElTX01PRFVMRSwKQEAgLTU3LDEzICs1OSwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHRfdHRsX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZ0dGxfbWF0Y2gpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmdHRsX21hdGNoKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwdF90dGxfZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZ0dGxfbWF0Y2gpOwotCisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmdHRsX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X3R0bF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMKaW5kZXggZTJlN2RkOC4uNTEwNTNjYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMKQEAgLTc0LDcgKzc0LDcgQEAKICAgICB9CiB9OwogCi1zdGF0aWMgc3RydWN0IGlwdF90YWJsZSBwYWNrZXRfZmlsdGVyID0geworc3RhdGljIHN0cnVjdCB4dF90YWJsZSBwYWNrZXRfZmlsdGVyID0gewogCS5uYW1lCQk9ICJmaWx0ZXIiLAogCS52YWxpZF9ob29rcwk9IEZJTFRFUl9WQUxJRF9IT09LUywKIAkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYwppbmRleCBhZjI5Mzk4Li5hNTMyZTRkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgfQogfTsKIAotc3RhdGljIHN0cnVjdCBpcHRfdGFibGUgcGFja2V0X21hbmdsZXIgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhYmxlIHBhY2tldF9tYW5nbGVyID0gewogCS5uYW1lCQk9ICJtYW5nbGUiLAogCS52YWxpZF9ob29rcwk9IE1BTkdMRV9WQUxJRF9IT09LUywKIAkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfcmF3LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYwppbmRleCBiY2JlYjRhLi41Mjc3NTUwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYwpAQCAtNzksNyArNzksNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhYmxlIHBhY2tldF9yYXcgPSB7IAorc3RhdGljIHN0cnVjdCB4dF90YWJsZSBwYWNrZXRfcmF3ID0gewogCS5uYW1lID0gInJhdyIsIAogCS52YWxpZF9ob29rcyA9ICBSQVdfVkFMSURfSE9PS1MsIAogCS5sb2NrID0gUldfTE9DS19VTkxPQ0tFRCwgCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCmluZGV4IDg2YTkyMjcuLjk5OGIyNTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCkBAIC0yNTQsOCArMjU0LDkgQEAKIAlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpIHsKIAkJaWYgKGZpbmRfYXBwcm9wcmlhdGVfc3JjKG9yaWdfdHVwbGUsIHR1cGxlLCByYW5nZSkpIHsKIAkJCURFQlVHUCgiZ2V0X3VuaXF1ZV90dXBsZTogRm91bmQgY3VycmVudCBzcmMgbWFwXG4iKTsKLQkJCWlmICghbmZfbmF0X3VzZWRfdHVwbGUodHVwbGUsIGN0KSkKLQkJCQlyZXR1cm47CisJCQlpZiAoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKSkKKwkJCQlpZiAoIW5mX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjdCkpCisJCQkJCXJldHVybjsKIAkJfQogCX0KIApAQCAtMjY5LDYgKzI3MCwxMyBAQAogCiAJcHJvdG8gPSBuZl9uYXRfcHJvdG9fZmluZF9nZXQob3JpZ190dXBsZS0+ZHN0LnByb3RvbnVtKTsKIAorCS8qIENoYW5nZSBwcm90b2NvbCBpbmZvIHRvIGhhdmUgc29tZSByYW5kb21pemF0aW9uICovCisJaWYgKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pIHsKKwkJcHJvdG8tPnVuaXF1ZV90dXBsZSh0dXBsZSwgcmFuZ2UsIG1hbmlwdHlwZSwgY3QpOworCQluZl9uYXRfcHJvdG9fcHV0KHByb3RvKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIE9ubHkgYm90aGVyIG1hcHBpbmcgaWYgaXQncyBub3QgYWxyZWFkeSBpbiByYW5nZSBhbmQgdW5pcXVlICovCiAJaWYgKCghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpIHx8CiAJICAgICBwcm90by0+aW5fcmFuZ2UodHVwbGUsIG1hbmlwdHlwZSwgJnJhbmdlLT5taW4sICZyYW5nZS0+bWF4KSkgJiYKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jCmluZGV4IDk4ZmJmYzg0Li5kYzY3MzhiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBpcGgtPmlobCo0OwogCWlmICgoKnBza2IpLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQl0Y3BoLT5jaGVjayA9IDA7Ci0JCXRjcGgtPmNoZWNrID0gdGNwX3Y0X2NoZWNrKHRjcGgsIGRhdGFsZW4sCisJCXRjcGgtPmNoZWNrID0gdGNwX3Y0X2NoZWNrKGRhdGFsZW4sCiAJCQkJCSAgIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCiAJCQkJCSAgIGNzdW1fcGFydGlhbCgoY2hhciAqKXRjcGgsCiAJCQkJCSAgIAkJZGF0YWxlbiwgMCkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b190Y3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdGNwLmMKaW5kZXggN2UyNmE3ZS4uNDM5MTY0YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b190Y3AuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3RjcC5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KIApAQCAtNzUsNiArNzYsOSBAQAogCQlyYW5nZV9zaXplID0gbnRvaHMocmFuZ2UtPm1heC50Y3AucG9ydCkgLSBtaW4gKyAxOwogCX0KIAorCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKQorCQlwb3J0ID0gIG5ldF9yYW5kb20oKTsKKwogCWZvciAoaSA9IDA7IGkgPCByYW5nZV9zaXplOyBpKyssIHBvcnQrKykgewogCQkqcG9ydHB0ciA9IGh0b25zKG1pbiArIHBvcnQgJSByYW5nZV9zaXplKTsKIAkJaWYgKCFuZl9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY3QpKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwLmMKaW5kZXggYWIwY2U0Yy4uOGNhZTZlMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcC5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KIApAQCAtNzMsNiArNzQsOSBAQAogCQlyYW5nZV9zaXplID0gbnRvaHMocmFuZ2UtPm1heC51ZHAucG9ydCkgLSBtaW4gKyAxOwogCX0KIAorCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKQorCQlwb3J0ID0gbmV0X3JhbmRvbSgpOworCiAJZm9yIChpID0gMDsgaSA8IHJhbmdlX3NpemU7IGkrKywgcG9ydCsrKSB7CiAJCSpwb3J0cHRyID0gaHRvbnMobWluICsgcG9ydCAlIHJhbmdlX3NpemUpOwogCQlpZiAoIW5mX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjdCkpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCmluZGV4IGI4NjhlZTAuLjdmOTViNGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IGlwdF90YWJsZSBuYXRfdGFibGUgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhYmxlIG5hdF90YWJsZSA9IHsKIAkubmFtZQkJPSAibmF0IiwKIAkudmFsaWRfaG9va3MJPSBOQVRfVkFMSURfSE9PS1MsCiAJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKQEAgLTIyNiw2ICsyMjYsMTAgQEAKIAkJcHJpbnRrKCJETkFUOiBtdWx0aXBsZSByYW5nZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAwOwogCX0KKwlpZiAobXItPnJhbmdlWzBdLmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkgeworCQlwcmludGsoIkROQVQ6IHBvcnQgcmFuZG9taXphdGlvbiBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQogCXJldHVybiAxOwogfQogCkBAIC0yOTAsNyArMjk0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X3NuYXRfcmVnID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X3NuYXRfcmVnID0gewogCS5uYW1lCQk9ICJTTkFUIiwKIAkudGFyZ2V0CQk9IGlwdF9zbmF0X3RhcmdldCwKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCmluZGV4IDAwZDZkZWEuLjVhOTY0YTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCkBAIC0zMiwxMiArMzIsNiBAQAogI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQogI2VuZGlmCiAKLSNkZWZpbmUgSE9PS05BTUUoaG9va251bSkgKChob29rbnVtKSA9PSBORl9JUF9QT1NUX1JPVVRJTkcgPyAiUE9TVF9ST1VUSU5HIiAgXAotCQkJICAgOiAoKGhvb2tudW0pID09IE5GX0lQX1BSRV9ST1VUSU5HID8gIlBSRV9ST1VUSU5HIiBcCi0JCQkgICAgICA6ICgoaG9va251bSkgPT0gTkZfSVBfTE9DQUxfT1VUID8gIkxPQ0FMX09VVCIgIFwKLQkJCSAgICAgICAgIDogKChob29rbnVtKSA9PSBORl9JUF9MT0NBTF9JTiA/ICJMT0NBTF9JTiIgIFwKLQkJCQkgICAgOiAiKkVSUk9SKiIpKSkKLQogI2lmZGVmIENPTkZJR19YRlJNCiBzdGF0aWMgdm9pZCBuYXRfZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dpICpmbCkKIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Jhdy5jIGIvbmV0L2lwdjQvcmF3LmMKaW5kZXggYTZjNjNiYi4uZmVkNmExZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcmF3LmMKKysrIGIvbmV0L2lwdjQvcmF3LmMKQEAgLTQ4OSw3ICs0ODksNyBAQAogCQl9CiAKIAkJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgJmZsKTsKLQkJZXJyID0gaXBfcm91dGVfb3V0cHV0X2Zsb3coJnJ0LCAmZmwsIHNrLCAhKG1zZy0+bXNnX2ZsYWdzJk1TR19ET05UV0FJVCkpOworCQllcnIgPSBpcF9yb3V0ZV9vdXRwdXRfZmxvdygmcnQsICZmbCwgc2ssIDEpOwogCX0KIAlpZiAoZXJyKQogCQlnb3RvIGRvbmU7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yb3V0ZS5jIGIvbmV0L2lwdjQvcm91dGUuYwppbmRleCAyZGFhMGRjLi5iYWVlMzA0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yb3V0ZS5jCisrKyBiL25ldC9pcHY0L3JvdXRlLmMKQEAgLTI2MzUsNyArMjYzNSw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqciksIGZsYWdzKTsKIAlpZiAobmxoID09IE5VTEwpCi0JCXJldHVybiAtRU5PQlVGUzsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCXIgPSBubG1zZ19kYXRhKG5saCk7CiAJci0+cnRtX2ZhbWlseQkgPSBBRl9JTkVUOwpAQCAtMjcxOCw3ICsyNzE4LDggQEAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAogbmxhX3B1dF9mYWlsdXJlOgotCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogaW50IGluZXRfcnRtX2dldHJvdXRlKHN0cnVjdCBza19idWZmICppbl9za2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3AuYyBiL25ldC9pcHY0L3RjcC5jCmluZGV4IGI2N2UwZGQuLjViZDQzZDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcC5jCisrKyBiL25ldC9pcHY0L3RjcC5jCkBAIC0yNDE1LDEwICsyNDE1LDExIEBACiAJCQkJCSZ0Y3BfaGFzaGluZm8uZWhhc2hfc2l6ZSwKIAkJCQkJTlVMTCwKIAkJCQkJMCk7Ci0JdGNwX2hhc2hpbmZvLmVoYXNoX3NpemUgPSAoMSA8PCB0Y3BfaGFzaGluZm8uZWhhc2hfc2l6ZSkgPj4gMTsKLQlmb3IgKGkgPSAwOyBpIDwgKHRjcF9oYXNoaW5mby5laGFzaF9zaXplIDw8IDEpOyBpKyspIHsKKwl0Y3BfaGFzaGluZm8uZWhhc2hfc2l6ZSA9IDEgPDwgdGNwX2hhc2hpbmZvLmVoYXNoX3NpemU7CisJZm9yIChpID0gMDsgaSA8IHRjcF9oYXNoaW5mby5laGFzaF9zaXplOyBpKyspIHsKIAkJcndsb2NrX2luaXQoJnRjcF9oYXNoaW5mby5laGFzaFtpXS5sb2NrKTsKIAkJSU5JVF9ITElTVF9IRUFEKCZ0Y3BfaGFzaGluZm8uZWhhc2hbaV0uY2hhaW4pOworCQlJTklUX0hMSVNUX0hFQUQoJnRjcF9oYXNoaW5mby5laGFzaFtpXS50d2NoYWluKTsKIAl9CiAKIAl0Y3BfaGFzaGluZm8uYmhhc2ggPQpAQCAtMjQ3NSw3ICsyNDc2LDcgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIlRDUDogSGFzaCB0YWJsZXMgY29uZmlndXJlZCAiCiAJICAgICAgICIoZXN0YWJsaXNoZWQgJWQgYmluZCAlZClcbiIsCi0JICAgICAgIHRjcF9oYXNoaW5mby5laGFzaF9zaXplIDw8IDEsIHRjcF9oYXNoaW5mby5iaGFzaF9zaXplKTsKKwkgICAgICAgdGNwX2hhc2hpbmZvLmVoYXNoX3NpemUsIHRjcF9oYXNoaW5mby5iaGFzaF9zaXplKTsKIAogCXRjcF9yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJnRjcF9yZW5vKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pbnB1dC5jIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKaW5kZXggYzI2MDc2Zi4uYzYxMDk4OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKQEAgLTkzNiwyOCArOTM2LDU4IEBACiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJdW5zaWduZWQgY2hhciAqcHRyID0gYWNrX3NrYi0+aC5yYXcgKyBUQ1BfU0tCX0NCKGFja19za2IpLT5zYWNrZWQ7CiAJc3RydWN0IHRjcF9zYWNrX2Jsb2NrX3dpcmUgKnNwID0gKHN0cnVjdCB0Y3Bfc2Fja19ibG9ja193aXJlICopKHB0cisyKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqY2FjaGVkX3NrYjsKIAlpbnQgbnVtX3NhY2tzID0gKHB0clsxXSAtIFRDUE9MRU5fU0FDS19CQVNFKT4+MzsKIAlpbnQgcmVvcmQgPSB0cC0+cGFja2V0c19vdXQ7CiAJaW50IHByaW9yX2ZhY2tldHM7CiAJdTMyIGxvc3RfcmV0cmFucyA9IDA7CiAJaW50IGZsYWcgPSAwOwogCWludCBkdXBfc2FjayA9IDA7CisJaW50IGNhY2hlZF9mYWNrX2NvdW50OwogCWludCBpOworCWludCBmaXJzdF9zYWNrX2luZGV4OwogCiAJaWYgKCF0cC0+c2Fja2VkX291dCkKIAkJdHAtPmZhY2tldHNfb3V0ID0gMDsKIAlwcmlvcl9mYWNrZXRzID0gdHAtPmZhY2tldHNfb3V0OwogCisJLyogQ2hlY2sgZm9yIEQtU0FDSy4gKi8KKwlpZiAoYmVmb3JlKG50b2hsKHNwWzBdLnN0YXJ0X3NlcSksIFRDUF9TS0JfQ0IoYWNrX3NrYiktPmFja19zZXEpKSB7CisJCWR1cF9zYWNrID0gMTsKKwkJdHAtPnJ4X29wdC5zYWNrX29rIHw9IDQ7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUERTQUNLUkVDVik7CisJfSBlbHNlIGlmIChudW1fc2Fja3MgPiAxICYmCisJCQkhYWZ0ZXIobnRvaGwoc3BbMF0uZW5kX3NlcSksIG50b2hsKHNwWzFdLmVuZF9zZXEpKSAmJgorCQkJIWJlZm9yZShudG9obChzcFswXS5zdGFydF9zZXEpLCBudG9obChzcFsxXS5zdGFydF9zZXEpKSkgeworCQlkdXBfc2FjayA9IDE7CisJCXRwLT5yeF9vcHQuc2Fja19vayB8PSA0OworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BEU0FDS09GT1JFQ1YpOworCX0KKworCS8qIEQtU0FDSyBmb3IgYWxyZWFkeSBmb3Jnb3R0ZW4gZGF0YS4uLgorCSAqIERvIGR1bWIgY291bnRpbmcuICovCisJaWYgKGR1cF9zYWNrICYmCisJCQkhYWZ0ZXIobnRvaGwoc3BbMF0uZW5kX3NlcSksIHByaW9yX3NuZF91bmEpICYmCisJCQlhZnRlcihudG9obChzcFswXS5lbmRfc2VxKSwgdHAtPnVuZG9fbWFya2VyKSkKKwkJdHAtPnVuZG9fcmV0cmFucy0tOworCisJLyogRWxpbWluYXRlIHRvbyBvbGQgQUNLcywgYnV0IHRha2UgaW50bworCSAqIGFjY291bnQgbW9yZSBvciBsZXNzIGZyZXNoIG9uZXMsIHRoZXkgY2FuCisJICogY29udGFpbiB2YWxpZCBTQUNLIGluZm8uCisJICovCisJaWYgKGJlZm9yZShUQ1BfU0tCX0NCKGFja19za2IpLT5hY2tfc2VxLCBwcmlvcl9zbmRfdW5hIC0gdHAtPm1heF93aW5kb3cpKQorCQlyZXR1cm4gMDsKKwogCS8qIFNBQ0sgZmFzdHBhdGg6CiAJICogaWYgdGhlIG9ubHkgU0FDSyBjaGFuZ2UgaXMgdGhlIGluY3JlYXNlIG9mIHRoZSBlbmRfc2VxIG9mCiAJICogdGhlIGZpcnN0IGJsb2NrIHRoZW4gb25seSBhcHBseSB0aGF0IFNBQ0sgYmxvY2sKIAkgKiBhbmQgdXNlIHJldHJhbnMgcXVldWUgaGludGluZyBvdGhlcndpc2Ugc2xvd3BhdGggKi8KIAlmbGFnID0gMTsKLQlmb3IgKGkgPSAwOyBpPCBudW1fc2Fja3M7IGkrKykgewotCQlfX3UzMiBzdGFydF9zZXEgPSBudG9obChzcFtpXS5zdGFydF9zZXEpOwotCQlfX3UzMiBlbmRfc2VxID0JIG50b2hsKHNwW2ldLmVuZF9zZXEpOworCWZvciAoaSA9IDA7IGkgPCBudW1fc2Fja3M7IGkrKykgeworCQlfX2JlMzIgc3RhcnRfc2VxID0gc3BbaV0uc3RhcnRfc2VxOworCQlfX2JlMzIgZW5kX3NlcSA9IHNwW2ldLmVuZF9zZXE7CiAKLQkJaWYgKGkgPT0gMCl7CisJCWlmIChpID09IDApIHsKIAkJCWlmICh0cC0+cmVjdl9zYWNrX2NhY2hlW2ldLnN0YXJ0X3NlcSAhPSBzdGFydF9zZXEpCiAJCQkJZmxhZyA9IDA7CiAJCX0gZWxzZSB7CkBAIC05NjcsMzkgKzk5NywxNCBAQAogCQl9CiAJCXRwLT5yZWN2X3NhY2tfY2FjaGVbaV0uc3RhcnRfc2VxID0gc3RhcnRfc2VxOwogCQl0cC0+cmVjdl9zYWNrX2NhY2hlW2ldLmVuZF9zZXEgPSBlbmRfc2VxOwotCi0JCS8qIENoZWNrIGZvciBELVNBQ0suICovCi0JCWlmIChpID09IDApIHsKLQkJCXUzMiBhY2sgPSBUQ1BfU0tCX0NCKGFja19za2IpLT5hY2tfc2VxOwotCi0JCQlpZiAoYmVmb3JlKHN0YXJ0X3NlcSwgYWNrKSkgewotCQkJCWR1cF9zYWNrID0gMTsKLQkJCQl0cC0+cnhfb3B0LnNhY2tfb2sgfD0gNDsKLQkJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BEU0FDS1JFQ1YpOwotCQkJfSBlbHNlIGlmIChudW1fc2Fja3MgPiAxICYmCi0JCQkJICAgIWFmdGVyKGVuZF9zZXEsIG50b2hsKHNwWzFdLmVuZF9zZXEpKSAmJgotCQkJCSAgICFiZWZvcmUoc3RhcnRfc2VxLCBudG9obChzcFsxXS5zdGFydF9zZXEpKSkgewotCQkJCWR1cF9zYWNrID0gMTsKLQkJCQl0cC0+cnhfb3B0LnNhY2tfb2sgfD0gNDsKLQkJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BEU0FDS09GT1JFQ1YpOwotCQkJfQotCi0JCQkvKiBELVNBQ0sgZm9yIGFscmVhZHkgZm9yZ290dGVuIGRhdGEuLi4KLQkJCSAqIERvIGR1bWIgY291bnRpbmcuICovCi0JCQlpZiAoZHVwX3NhY2sgJiYKLQkJCSAgICAhYWZ0ZXIoZW5kX3NlcSwgcHJpb3Jfc25kX3VuYSkgJiYKLQkJCSAgICBhZnRlcihlbmRfc2VxLCB0cC0+dW5kb19tYXJrZXIpKQotCQkJCXRwLT51bmRvX3JldHJhbnMtLTsKLQotCQkJLyogRWxpbWluYXRlIHRvbyBvbGQgQUNLcywgYnV0IHRha2UgaW50bwotCQkJICogYWNjb3VudCBtb3JlIG9yIGxlc3MgZnJlc2ggb25lcywgdGhleSBjYW4KLQkJCSAqIGNvbnRhaW4gdmFsaWQgU0FDSyBpbmZvLgotCQkJICovCi0JCQlpZiAoYmVmb3JlKGFjaywgcHJpb3Jfc25kX3VuYSAtIHRwLT5tYXhfd2luZG93KSkKLQkJCQlyZXR1cm4gMDsKLQkJfQorCX0KKwkvKiBDbGVhciB0aGUgcmVzdCBvZiB0aGUgY2FjaGUgc2FjayBibG9ja3Mgc28gdGhleSB3b24ndCBtYXRjaCBtaXN0YWtlbmx5LiAqLworCWZvciAoOyBpIDwgQVJSQVlfU0laRSh0cC0+cmVjdl9zYWNrX2NhY2hlKTsgaSsrKSB7CisJCXRwLT5yZWN2X3NhY2tfY2FjaGVbaV0uc3RhcnRfc2VxID0gMDsKKwkJdHAtPnJlY3Zfc2Fja19jYWNoZVtpXS5lbmRfc2VxID0gMDsKIAl9CiAKKwlmaXJzdF9zYWNrX2luZGV4ID0gMDsKIAlpZiAoZmxhZykKIAkJbnVtX3NhY2tzID0gMTsKIAllbHNlIHsKQEAgLTEwMTYsNiArMTAyMSwxMCBAQAogCQkJCQl0bXAgPSBzcFtqXTsKIAkJCQkJc3Bbal0gPSBzcFtqKzFdOwogCQkJCQlzcFtqKzFdID0gdG1wOworCisJCQkJCS8qIFRyYWNrIHdoZXJlIHRoZSBmaXJzdCBTQUNLIGJsb2NrIGdvZXMgdG8gKi8KKwkJCQkJaWYgKGogPT0gZmlyc3Rfc2Fja19pbmRleCkKKwkJCQkJCWZpcnN0X3NhY2tfaW5kZXggPSBqKzE7CiAJCQkJfQogCiAJCQl9CkBAIC0xMDI1LDIwICsxMDM0LDIyIEBACiAJLyogY2xlYXIgZmxhZyBhcyB1c2VkIGZvciBkaWZmZXJlbnQgcHVycG9zZSBpbiBmb2xsb3dpbmcgY29kZSAqLwogCWZsYWcgPSAwOwogCisJLyogVXNlIFNBQ0sgZmFzdHBhdGggaGludCBpZiB2YWxpZCAqLworCWNhY2hlZF9za2IgPSB0cC0+ZmFzdHBhdGhfc2tiX2hpbnQ7CisJY2FjaGVkX2ZhY2tfY291bnQgPSB0cC0+ZmFzdHBhdGhfY250X2hpbnQ7CisJaWYgKCFjYWNoZWRfc2tiKSB7CisJCWNhY2hlZF9za2IgPSBzay0+c2tfd3JpdGVfcXVldWUubmV4dDsKKwkJY2FjaGVkX2ZhY2tfY291bnQgPSAwOworCX0KKwogCWZvciAoaT0wOyBpPG51bV9zYWNrczsgaSsrLCBzcCsrKSB7CiAJCXN0cnVjdCBza19idWZmICpza2I7CiAJCV9fdTMyIHN0YXJ0X3NlcSA9IG50b2hsKHNwLT5zdGFydF9zZXEpOwogCQlfX3UzMiBlbmRfc2VxID0gbnRvaGwoc3AtPmVuZF9zZXEpOwogCQlpbnQgZmFja19jb3VudDsKIAotCQkvKiBVc2UgU0FDSyBmYXN0cGF0aCBoaW50IGlmIHZhbGlkICovCi0JCWlmICh0cC0+ZmFzdHBhdGhfc2tiX2hpbnQpIHsKLQkJCXNrYiA9IHRwLT5mYXN0cGF0aF9za2JfaGludDsKLQkJCWZhY2tfY291bnQgPSB0cC0+ZmFzdHBhdGhfY250X2hpbnQ7Ci0JCX0gZWxzZSB7Ci0JCQlza2IgPSBzay0+c2tfd3JpdGVfcXVldWUubmV4dDsKLQkJCWZhY2tfY291bnQgPSAwOwotCQl9CisJCXNrYiA9IGNhY2hlZF9za2I7CisJCWZhY2tfY291bnQgPSBjYWNoZWRfZmFja19jb3VudDsKIAogCQkvKiBFdmVudCAiQiIgaW4gdGhlIGNvbW1lbnQgYWJvdmUuICovCiAJCWlmIChhZnRlcihlbmRfc2VxLCB0cC0+aGlnaF9zZXEpKQpAQCAtMTA0OCw4ICsxMDU5LDEyIEBACiAJCQlpbnQgaW5fc2FjaywgcGNvdW50OwogCQkJdTggc2Fja2VkOwogCi0JCQl0cC0+ZmFzdHBhdGhfc2tiX2hpbnQgPSBza2I7Ci0JCQl0cC0+ZmFzdHBhdGhfY250X2hpbnQgPSBmYWNrX2NvdW50OworCQkJY2FjaGVkX3NrYiA9IHNrYjsKKwkJCWNhY2hlZF9mYWNrX2NvdW50ID0gZmFja19jb3VudDsKKwkJCWlmIChpID09IGZpcnN0X3NhY2tfaW5kZXgpIHsKKwkJCQl0cC0+ZmFzdHBhdGhfc2tiX2hpbnQgPSBza2I7CisJCQkJdHAtPmZhc3RwYXRoX2NudF9oaW50ID0gZmFja19jb3VudDsKKwkJCX0KIAogCQkJLyogVGhlIHJldHJhbnNtaXNzaW9uIHF1ZXVlIGlzIGFsd2F5cyBpbiBvcmRlciwgc28KIAkJCSAqIHdlIGNhbiBzaG9ydC1jaXJjdWl0IHRoZSB3YWxrIGVhcmx5LgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggMTJkZTkwYS4uZjUxZDY0MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAl0bXAgPSBpcF9yb3V0ZV9jb25uZWN0KCZydCwgbmV4dGhvcCwgaW5ldC0+c2FkZHIsCiAJCQkgICAgICAgUlRfQ09OTl9GTEFHUyhzayksIHNrLT5za19ib3VuZF9kZXZfaWYsCiAJCQkgICAgICAgSVBQUk9UT19UQ1AsCi0JCQkgICAgICAgaW5ldC0+c3BvcnQsIHVzaW4tPnNpbl9wb3J0LCBzayk7CisJCQkgICAgICAgaW5ldC0+c3BvcnQsIHVzaW4tPnNpbl9wb3J0LCBzaywgMSk7CiAJaWYgKHRtcCA8IDApCiAJCXJldHVybiB0bXA7CiAKQEAgLTUwMiwxMSArNTAyLDExIEBACiAJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQl0aC0+Y2hlY2sgPSB+dGNwX3Y0X2NoZWNrKHRoLCBsZW4sCi0JCQkJCSAgaW5ldC0+c2FkZHIsIGluZXQtPmRhZGRyLCAwKTsKKwkJdGgtPmNoZWNrID0gfnRjcF92NF9jaGVjayhsZW4sIGluZXQtPnNhZGRyLAorCQkJCQkgIGluZXQtPmRhZGRyLCAwKTsKIAkJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKIAl9IGVsc2UgewotCQl0aC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2sodGgsIGxlbiwgaW5ldC0+c2FkZHIsIGluZXQtPmRhZGRyLAorCQl0aC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2sobGVuLCBpbmV0LT5zYWRkciwgaW5ldC0+ZGFkZHIsCiAJCQkJCSBjc3VtX3BhcnRpYWwoKGNoYXIgKil0aCwKIAkJCQkJCSAgICAgIHRoLT5kb2ZmIDw8IDIsCiAJCQkJCQkgICAgICBza2ItPmNzdW0pKTsKQEAgLTUyNSw3ICs1MjUsNyBAQAogCXRoID0gc2tiLT5oLnRoOwogCiAJdGgtPmNoZWNrID0gMDsKLQl0aC0+Y2hlY2sgPSB+dGNwX3Y0X2NoZWNrKHRoLCBza2ItPmxlbiwgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgMCk7CisJdGgtPmNoZWNrID0gfnRjcF92NF9jaGVjayhza2ItPmxlbiwgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgMCk7CiAJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAJcmV0dXJuIDA7CkBAIC03NDcsNyArNzQ3LDcgQEAKIAlpZiAoc2tiKSB7CiAJCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOwogCi0JCXRoLT5jaGVjayA9IHRjcF92NF9jaGVjayh0aCwgc2tiLT5sZW4sCisJCXRoLT5jaGVjayA9IHRjcF92NF9jaGVjayhza2ItPmxlbiwKIAkJCQkJIGlyZXEtPmxvY19hZGRyLAogCQkJCQkgaXJlcS0+cm10X2FkZHIsCiAJCQkJCSBjc3VtX3BhcnRpYWwoKGNoYXIgKil0aCwgc2tiLT5sZW4sCkBAIC0xNTE0LDcgKzE1MTQsNyBAQAogc3RhdGljIF9fc3VtMTYgdGNwX3Y0X2NoZWNrc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKLQkJaWYgKCF0Y3BfdjRfY2hlY2soc2tiLT5oLnRoLCBza2ItPmxlbiwgc2tiLT5uaC5pcGgtPnNhZGRyLAorCQlpZiAoIXRjcF92NF9jaGVjayhza2ItPmxlbiwgc2tiLT5uaC5pcGgtPnNhZGRyLAogCQkJCSAgc2tiLT5uaC5pcGgtPmRhZGRyLCBza2ItPmNzdW0pKSB7CiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCQkJcmV0dXJuIDA7CkBAIC0yMDUxLDcgKzIwNTEsNyBAQAogCQl9CiAJCXN0LT5zdGF0ZSA9IFRDUF9TRVFfU1RBVEVfVElNRV9XQUlUOwogCQlpbmV0X3R3c2tfZm9yX2VhY2godHcsIG5vZGUsCi0JCQkJICAgJnRjcF9oYXNoaW5mby5laGFzaFtzdC0+YnVja2V0ICsgdGNwX2hhc2hpbmZvLmVoYXNoX3NpemVdLmNoYWluKSB7CisJCQkJICAgJnRjcF9oYXNoaW5mby5laGFzaFtzdC0+YnVja2V0XS50d2NoYWluKSB7CiAJCQlpZiAodHctPnR3X2ZhbWlseSAhPSBzdC0+ZmFtaWx5KSB7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC0yMTA3LDcgKzIxMDcsNyBAQAogCX0KIAogCXN0LT5zdGF0ZSA9IFRDUF9TRVFfU1RBVEVfVElNRV9XQUlUOwotCXR3ID0gdHdfaGVhZCgmdGNwX2hhc2hpbmZvLmVoYXNoW3N0LT5idWNrZXQgKyB0Y3BfaGFzaGluZm8uZWhhc2hfc2l6ZV0uY2hhaW4pOworCXR3ID0gdHdfaGVhZCgmdGNwX2hhc2hpbmZvLmVoYXNoW3N0LT5idWNrZXRdLnR3Y2hhaW4pOwogCWdvdG8gZ2V0X3R3OwogZm91bmQ6CiAJY3VyID0gc2s7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKaW5kZXggOTc1ZjQ0Ny4uNThiNzExMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwpAQCAtOTY1LDcgKzk2NSw4IEBACiAJdTMyIGluX2ZsaWdodCwgY3duZDsKIAogCS8qIERvbid0IGJlIHN0cmljdCBhYm91dCB0aGUgY29uZ2VzdGlvbiB3aW5kb3cgZm9yIHRoZSBmaW5hbCBGSU4uICAqLwotCWlmIChUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19GSU4pCisJaWYgKChUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19GSU4pICYmCisJICAgIHRjcF9za2JfcGNvdW50KHNrYikgPT0gMSkKIAkJcmV0dXJuIDE7CiAKIAlpbl9mbGlnaHQgPSB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwLmMgYi9uZXQvaXB2NC91ZHAuYwppbmRleCBjZmZmOTMwLi44YjU0YzY4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHAuYworKysgYi9uZXQvaXB2NC91ZHAuYwpAQCAtNjI5LDcgKzYyOSw3IEBACiAJCQkJCSAgICAgICB7IC5zcG9ydCA9IGluZXQtPnNwb3J0LAogCQkJCQkJIC5kcG9ydCA9IGRwb3J0IH0gfSB9OwogCQlzZWN1cml0eV9za19jbGFzc2lmeV9mbG93KHNrLCAmZmwpOwotCQllcnIgPSBpcF9yb3V0ZV9vdXRwdXRfZmxvdygmcnQsICZmbCwgc2ssICEobXNnLT5tc2dfZmxhZ3MmTVNHX0RPTlRXQUlUKSk7CisJCWVyciA9IGlwX3JvdXRlX291dHB1dF9mbG93KCZydCwgJmZsLCBzaywgMSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfbW9kZV90dW5uZWwuYyBiL25ldC9pcHY0L3hmcm00X21vZGVfdHVubmVsLmMKaW5kZXggZTIzYzIxZC4uZTU0YzU0OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfbW9kZV90dW5uZWwuYworKysgYi9uZXQvaXB2NC94ZnJtNF9tb2RlX3R1bm5lbC5jCkBAIC0yMyw2ICsyMywxMiBAQAogCQlJUF9FQ05fc2V0X2NlKGlubmVyX2lwaCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcGlwNl9lY25fZGVjYXBzdWxhdGUoc3RydWN0IGlwaGRyICppcGgsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKElORVRfRUNOX2lzX2NlKGlwaC0+dG9zKSkKKwkJSVA2X0VDTl9zZXRfY2Uoc2tiLT5uaC5pcHY2aCk7Cit9CisKIC8qIEFkZCBlbmNhcHN1bGF0aW9uIGhlYWRlci4KICAqCiAgKiBUaGUgdG9wIElQIGhlYWRlciB3aWxsIGJlIGNvbnN0cnVjdGVkIHBlciBSRkMgMjQwMS4gIFRoZSBmb2xsb3dpbmcgZmllbGRzCkBAIC0zNiw2ICs0Miw3IEBACiBzdGF0aWMgaW50IHhmcm00X3R1bm5lbF9vdXRwdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CisJc3RydWN0IHhmcm1fZHN0ICp4ZHN0ID0gKHN0cnVjdCB4ZnJtX2RzdCopZHN0OwogCXN0cnVjdCBpcGhkciAqaXBoLCAqdG9wX2lwaDsKIAlpbnQgZmxhZ3M7CiAKQEAgLTQ4LDE1ICs1NSwyNyBAQAogCXRvcF9pcGgtPmlobCA9IDU7CiAJdG9wX2lwaC0+dmVyc2lvbiA9IDQ7CiAKLQkvKiBEUyBkaXNjbG9zZWQgKi8KLQl0b3BfaXBoLT50b3MgPSBJTkVUX0VDTl9lbmNhcHN1bGF0ZShpcGgtPnRvcywgaXBoLT50b3MpOwotCiAJZmxhZ3MgPSB4LT5wcm9wcy5mbGFnczsKKworCS8qIERTIGRpc2Nsb3NlZCAqLworCWlmICh4ZHN0LT5yb3V0ZS0+b3BzLT5mYW1pbHkgPT0gQUZfSU5FVCkgeworCQl0b3BfaXBoLT5wcm90b2NvbCA9IElQUFJPVE9fSVBJUDsKKwkJdG9wX2lwaC0+dG9zID0gSU5FVF9FQ05fZW5jYXBzdWxhdGUoaXBoLT50b3MsIGlwaC0+dG9zKTsKKwkJdG9wX2lwaC0+ZnJhZ19vZmYgPSAoZmxhZ3MgJiBYRlJNX1NUQVRFX05PUE1UVURJU0MpID8KKwkJCTAgOiAoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSk7CisJfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKKwllbHNlIHsKKwkJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gKHN0cnVjdCBpcHY2aGRyKilpcGg7CisJCXRvcF9pcGgtPnByb3RvY29sID0gSVBQUk9UT19JUFY2OworCQl0b3BfaXBoLT50b3MgPSBJTkVUX0VDTl9lbmNhcHN1bGF0ZShpcGgtPnRvcywgaXB2Nl9nZXRfZHNmaWVsZChpcHY2aCkpOworCQl0b3BfaXBoLT5mcmFnX29mZiA9IDA7CisJfQorI2VuZGlmCisKIAlpZiAoZmxhZ3MgJiBYRlJNX1NUQVRFX05PRUNOKQogCQlJUF9FQ05fY2xlYXIodG9wX2lwaCk7CiAKLQl0b3BfaXBoLT5mcmFnX29mZiA9IChmbGFncyAmIFhGUk1fU1RBVEVfTk9QTVRVRElTQykgPwotCQkwIDogKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpOwogCWlmICghdG9wX2lwaC0+ZnJhZ19vZmYpCiAJCV9faXBfc2VsZWN0X2lkZW50KHRvcF9pcGgsIGRzdC0+Y2hpbGQsIDApOwogCkBAIC02NCw3ICs4Myw2IEBACiAKIAl0b3BfaXBoLT5zYWRkciA9IHgtPnByb3BzLnNhZGRyLmE0OwogCXRvcF9pcGgtPmRhZGRyID0geC0+aWQuZGFkZHIuYTQ7Ci0JdG9wX2lwaC0+cHJvdG9jb2wgPSBJUFBST1RPX0lQSVA7CiAKIAltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihzdHJ1Y3QgaXBfb3B0aW9ucykpOwogCXJldHVybiAwOwpAQCAtNzUsOCArOTMsMTYgQEAKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwogCWludCBlcnIgPSAtRUlOVkFMOwogCi0JaWYgKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19JUElQKQotCQlnb3RvIG91dDsKKwlzd2l0Y2goaXBoLT5wcm90b2NvbCl7CisJCWNhc2UgSVBQUk9UT19JUElQOgorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKKwkJY2FzZSBJUFBST1RPX0lQVjY6CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJZ290byBvdXQ7CisJfQorCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQogCQlnb3RvIG91dDsKIApAQCAtODQsMTAgKzExMCwxOSBAQAogCSAgICAoZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX0RFQ0FQX0RTQ1ApCi0JCWlwdjRfY29weV9kc2NwKGlwaCwgc2tiLT5oLmlwaXBoKTsKLQlpZiAoISh4LT5wcm9wcy5mbGFncyAmIFhGUk1fU1RBVEVfTk9FQ04pKQotCQlpcGlwX2Vjbl9kZWNhcHN1bGF0ZShza2IpOworCWlmIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fSVBJUCkgeworCQlpZiAoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX0RFQ0FQX0RTQ1ApCisJCQlpcHY0X2NvcHlfZHNjcChpcGgsIHNrYi0+aC5pcGlwaCk7CisJCWlmICghKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9OT0VDTikpCisJCQlpcGlwX2Vjbl9kZWNhcHN1bGF0ZShza2IpOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisJZWxzZSB7CisJCWlmICghKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9OT0VDTikpCisJCQlpcGlwNl9lY25fZGVjYXBzdWxhdGUoaXBoLCBza2IpOworCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CisJfQorI2VuZGlmCiAJc2tiLT5tYWMucmF3ID0gbWVtbW92ZShza2ItPmRhdGEgLSBza2ItPm1hY19sZW4sCiAJCQkgICAgICAgc2tiLT5tYWMucmF3LCBza2ItPm1hY19sZW4pOwogCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfcG9saWN5LmMgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwppbmRleCBmYjlmNjljLi42OTlmMjdjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYworKysgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwpAQCAtNzIsMTMgKzcyLDExIEBACiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0LCAqZHN0X3ByZXY7CiAJc3RydWN0IHJ0YWJsZSAqcnQwID0gKHN0cnVjdCBydGFibGUqKSgqZHN0X3ApOwogCXN0cnVjdCBydGFibGUgKnJ0ID0gcnQwOwotCV9fYmUzMiByZW1vdGUgPSBmbC0+Zmw0X2RzdDsKLQlfX2JlMzIgbG9jYWwgID0gZmwtPmZsNF9zcmM7CiAJc3RydWN0IGZsb3dpIGZsX3R1bm5lbCA9IHsKIAkJLm5sX3UgPSB7CiAJCQkuaXA0X3UgPSB7Ci0JCQkJLnNhZGRyID0gbG9jYWwsCi0JCQkJLmRhZGRyID0gcmVtb3RlLAorCQkJCS5zYWRkciA9IGZsLT5mbDRfc3JjLAorCQkJCS5kYWRkciA9IGZsLT5mbDRfZHN0LAogCQkJCS50b3MgPSBmbC0+Zmw0X3RvcwogCQkJfQogCQl9CkBAIC05NCw3ICs5Miw2IEBACiAJZm9yIChpID0gMDsgaSA8IG54OyBpKyspIHsKIAkJc3RydWN0IGRzdF9lbnRyeSAqZHN0MSA9IGRzdF9hbGxvYygmeGZybTRfZHN0X29wcyk7CiAJCXN0cnVjdCB4ZnJtX2RzdCAqeGRzdDsKLQkJaW50IHR1bm5lbCA9IDA7CiAKIAkJaWYgKHVubGlrZWx5KGRzdDEgPT0gTlVMTCkpIHsKIAkJCWVyciA9IC1FTk9CVUZTOwpAQCAtMTE2LDE5ICsxMTMsMjggQEAKIAogCQlkc3QxLT5uZXh0ID0gZHN0X3ByZXY7CiAJCWRzdF9wcmV2ID0gZHN0MTsKLQkJaWYgKHhmcm1baV0tPnByb3BzLm1vZGUgIT0gWEZSTV9NT0RFX1RSQU5TUE9SVCkgewotCQkJcmVtb3RlID0geGZybVtpXS0+aWQuZGFkZHIuYTQ7Ci0JCQlsb2NhbCAgPSB4ZnJtW2ldLT5wcm9wcy5zYWRkci5hNDsKLQkJCXR1bm5lbCA9IDE7Ci0JCX0KKwogCQloZWFkZXJfbGVuICs9IHhmcm1baV0tPnByb3BzLmhlYWRlcl9sZW47CiAJCXRyYWlsZXJfbGVuICs9IHhmcm1baV0tPnByb3BzLnRyYWlsZXJfbGVuOwogCi0JCWlmICh0dW5uZWwpIHsKLQkJCWZsX3R1bm5lbC5mbDRfc3JjID0gbG9jYWw7Ci0JCQlmbF90dW5uZWwuZmw0X2RzdCA9IHJlbW90ZTsKKwkJaWYgKHhmcm1baV0tPnByb3BzLm1vZGUgPT0gWEZSTV9NT0RFX1RVTk5FTCkgeworCQkJdW5zaWduZWQgc2hvcnQgZW5jYXBfZmFtaWx5ID0geGZybVtpXS0+cHJvcHMuZmFtaWx5OworCQkJc3dpdGNoKGVuY2FwX2ZhbWlseSkgeworCQkJY2FzZSBBRl9JTkVUOgorCQkJCWZsX3R1bm5lbC5mbDRfZHN0ID0geGZybVtpXS0+aWQuZGFkZHIuYTQ7CisJCQkJZmxfdHVubmVsLmZsNF9zcmMgPSB4ZnJtW2ldLT5wcm9wcy5zYWRkci5hNDsKKwkJCQlicmVhazsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisJCQljYXNlIEFGX0lORVQ2OgorCQkJCWlwdjZfYWRkcl9jb3B5KCZmbF90dW5uZWwuZmw2X2RzdCwgKHN0cnVjdCBpbjZfYWRkciopJnhmcm1baV0tPmlkLmRhZGRyLmE2KTsKKwkJCQlpcHY2X2FkZHJfY29weSgmZmxfdHVubmVsLmZsNl9zcmMsIChzdHJ1Y3QgaW42X2FkZHIqKSZ4ZnJtW2ldLT5wcm9wcy5zYWRkci5hNik7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWRlZmF1bHQ6CisJCQkJQlVHX09OKDEpOworCQkJfQogCQkJZXJyID0geGZybV9kc3RfbG9va3VwKChzdHJ1Y3QgeGZybV9kc3QgKiopJnJ0LAotCQkJCQkgICAgICAmZmxfdHVubmVsLCBBRl9JTkVUKTsKKwkJCQkJICAgICAgJmZsX3R1bm5lbCwgZW5jYXBfZmFtaWx5KTsKIAkJCWlmIChlcnIpCiAJCQkJZ290byBlcnJvcjsKIAkJfSBlbHNlCkBAIC0xNDUsNiArMTUxLDcgQEAKIAlpID0gMDsKIAlmb3IgKDsgZHN0X3ByZXYgIT0gJnJ0LT51LmRzdDsgZHN0X3ByZXYgPSBkc3RfcHJldi0+Y2hpbGQpIHsKIAkJc3RydWN0IHhmcm1fZHN0ICp4ID0gKHN0cnVjdCB4ZnJtX2RzdCopZHN0X3ByZXY7CisJCXN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqYWZpbmZvOwogCQl4LT51LnJ0LmZsID0gKmZsOwogCiAJCWRzdF9wcmV2LT54ZnJtID0geGZybVtpKytdOwpAQCAtMTYyLDggKzE2OSwxOCBAQAogCQkvKiBDb3B5IG5laWdoYm91dCBmb3IgcmVhY2hhYmlsaXR5IGNvbmZpcm1hdGlvbiAqLwogCQlkc3RfcHJldi0+bmVpZ2hib3VyCT0gbmVpZ2hfY2xvbmUocnQtPnUuZHN0Lm5laWdoYm91cik7CiAJCWRzdF9wcmV2LT5pbnB1dAkJPSBydC0+dS5kc3QuaW5wdXQ7Ci0JCWRzdF9wcmV2LT5vdXRwdXQJPSB4ZnJtNF9vdXRwdXQ7Ci0JCWlmIChydC0+cGVlcikKKwkJLyogWFhYOiBXaGVuIElQdjYgbW9kdWxlIGNhbiBiZSB1bmxvYWRlZCwgd2Ugc2hvdWxkIG1hbmFnZSByZWZlcmVuY2UKKwkJICogdG8geGZybTZfb3V0cHV0IGluIGFmaW5mby0+b3V0cHV0LiBNaXlhemF3YQorCQkgKiAqLworCQlhZmluZm8gPSB4ZnJtX3N0YXRlX2dldF9hZmluZm8oZHN0X3ByZXYtPnhmcm0tPnByb3BzLmZhbWlseSk7CisJCWlmICghYWZpbmZvKSB7CisJCQlkc3QgPSAqZHN0X3A7CisJCQllcnIgPSAtRUFGTk9TVVBQT1JUOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkc3RfcHJldi0+b3V0cHV0ID0gYWZpbmZvLT5vdXRwdXQ7CisJCXhmcm1fc3RhdGVfcHV0X2FmaW5mbyhhZmluZm8pOworCQlpZiAoZHN0X3ByZXYtPnhmcm0tPnByb3BzLmZhbWlseSA9PSBBRl9JTkVUICYmIHJ0LT5wZWVyKQogCQkJYXRvbWljX2luYygmcnQtPnBlZXItPnJlZmNudCk7CiAJCXgtPnUucnQucGVlciA9IHJ0LT5wZWVyOwogCQkvKiBTaGVpdC4uLiBJIHJlbWVtYmVyIEkgZGlkIHRoaXMgcmlnaHQuIEFwcGFyZW50bHksCkBAIC0yNzQsNyArMjkxLDcgQEAKIAogCWlmIChsaWtlbHkoeGRzdC0+dS5ydC5pZGV2KSkKIAkJaW5fZGV2X3B1dCh4ZHN0LT51LnJ0LmlkZXYpOwotCWlmIChsaWtlbHkoeGRzdC0+dS5ydC5wZWVyKSkKKwlpZiAoZHN0LT54ZnJtLT5wcm9wcy5mYW1pbHkgPT0gQUZfSU5FVCAmJiBsaWtlbHkoeGRzdC0+dS5ydC5wZWVyKSkKIAkJaW5ldF9wdXRwZWVyKHhkc3QtPnUucnQucGVlcik7CiAJeGZybV9kc3RfZGVzdHJveSh4ZHN0KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X3N0YXRlLmMgYi9uZXQvaXB2NC94ZnJtNF9zdGF0ZS5jCmluZGV4IDNjYzNkZjAuLjkzZTJjMDYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X3N0YXRlLmMKKysrIGIvbmV0L2lwdjQveGZybTRfc3RhdGUuYwpAQCAtNTEsNiArNTEsNyBAQAogCS5mYW1pbHkJCQk9IEFGX0lORVQsCiAJLmluaXRfZmxhZ3MJCT0geGZybTRfaW5pdF9mbGFncywKIAkuaW5pdF90ZW1wc2VsCQk9IF9feGZybTRfaW5pdF90ZW1wc2VsLAorCS5vdXRwdXQJCQk9IHhmcm00X291dHB1dCwKIH07CiAKIHZvaWQgX19pbml0IHhmcm00X3N0YXRlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IGUzODU0NjkuLmZlNWUxZDggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtMzExNyw3ICszMTE3LDcgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpLCBmbGFncyk7CiAJaWYgKG5saCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0JVRlM7CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlwdXRfaWZhZGRybXNnKG5saCwgaWZhLT5wcmVmaXhfbGVuLCBpZmEtPmZsYWdzLCBydF9zY29wZShpZmEtPnNjb3BlKSwKIAkJICAgICAgaWZhLT5pZGV2LT5kZXYtPmlmaW5kZXgpOwpAQCAtMzEzNyw4ICszMTM3LDEwIEBACiAJfQogCiAJaWYgKG5sYV9wdXQoc2tiLCBJRkFfQUREUkVTUywgMTYsICZpZmEtPmFkZHIpIDwgMCB8fAotCSAgICBwdXRfY2FjaGVpbmZvKHNrYiwgaWZhLT5jc3RhbXAsIGlmYS0+dHN0YW1wLCBwcmVmZXJyZWQsIHZhbGlkKSA8IDApCi0JCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCSAgICBwdXRfY2FjaGVpbmZvKHNrYiwgaWZhLT5jc3RhbXAsIGlmYS0+dHN0YW1wLCBwcmVmZXJyZWQsIHZhbGlkKSA8IDApIHsKKwkJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CiAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIH0KQEAgLTMxNTUsMTMgKzMxNTcsMTUgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpLCBmbGFncyk7CiAJaWYgKG5saCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0JVRlM7CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlwdXRfaWZhZGRybXNnKG5saCwgMTI4LCBJRkFfRl9QRVJNQU5FTlQsIHNjb3BlLCBpZmluZGV4KTsKIAlpZiAobmxhX3B1dChza2IsIElGQV9NVUxUSUNBU1QsIDE2LCAmaWZtY2EtPm1jYV9hZGRyKSA8IDAgfHwKIAkgICAgcHV0X2NhY2hlaW5mbyhza2IsIGlmbWNhLT5tY2FfY3N0YW1wLCBpZm1jYS0+bWNhX3RzdGFtcCwKLQkJCSAgSU5GSU5JVFlfTElGRV9USU1FLCBJTkZJTklUWV9MSUZFX1RJTUUpIDwgMCkKLQkJcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJCQkgIElORklOSVRZX0xJRkVfVElNRSwgSU5GSU5JVFlfTElGRV9USU1FKSA8IDApIHsKKwkJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CiAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIH0KQEAgLTMxNzgsMTMgKzMxODIsMTUgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpLCBmbGFncyk7CiAJaWYgKG5saCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0JVRlM7CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlwdXRfaWZhZGRybXNnKG5saCwgMTI4LCBJRkFfRl9QRVJNQU5FTlQsIHNjb3BlLCBpZmluZGV4KTsKIAlpZiAobmxhX3B1dChza2IsIElGQV9BTllDQVNULCAxNiwgJmlmYWNhLT5hY2FfYWRkcikgPCAwIHx8CiAJICAgIHB1dF9jYWNoZWluZm8oc2tiLCBpZmFjYS0+YWNhX2NzdGFtcCwgaWZhY2EtPmFjYV90c3RhbXAsCi0JCQkgIElORklOSVRZX0xJRkVfVElNRSwgSU5GSU5JVFlfTElGRV9USU1FKSA8IDApCi0JCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCQkJICBJTkZJTklUWV9MSUZFX1RJTUUsIElORklOSVRZX0xJRkVfVElNRSkgPCAwKSB7CisJCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJCXJldHVybiAtRU1TR1NJWkU7CisJfQogCiAJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CiB9CkBAIC0zMzM0LDkgKzMzNDAsMTIgQEAKIAogCWVyciA9IGluZXQ2X2ZpbGxfaWZhZGRyKHNrYiwgaWZhLCBORVRMSU5LX0NCKGluX3NrYikucGlkLAogCQkJCW5saC0+bmxtc2dfc2VxLCBSVE1fTkVXQUREUiwgMCk7Ci0JLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBpbmV0Nl9pZmFkZHJfbXNnc2l6ZSgpICovCi0JQlVHX09OKGVyciA8IDApOwotCisJaWYgKGVyciA8IDApIHsKKwkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIGluZXQ2X2lmYWRkcl9tc2dzaXplKCkgKi8KKwkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3V0X2lmYTsKKwl9CiAJZXJyID0gcnRubF91bmljYXN0KHNrYiwgTkVUTElOS19DQihpbl9za2IpLnBpZCk7CiBlcnJvdXRfaWZhOgogCWluNl9pZmFfcHV0KGlmYSk7CkBAIC0zMzU0LDkgKzMzNjMsMTIgQEAKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0Nl9maWxsX2lmYWRkcihza2IsIGlmYSwgMCwgMCwgZXZlbnQsIDApOwotCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gaW5ldDZfaWZhZGRyX21zZ3NpemUoKSAqLwotCUJVR19PTihlcnIgPCAwKTsKLQorCWlmIChlcnIgPCAwKSB7CisJCS8qIC1FTVNHU0laRSBpbXBsaWVzIEJVRyBpbiBpbmV0Nl9pZmFkZHJfbXNnc2l6ZSgpICovCisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIGVycm91dDsKKwl9CiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCAwLCBSVE5MR1JQX0lQVjZfSUZBRERSLCBOVUxMLCBHRlBfQVRPTUlDKTsKIGVycm91dDoKIAlpZiAoZXJyIDwgMCkKQEAgLTM0MjYsNyArMzQzOCw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqaGRyKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9CVUZTOworCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJaGRyID0gbmxtc2dfZGF0YShubGgpOwogCWhkci0+aWZpX2ZhbWlseSA9IEFGX0lORVQ2OwpAQCAtMzQ2OSw3ICszNDgxLDggQEAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAogbmxhX3B1dF9mYWlsdXJlOgotCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogc3RhdGljIGludCBpbmV0Nl9kdW1wX2lmaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCkBAIC0zNTA3LDkgKzM1MjAsMTIgQEAKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0Nl9maWxsX2lmaW5mbyhza2IsIGlkZXYsIDAsIDAsIGV2ZW50LCAwKTsKLQkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIGluZXQ2X2lmX25sbXNnX3NpemUoKSAqLwotCUJVR19PTihlcnIgPCAwKTsKLQorCWlmIChlcnIgPCAwKSB7CisJCS8qIC1FTVNHU0laRSBpbXBsaWVzIEJVRyBpbiBpbmV0Nl9pZl9ubG1zZ19zaXplKCkgKi8KKwkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3V0OworCX0KIAllcnIgPSBydG5sX25vdGlmeShza2IsIDAsIFJUTkxHUlBfSVBWNl9JRkFERFIsIE5VTEwsIEdGUF9BVE9NSUMpOwogZXJyb3V0OgogCWlmIChlcnIgPCAwKQpAQCAtMzUzMyw3ICszNTQ5LDcgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpwbXNnKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9CVUZTOworCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJcG1zZyA9IG5sbXNnX2RhdGEobmxoKTsKIAlwbXNnLT5wcmVmaXhfZmFtaWx5ID0gQUZfSU5FVDY7CkBAIC0zNTU4LDcgKzM1NzQsOCBAQAogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwogCiBubGFfcHV0X2ZhaWx1cmU6Ci0JcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogCiBzdGF0aWMgdm9pZCBpbmV0Nl9wcmVmaXhfbm90aWZ5KGludCBldmVudCwgc3RydWN0IGluZXQ2X2RldiAqaWRldiwgCkBAIC0zNTcyLDkgKzM1ODksMTIgQEAKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0Nl9maWxsX3ByZWZpeChza2IsIGlkZXYsIHBpbmZvLCAwLCAwLCBldmVudCwgMCk7Ci0JLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBpbmV0Nl9wcmVmaXhfbmxtc2dfc2l6ZSgpICovCi0JQlVHX09OKGVyciA8IDApOwotCisJaWYgKGVyciA8IDApIHsKKwkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIGluZXQ2X3ByZWZpeF9ubG1zZ19zaXplKCkgKi8KKwkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3V0OworCX0KIAllcnIgPSBydG5sX25vdGlmeShza2IsIDAsIFJUTkxHUlBfSVBWNl9QUkVGSVgsIE5VTEwsIEdGUF9BVE9NSUMpOwogZXJyb3V0OgogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZGF0YWdyYW0uYyBiL25ldC9pcHY2L2RhdGFncmFtLmMKaW5kZXggNWM5NGZlYS4uZWNkZTMwMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZGF0YWdyYW0uYworKysgYi9uZXQvaXB2Ni9kYXRhZ3JhbS5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAlpZiAoZmluYWxfcCkKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIGZpbmFsX3ApOwogCi0JaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKQorCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMSkpIDwgMCkKIAkJZ290byBvdXQ7CiAKIAkvKiBzb3VyY2UgYWRkcmVzcyBsb29rdXAgZG9uZSBpbiBpcDZfZHN0X2xvb2t1cCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaW5ldDZfaGFzaHRhYmxlcy5jIGIvbmV0L2lwdjYvaW5ldDZfaGFzaHRhYmxlcy5jCmluZGV4IGI3ZTViYWUuLmU2MTExNjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2luZXQ2X2hhc2h0YWJsZXMuYworKysgYi9uZXQvaXB2Ni9pbmV0Nl9oYXNodGFibGVzLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAkJCWdvdG8gaGl0OyAvKiBZb3Ugc3VuayBteSBiYXR0bGVzaGlwISAqLwogCX0KIAkvKiBNdXN0IGNoZWNrIGZvciBhIFRJTUVfV0FJVCdlciBiZWZvcmUgZ29pbmcgdG8gbGlzdGVuZXIgaGFzaC4gKi8KLQlza19mb3JfZWFjaChzaywgbm9kZSwgJihoZWFkICsgaGFzaGluZm8tPmVoYXNoX3NpemUpLT5jaGFpbikgeworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmaGVhZC0+dHdjaGFpbikgewogCQljb25zdCBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dyA9IGluZXRfdHdzayhzayk7CiAKIAkJaWYoKigoX19wb3J0cGFpciAqKSYodHctPnR3X2Rwb3J0KSkJPT0gcG9ydHMJJiYKQEAgLTE4Myw3ICsxODMsNyBAQAogCXdyaXRlX2xvY2soJmhlYWQtPmxvY2spOwogCiAJLyogQ2hlY2sgVElNRS1XQUlUIHNvY2tldHMgZmlyc3QuICovCi0Jc2tfZm9yX2VhY2goc2syLCBub2RlLCAmKGhlYWQgKyBoaW5mby0+ZWhhc2hfc2l6ZSktPmNoYWluKSB7CisJc2tfZm9yX2VhY2goc2syLCBub2RlLCAmaGVhZC0+dHdjaGFpbikgewogCQljb25zdCBzdHJ1Y3QgaW5ldDZfdGltZXdhaXRfc29jayAqdHc2ID0gaW5ldDZfdHdzayhzazIpOwogCiAJCXR3ID0gaW5ldF90d3NrKHNrMik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKaW5kZXggOGQ5MTgzNC4uMmI5ZTNiYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwpAQCAtOTk5LDcgKzk5OSw4IEBACiAJCQkJYnJlYWs7CiAJCQlkZXYgPSB0LT5kZXY7CiAJCX0KLQkJZXJyID0gdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwkJZXJyID0gMDsKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L21jYXN0LmMgYi9uZXQvaXB2Ni9tY2FzdC5jCmluZGV4IDg4MmNkZTQuLmUzZWMyMTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21jYXN0LmMKKysrIGIvbmV0L2lwdjYvbWNhc3QuYwpAQCAtMTU4Miw2ICsxNTgyLDggQEAKIAkJCXNrYiA9IGFkZF9ncmhlYWQoc2tiLCBwbWMsIHR5cGUsICZwZ3IpOwogCQkJZmlyc3QgPSAwOwogCQl9CisJCWlmICghc2tiKQorCQkJcmV0dXJuIE5VTEw7CiAJCXBzcmMgPSAoc3RydWN0IGluNl9hZGRyICopc2tiX3B1dChza2IsIHNpemVvZigqcHNyYykpOwogCQkqcHNyYyA9IHBzZi0+c2ZfYWRkcjsKIAkJc2NvdW50Kys7IHN0b3RhbCsrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbWlwNi5jIGIvbmV0L2lwdjYvbWlwNi5jCmluZGV4IGJlN2RkN2QuLjY4MWJiMDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21pcDYuYworKysgYi9uZXQvaXB2Ni9taXA2LmMKQEAgLTg5LDcgKzg5LDYgQEAKIGludCBtaXA2X21oX2ZpbHRlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGlwNl9taCAqbWg7Ci0JaW50IG1obGVuOwogCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpICsgOCkgfHwKIAkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoKHNrYi0+aC5yYXdbMV0gKyAxKSA8PCAzKSkpCkBAIC0xMDMsMzEgKzEwMiw2IEBACiAJCW1pcDZfcGFyYW1fcHJvYihza2IsIDAsICgmbWgtPmlwNm1oX2hkcmxlbikgLSBza2ItPm5oLnJhdyk7CiAJCXJldHVybiAtMTsKIAl9Ci0JbWhsZW4gPSAobWgtPmlwNm1oX2hkcmxlbiArIDEpIDw8IDM7Ci0KLQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQkJaWYgKGNzdW1faXB2Nl9tYWdpYygmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJICAgICZza2ItPm5oLmlwdjZoLT5kYWRkciwKLQkJCQkgICAgbWhsZW4sIElQUFJPVE9fTUgsCi0JCQkJICAgIHNrYi0+Y3N1bSkpIHsKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIm1pcDY6IE1IIGh3IGNoZWNrc3VtIGZhaWxlZFxuIik7Ci0JCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JCX0KLQl9Ci0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkUpIHsKLQkJaWYgKGNzdW1faXB2Nl9tYWdpYygmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJICAgICZza2ItPm5oLmlwdjZoLT5kYWRkciwKLQkJCQkgICAgbWhsZW4sIElQUFJPVE9fTUgsCi0JCQkJICAgIHNrYl9jaGVja3N1bShza2IsIDAsIG1obGVuLCAwKSkpIHsKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIm1pcDY6IE1IIGNoZWNrc3VtIGZhaWxlZCAiCi0JCQkJICAgICAgICJbIiBOSVA2X0ZNVCAiID4gIiBOSVA2X0ZNVCAiXVxuIiwKLQkJCQkgICAgICAgTklQNihza2ItPm5oLmlwdjZoLT5zYWRkciksCi0JCQkJICAgICAgIE5JUDYoc2tiLT5uaC5pcHY2aC0+ZGFkZHIpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotCX0KIAogCWlmIChtaC0+aXA2bWhfcHJvdG8gIT0gSVBQUk9UT19OT05FKSB7CiAJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIm1pcDY6IE1IIGludmFsaWQgcGF5bG9hZCBwcm90byA9ICVkXG4iLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCBhZGNkNjEzLi5jZDU0OWFlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMTE0LDYgKzExNCwxNCBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIElQNl9ORl9NQVRDSF9NSAorCXRyaXN0YXRlICJNSCBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCisJaGVscAorCSAgVGhpcyBtb2R1bGUgYWxsb3dzIG9uZSB0byBtYXRjaCBNSCBwYWNrZXRzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIElQNl9ORl9NQVRDSF9FVUk2NAogCXRyaXN0YXRlICJFVUk2NCBhZGRyZXNzIGNoZWNrIgogCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggYWMxZGZlYi4uNDUxM2VhYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtMTksNiArMTksNyBAQAogb2JqLSQoQ09ORklHX0lQNl9ORl9SQVcpICs9IGlwNnRhYmxlX3Jhdy5vCiBvYmotJChDT05GSUdfSVA2X05GX01BVENIX0hMKSArPSBpcDZ0X2hsLm8KIG9iai0kKENPTkZJR19JUDZfTkZfVEFSR0VUX1JFSkVDVCkgKz0gaXA2dF9SRUpFQ1Qubworb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9NSCkgKz0gaXA2dF9taC5vCiAKICMgb2JqZWN0cyBmb3IgbDMgaW5kZXBlbmRlbnQgY29ubnRyYWNrCiBuZl9jb25udHJhY2tfaXB2Ni1vYmpzICA6PSAgbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5vIG5mX2Nvbm50cmFja19wcm90b19pY21wdjYubyBuZl9jb25udHJhY2tfcmVhc20ubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKaW5kZXggOTk1MDJjNS4uNzA4M2UxYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCkBAIC01MzAsNyArNTMwLDcgQEAKIAkgICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLAogCSAgICB1bnNpZ25lZCBpbnQgKmkpCiB7Ci0Jc3RydWN0IGlwNnRfbWF0Y2ggKm1hdGNoOworCXN0cnVjdCB4dF9tYXRjaCAqbWF0Y2g7CiAJaW50IHJldDsKIAogCW1hdGNoID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF9tYXRjaChBRl9JTkVUNiwgbS0+dS51c2VyLm5hbWUsCkBAIC01NjQsMTQgKzU2NCwxNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YXJnZXQgaXA2dF9zdGFuZGFyZF90YXJnZXQ7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcDZ0X3N0YW5kYXJkX3RhcmdldDsKIAogc3RhdGljIGlubGluZSBpbnQKIGNoZWNrX2VudHJ5KHN0cnVjdCBpcDZ0X2VudHJ5ICplLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkgICAgdW5zaWduZWQgaW50ICppKQogewogCXN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCAqdDsKLQlzdHJ1Y3QgaXA2dF90YXJnZXQgKnRhcmdldDsKKwlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgajsKIApAQCAtMTM0OCwxMyArMTM0OCwxMyBAQAogfQogCiAvKiBUaGUgYnVpbHQtaW4gdGFyZ2V0czogc3RhbmRhcmQgKE5VTEwpIGFuZCBlcnJvci4gKi8KLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YXJnZXQgaXA2dF9zdGFuZGFyZF90YXJnZXQgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcDZ0X3N0YW5kYXJkX3RhcmdldCA9IHsKIAkubmFtZQkJPSBJUDZUX1NUQU5EQVJEX1RBUkdFVCwKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihpbnQpLAogCS5mYW1pbHkJCT0gQUZfSU5FVDYsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlwNnRfdGFyZ2V0IGlwNnRfZXJyb3JfdGFyZ2V0ID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXA2dF9lcnJvcl90YXJnZXQgPSB7CiAJLm5hbWUJCT0gSVA2VF9FUlJPUl9UQVJHRVQsCiAJLnRhcmdldAkJPSBpcDZ0X2Vycm9yLAogCS50YXJnZXRzaXplCT0gSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOLApAQCAtMTM3MSw3ICsxMzcxLDcgQEAKIAkuZ2V0CQk9IGRvX2lwNnRfZ2V0X2N0bCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBpY21wNl9tYXRjaHN0cnVjdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggaWNtcDZfbWF0Y2hzdHJ1Y3QgPSB7CiAJLm5hbWUJCT0gImljbXA2IiwKIAkubWF0Y2gJCT0gJmljbXA2X21hdGNoLAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfaWNtcCksCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ITC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfSEwuYwppbmRleCA0MzU3NTBmLi4wNGU1MDAxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ITC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0hMLmMKQEAgLTksMTIgKzksMTMgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X0hMLmg+CiAKIE1PRFVMRV9BVVRIT1IoIk1hY2llaiBTb2x0eXNpYWsgPHNvbHRAZG5zLnRveGljZmlsbXMudHY+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBIb3AgTGltaXQgbW9kaWZpY2F0aW9uIG1vZHVsZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUDYgdGFibGVzIEhvcCBMaW1pdCBtb2RpZmljYXRpb24gbW9kdWxlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2dF9obF90YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCAKQEAgLTUyLDEwICs1Myw5IEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAobmV3X2hsICE9IGlwNmgtPmhvcF9saW1pdCkKLQkJaXA2aC0+aG9wX2xpbWl0ID0gbmV3X2hsOworCWlwNmgtPmhvcF9saW1pdCA9IG5ld19obDsKIAotCXJldHVybiBJUDZUX0NPTlRJTlVFOworCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBpcDZ0X2hsX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLApAQCAtNzksOCArNzksOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwNnRfdGFyZ2V0IGlwNnRfSEwgPSB7IAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXA2dF9ITCA9IHsKIAkubmFtZSAJCT0gIkhMIiwgCisJLmZhbWlseQkJPSBBRl9JTkVUNiwKIAkudGFyZ2V0CQk9IGlwNnRfaGxfdGFyZ2V0LCAKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9ITF9pbmZvKSwKIAkudGFibGUJCT0gIm1hbmdsZSIsCkBAIC05MCwxMiArOTEsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXA2dF9obF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwNnRfcmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X0hMKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X0hMKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwNnRfaGxfZmluaSh2b2lkKQogewotCWlwNnRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwNnRfSEwpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X0hMKTsKIH0KIAogbW9kdWxlX2luaXQoaXA2dF9obF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKaW5kZXggMzNiMWZhYS4uNTU4N2E3NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkphbiBSZWtvcmFqc2tpIDxiYWdnaW5zQHBsZC5vcmcucGw+Iik7CkBAIC00NDIsNyArNDQzLDcgQEAKIAogCWlwNnRfbG9nX3BhY2tldChQRl9JTkVUNiwgaG9va251bSwgKnBza2IsIGluLCBvdXQsICZsaSwKIAkgICAgICAgICAgICAgICAgbG9naW5mby0+cHJlZml4KTsKLQlyZXR1cm4gSVA2VF9DT05USU5VRTsKKwlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKIApAQCAtNDY2LDggKzQ2Nyw5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YXJnZXQgaXA2dF9sb2dfcmVnID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXA2dF9sb2dfcmVnID0gewogCS5uYW1lIAkJPSAiTE9HIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQ2LAogCS50YXJnZXQgCT0gaXA2dF9sb2dfdGFyZ2V0LCAKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9sb2dfaW5mbyksCiAJLmNoZWNrZW50cnkJPSBpcDZ0X2xvZ19jaGVja2VudHJ5LCAKQEAgLTQ4Miw4ICs0ODQsMTEgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXA2dF9sb2dfaW5pdCh2b2lkKQogewotCWlmIChpcDZ0X3JlZ2lzdGVyX3RhcmdldCgmaXA2dF9sb2dfcmVnKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaW50IHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldCgmaXA2dF9sb2dfcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAlpZiAobmZfbG9nX3JlZ2lzdGVyKFBGX0lORVQ2LCAmaXA2dF9sb2dnZXIpIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpcDZ0X0xPRzogbm90IGxvZ2dpbmcgdmlhIHN5c3RlbSBjb25zb2xlICIKIAkJICAgICAgICJzaW5jZSBzb21lYm9keSBlbHNlIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgUEZfSU5FVDZcbiIpOwpAQCAtNDk3LDcgKzUwMiw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgaXA2dF9sb2dfZmluaSh2b2lkKQogewogCW5mX2xvZ191bnJlZ2lzdGVyX2xvZ2dlcigmaXA2dF9sb2dnZXIpOwotCWlwNnRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwNnRfbG9nX3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwNnRfbG9nX3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGlwNnRfbG9nX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYwppbmRleCAzMTFlYWU4Li4yNzgzNDljIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPG5ldC9pcDZfZmliLmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9mbG93Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfUkVKRUNULmg+CiAKQEAgLTIzNCw3ICsyMzUsNyBAQAogCX0gZWxzZSBpZiAocmVqaW5mby0+d2l0aCA9PSBJUDZUX1RDUF9SRVNFVCkgewogCQkvKiBNdXN0IHNwZWNpZnkgdGhhdCBpdCdzIGEgVENQIHBhY2tldCAqLwogCQlpZiAoZS0+aXB2Ni5wcm90byAhPSBJUFBST1RPX1RDUAotCQkgICAgfHwgKGUtPmlwdjYuaW52ZmxhZ3MgJiBJUDZUX0lOVl9QUk9UTykpIHsKKwkJICAgIHx8IChlLT5pcHY2LmludmZsYWdzICYgWFRfSU5WX1BST1RPKSkgewogCQkJREVCVUdQKCJpcDZ0X1JFSkVDVDogVENQX1JFU0VUIGlsbGVnYWwgZm9yIG5vbi10Y3BcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTI0Miw4ICsyNDMsOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwNnRfdGFyZ2V0IGlwNnRfcmVqZWN0X3JlZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwNnRfcmVqZWN0X3JlZyA9IHsKIAkubmFtZQkJPSAiUkVKRUNUIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQ2LAogCS50YXJnZXQJCT0gcmVqZWN0Nl90YXJnZXQsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfcmVqZWN0X2luZm8pLAogCS50YWJsZQkJPSAiZmlsdGVyIiwKQEAgLTI1NSwxMiArMjU3LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwNnRfcmVqZWN0X2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXA2dF9yZWdpc3Rlcl90YXJnZXQoJmlwNnRfcmVqZWN0X3JlZyk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmaXA2dF9yZWplY3RfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwNnRfcmVqZWN0X2Zpbmkodm9pZCkKIHsKLQlpcDZ0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X3JlamVjdF9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X3JlamVjdF9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChpcDZ0X3JlamVjdF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9haC5jCmluZGV4IDQ2NDg2NjQuLjQ1NmM3NmEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfYWguYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9haC5oPgogCkBAIC0xMTgsOCArMTE5LDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIGFoX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBhaF9tYXRjaCA9IHsKIAkubmFtZQkJPSAiYWgiLAorCS5mYW1pbHkJCT0gQUZfSU5FVDYsCiAJLm1hdGNoCQk9IG1hdGNoLAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfYWgpLAogCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKQEAgLTEyOCwxMiArMTMwLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwNnRfYWhfaW5pdCh2b2lkKQogewotCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZhaF9tYXRjaCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZhaF9tYXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcDZ0X2FoX2Zpbmkodm9pZCkKIHsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJmFoX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZhaF9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwNnRfYWhfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXVpNjQuYwppbmRleCA0ZjZiODRjLi45NjdiZWQ3IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2V1aTY0LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KIAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJJUHY2IEVVSTY0IGFkZHJlc3MgY2hlY2tpbmcgbWF0Y2giKTsKQEAgLTYxLDggKzYyLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIGV1aTY0X21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBldWk2NF9tYXRjaCA9IHsKIAkubmFtZQkJPSAiZXVpNjQiLAorCS5mYW1pbHkJCT0gQUZfSU5FVDYsCiAJLm1hdGNoCQk9IG1hdGNoLAogCS5tYXRjaHNpemUJPSBzaXplb2YoaW50KSwKIAkuaG9va3MJCT0gKDEgPDwgTkZfSVA2X1BSRV9ST1VUSU5HKSB8ICgxIDw8IE5GX0lQNl9MT0NBTF9JTikgfApAQCAtNzIsMTIgKzc0LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwNnRfZXVpNjRfaW5pdCh2b2lkKQogewotCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZldWk2NF9tYXRjaCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZldWk2NF9tYXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcDZ0X2V1aTY0X2Zpbmkodm9pZCkKIHsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJmV1aTY0X21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZldWk2NF9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwNnRfZXVpNjRfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMKaW5kZXggY2QyMmVhYS4uNWE1ZGE3MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZnJhZy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2ZyYWcuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9mcmFnLmg+CiAKQEAgLTEzNSw4ICsxMzYsOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggZnJhZ19tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggZnJhZ19tYXRjaCA9IHsKIAkubmFtZQkJPSAiZnJhZyIsCisJLmZhbWlseQkJPSBBRl9JTkVUNiwKIAkubWF0Y2gJCT0gbWF0Y2gsCiAJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9mcmFnKSwKIAkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCkBAIC0xNDUsMTIgKzE0NywxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcDZ0X2ZyYWdfaW5pdCh2b2lkKQogewotCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZmcmFnX21hdGNoKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJmZyYWdfbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXA2dF9mcmFnX2Zpbmkodm9pZCkKIHsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJmZyYWdfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmZyYWdfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpcDZ0X2ZyYWdfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCmluZGV4IDNmMjViYWIuLmQyMzczYzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9vcHRzLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hsLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jCmluZGV4IDQ0YTcyOWUuLjYwMWNjMTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hsLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGwuYwpAQCAtOCwxMSArOCwxMiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfaGwuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAKIE1PRFVMRV9BVVRIT1IoIk1hY2llaiBTb2x0eXNpYWsgPHNvbHRAZG5zLnRveGljZmlsbXMudHY+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBIb3AgTGltaXQgbWF0Y2hpbmcgbW9kdWxlIik7CkBAIC00OCw4ICs0OSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBobF9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggaGxfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gImhsIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQ2LAogCS5tYXRjaAkJPSBtYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2hsX2luZm8pLAogCS5tZQkJPSBUSElTX01PRFVMRSwKQEAgLTU3LDEzICs1OSwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcDZ0X2hsX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXA2dF9yZWdpc3Rlcl9tYXRjaCgmaGxfbWF0Y2gpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmaGxfbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXA2dF9obF9maW5pKHZvaWQpCiB7Ci0JaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZobF9tYXRjaCk7Ci0KKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZobF9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwNnRfaGxfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMKaW5kZXggMzA5M2MzOS4uMjZhYzA4NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaXB2NmhlYWRlci5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2lwdjZoZWFkZXIuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9pcHY2aGVhZGVyLmg+CiAKQEAgLTE0MCw4ICsxNDEsOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggaXA2dF9pcHY2aGVhZGVyX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBpcDZ0X2lwdjZoZWFkZXJfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gImlwdjZoZWFkZXIiLAorCS5mYW1pbHkJCT0gQUZfSU5FVDYsCiAJLm1hdGNoCQk9ICZpcHY2aGVhZGVyX21hdGNoLAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfaXB2NmhlYWRlcl9pbmZvKSwKIAkuY2hlY2tlbnRyeQk9ICZpcHY2aGVhZGVyX2NoZWNrZW50cnksCkBAIC0xNTEsMTIgKzE1MywxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHY2aGVhZGVyX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXA2dF9yZWdpc3Rlcl9tYXRjaCgmaXA2dF9pcHY2aGVhZGVyX21hdGNoKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJmlwNnRfaXB2NmhlYWRlcl9tYXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHY2aGVhZGVyX2V4aXQodm9pZCkKIHsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJmlwNnRfaXB2NmhlYWRlcl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmaXA2dF9pcHY2aGVhZGVyX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaXB2NmhlYWRlcl9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X21oLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9taC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjN2VmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9taC5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKTIwMDYgVVNBR0kvV0lERSBQcm9qZWN0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBdXRob3I6CisgKglNYXNhaGlkZSBOQUtBTVVSQSBAVVNBR0kgPG1hc2FoaWRlLm5ha2FtdXJhLmN6QGhpdGFjaGkuY29tPgorICoKKyAqIEJhc2VkIG9uIG5ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmMKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9taXA2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21oLmg+CisKK01PRFVMRV9ERVNDUklQVElPTigiaXA2dF90YWJsZXMgbWF0Y2ggZm9yIE1IIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBERUJVR19JUF9GSVJFV0FMTF9VU0VSCisjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogUmV0dXJucyAxIGlmIHRoZSB0eXBlIGlzIG1hdGNoZWQgYnkgdGhlIHJhbmdlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGlubGluZSBpbnQKK3R5cGVfbWF0Y2godV9pbnQ4X3QgbWluLCB1X2ludDhfdCBtYXgsIHVfaW50OF90IHR5cGUsIGludCBpbnZlcnQpCit7CisJaW50IHJldDsKKworCXJldCA9ICh0eXBlID49IG1pbiAmJiB0eXBlIDw9IG1heCkgXiBpbnZlcnQ7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAorCSBjb25zdCB2b2lkICptYXRjaGluZm8sCisJIGludCBvZmZzZXQsCisJIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCSBpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IGlwNl9taCBfbWgsICptaDsKKwljb25zdCBzdHJ1Y3QgaXA2dF9taCAqbWhpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KKwlpZiAob2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCW1oID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF9taCksICZfbWgpOworCWlmIChtaCA9PSBOVUxMKSB7CisJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCisJCSAgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KKwkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgTUggdGlueWdyYW0uXG4iKTsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gdHlwZV9tYXRjaChtaGluZm8tPnR5cGVzWzBdLCBtaGluZm8tPnR5cGVzWzFdLCBtaC0+aXA2bWhfdHlwZSwKKwkJCSAgISEobWhpbmZvLT5pbnZmbGFncyAmIElQNlRfTUhfSU5WX1RZUEUpKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAorbWhfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgICAgY29uc3Qgdm9pZCAqZW50cnksCisJICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKKwkgICAgICB2b2lkICptYXRjaGluZm8sCisJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF9taCAqbWhpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBzcGVjaWZ5IG5vIHVua25vd24gaW52ZmxhZ3MgKi8KKwlyZXR1cm4gIShtaGluZm8tPmludmZsYWdzICYgfklQNlRfTUhfSU5WX01BU0spOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIG1oX21hdGNoID0geworCS5uYW1lCQk9ICJtaCIsCisJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkuY2hlY2tlbnRyeQk9IG1oX2NoZWNrZW50cnksCisJLm1hdGNoCQk9IG1hdGNoLAorCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfbWgpLAorCS5wcm90bwkJPSBJUFBST1RPX01ILAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlwNnRfbWhfaW5pdCh2b2lkKQoreworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmbWhfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXA2dF9taF9maW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmbWhfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpcDZ0X21oX2luaXQpOworbW9kdWxlX2V4aXQoaXA2dF9taF9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X293bmVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9vd25lci5jCmluZGV4IDRlYjliYmMuLjQzNzM4YmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X293bmVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfb3duZXIuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9vd25lci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KIAogTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQNiB0YWJsZXMgb3duZXIgbWF0Y2hpbmcgbW9kdWxlIik7CkBAIC02OSw4ICs3MCw5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBvd25lcl9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggb3duZXJfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gIm93bmVyIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQ2LAogCS5tYXRjaAkJPSBtYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X293bmVyX2luZm8pLAogCS5ob29rcwkJPSAoMSA8PCBORl9JUDZfTE9DQUxfT1VUKSB8ICgxIDw8IE5GX0lQNl9QT1NUX1JPVVRJTkcpLApAQCAtODAsMTIgKzgyLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwNnRfb3duZXJfaW5pdCh2b2lkKQogewotCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZvd25lcl9tYXRjaCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZvd25lcl9tYXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcDZ0X293bmVyX2Zpbmkodm9pZCkKIHsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJm93bmVyX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZvd25lcl9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwNnRfb3duZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYwppbmRleCA1NGQ3ZDE0Li44MWFiMDBkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3J0Lmg+CiAKQEAgLTIyMSw4ICsyMjIsOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggcnRfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHJ0X21hdGNoID0gewogCS5uYW1lCQk9ICJydCIsCisJLmZhbWlseQkJPSBBRl9JTkVUNiwKIAkubWF0Y2gJCT0gbWF0Y2gsCiAJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9ydCksCiAJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LApAQCAtMjMxLDEyICsyMzMsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXA2dF9ydF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJnJ0X21hdGNoKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJnJ0X21hdGNoKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwNnRfcnRfZmluaSh2b2lkKQogewotCWlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmcnRfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJnJ0X21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaXA2dF9ydF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYwppbmRleCAyZmMwN2M3Li4xMTJhMjFkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jCkBAIC0xOSwyNSArMTksNiBAQAogCiAjZGVmaW5lIEZJTFRFUl9WQUxJRF9IT09LUyAoKDEgPDwgTkZfSVA2X0xPQ0FMX0lOKSB8ICgxIDw8IE5GX0lQNl9GT1JXQVJEKSB8ICgxIDw8IE5GX0lQNl9MT0NBTF9PVVQpKQogCi0vKiBTdGFuZGFyZCBlbnRyeS4gKi8KLXN0cnVjdCBpcDZ0X3N0YW5kYXJkCi17Ci0Jc3RydWN0IGlwNnRfZW50cnkgZW50cnk7Ci0Jc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0IHRhcmdldDsKLX07Ci0KLXN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldAotewotCXN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCB0YXJnZXQ7Ci0JY2hhciBlcnJvcm5hbWVbSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKLX07Ci0KLXN0cnVjdCBpcDZ0X2Vycm9yCi17Ci0Jc3RydWN0IGlwNnRfZW50cnkgZW50cnk7Ci0Jc3RydWN0IGlwNnRfZXJyb3JfdGFyZ2V0IHRhcmdldDsKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QKIHsKIAlzdHJ1Y3QgaXA2dF9yZXBsYWNlIHJlcGw7CkBAIC05Miw3ICs3Myw3IEBACiAgICAgfQogfTsKIAotc3RhdGljIHN0cnVjdCBpcDZ0X3RhYmxlIHBhY2tldF9maWx0ZXIgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhYmxlIHBhY2tldF9maWx0ZXIgPSB7CiAJLm5hbWUJCT0gImZpbHRlciIsCiAJLnZhbGlkX2hvb2tzCT0gRklMVEVSX1ZBTElEX0hPT0tTLAogCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKaW5kZXggNjI1MGU4Ni4uNWY1YWEwZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYwpAQCAtMjksMjUgKzI5LDYgQEAKICNkZWZpbmUgREVCVUdQKHgsIGFyZ3MuLi4pCiAjZW5kaWYKIAotLyogU3RhbmRhcmQgZW50cnkuICovCi1zdHJ1Y3QgaXA2dF9zdGFuZGFyZAotewotCXN0cnVjdCBpcDZ0X2VudHJ5IGVudHJ5OwotCXN0cnVjdCBpcDZ0X3N0YW5kYXJkX3RhcmdldCB0YXJnZXQ7Ci19OwotCi1zdHJ1Y3QgaXA2dF9lcnJvcl90YXJnZXQKLXsKLQlzdHJ1Y3QgaXA2dF9lbnRyeV90YXJnZXQgdGFyZ2V0OwotCWNoYXIgZXJyb3JuYW1lW0lQNlRfRlVOQ1RJT05fTUFYTkFNRUxFTl07Ci19OwotCi1zdHJ1Y3QgaXA2dF9lcnJvcgotewotCXN0cnVjdCBpcDZ0X2VudHJ5IGVudHJ5OwotCXN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldCB0YXJnZXQ7Ci19OwotCiBzdGF0aWMgc3RydWN0CiB7CiAJc3RydWN0IGlwNnRfcmVwbGFjZSByZXBsOwpAQCAtMTIyLDcgKzEwMyw3IEBACiAgICAgfQogfTsKIAotc3RhdGljIHN0cnVjdCBpcDZ0X3RhYmxlIHBhY2tldF9tYW5nbGVyID0geworc3RhdGljIHN0cnVjdCB4dF90YWJsZSBwYWNrZXRfbWFuZ2xlciA9IHsKIAkubmFtZQkJPSAibWFuZ2xlIiwKIAkudmFsaWRfaG9va3MJPSBNQU5HTEVfVkFMSURfSE9PS1MsCiAJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYwppbmRleCBiNDE1NGRhLi4yNzdiZjM0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfcmF3LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3Jhdy5jCkBAIC0xNCwyNSArMTQsNiBAQAogI2RlZmluZSBERUJVR1AoeCwgYXJncy4uLikKICNlbmRpZgogCi0vKiBTdGFuZGFyZCBlbnRyeS4gKi8KLXN0cnVjdCBpcDZ0X3N0YW5kYXJkCi17Ci0Jc3RydWN0IGlwNnRfZW50cnkgZW50cnk7Ci0Jc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0IHRhcmdldDsKLX07Ci0KLXN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldAotewotCXN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCB0YXJnZXQ7Ci0JY2hhciBlcnJvcm5hbWVbSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKLX07Ci0KLXN0cnVjdCBpcDZ0X2Vycm9yCi17Ci0Jc3RydWN0IGlwNnRfZW50cnkgZW50cnk7Ci0Jc3RydWN0IGlwNnRfZXJyb3JfdGFyZ2V0IHRhcmdldDsKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QKIHsKIAlzdHJ1Y3QgaXA2dF9yZXBsYWNlIHJlcGw7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yYXcuYyBiL25ldC9pcHY2L3Jhdy5jCmluZGV4IDRhZTFiMTlhLi5jMmQ4MDU5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yYXcuYworKysgYi9uZXQvaXB2Ni9yYXcuYwpAQCAtODE1LDcgKzgxNSw3IEBACiAJaWYgKGZpbmFsX3ApCiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBmaW5hbF9wKTsKIAotCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkKKwlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDEpKSA8IDApCiAJCWdvdG8gb3V0OwogCiAJaWYgKGhsaW1pdCA8IDApIHsKQEAgLTEwOTQsMTAgKzEwOTQsMTkgQEAKIAogc3RhdGljIGludCByYXd2Nl9pbml0X3NrKHN0cnVjdCBzb2NrICpzaykKIHsKLQlpZiAoaW5ldF9zayhzayktPm51bSA9PSBJUFBST1RPX0lDTVBWNikgewotCQlzdHJ1Y3QgcmF3Nl9zb2NrICpycCA9IHJhdzZfc2soc2spOworCXN0cnVjdCByYXc2X3NvY2sgKnJwID0gcmF3Nl9zayhzayk7CisKKwlzd2l0Y2ggKGluZXRfc2soc2spLT5udW0pIHsKKwljYXNlIElQUFJPVE9fSUNNUFY2OgogCQlycC0+Y2hlY2tzdW0gPSAxOwogCQlycC0+b2Zmc2V0ICAgPSAyOworCQlicmVhazsKKwljYXNlIElQUFJPVE9fTUg6CisJCXJwLT5jaGVja3N1bSA9IDE7CisJCXJwLT5vZmZzZXQgICA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAlyZXR1cm4oMCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCA1ZjAwNDNjLi4xOWM5MDZmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTMxMSwxMiArMzExLDIxIEBACiBzdGF0aWMgaW50IGlubGluZSBydDZfY2hlY2tfZGV2KHN0cnVjdCBydDZfaW5mbyAqcnQsIGludCBvaWYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHJ0LT5ydDZpX2RldjsKLQlpZiAoIW9pZiB8fCBkZXYtPmlmaW5kZXggPT0gb2lmKQorCWludCByZXQgPSAwOworCisJaWYgKCFvaWYpCiAJCXJldHVybiAyOwotCWlmICgoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgJiYKLQkgICAgcnQtPnJ0NmlfaWRldiAmJiBydC0+cnQ2aV9pZGV2LT5kZXYtPmlmaW5kZXggPT0gb2lmKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgeworCQlpZiAoIVdBUk5fT04ocnQtPnJ0NmlfaWRldiA9PSBOVUxMKSAmJgorCQkgICAgcnQtPnJ0NmlfaWRldi0+ZGV2LT5pZmluZGV4ID09IG9pZikKKwkJCXJldCA9IDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKwlpZiAoZGV2LT5pZmluZGV4ID09IG9pZikKKwkJcmV0dXJuIDI7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGlubGluZSBydDZfY2hlY2tfbmVpZ2goc3RydWN0IHJ0Nl9pbmZvICpydCkKQEAgLTIwNDAsNyArMjA0OSw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgdHlwZSwgc2l6ZW9mKCpydG0pLCBmbGFncyk7CiAJaWYgKG5saCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0JVRlM7CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlydG0gPSBubG1zZ19kYXRhKG5saCk7CiAJcnRtLT5ydG1fZmFtaWx5ID0gQUZfSU5FVDY7CkBAIC0yMTExLDcgKzIxMjAsOCBAQAogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwogCiBubGFfcHV0X2ZhaWx1cmU6Ci0JcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogCiBpbnQgcnQ2X2R1bXBfcm91dGUoc3RydWN0IHJ0Nl9pbmZvICpydCwgdm9pZCAqcF9hcmcpCkBAIC0yMjIyLDkgKzIyMzIsMTIgQEAKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBydDZfZmlsbF9ub2RlKHNrYiwgcnQsIE5VTEwsIE5VTEwsIDAsIGV2ZW50LCBwaWQsIHNlcSwgMCwgMCk7Ci0JLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBydDZfbmxtc2dfc2l6ZSgpICovCi0JQlVHX09OKGVyciA8IDApOwotCisJaWYgKGVyciA8IDApIHsKKwkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIHJ0Nl9ubG1zZ19zaXplKCkgKi8KKwkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3V0OworCX0KIAllcnIgPSBydG5sX25vdGlmeShza2IsIHBpZCwgUlROTEdSUF9JUFY2X1JPVVRFLCBubGgsIGdmcF9hbnkoKSk7CiBlcnJvdXQ6CiAJaWYgKGVyciA8IDApCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9zaXQuYyBiL25ldC9pcHY2L3NpdC5jCmluZGV4IDc3YjdiMDkuLjQ3Y2ZlYWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3NpdC5jCisrKyBiL25ldC9pcHY2L3NpdC5jCkBAIC02ODYsNyArNjg2LDggQEAKIAkJCQlnb3RvIGRvbmU7CiAJCQlkZXYgPSB0LT5kZXY7CiAJCX0KLQkJZXJyID0gdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwkJZXJyID0gMDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdGNwX2lwdjYuYyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKaW5kZXggYzI1ZTkzMC4uZGNiN2IwMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdGNwX2lwdjYuYworKysgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIAlpZiAoZmluYWxfcCkKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIGZpbmFsX3ApOwogCi0JaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKQorCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMSkpIDwgMCkKIAkJZ290byBmYWlsdXJlOwogCiAJaWYgKHNhZGRyID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcC5jIGIvbmV0L2lwdjYvdWRwLmMKaW5kZXggZjUyYTVjMy4uMTVlNTE5NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwLmMKKysrIGIvbmV0L2lwdjYvdWRwLmMKQEAgLTczNiw3ICs3MzYsNyBAQAogCWlmIChmaW5hbF9wKQogCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgZmluYWxfcCk7CiAKLQlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApKSA8IDApCisJaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAxKSkgPCAwKQogCQlnb3RvIG91dDsKIAogCWlmIChobGltaXQgPCAwKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9tb2RlX3R1bm5lbC5jIGIvbmV0L2lwdjYveGZybTZfbW9kZV90dW5uZWwuYwppbmRleCA1ZTdkOGE3Li4wYmM4NjZjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9tb2RlX3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L3hmcm02X21vZGVfdHVubmVsLmMKQEAgLTI1LDYgKzI1LDEyIEBACiAJCUlQNl9FQ05fc2V0X2NlKGlubmVyX2lwaCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcDZpcF9lY25fZGVjYXBzdWxhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoSU5FVF9FQ05faXNfY2UoaXB2Nl9nZXRfZHNmaWVsZChza2ItPm5oLmlwdjZoKSkpCisJCQlJUF9FQ05fc2V0X2NlKHNrYi0+aC5pcGlwaCk7Cit9CisKIC8qIEFkZCBlbmNhcHN1bGF0aW9uIGhlYWRlci4KICAqCiAgKiBUaGUgdG9wIElQIGhlYWRlciB3aWxsIGJlIGNvbnN0cnVjdGVkIHBlciBSRkMgMjQwMS4gIFRoZSBmb2xsb3dpbmcgZmllbGRzCkBAIC00MCw2ICs0Niw3IEBACiBzdGF0aWMgaW50IHhmcm02X3R1bm5lbF9vdXRwdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CisJc3RydWN0IHhmcm1fZHN0ICp4ZHN0ID0gKHN0cnVjdCB4ZnJtX2RzdCopZHN0OwogCXN0cnVjdCBpcHY2aGRyICppcGgsICp0b3BfaXBoOwogCWludCBkc2ZpZWxkOwogCkBAIC01MiwxNiArNTksMjQgQEAKIAlza2ItPmguaXB2NmggPSB0b3BfaXBoICsgMTsKIAogCXRvcF9pcGgtPnZlcnNpb24gPSA2OwotCXRvcF9pcGgtPnByaW9yaXR5ID0gaXBoLT5wcmlvcml0eTsKLQl0b3BfaXBoLT5mbG93X2xibFswXSA9IGlwaC0+Zmxvd19sYmxbMF07Ci0JdG9wX2lwaC0+Zmxvd19sYmxbMV0gPSBpcGgtPmZsb3dfbGJsWzFdOwotCXRvcF9pcGgtPmZsb3dfbGJsWzJdID0gaXBoLT5mbG93X2xibFsyXTsKKwlpZiAoeGRzdC0+cm91dGUtPm9wcy0+ZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXRvcF9pcGgtPnByaW9yaXR5ID0gaXBoLT5wcmlvcml0eTsKKwkJdG9wX2lwaC0+Zmxvd19sYmxbMF0gPSBpcGgtPmZsb3dfbGJsWzBdOworCQl0b3BfaXBoLT5mbG93X2xibFsxXSA9IGlwaC0+Zmxvd19sYmxbMV07CisJCXRvcF9pcGgtPmZsb3dfbGJsWzJdID0gaXBoLT5mbG93X2xibFsyXTsKKwkJdG9wX2lwaC0+bmV4dGhkciA9IElQUFJPVE9fSVBWNjsKKwl9IGVsc2UgeworCQl0b3BfaXBoLT5wcmlvcml0eSA9IDA7CisJCXRvcF9pcGgtPmZsb3dfbGJsWzBdID0gMDsKKwkJdG9wX2lwaC0+Zmxvd19sYmxbMV0gPSAwOworCQl0b3BfaXBoLT5mbG93X2xibFsyXSA9IDA7CisJCXRvcF9pcGgtPm5leHRoZHIgPSBJUFBST1RPX0lQSVA7CisJfQogCWRzZmllbGQgPSBpcHY2X2dldF9kc2ZpZWxkKHRvcF9pcGgpOwogCWRzZmllbGQgPSBJTkVUX0VDTl9lbmNhcHN1bGF0ZShkc2ZpZWxkLCBkc2ZpZWxkKTsKIAlpZiAoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX05PRUNOKQogCQlkc2ZpZWxkICY9IH5JTkVUX0VDTl9NQVNLOwogCWlwdjZfY2hhbmdlX2RzZmllbGQodG9wX2lwaCwgMCwgZHNmaWVsZCk7Ci0JdG9wX2lwaC0+bmV4dGhkciA9IElQUFJPVE9fSVBWNjsgCiAJdG9wX2lwaC0+aG9wX2xpbWl0ID0gZHN0X21ldHJpYyhkc3QtPmNoaWxkLCBSVEFYX0hPUExJTUlUKTsKIAlpcHY2X2FkZHJfY29weSgmdG9wX2lwaC0+c2FkZHIsIChzdHJ1Y3QgaW42X2FkZHIgKikmeC0+cHJvcHMuc2FkZHIpOwogCWlwdjZfYWRkcl9jb3B5KCZ0b3BfaXBoLT5kYWRkciwgKHN0cnVjdCBpbjZfYWRkciAqKSZ4LT5pZC5kYWRkcik7CkBAIC03Miw3ICs4Nyw4IEBACiB7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQlpZiAoc2tiLT5uaC5yYXdbSVA2Q0Ioc2tiKS0+bmhvZmZdICE9IElQUFJPVE9fSVBWNikKKwlpZiAoc2tiLT5uaC5yYXdbSVA2Q0Ioc2tiKS0+bmhvZmZdICE9IElQUFJPVE9fSVBWNgorCSAgICAmJiBza2ItPm5oLnJhd1tJUDZDQihza2IpLT5uaG9mZl0gIT0gSVBQUk9UT19JUElQKQogCQlnb3RvIG91dDsKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKIAkJZ290byBvdXQ7CkBAIC04MSwxMCArOTcsMTYgQEAKIAkgICAgKGVyciA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkpCiAJCWdvdG8gb3V0OwogCi0JaWYgKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9ERUNBUF9EU0NQKQotCQlpcHY2X2NvcHlfZHNjcChza2ItPm5oLmlwdjZoLCBza2ItPmguaXB2NmgpOwotCWlmICghKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9OT0VDTikpCi0JCWlwaXA2X2Vjbl9kZWNhcHN1bGF0ZShza2IpOworCWlmIChza2ItPm5oLnJhd1tJUDZDQihza2IpLT5uaG9mZl0gPT0gSVBQUk9UT19JUFY2KSB7CisJCWlmICh4LT5wcm9wcy5mbGFncyAmIFhGUk1fU1RBVEVfREVDQVBfRFNDUCkKKwkJCWlwdjZfY29weV9kc2NwKHNrYi0+bmguaXB2NmgsIHNrYi0+aC5pcHY2aCk7CisJCWlmICghKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9OT0VDTikpCisJCQlpcGlwNl9lY25fZGVjYXBzdWxhdGUoc2tiKTsKKwl9IGVsc2UgeworCQlpZiAoISh4LT5wcm9wcy5mbGFncyAmIFhGUk1fU1RBVEVfTk9FQ04pKQorCQkJaXA2aXBfZWNuX2RlY2Fwc3VsYXRlKHNrYik7CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJfQogCXNrYi0+bWFjLnJhdyA9IG1lbW1vdmUoc2tiLT5kYXRhIC0gc2tiLT5tYWNfbGVuLAogCQkJICAgICAgIHNrYi0+bWFjLnJhdywgc2tiLT5tYWNfbGVuKTsKIAlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X3BvbGljeS5jIGIvbmV0L2lwdjYveGZybTZfcG9saWN5LmMKaW5kZXggOGRmZmQ0ZC4uNTk0ODBlOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfcG9saWN5LmMKKysrIGIvbmV0L2lwdjYveGZybTZfcG9saWN5LmMKQEAgLTEzMSwxMyArMTMxLDExIEBACiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0LCAqZHN0X3ByZXY7CiAJc3RydWN0IHJ0Nl9pbmZvICpydDAgPSAoc3RydWN0IHJ0Nl9pbmZvKikoKmRzdF9wKTsKIAlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ICA9IHJ0MDsKLQlzdHJ1Y3QgaW42X2FkZHIgKnJlbW90ZSA9ICZmbC0+Zmw2X2RzdDsKLQlzdHJ1Y3QgaW42X2FkZHIgKmxvY2FsICA9ICZmbC0+Zmw2X3NyYzsKIAlzdHJ1Y3QgZmxvd2kgZmxfdHVubmVsID0gewogCQkubmxfdSA9IHsKIAkJCS5pcDZfdSA9IHsKLQkJCQkuc2FkZHIgPSAqbG9jYWwsCi0JCQkJLmRhZGRyID0gKnJlbW90ZQorCQkJCS5zYWRkciA9IGZsLT5mbDZfc3JjLAorCQkJCS5kYWRkciA9IGZsLT5mbDZfZHN0LAogCQkJfQogCQl9CiAJfTsKQEAgLTE1Myw3ICsxNTEsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBueDsgaSsrKSB7CiAJCXN0cnVjdCBkc3RfZW50cnkgKmRzdDEgPSBkc3RfYWxsb2MoJnhmcm02X2RzdF9vcHMpOwogCQlzdHJ1Y3QgeGZybV9kc3QgKnhkc3Q7Ci0JCWludCB0dW5uZWwgPSAwOwogCiAJCWlmICh1bmxpa2VseShkc3QxID09IE5VTEwpKSB7CiAJCQllcnIgPSAtRU5PQlVGUzsKQEAgLTE3NywxOSArMTc0LDI3IEBACiAKIAkJZHN0MS0+bmV4dCA9IGRzdF9wcmV2OwogCQlkc3RfcHJldiA9IGRzdDE7Ci0JCWlmICh4ZnJtW2ldLT5wcm9wcy5tb2RlICE9IFhGUk1fTU9ERV9UUkFOU1BPUlQpIHsKLQkJCXJlbW90ZSA9IF9feGZybTZfYnVuZGxlX2FkZHJfcmVtb3RlKHhmcm1baV0sIHJlbW90ZSk7Ci0JCQlsb2NhbCAgPSBfX3hmcm02X2J1bmRsZV9hZGRyX2xvY2FsKHhmcm1baV0sIGxvY2FsKTsKLQkJCXR1bm5lbCA9IDE7Ci0JCX0KKwogCQlfX3hmcm02X2J1bmRsZV9sZW5faW5jKCZoZWFkZXJfbGVuLCAmbmZoZWFkZXJfbGVuLCB4ZnJtW2ldKTsKIAkJdHJhaWxlcl9sZW4gKz0geGZybVtpXS0+cHJvcHMudHJhaWxlcl9sZW47CiAKLQkJaWYgKHR1bm5lbCkgewotCQkJaXB2Nl9hZGRyX2NvcHkoJmZsX3R1bm5lbC5mbDZfZHN0LCByZW1vdGUpOwotCQkJaXB2Nl9hZGRyX2NvcHkoJmZsX3R1bm5lbC5mbDZfc3JjLCBsb2NhbCk7CisJCWlmICh4ZnJtW2ldLT5wcm9wcy5tb2RlID09IFhGUk1fTU9ERV9UVU5ORUwpIHsKKwkJCXVuc2lnbmVkIHNob3J0IGVuY2FwX2ZhbWlseSA9IHhmcm1baV0tPnByb3BzLmZhbWlseTsKKwkJCXN3aXRjaChlbmNhcF9mYW1pbHkpIHsKKwkJCWNhc2UgQUZfSU5FVDoKKwkJCQlmbF90dW5uZWwuZmw0X2RzdCA9IHhmcm1baV0tPmlkLmRhZGRyLmE0OworCQkJCWZsX3R1bm5lbC5mbDRfc3JjID0geGZybVtpXS0+cHJvcHMuc2FkZHIuYTQ7CisJCQkJYnJlYWs7CisJCQljYXNlIEFGX0lORVQ2OgorCQkJCWlwdjZfYWRkcl9jb3B5KCZmbF90dW5uZWwuZmw2X2RzdCwgKHN0cnVjdCBpbjZfYWRkciopJnhmcm1baV0tPmlkLmRhZGRyLmE2KTsKKwkJCQlpcHY2X2FkZHJfY29weSgmZmxfdHVubmVsLmZsNl9zcmMsIChzdHJ1Y3QgaW42X2FkZHIqKSZ4ZnJtW2ldLT5wcm9wcy5zYWRkci5hNik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUJVR19PTigxKTsKKwkJCX0KKwogCQkJZXJyID0geGZybV9kc3RfbG9va3VwKChzdHJ1Y3QgeGZybV9kc3QgKiopICZydCwKLQkJCQkJICAgICAgJmZsX3R1bm5lbCwgQUZfSU5FVDYpOworCQkJCQkgICAgICAmZmxfdHVubmVsLCBlbmNhcF9mYW1pbHkpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIGVycm9yOwogCQl9IGVsc2UKQEAgLTIwOCw2ICsyMTMsNyBAQAogCWkgPSAwOwogCWZvciAoOyBkc3RfcHJldiAhPSAmcnQtPnUuZHN0OyBkc3RfcHJldiA9IGRzdF9wcmV2LT5jaGlsZCkgewogCQlzdHJ1Y3QgeGZybV9kc3QgKnggPSAoc3RydWN0IHhmcm1fZHN0Kilkc3RfcHJldjsKKwkJc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvICphZmluZm87CiAKIAkJZHN0X3ByZXYtPnhmcm0gPSB4ZnJtW2krK107CiAJCWRzdF9wcmV2LT5kZXYgPSBydC0+dS5kc3QuZGV2OwpAQCAtMjI0LDcgKzIzMCwxNyBAQAogCQkvKiBDb3B5IG5laWdoYm91ciBmb3IgcmVhY2hhYmlsaXR5IGNvbmZpcm1hdGlvbiAqLwogCQlkc3RfcHJldi0+bmVpZ2hib3VyCT0gbmVpZ2hfY2xvbmUocnQtPnUuZHN0Lm5laWdoYm91cik7CiAJCWRzdF9wcmV2LT5pbnB1dAkJPSBydC0+dS5kc3QuaW5wdXQ7Ci0JCWRzdF9wcmV2LT5vdXRwdXQJPSB4ZnJtNl9vdXRwdXQ7CisJCS8qIFhYWDogV2hlbiBJUHY0IGlzIGltcGxlbWVudGVkIGFzIG1vZHVsZSBhbmQgY2FuIGJlIHVubG9hZGVkLAorCQkgKiB3ZSBzaG91bGQgbWFuYWdlIHJlZmVyZW5jZSB0byB4ZnJtNF9vdXRwdXQgaW4gYWZpbmZvLT5vdXRwdXQuCisJCSAqIE1peWF6YXdhCisJCSAqLworCQlhZmluZm8gPSB4ZnJtX3N0YXRlX2dldF9hZmluZm8oZHN0X3ByZXYtPnhmcm0tPnByb3BzLmZhbWlseSk7CisJCWlmICghYWZpbmZvKSB7CisJCQlkc3QgPSAqZHN0X3A7CisJCQlnb3RvIGVycm9yOworCQl9OworCQlkc3RfcHJldi0+b3V0cHV0ID0gYWZpbmZvLT5vdXRwdXQ7CisJCXhmcm1fc3RhdGVfcHV0X2FmaW5mbyhhZmluZm8pOwogCQkvKiBTaGVpdC4uLiBJIHJlbWVtYmVyIEkgZGlkIHRoaXMgcmlnaHQuIEFwcGFyZW50bHksCiAJCSAqIGl0IHdhcyBtYWdpY2FsbHkgbG9zdCwgc28gdGhpcyBjb2RlIG5lZWRzIGF1ZGl0ICovCiAJCXgtPnUucnQ2LnJ0NmlfZmxhZ3MgICAgPSBydDAtPnJ0NmlfZmxhZ3MmKFJUQ0ZfQlJPQURDQVNUfFJUQ0ZfTVVMVElDQVNUfFJUQ0ZfTE9DQUwpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfc3RhdGUuYyBiL25ldC9pcHY2L3hmcm02X3N0YXRlLmMKaW5kZXggOWRkYWE5ZC4uNjBhZDVmMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfc3RhdGUuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9zdGF0ZS5jCkBAIC0xNzEsNiArMTcxLDcgQEAKIAkuaW5pdF90ZW1wc2VsCQk9IF9feGZybTZfaW5pdF90ZW1wc2VsLAogCS50bXBsX3NvcnQJCT0gX194ZnJtNl90bXBsX3NvcnQsCiAJLnN0YXRlX3NvcnQJCT0gX194ZnJtNl9zdGF0ZV9zb3J0LAorCS5vdXRwdXQJCQk9IHhmcm02X291dHB1dCwKIH07CiAKIHZvaWQgX19pbml0IHhmcm02X3N0YXRlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9pcHgvYWZfaXB4LmMgYi9uZXQvaXB4L2FmX2lweC5jCmluZGV4IDc2YzY2MTUuLjg5ZjI4M2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHgvYWZfaXB4LmMKKysrIGIvbmV0L2lweC9hZl9pcHguYwpAQCAtMjAzNSwxOSArMjAzNSwyNyBAQAogCiAJaXB4aXRmX2NsZWFudXAoKTsKIAotCXVucmVnaXN0ZXJfc25hcF9jbGllbnQocFNOQVBfZGF0YWxpbmspOwotCXBTTkFQX2RhdGFsaW5rID0gTlVMTDsKKwlpZiAocFNOQVBfZGF0YWxpbmspIHsKKwkJdW5yZWdpc3Rlcl9zbmFwX2NsaWVudChwU05BUF9kYXRhbGluayk7CisJCXBTTkFQX2RhdGFsaW5rID0gTlVMTDsKKwl9CiAKLQl1bnJlZ2lzdGVyXzgwMjJfY2xpZW50KHA4MDIyX2RhdGFsaW5rKTsKLQlwODAyMl9kYXRhbGluayA9IE5VTEw7CisJaWYgKHA4MDIyX2RhdGFsaW5rKSB7CisJCXVucmVnaXN0ZXJfODAyMl9jbGllbnQocDgwMjJfZGF0YWxpbmspOworCQlwODAyMl9kYXRhbGluayA9IE5VTEw7CisJfQogCiAJZGV2X3JlbW92ZV9wYWNrKCZpcHhfODAyM19wYWNrZXRfdHlwZSk7Ci0JZGVzdHJveV84MDIzX2NsaWVudChwODAyM19kYXRhbGluayk7Ci0JcDgwMjNfZGF0YWxpbmsgPSBOVUxMOworCWlmIChwODAyM19kYXRhbGluaykgeworCQlkZXN0cm95XzgwMjNfY2xpZW50KHA4MDIzX2RhdGFsaW5rKTsKKwkJcDgwMjNfZGF0YWxpbmsgPSBOVUxMOworCX0KIAogCWRldl9yZW1vdmVfcGFjaygmaXB4X2RpeF9wYWNrZXRfdHlwZSk7Ci0JZGVzdHJveV9FSUlfY2xpZW50KHBFSUlfZGF0YWxpbmspOwotCXBFSUlfZGF0YWxpbmsgPSBOVUxMOworCWlmIChwRUlJX2RhdGFsaW5rKSB7CisJCWRlc3Ryb3lfRUlJX2NsaWVudChwRUlJX2RhdGFsaW5rKTsKKwkJcEVJSV9kYXRhbGluayA9IE5VTEw7CisJfQogCiAJcHJvdG9fdW5yZWdpc3RlcigmaXB4X3Byb3RvKTsKIAlzb2NrX3VucmVnaXN0ZXIoaXB4X2ZhbWlseV9vcHMuZmFtaWx5KTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyaWFzX29iamVjdC5jIGIvbmV0L2lyZGEvaXJpYXNfb2JqZWN0LmMKaW5kZXggYjFlZTk5YS4uMmE1NzFiNCAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJpYXNfb2JqZWN0LmMKKysrIGIvbmV0L2lyZGEvaXJpYXNfb2JqZWN0LmMKQEAgLTkxLDYgKzkxLDEyIEBACiAKIAlvYmotPm1hZ2ljID0gSUFTX09CSkVDVF9NQUdJQzsKIAlvYmotPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQ0xBU1NOQU1FKTsKKwlpZiAoIW9iai0+bmFtZSkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIFVuYWJsZSB0byBhbGxvY2F0ZSBuYW1lIVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCW9iai0+aWQgPSBpZDsKIAogCS8qIExvY2tpbmcgbm90ZXMgOiB0aGUgYXR0cmliIHNwaW5sb2NrIGhhcyBsb3dlciBwcmVjZW5kZW5jZQpAQCAtMTAxLDYgKzEwNyw3IEBACiAJaWYgKG9iai0+YXR0cmlicyA9PSBOVUxMKSB7CiAJCUlSREFfV0FSTklORygiJXMoKSwgVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnMhXG4iLAogCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlrZnJlZShvYmotPm5hbWUpOwogCQlrZnJlZShvYmopOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0zNTcsNiArMzY0LDE1IEBACiAKIAkvKiBJbnNlcnQgdmFsdWUgKi8KIAlhdHRyaWItPnZhbHVlID0gaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUodmFsdWUpOworCWlmICghYXR0cmliLT5uYW1lIHx8ICFhdHRyaWItPnZhbHVlKSB7CisJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlpZiAoYXR0cmliLT52YWx1ZSkKKwkJCWlyaWFzX2RlbGV0ZV92YWx1ZShhdHRyaWItPnZhbHVlKTsKKwkJa2ZyZWUoYXR0cmliLT5uYW1lKTsKKwkJa2ZyZWUoYXR0cmliKTsKKwkJcmV0dXJuOworCX0KIAogCWlyaWFzX2FkZF9hdHRyaWIob2JqLCBhdHRyaWIsIG93bmVyKTsKIH0KQEAgLTM5MSw2ICs0MDcsMTUgQEAKIAlhdHRyaWItPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQVRUUklCTkFNRSk7CiAKIAlhdHRyaWItPnZhbHVlID0gaXJpYXNfbmV3X29jdHNlcV92YWx1ZSggb2N0ZXRzLCBsZW4pOworCWlmICghYXR0cmliLT5uYW1lIHx8ICFhdHRyaWItPnZhbHVlKSB7CisJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlpZiAoYXR0cmliLT52YWx1ZSkKKwkJCWlyaWFzX2RlbGV0ZV92YWx1ZShhdHRyaWItPnZhbHVlKTsKKwkJa2ZyZWUoYXR0cmliLT5uYW1lKTsKKwkJa2ZyZWUoYXR0cmliKTsKKwkJcmV0dXJuOworCX0KIAogCWlyaWFzX2FkZF9hdHRyaWIob2JqLCBhdHRyaWIsIG93bmVyKTsKIH0KQEAgLTQyNCw2ICs0NDksMTUgQEAKIAlhdHRyaWItPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQVRUUklCTkFNRSk7CiAKIAlhdHRyaWItPnZhbHVlID0gaXJpYXNfbmV3X3N0cmluZ192YWx1ZSh2YWx1ZSk7CisJaWYgKCFhdHRyaWItPm5hbWUgfHwgIWF0dHJpYi0+dmFsdWUpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCWlmIChhdHRyaWItPnZhbHVlKQorCQkJaXJpYXNfZGVsZXRlX3ZhbHVlKGF0dHJpYi0+dmFsdWUpOworCQlrZnJlZShhdHRyaWItPm5hbWUpOworCQlrZnJlZShhdHRyaWIpOworCQlyZXR1cm47CisJfQogCiAJaXJpYXNfYWRkX2F0dHJpYihvYmosIGF0dHJpYiwgb3duZXIpOwogfQpAQCAtNDczLDYgKzUwNywxMiBAQAogCXZhbHVlLT50eXBlID0gSUFTX1NUUklORzsKIAl2YWx1ZS0+Y2hhcnNldCA9IENTX0FTQ0lJOwogCXZhbHVlLT50LnN0cmluZyA9IHN0cm5kdXAoc3RyaW5nLCBJQVNfTUFYX1NUUklORyk7CisJaWYgKCF2YWx1ZS0+dC5zdHJpbmcpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlrZnJlZSh2YWx1ZSk7CisJCXJldHVybiBOVUxMOworCX0KKwogCXZhbHVlLT5sZW4gPSBzdHJsZW4odmFsdWUtPnQuc3RyaW5nKTsKIAogCXJldHVybiB2YWx1ZTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFuL2lybGFuX2NvbW1vbi5jIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMKaW5kZXggMmJiMDRhYy4uMzEwNzc2ZCAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMKKysrIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMKQEAgLTE0NCwxMiArMTQ0LDE4IEBACiAJLyogUmVnaXN0ZXIgd2l0aCBJckxNUCBhcyBhIGNsaWVudCAqLwogCWNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9jbGllbnQoaGludHMsICZpcmxhbl9jbGllbnRfZGlzY292ZXJ5X2luZGljYXRpb24sCiAJCQkJICAgICBOVUxMLCBOVUxMKTsKLQkKKwlpZiAoIWNrZXkpCisJCWdvdG8gZXJyX2NrZXk7CisKIAkvKiBSZWdpc3RlciB3aXRoIElyTE1QIGFzIGEgc2VydmljZSAqLwotIAlza2V5ID0gaXJsbXBfcmVnaXN0ZXJfc2VydmljZShoaW50cyk7CisJc2tleSA9IGlybG1wX3JlZ2lzdGVyX3NlcnZpY2UoaGludHMpOworCWlmICghc2tleSkKKwkJZ290byBlcnJfc2tleTsKIAogCS8qIFN0YXJ0IHRoZSBtYXN0ZXIgSXJMQU4gaW5zdGFuY2UgKHRoZSBvbmx5IG9uZSBmb3Igbm93KSAqLwotIAluZXcgPSBpcmxhbl9vcGVuKERFVl9BRERSX0FOWSwgREVWX0FERFJfQU5ZKTsKKwluZXcgPSBpcmxhbl9vcGVuKERFVl9BRERSX0FOWSwgREVWX0FERFJfQU5ZKTsKKwlpZiAoIW5ldykKKwkJZ290byBlcnJfb3BlbjsKIAogCS8qIFRoZSBtYXN0ZXIgd2lsbCBvbmx5IG9wZW4gaXRzIChsaXN0ZW4pIGNvbnRyb2wgVFNBUCAqLwogCWlybGFuX3Byb3ZpZGVyX29wZW5fY3RybF90c2FwKG5ldyk7CkBAIC0xNTgsNiArMTY0LDE3IEBACiAJaXJsbXBfZGlzY292ZXJ5X3JlcXVlc3QoRElTQ09WRVJZX0RFRkFVTFRfU0xPVFMpOwogCiAJcmV0dXJuIDA7CisKK2Vycl9vcGVuOgorCWlybG1wX3VucmVnaXN0ZXJfc2VydmljZShza2V5KTsKK2Vycl9za2V5OgorCWlybG1wX3VucmVnaXN0ZXJfY2xpZW50KGNrZXkpOworZXJyX2NrZXk6CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlyZW1vdmVfcHJvY19lbnRyeSgiaXJsYW4iLCBwcm9jX2lyZGEpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlybGFuX2NsZWFudXAodm9pZCkgCmRpZmYgLS1naXQgYS9uZXQvaXVjdi9LY29uZmlnIGIvbmV0L2l1Y3YvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGZjYzNkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2l1Y3YvS2NvbmZpZwpAQCAtMCwwICsxLDE1IEBACitjb25maWcgSVVDVgorCXRyaXN0YXRlICJJVUNWIHN1cHBvcnQgKFZNIG9ubHkpIgorCWRlcGVuZHMgb24gUzM5MAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgaW50ZXItdXNlciBjb21tdW5pY2F0aW9uIHVuZGVyCisJICBWTSBvciBWSUYgc29ja2V0cy4gSWYgeW91IHJ1biBvbiB6L1ZNLCBzYXkgIlkiIHRvIGVuYWJsZSBhIGZhc3QKKwkgIGNvbW11bmljYXRpb24gbGluayBiZXR3ZWVuIFZNIGd1ZXN0cy4KKworY29uZmlnIEFGSVVDVgorCXRyaXN0YXRlICJBRl9JVUNWIHN1cHBvcnQgKFZNIG9ubHkpIgorCWRlcGVuZHMgb24gSVVDVgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgaW50ZXItdXNlciBjb21tdW5pY2F0aW9uIHVuZGVyCisJICBWTSBvciBWSUYgc29ja2V0cy4gSWYgeW91IHJ1biBvbiB6L1ZNLCBzYXkgIlkiIHRvIGVuYWJsZSBhIGZhc3QKKwkgIGNvbW11bmljYXRpb24gbGluayBiZXR3ZWVuIFZNIGd1ZXN0cy4KZGlmZiAtLWdpdCBhL25ldC9pdWN2L01ha2VmaWxlIGIvbmV0L2l1Y3YvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmZGM4NQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pdWN2L01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3IgSVVDVgorIworCitvYmotJChDT05GSUdfSVVDVikJKz0gaXVjdi5vCitvYmotJChDT05GSUdfQUZJVUNWKQkrPSBhZl9pdWN2Lm8KZGlmZiAtLWdpdCBhL25ldC9pdWN2L2FmX2l1Y3YuYyBiL25ldC9pdWN2L2FmX2l1Y3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2M5NDIxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2l1Y3YvYWZfaXVjdi5jCkBAIC0wLDAgKzEsMTA3NyBAQAorLyoKKyAqICBsaW51eC9uZXQvaXVjdi9hZl9pdWN2LmMKKyAqCisgKiAgSVVDViBwcm90b2NvbCBzdGFjayBmb3IgTGludXggb24gelNlcmllcworICoKKyAqICBDb3B5cmlnaHQgMjAwNiBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiAgQXV0aG9yKHMpOglKZW5uaWZlciBIdW50IDxqZW5odW50QHVzLmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KKyNpbmNsdWRlIDxhc20vY3BjbWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisKKyNpbmNsdWRlIDxuZXQvaXVjdi9pdWN2Lmg+CisjaW5jbHVkZSA8bmV0L2l1Y3YvYWZfaXVjdi5oPgorCisjZGVmaW5lIENPTkZJR19JVUNWX1NPQ0tfREVCVUcgMQorCisjZGVmaW5lIElQUk1EQVRBIDB4ODAKKyNkZWZpbmUgVkVSU0lPTiAiMS4wIgorCitzdGF0aWMgY2hhciBpdWN2X3VzZXJpZFs4MF07CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGl1Y3Zfc29ja19vcHM7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gaXVjdl9wcm90byA9IHsKKwkubmFtZQkJPSAiQUZfSVVDViIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vYmpfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXVjdl9zb2NrKSwKK307CisKKy8qIENhbGwgQmFjayBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGl1Y3ZfY2FsbGJhY2tfcngoc3RydWN0IGl1Y3ZfcGF0aCAqLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICopOworc3RhdGljIHZvaWQgaXVjdl9jYWxsYmFja190eGRvbmUoc3RydWN0IGl1Y3ZfcGF0aCAqLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICopOworc3RhdGljIHZvaWQgaXVjdl9jYWxsYmFja19jb25uYWNrKHN0cnVjdCBpdWN2X3BhdGggKiwgdTggaXB1c2VyWzE2XSk7CitzdGF0aWMgaW50IGl1Y3ZfY2FsbGJhY2tfY29ubnJlcShzdHJ1Y3QgaXVjdl9wYXRoICosIHU4IGlwdm1pZFs4XSwgdTggaXB1c2VyWzE2XSk7CitzdGF0aWMgdm9pZCBpdWN2X2NhbGxiYWNrX2Nvbm5yZWooc3RydWN0IGl1Y3ZfcGF0aCAqLCB1OCBpcHVzZXJbMTZdKTsKKworc3RhdGljIHN0cnVjdCBpdWN2X3NvY2tfbGlzdCBpdWN2X3NrX2xpc3QgPSB7CisJLmxvY2sgPSBSV19MT0NLX1VOTE9DS0VELAorCS5hdXRvYmluZF9uYW1lID0gQVRPTUlDX0lOSVQoMCkKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXVjdl9oYW5kbGVyIGFmX2l1Y3ZfaGFuZGxlciA9IHsKKwkucGF0aF9wZW5kaW5nCSAgPSBpdWN2X2NhbGxiYWNrX2Nvbm5yZXEsCisJLnBhdGhfY29tcGxldGUJICA9IGl1Y3ZfY2FsbGJhY2tfY29ubmFjaywKKwkucGF0aF9zZXZlcmVkCSAgPSBpdWN2X2NhbGxiYWNrX2Nvbm5yZWosCisJLm1lc3NhZ2VfcGVuZGluZyAgPSBpdWN2X2NhbGxiYWNrX3J4LAorCS5tZXNzYWdlX2NvbXBsZXRlID0gaXVjdl9jYWxsYmFja190eGRvbmUKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWdoX25tY3B5KHVuc2lnbmVkIGNoYXIgKmRzdCwgY2hhciAqc3JjKQoreworICAgICAgIG1lbWNweShkc3QsIHNyYywgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb3dfbm1jcHkodW5zaWduZWQgY2hhciAqZHN0LCBjaGFyICpzcmMpCit7CisgICAgICAgbWVtY3B5KCZkc3RbOF0sIHNyYywgOCk7Cit9CisKKy8qIFRpbWVycyAqLworc3RhdGljIHZvaWQgaXVjdl9zb2NrX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopYXJnOworCisJYmhfbG9ja19zb2NrKHNrKTsKKwlzay0+c2tfZXJyID0gRVRJTUVET1VUOworCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCWJoX3VubG9ja19zb2NrKHNrKTsKKworCWl1Y3Zfc29ja19raWxsKHNrKTsKKwlzb2NrX3B1dChzayk7Cit9CisKK3N0YXRpYyB2b2lkIGl1Y3Zfc29ja19jbGVhcl90aW1lcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc2tfc3RvcF90aW1lcihzaywgJnNrLT5za190aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIGl1Y3Zfc29ja19pbml0X3RpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbml0X3RpbWVyKCZzay0+c2tfdGltZXIpOworCXNrLT5za190aW1lci5mdW5jdGlvbiA9IGl1Y3Zfc29ja190aW1lb3V0OworCXNrLT5za190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqX19pdWN2X2dldF9zb2NrX2J5X25hbWUoY2hhciAqbm0pCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZpdWN2X3NrX2xpc3QuaGVhZCkKKwkJaWYgKCFtZW1jbXAoJml1Y3Zfc2soc2spLT5zcmNfbmFtZSwgbm0sIDgpKQorCQkJcmV0dXJuIHNrOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGl1Y3Zfc29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfd3JpdGVfcXVldWUpOworfQorCisvKiBDbGVhbnVwIExpc3RlbiAqLworc3RhdGljIHZvaWQgaXVjdl9zb2NrX2NsZWFudXBfbGlzdGVuKHN0cnVjdCBzb2NrICpwYXJlbnQpCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJLyogQ2xvc2Ugbm9uLWFjY2VwdGVkIGNvbm5lY3Rpb25zICovCisJd2hpbGUgKChzayA9IGl1Y3ZfYWNjZXB0X2RlcXVldWUocGFyZW50LCBOVUxMKSkpIHsKKwkJaXVjdl9zb2NrX2Nsb3NlKHNrKTsKKwkJaXVjdl9zb2NrX2tpbGwoc2spOworCX0KKworCXBhcmVudC0+c2tfc3RhdGUgPSBJVUNWX0NMT1NFRDsKKwlzb2NrX3NldF9mbGFnKHBhcmVudCwgU09DS19aQVBQRUQpOworfQorCisvKiBLaWxsIHNvY2tldCAqLworc3RhdGljIHZvaWQgaXVjdl9zb2NrX2tpbGwoc3RydWN0IHNvY2sgKnNrKQoreworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkgfHwgc2stPnNrX3NvY2tldCkKKwkJcmV0dXJuOworCisJaXVjdl9zb2NrX3VubGluaygmaXVjdl9za19saXN0LCBzayk7CisJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKwlzb2NrX3B1dChzayk7Cit9CisKKy8qIENsb3NlIGFuIElVQ1Ygc29ja2V0ICovCitzdGF0aWMgdm9pZCBpdWN2X3NvY2tfY2xvc2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXVuc2lnbmVkIGNoYXIgdXNlcl9kYXRhWzE2XTsKKwlzdHJ1Y3QgaXVjdl9zb2NrICppdWN2ID0gaXVjdl9zayhzayk7CisJaW50IGVycjsKKworCWl1Y3Zfc29ja19jbGVhcl90aW1lcihzayk7CisJbG9ja19zb2NrKHNrKTsKKworCXN3aXRjaChzay0+c2tfc3RhdGUpIHsKKwljYXNlIElVQ1ZfTElTVEVOOgorCQlpdWN2X3NvY2tfY2xlYW51cF9saXN0ZW4oc2spOworCQlicmVhazsKKworCWNhc2UgSVVDVl9DT05ORUNURUQ6CisJY2FzZSBJVUNWX0RJU0NPTk46CisJCWVyciA9IDA7CisJCWlmIChpdWN2LT5wYXRoKSB7CisJCQlsb3dfbm1jcHkodXNlcl9kYXRhLCBpdWN2LT5zcmNfbmFtZSk7CisJCQloaWdoX25tY3B5KHVzZXJfZGF0YSwgaXVjdi0+ZHN0X25hbWUpOworCQkJQVNDRUJDKHVzZXJfZGF0YSwgc2l6ZW9mKHVzZXJfZGF0YSkpOworCQkJZXJyID0gaXVjdl9wYXRoX3NldmVyKGl1Y3YtPnBhdGgsIHVzZXJfZGF0YSk7CisJCQlpdWN2X3BhdGhfZnJlZShpdWN2LT5wYXRoKTsKKwkJCWl1Y3YtPnBhdGggPSBOVUxMOworCQl9CisKKwkJc2stPnNrX3N0YXRlID0gSVVDVl9DTE9TRUQ7CisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQlzay0+c2tfZXJyID0gRUNPTk5SRVNFVDsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisKKwkJc2tiX3F1ZXVlX3B1cmdlKCZpdWN2LT5zZW5kX3NrYl9xKTsKKworCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc29ja19zZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCQlicmVhazsKKwl9OworCisJcmVsZWFzZV9zb2NrKHNrKTsKKwlpdWN2X3NvY2tfa2lsbChzayk7Cit9CisKK3N0YXRpYyB2b2lkIGl1Y3Zfc29ja19pbml0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnBhcmVudCkKK3sKKwlpZiAocGFyZW50KQorCQlzay0+c2tfdHlwZSA9IHBhcmVudC0+c2tfdHlwZTsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICppdWN2X3NvY2tfYWxsb2Moc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvLCBnZnBfdCBwcmlvKQoreworCXN0cnVjdCBzb2NrICpzazsKKworCXNrID0gc2tfYWxsb2MoUEZfSVVDViwgcHJpbywgJml1Y3ZfcHJvdG8sIDEpOworCWlmICghc2spCisJCXJldHVybiBOVUxMOworCisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCUlOSVRfTElTVF9IRUFEKCZpdWN2X3NrKHNrKS0+YWNjZXB0X3EpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJml1Y3Zfc2soc2spLT5zZW5kX3NrYl9xKTsKKwlpdWN2X3NrKHNrKS0+c2VuZF90YWcgPSAwOworCisJc2stPnNrX2Rlc3RydWN0ID0gaXVjdl9zb2NrX2Rlc3RydWN0OworCXNrLT5za19zbmR0aW1lbyA9IElVQ1ZfQ09OTl9USU1FT1VUOworCXNrLT5za19hbGxvY2F0aW9uID0gR0ZQX0RNQTsKKworCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCisJc2stPnNrX3Byb3RvY29sID0gcHJvdG87CisJc2stPnNrX3N0YXRlCT0gSVVDVl9PUEVOOworCisJaXVjdl9zb2NrX2luaXRfdGltZXIoc2spOworCisJaXVjdl9zb2NrX2xpbmsoJml1Y3Zfc2tfbGlzdCwgc2spOworCXJldHVybiBzazsKK30KKworLyogQ3JlYXRlIGFuIElVQ1Ygc29ja2V0ICovCitzdGF0aWMgaW50IGl1Y3Zfc29ja19jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sKQoreworCXN0cnVjdCBzb2NrICpzazsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfU1RSRUFNKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisJc29jay0+b3BzID0gJml1Y3Zfc29ja19vcHM7CisKKwlzayA9IGl1Y3Zfc29ja19hbGxvYyhzb2NrLCBwcm90b2NvbCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpdWN2X3NvY2tfaW5pdChzaywgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpdWN2X3NvY2tfbGluayhzdHJ1Y3QgaXVjdl9zb2NrX2xpc3QgKmwsIHN0cnVjdCBzb2NrICpzaykKK3sKKwl3cml0ZV9sb2NrX2JoKCZsLT5sb2NrKTsKKwlza19hZGRfbm9kZShzaywgJmwtPmhlYWQpOworCXdyaXRlX3VubG9ja19iaCgmbC0+bG9jayk7Cit9CisKK3ZvaWQgaXVjdl9zb2NrX3VubGluayhzdHJ1Y3QgaXVjdl9zb2NrX2xpc3QgKmwsIHN0cnVjdCBzb2NrICpzaykKK3sKKwl3cml0ZV9sb2NrX2JoKCZsLT5sb2NrKTsKKwlza19kZWxfbm9kZV9pbml0KHNrKTsKKwl3cml0ZV91bmxvY2tfYmgoJmwtPmxvY2spOworfQorCit2b2lkIGl1Y3ZfYWNjZXB0X2VucXVldWUoc3RydWN0IHNvY2sgKnBhcmVudCwgc3RydWN0IHNvY2sgKnNrKQoreworCXNvY2tfaG9sZChzayk7CisJbGlzdF9hZGRfdGFpbCgmaXVjdl9zayhzayktPmFjY2VwdF9xLCAmaXVjdl9zayhwYXJlbnQpLT5hY2NlcHRfcSk7CisJaXVjdl9zayhzayktPnBhcmVudCA9IHBhcmVudDsKKwlwYXJlbnQtPnNrX2Fja19iYWNrbG9nKys7Cit9CisKK3ZvaWQgaXVjdl9hY2NlcHRfdW5saW5rKHN0cnVjdCBzb2NrICpzaykKK3sKKwlsaXN0X2RlbF9pbml0KCZpdWN2X3NrKHNrKS0+YWNjZXB0X3EpOworCWl1Y3Zfc2soc2spLT5wYXJlbnQtPnNrX2Fja19iYWNrbG9nLS07CisJaXVjdl9zayhzayktPnBhcmVudCA9IE5VTEw7CisJc29ja19wdXQoc2spOworfQorCitzdHJ1Y3Qgc29jayAqaXVjdl9hY2NlcHRfZGVxdWV1ZShzdHJ1Y3Qgc29jayAqcGFyZW50LCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrKQoreworCXN0cnVjdCBpdWN2X3NvY2sgKmlzaywgKm47CisJc3RydWN0IHNvY2sgKnNrOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlzaywgbiwgJml1Y3Zfc2socGFyZW50KS0+YWNjZXB0X3EsIGFjY2VwdF9xKXsKKwkJc2sgPSAoc3RydWN0IHNvY2sgKikgaXNrOworCQlsb2NrX3NvY2soc2spOworCisJCWlmIChzay0+c2tfc3RhdGUgPT0gSVVDVl9DTE9TRUQpIHsKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQlpdWN2X2FjY2VwdF91bmxpbmsoc2spOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc2stPnNrX3N0YXRlID09IElVQ1ZfQ09OTkVDVEVEIHx8CisJCSAgICBzay0+c2tfc3RhdGUgPT0gSVVDVl9TRVZFUkVEIHx8CisJCSAgICAhbmV3c29jaykgeworCQkJaXVjdl9hY2NlcHRfdW5saW5rKHNrKTsKKwkJCWlmIChuZXdzb2NrKQorCQkJCXNvY2tfZ3JhZnQoc2ssIG5ld3NvY2spOworCisJCQlpZiAoc2stPnNrX3N0YXRlID09IElVQ1ZfU0VWRVJFRCkKKwkJCQlzay0+c2tfc3RhdGUgPSBJVUNWX0RJU0NPTk47CisKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQlyZXR1cm4gc2s7CisJCX0KKworCQlyZWxlYXNlX3NvY2soc2spOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGl1Y3Zfc29ja193YWl0X3N0YXRlKHN0cnVjdCBzb2NrICpzaywgaW50IHN0YXRlLCBpbnQgc3RhdGUyLAorCQkJIHVuc2lnbmVkIGxvbmcgdGltZW8pCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IGVyciA9IDA7CisKKwlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwl3aGlsZSAoc2stPnNrX3N0YXRlICE9IHN0YXRlICYmIHNrLT5za19zdGF0ZSAhPSBzdGF0ZTIpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlpZiAoIXRpbWVvKSB7CisJCQllcnIgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCWVyciA9IHNvY2tfaW50cl9lcnJubyh0aW1lbyk7CisJCQlicmVhazsKKwkJfQorCisJCXJlbGVhc2Vfc29jayhzayk7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCWxvY2tfc29jayhzayk7CisKKwkJZXJyID0gc29ja19lcnJvcihzayk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBCaW5kIGFuIHVuYm91bmQgc29ja2V0ICovCitzdGF0aWMgaW50IGl1Y3Zfc29ja19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCSAgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9pdWN2ICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaXVjdiAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBpdWN2X3NvY2sgKml1Y3Y7CisJaW50IGVycjsKKworCS8qIFZlcmlmeSB0aGUgaW5wdXQgc29ja2FkZHIgKi8KKwlpZiAoIWFkZHIgfHwgYWRkci0+c2FfZmFtaWx5ICE9IEFGX0lVQ1YpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc2stPnNrX3N0YXRlICE9IElVQ1ZfT1BFTikgeworCQllcnIgPSAtRUJBREZEOworCQlnb3RvIGRvbmU7CisJfQorCisJd3JpdGVfbG9ja19iaCgmaXVjdl9za19saXN0LmxvY2spOworCisJaXVjdiA9IGl1Y3Zfc2soc2spOworCWlmIChfX2l1Y3ZfZ2V0X3NvY2tfYnlfbmFtZShzYS0+c2l1Y3ZfbmFtZSkpIHsKKwkJZXJyID0gLUVBRERSSU5VU0U7CisJCWdvdG8gZG9uZV91bmxvY2s7CisJfQorCWlmIChpdWN2LT5wYXRoKSB7CisJCWVyciA9IDA7CisJCWdvdG8gZG9uZV91bmxvY2s7CisJfQorCisJLyogQmluZCB0aGUgc29ja2V0ICovCisJbWVtY3B5KGl1Y3YtPnNyY19uYW1lLCBzYS0+c2l1Y3ZfbmFtZSwgOCk7CisKKwkvKiBDb3B5IHRoZSB1c2VyIGlkICovCisJbWVtY3B5KGl1Y3YtPnNyY191c2VyX2lkLCBpdWN2X3VzZXJpZCwgOCk7CisJc2stPnNrX3N0YXRlID0gSVVDVl9CT1VORDsKKwllcnIgPSAwOworCitkb25lX3VubG9jazoKKwkvKiBSZWxlYXNlIHRoZSBzb2NrZXQgbGlzdCBsb2NrICovCisJd3JpdGVfdW5sb2NrX2JoKCZpdWN2X3NrX2xpc3QubG9jayk7Citkb25lOgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworLyogQXV0b21hdGljYWxseSBiaW5kIGFuIHVuYm91bmQgc29ja2V0ICovCitzdGF0aWMgaW50IGl1Y3Zfc29ja19hdXRvYmluZChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGl1Y3Zfc29jayAqaXVjdiA9IGl1Y3Zfc2soc2spOworCWNoYXIgcXVlcnlfYnVmZmVyWzgwXTsKKwljaGFyIG5hbWVbMTJdOworCWludCBlcnIgPSAwOworCisJLyogU2V0IHRoZSB1c2VyaWQgYW5kIG5hbWUgKi8KKwljcGNtZCgiUVVFUlkgVVNFUklEIiwgcXVlcnlfYnVmZmVyLCBzaXplb2YocXVlcnlfYnVmZmVyKSwgJmVycik7CisJaWYgKHVubGlrZWx5KGVycikpCisJCXJldHVybiAtRVBST1RPOworCisJbWVtY3B5KGl1Y3YtPnNyY191c2VyX2lkLCBxdWVyeV9idWZmZXIsIDgpOworCisJd3JpdGVfbG9ja19iaCgmaXVjdl9za19saXN0LmxvY2spOworCisJc3ByaW50ZihuYW1lLCAiJTA4eCIsIGF0b21pY19pbmNfcmV0dXJuKCZpdWN2X3NrX2xpc3QuYXV0b2JpbmRfbmFtZSkpOworCXdoaWxlIChfX2l1Y3ZfZ2V0X3NvY2tfYnlfbmFtZShuYW1lKSkgeworCQlzcHJpbnRmKG5hbWUsICIlMDh4IiwKKwkJCWF0b21pY19pbmNfcmV0dXJuKCZpdWN2X3NrX2xpc3QuYXV0b2JpbmRfbmFtZSkpOworCX0KKworCXdyaXRlX3VubG9ja19iaCgmaXVjdl9za19saXN0LmxvY2spOworCisJbWVtY3B5KCZpdWN2LT5zcmNfbmFtZSwgbmFtZSwgOCk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBDb25uZWN0IGFuIHVuY29ubmVjdGVkIHNvY2tldCAqLworc3RhdGljIGludCBpdWN2X3NvY2tfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisJCQkgICAgIGludCBhbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2thZGRyX2l1Y3YgKnNhID0gKHN0cnVjdCBzb2NrYWRkcl9pdWN2ICopIGFkZHI7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGl1Y3Zfc29jayAqaXVjdjsKKwl1bnNpZ25lZCBjaGFyIHVzZXJfZGF0YVsxNl07CisJaW50IGVycjsKKworCWlmIChhZGRyLT5zYV9mYW1pbHkgIT0gQUZfSVVDViB8fCBhbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pdWN2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IElVQ1ZfT1BFTiAmJiBzay0+c2tfc3RhdGUgIT0gSVVDVl9CT1VORCkKKwkJcmV0dXJuIC1FQkFERkQ7CisKKwlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0pCisJCXJldHVybiAtRUlOVkFMOworCisJaXVjdiA9IGl1Y3Zfc2soc2spOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBJVUNWX09QRU4pIHsKKwkJZXJyID0gaXVjdl9zb2NrX2F1dG9iaW5kKHNrKTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWxvY2tfc29jayhzayk7CisKKwkvKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGluZm9ybWF0aW9uICovCisJbWVtY3B5KGl1Y3Zfc2soc2spLT5kc3RfdXNlcl9pZCwgc2EtPnNpdWN2X3VzZXJfaWQsIDgpOworCW1lbWNweShpdWN2X3NrKHNrKS0+ZHN0X25hbWUsIHNhLT5zaXVjdl9uYW1lLCA4KTsKKworCWhpZ2hfbm1jcHkodXNlcl9kYXRhLCBzYS0+c2l1Y3ZfbmFtZSk7CisJbG93X25tY3B5KHVzZXJfZGF0YSwgaXVjdl9zayhzayktPnNyY19uYW1lKTsKKwlBU0NFQkModXNlcl9kYXRhLCBzaXplb2YodXNlcl9kYXRhKSk7CisKKwlpdWN2ID0gaXVjdl9zayhzayk7CisJLyogQ3JlYXRlIHBhdGguICovCisJaXVjdi0+cGF0aCA9IGl1Y3ZfcGF0aF9hbGxvYyhJVUNWX1FVRVVFTEVOX0RFRkFVTFQsCisJCQkJICAgICBJUFJNREFUQSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gaXVjdl9wYXRoX2Nvbm5lY3QoaXVjdi0+cGF0aCwgJmFmX2l1Y3ZfaGFuZGxlciwKKwkJCQlzYS0+c2l1Y3ZfdXNlcl9pZCwgTlVMTCwgdXNlcl9kYXRhLCBzayk7CisJaWYgKGVycikgeworCQlpdWN2X3BhdGhfZnJlZShpdWN2LT5wYXRoKTsKKwkJaXVjdi0+cGF0aCA9IE5VTEw7CisJCWVyciA9IC1FQ09OTlJFRlVTRUQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IElVQ1ZfQ09OTkVDVEVEKSB7CisJCWVyciA9IGl1Y3Zfc29ja193YWl0X3N0YXRlKHNrLCBJVUNWX0NPTk5FQ1RFRCwgSVVDVl9ESVNDT05OLAorCQkJCXNvY2tfc25kdGltZW8oc2ssIGZsYWdzICYgT19OT05CTE9DSykpOworCX0KKworCWlmIChzay0+c2tfc3RhdGUgPT0gSVVDVl9ESVNDT05OKSB7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiAtRUNPTk5SRUZVU0VEOworCX0KK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBNb3ZlIGEgc29ja2V0IGludG8gbGlzdGVuaW5nIHN0YXRlLiAqLworc3RhdGljIGludCBpdWN2X3NvY2tfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnI7CisKKwlsb2NrX3NvY2soc2spOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoc2stPnNrX3N0YXRlICE9IElVQ1ZfQk9VTkQgfHwgc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSkKKwkJZ290byBkb25lOworCisJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJc2stPnNrX2Fja19iYWNrbG9nID0gMDsKKwlzay0+c2tfc3RhdGUgPSBJVUNWX0xJU1RFTjsKKwllcnIgPSAwOworCitkb25lOgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworLyogQWNjZXB0IGEgcGVuZGluZyBjb25uZWN0aW9uICovCitzdGF0aWMgaW50IGl1Y3Zfc29ja19hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywKKwkJCSAgICBpbnQgZmxhZ3MpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2ssICpuc2s7CisJbG9uZyB0aW1lbzsKKwlpbnQgZXJyID0gMDsKKworCWxvY2tfc29jayhzayk7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IElVQ1ZfTElTVEVOKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIGZsYWdzICYgT19OT05CTE9DSyk7CisKKwkvKiBXYWl0IGZvciBhbiBpbmNvbWluZyBjb25uZWN0aW9uICovCisJYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKHNrLT5za19zbGVlcCwgJndhaXQpOworCXdoaWxlICghKG5zayA9IGl1Y3ZfYWNjZXB0X2RlcXVldWUoc2ssIG5ld3NvY2spKSl7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICghdGltZW8pIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCXJlbGVhc2Vfc29jayhzayk7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCWxvY2tfc29jayhzayk7CisKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBJVUNWX0xJU1RFTikgeworCQkJZXJyID0gLUVCQURGRDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQllcnIgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCisJaWYgKGVycikKKwkJZ290byBkb25lOworCisJbmV3c29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGl1Y3Zfc29ja19nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCSAgICAgaW50ICpsZW4sIGludCBwZWVyKQoreworCXN0cnVjdCBzb2NrYWRkcl9pdWN2ICpzaXVjdiA9IChzdHJ1Y3Qgc29ja2FkZHJfaXVjdiAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisJYWRkci0+c2FfZmFtaWx5ID0gQUZfSVVDVjsKKwkqbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pdWN2KTsKKworCWlmIChwZWVyKSB7CisJCW1lbWNweShzaXVjdi0+c2l1Y3ZfdXNlcl9pZCwgaXVjdl9zayhzayktPmRzdF91c2VyX2lkLCA4KTsKKwkJbWVtY3B5KHNpdWN2LT5zaXVjdl9uYW1lLCAmaXVjdl9zayhzayktPmRzdF9uYW1lLCA4KTsKKwl9IGVsc2UgeworCQltZW1jcHkoc2l1Y3YtPnNpdWN2X3VzZXJfaWQsIGl1Y3Zfc2soc2spLT5zcmNfdXNlcl9pZCwgOCk7CisJCW1lbWNweShzaXVjdi0+c2l1Y3ZfbmFtZSwgaXVjdl9zayhzayktPnNyY19uYW1lLCA4KTsKKwl9CisJbWVtc2V0KCZzaXVjdi0+c2l1Y3ZfcG9ydCwgMCwgc2l6ZW9mKHNpdWN2LT5zaXVjdl9wb3J0KSk7CisJbWVtc2V0KCZzaXVjdi0+c2l1Y3ZfYWRkciwgMCwgc2l6ZW9mKHNpdWN2LT5zaXVjdl9hZGRyKSk7CisJbWVtc2V0KHNpdWN2LT5zaXVjdl9ub2RlaWQsIDAsIHNpemVvZihzaXVjdi0+c2l1Y3Zfbm9kZWlkKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdWN2X3NvY2tfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXVjdl9zb2NrICppdWN2ID0gaXVjdl9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaXVjdl9tZXNzYWdlIHR4bXNnOworCWludCBlcnI7CisKKwllcnIgPSBzb2NrX2Vycm9yKHNrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX09PQikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSB7CisJCWVyciA9IC1FUElQRTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBJVUNWX0NPTk5FQ1RFRCl7CisJCWlmKCEoc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgbGVuLAorCQkJCSAgICAgICBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwKKwkJCQkgICAgICAgJmVycikpKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAobWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYiwgbGVuKSwgbXNnLT5tc2dfaW92LCBsZW4pKXsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQl0eG1zZy5jbGFzcyA9IDA7CisJCXR4bXNnLnRhZyA9IGl1Y3YtPnNlbmRfdGFnKys7CisJCW1lbWNweShza2ItPmNiLCAmdHhtc2cudGFnLCA0KTsKKwkJc2tiX3F1ZXVlX3RhaWwoJml1Y3YtPnNlbmRfc2tiX3EsIHNrYik7CisJCWVyciA9IGl1Y3ZfbWVzc2FnZV9zZW5kKGl1Y3YtPnBhdGgsICZ0eG1zZywgMCwgMCwKKwkJCQkJKHZvaWQgKikgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWlmIChlcnIpIHsKKwkJCWlmIChlcnIgPT0gMykKKwkJCQlwcmludGsoS0VSTl9FUlIgIkFGX0lVQ1YgbXNnIGxpbWl0IGV4Y2VlZGVkXG4iKTsKKwkJCXNrYl91bmxpbmsoc2tiLCAmaXVjdi0+c2VuZF9za2JfcSk7CisJCQllcnIgPSAtRVBJUEU7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCX0gZWxzZSB7CisJCWVyciA9IC1FTk9UQ09OTjsKKwkJZ290byBvdXQ7CisJfQorCisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gbGVuOworCitmYWlsOgorCWtmcmVlX3NrYihza2IpOworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpdWN2X3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IGZsYWdzKQoreworCWludCBub2Jsb2NrID0gZmxhZ3MgJiBNU0dfRE9OVFdBSVQ7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IHRhcmdldCwgY29waWVkID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnIgPSAwOworCisJaWYgKGZsYWdzICYgKE1TR19PT0IpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwl0YXJnZXQgPSBzb2NrX3Jjdmxvd2F0KHNrLCBmbGFncyAmIE1TR19XQUlUQUxMLCBsZW4pOworCisJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzLCBub2Jsb2NrLCAmZXJyKTsKKwlpZiAoIXNrYikgeworCQlpZiAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBlcnI7CisJfQorCisJY29waWVkID0gbWluX3QodW5zaWduZWQgaW50LCBza2ItPmxlbiwgbGVuKTsKKworCWlmIChtZW1jcHlfdG9pb3ZlYyhtc2ctPm1zZ19pb3YsIHNrYi0+ZGF0YSwgY29waWVkKSkgeworCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCWlmIChjb3BpZWQgPT0gMCkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCWxlbiAtPSBjb3BpZWQ7CisKKwkvKiBNYXJrIHJlYWQgcGFydCBvZiBza2IgYXMgdXNlZCAqLworCWlmICghKGZsYWdzICYgTVNHX1BFRUspKSB7CisJCXNrYl9wdWxsKHNrYiwgY29waWVkKTsKKworCQlpZiAoc2tiLT5sZW4pIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWtmcmVlX3NrYihza2IpOworCX0gZWxzZQorCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisKK2RvbmU6CisJcmV0dXJuIGVyciA/IDogY29waWVkOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpdWN2X2FjY2VwdF9wb2xsKHN0cnVjdCBzb2NrICpwYXJlbnQpCit7CisJc3RydWN0IGl1Y3Zfc29jayAqaXNrLCAqbjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXNrLCBuLCAmaXVjdl9zayhwYXJlbnQpLT5hY2NlcHRfcSwgYWNjZXB0X3EpeworCQlzayA9IChzdHJ1Y3Qgc29jayAqKSBpc2s7CisKKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBJVUNWX0NPTk5FQ1RFRCkKKwkJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgaXVjdl9zb2NrX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlwb2xsX3dhaXQoZmlsZSwgc2stPnNrX3NsZWVwLCB3YWl0KTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gSVVDVl9MSVNURU4pCisJCXJldHVybiBpdWN2X2FjY2VwdF9wb2xsKHNrKTsKKworCWlmIChzay0+c2tfZXJyIHx8ICFza2JfcXVldWVfZW1wdHkoJnNrLT5za19lcnJvcl9xdWV1ZSkpCisJCW1hc2sgfD0gUE9MTEVSUjsKKworCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pCisJCW1hc2sgfD0gUE9MTFJESFVQOworCisJaWYgKHNrLT5za19zaHV0ZG93biA9PSBTSFVURE9XTl9NQVNLKQorCQltYXNrIHw9IFBPTExIVVA7CisKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpIHx8CisJCQkoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBJVUNWX0NMT1NFRCkKKwkJbWFzayB8PSBQT0xMSFVQOworCisJaWYgKHNvY2tfd3JpdGVhYmxlKHNrKSkKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STSB8IFBPTExXUkJBTkQ7CisJZWxzZQorCQlzZXRfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGl1Y3Zfc29ja19zaHV0ZG93bihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgaG93KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBpdWN2X3NvY2sgKml1Y3YgPSBpdWN2X3NrKHNrKTsKKwlzdHJ1Y3QgaXVjdl9tZXNzYWdlIHR4bXNnOworCWludCBlcnIgPSAwOworCXU4IHBybW1zZ1s4XSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxfTsKKworCWhvdysrOworCisJaWYgKChob3cgJiB+U0hVVERPV05fTUFTSykgfHwgIWhvdykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX3NvY2soc2spOworCXN3aXRjaChzay0+c2tfc3RhdGUpIHsKKwljYXNlIElVQ1ZfQ0xPU0VEOgorCQllcnIgPSAtRU5PVENPTk47CisJCWdvdG8gZmFpbDsKKworCWRlZmF1bHQ6CisJCXNrLT5za19zaHV0ZG93biB8PSBob3c7CisJCWJyZWFrOworCX0KKworCWlmIChob3cgPT0gU0VORF9TSFVURE9XTiB8fCBob3cgPT0gU0hVVERPV05fTUFTSykgeworCQl0eG1zZy5jbGFzcyA9IDA7CisJCXR4bXNnLnRhZyA9IDA7CisJCWVyciA9IGl1Y3ZfbWVzc2FnZV9zZW5kKGl1Y3YtPnBhdGgsICZ0eG1zZywgSVVDVl9JUFJNREFUQSwgMCwKKwkJCQkJKHZvaWQgKikgcHJtbXNnLCA4KTsKKwkJaWYgKGVycikgeworCQkJc3dpdGNoKGVycikgeworCQkJY2FzZSAxOgorCQkJCWVyciA9IC1FTk9UQ09OTjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQllcnIgPSAtRUNPTk5SRVNFVDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZXJyID0gLUVOT1RDT05OOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGhvdyA9PSBSQ1ZfU0hVVERPV04gfHwgaG93ID09IFNIVVRET1dOX01BU0spIHsKKwkJZXJyID0gaXVjdl9wYXRoX3F1aWVzY2UoaXVjdl9zayhzayktPnBhdGgsIE5VTEwpOworCQlpZiAoZXJyKQorCQkJZXJyID0gLUVOT1RDT05OOworCisJCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCX0KKworCS8qIFdha2UgdXAgYW55b25lIHNsZWVwaW5nIGluIHBvbGwgKi8KKwlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKworZmFpbDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXVjdl9zb2NrX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyID0gMDsKKworCWlmICghc2spCisJCXJldHVybiAwOworCisJaXVjdl9zb2NrX2Nsb3NlKHNrKTsKKworCS8qIFVucmVnaXN0ZXIgd2l0aCBJVUNWIGJhc2Ugc3VwcG9ydCAqLworCWlmIChpdWN2X3NrKHNrKS0+cGF0aCkgeworCQlpdWN2X3BhdGhfc2V2ZXIoaXVjdl9zayhzayktPnBhdGgsIE5VTEwpOworCQlpdWN2X3BhdGhfZnJlZShpdWN2X3NrKHNrKS0+cGF0aCk7CisJCWl1Y3Zfc2soc2spLT5wYXRoID0gTlVMTDsKKwl9CisKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX0xJTkdFUikgJiYgc2stPnNrX2xpbmdlcnRpbWUpeworCQlsb2NrX3NvY2soc2spOworCQllcnIgPSBpdWN2X3NvY2tfd2FpdF9zdGF0ZShzaywgSVVDVl9DTE9TRUQsIDAsCisJCQkJCSAgIHNrLT5za19saW5nZXJ0aW1lKTsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwl9CisKKwlzb2NrX29ycGhhbihzayk7CisJaXVjdl9zb2NrX2tpbGwoc2spOworCXJldHVybiBlcnI7Cit9CisKKy8qIENhbGxiYWNrIHdyYXBwZXJzIC0gY2FsbGVkIGZyb20gaXVjdiBiYXNlIHN1cHBvcnQgKi8KK3N0YXRpYyBpbnQgaXVjdl9jYWxsYmFja19jb25ucmVxKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsCisJCQkJIHU4IGlwdm1pZFs4XSwgdTggaXB1c2VyWzE2XSkKK3sKKwl1bnNpZ25lZCBjaGFyIHVzZXJfZGF0YVsxNl07CisJdW5zaWduZWQgY2hhciBudXNlcl9kYXRhWzE2XTsKKwl1bnNpZ25lZCBjaGFyIHNyY19uYW1lWzhdOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBzb2NrICpzaywgKm5zazsKKwlzdHJ1Y3QgaXVjdl9zb2NrICppdWN2LCAqbml1Y3Y7CisJaW50IGVycjsKKworCW1lbWNweShzcmNfbmFtZSwgaXB1c2VyLCA4KTsKKwlFQkNBU0Moc3JjX25hbWUsIDgpOworCS8qIEZpbmQgb3V0IGlmIHRoaXMgcGF0aCBiZWxvbmdzIHRvIGFmX2l1Y3YuICovCisJcmVhZF9sb2NrKCZpdWN2X3NrX2xpc3QubG9jayk7CisJaXVjdiA9IE5VTEw7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZpdWN2X3NrX2xpc3QuaGVhZCkKKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBJVUNWX0xJU1RFTiAmJgorCQkgICAgIW1lbWNtcCgmaXVjdl9zayhzayktPnNyY19uYW1lLCBzcmNfbmFtZSwgOCkpIHsKKwkJCS8qCisJCQkgKiBGb3VuZCBhIGxpc3RlbmluZyBzb2NrZXQgd2l0aAorCQkJICogc3JjX25hbWUgPT0gaXB1c2VyWzAtN10uCisJCQkgKi8KKwkJCWl1Y3YgPSBpdWN2X3NrKHNrKTsKKwkJCWJyZWFrOworCQl9CisJcmVhZF91bmxvY2soJml1Y3Zfc2tfbGlzdC5sb2NrKTsKKwlpZiAoIWl1Y3YpCisJCS8qIE5vIHNvY2tldCBmb3VuZCwgbm90IG9uZSBvZiBvdXIgcGF0aHMuICovCisJCXJldHVybiAtRUlOVkFMOworCisJYmhfbG9ja19zb2NrKHNrKTsKKworCS8qIENoZWNrIGlmIHBhcmVudCBzb2NrZXQgaXMgbGlzdGVuaW5nICovCisJbG93X25tY3B5KHVzZXJfZGF0YSwgaXVjdi0+c3JjX25hbWUpOworCWhpZ2hfbm1jcHkodXNlcl9kYXRhLCBpdWN2LT5kc3RfbmFtZSk7CisJQVNDRUJDKHVzZXJfZGF0YSwgc2l6ZW9mKHVzZXJfZGF0YSkpOworCWlmIChzay0+c2tfc3RhdGUgIT0gSVVDVl9MSVNURU4pIHsKKwkJZXJyID0gaXVjdl9wYXRoX3NldmVyKHBhdGgsIHVzZXJfZGF0YSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBDaGVjayBmb3IgYmFja2xvZyBzaXplICovCisJaWYgKHNrX2FjY2VwdHFfaXNfZnVsbChzaykpIHsKKwkJZXJyID0gaXVjdl9wYXRoX3NldmVyKHBhdGgsIHVzZXJfZGF0YSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIG5ldyBzb2NrZXQgKi8KKwluc2sgPSBpdWN2X3NvY2tfYWxsb2MoTlVMTCwgU09DS19TVFJFQU0sIEdGUF9BVE9NSUMpOworCWlmICghbnNrKXsKKwkJZXJyID0gaXVjdl9wYXRoX3NldmVyKHBhdGgsIHVzZXJfZGF0YSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwluaXVjdiA9IGl1Y3Zfc2sobnNrKTsKKwlpdWN2X3NvY2tfaW5pdChuc2ssIHNrKTsKKworCS8qIFNldCB0aGUgbmV3IGl1Y3Zfc29jayAqLworCW1lbWNweShuaXVjdi0+ZHN0X25hbWUsIGlwdXNlciArIDgsIDgpOworCUVCQ0FTQyhuaXVjdi0+ZHN0X25hbWUsIDgpOworCW1lbWNweShuaXVjdi0+ZHN0X3VzZXJfaWQsIGlwdm1pZCwgOCk7CisJbWVtY3B5KG5pdWN2LT5zcmNfbmFtZSwgaXVjdi0+c3JjX25hbWUsIDgpOworCW1lbWNweShuaXVjdi0+c3JjX3VzZXJfaWQsIGl1Y3YtPnNyY191c2VyX2lkLCA4KTsKKwluaXVjdi0+cGF0aCA9IHBhdGg7CisKKwkvKiBDYWxsIGl1Y3ZfYWNjZXB0ICovCisJaGlnaF9ubWNweShudXNlcl9kYXRhLCBpcHVzZXIgKyA4KTsKKwltZW1jcHkobnVzZXJfZGF0YSArIDgsIG5pdWN2LT5zcmNfbmFtZSwgOCk7CisJQVNDRUJDKG51c2VyX2RhdGEgKyA4LCA4KTsKKworCXBhdGgtPm1zZ2xpbSA9IElVQ1ZfUVVFVUVMRU5fREVGQVVMVDsKKwllcnIgPSBpdWN2X3BhdGhfYWNjZXB0KHBhdGgsICZhZl9pdWN2X2hhbmRsZXIsIG51c2VyX2RhdGEsIG5zayk7CisJaWYgKGVycil7CisJCWVyciA9IGl1Y3ZfcGF0aF9zZXZlcihwYXRoLCB1c2VyX2RhdGEpOworCQlnb3RvIGZhaWw7CisJfQorCisJaXVjdl9hY2NlcHRfZW5xdWV1ZShzaywgbnNrKTsKKworCS8qIFdha2UgdXAgYWNjZXB0ICovCisJbnNrLT5za19zdGF0ZSA9IElVQ1ZfQ09OTkVDVEVEOworCXNrLT5za19kYXRhX3JlYWR5KHNrLCAxKTsKKwllcnIgPSAwOworZmFpbDoKKwliaF91bmxvY2tfc29jayhzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGl1Y3ZfY2FsbGJhY2tfY29ubmFjayhzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCB1OCBpcHVzZXJbMTZdKQoreworCXN0cnVjdCBzb2NrICpzayA9IHBhdGgtPnByaXZhdGU7CisKKwlzay0+c2tfc3RhdGUgPSBJVUNWX0NPTk5FQ1RFRDsKKwlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKK30KKworc3RhdGljIHZvaWQgaXVjdl9jYWxsYmFja19yeChzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHNvY2sgKnNrID0gcGF0aC0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByYzsKKworCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pCisJCXJldHVybjsKKworCXNrYiA9IGFsbG9jX3NrYihtc2ctPmxlbmd0aCwgR0ZQX0FUT01JQyB8IEdGUF9ETUEpOworCWlmICghc2tiKSB7CisJCWl1Y3ZfbWVzc2FnZV9yZWplY3QocGF0aCwgbXNnKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChtc2ctPmZsYWdzICYgSVBSTURBVEEpIHsKKwkJc2tiLT5kYXRhID0gTlVMTDsKKwkJc2tiLT5sZW4gPSAwOworCX0gZWxzZSB7CisJCXJjID0gaXVjdl9tZXNzYWdlX3JlY2VpdmUocGF0aCwgbXNnLCAwLCBza2ItPmRhdGEsCisJCQkJCSAgbXNnLT5sZW5ndGgsIE5VTEwpOworCQlpZiAocmMpIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuOworCQl9CisKKwkJc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJCXNrYi0+bGVuID0gbXNnLT5sZW5ndGg7CisJfQorCisJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKSkKKwkJa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyB2b2lkIGl1Y3ZfY2FsbGJhY2tfdHhkb25lKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsCisJCQkJIHN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBwYXRoLT5wcml2YXRlOworCXN0cnVjdCBza19idWZmICp0aGlzOworCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QgPSAmaXVjdl9zayhzayktPnNlbmRfc2tiX3E7CisJc3RydWN0IHNrX2J1ZmYgKmxpc3Rfc2tiID0gbGlzdC0+bmV4dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3QtPmxvY2ssIGZsYWdzKTsKKworCWRvIHsKKwkJdGhpcyA9IGxpc3Rfc2tiOworCQlsaXN0X3NrYiA9IGxpc3Rfc2tiLT5uZXh0OworCX0gd2hpbGUgKG1lbWNtcCgmbXNnLT50YWcsIHRoaXMtPmNiLCA0KSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0LT5sb2NrLCBmbGFncyk7CisKKwlza2JfdW5saW5rKHRoaXMsICZpdWN2X3NrKHNrKS0+c2VuZF9za2JfcSk7CisJa2ZyZWVfc2tiKHRoaXMpOworfQorCitzdGF0aWMgdm9pZCBpdWN2X2NhbGxiYWNrX2Nvbm5yZWooc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgdTggaXB1c2VyWzE2XSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBwYXRoLT5wcml2YXRlOworCisJaWYgKCFsaXN0X2VtcHR5KCZpdWN2X3NrKHNrKS0+YWNjZXB0X3EpKQorCQlzay0+c2tfc3RhdGUgPSBJVUNWX1NFVkVSRUQ7CisJZWxzZQorCQlzay0+c2tfc3RhdGUgPSBJVUNWX0RJU0NPTk47CisKKwlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKK30KKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgaXVjdl9zb2NrX29wcyA9IHsKKwkuZmFtaWx5CQk9IFBGX0lVQ1YsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gaXVjdl9zb2NrX3JlbGVhc2UsCisJLmJpbmQJCT0gaXVjdl9zb2NrX2JpbmQsCisJLmNvbm5lY3QJPSBpdWN2X3NvY2tfY29ubmVjdCwKKwkubGlzdGVuCQk9IGl1Y3Zfc29ja19saXN0ZW4sCisJLmFjY2VwdAkJPSBpdWN2X3NvY2tfYWNjZXB0LAorCS5nZXRuYW1lCT0gaXVjdl9zb2NrX2dldG5hbWUsCisJLnNlbmRtc2cJPSBpdWN2X3NvY2tfc2VuZG1zZywKKwkucmVjdm1zZwk9IGl1Y3Zfc29ja19yZWN2bXNnLAorCS5wb2xsCQk9IGl1Y3Zfc29ja19wb2xsLAorCS5pb2N0bAkJPSBzb2NrX25vX2lvY3RsLAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuc2h1dGRvd24JPSBpdWN2X3NvY2tfc2h1dGRvd24sCisJLnNldHNvY2tvcHQJPSBzb2NrX25vX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJPSBzb2NrX25vX2dldHNvY2tvcHQKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBpdWN2X3NvY2tfZmFtaWx5X29wcyA9IHsKKwkuZmFtaWx5CT0gQUZfSVVDViwKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuY3JlYXRlCT0gaXVjdl9zb2NrX2NyZWF0ZSwKK307CisKK3N0YXRpYyBpbnQgYWZpdWN2X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCFNQUNISU5FX0lTX1ZNKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQUZfSVVDViBjb25uZWN0aW9uIG5lZWRzIFZNIGFzIGJhc2VcbiIpOworCQllcnIgPSAtRVBST1RPTk9TVVBQT1JUOworCQlnb3RvIG91dDsKKwl9CisJY3BjbWQoIlFVRVJZIFVTRVJJRCIsIGl1Y3ZfdXNlcmlkLCBzaXplb2YoaXVjdl91c2VyaWQpLCAmZXJyKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkFGX0lVQ1YgbmVlZHMgdGhlIFZNIHVzZXJpZFxuIik7CisJCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IGl1Y3ZfcmVnaXN0ZXIoJmFmX2l1Y3ZfaGFuZGxlciwgMCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcHJvdG9fcmVnaXN0ZXIoJml1Y3ZfcHJvdG8sIDApOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2l1Y3Y7CisJZXJyID0gc29ja19yZWdpc3RlcigmaXVjdl9zb2NrX2ZhbWlseV9vcHMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3Byb3RvOworCXByaW50ayhLRVJOX0lORk8gIkFGX0lVQ1YgbG93bGV2ZWwgZHJpdmVyIGluaXRpYWxpemVkXG4iKTsKKwlyZXR1cm4gMDsKKworb3V0X3Byb3RvOgorCXByb3RvX3VucmVnaXN0ZXIoJml1Y3ZfcHJvdG8pOworb3V0X2l1Y3Y6CisJaXVjdl91bnJlZ2lzdGVyKCZhZl9pdWN2X2hhbmRsZXIsIDApOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZml1Y3ZfZXhpdCh2b2lkKQoreworCXNvY2tfdW5yZWdpc3RlcihQRl9JVUNWKTsKKwlwcm90b191bnJlZ2lzdGVyKCZpdWN2X3Byb3RvKTsKKwlpdWN2X3VucmVnaXN0ZXIoJmFmX2l1Y3ZfaGFuZGxlciwgMCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJBRl9JVUNWIGxvd2xldmVsIGRyaXZlciB1bmxvYWRlZFxuIik7Cit9CisKK21vZHVsZV9pbml0KGFmaXVjdl9pbml0KTsKK21vZHVsZV9leGl0KGFmaXVjdl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSmVubmlmZXIgSHVudCA8amVuaHVudEB1cy5pYm0uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJVUNWIFNvY2tldHMgdmVyICIgVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9JVUNWKTsKZGlmZiAtLWdpdCBhL25ldC9pdWN2L2l1Y3YuYyBiL25ldC9pdWN2L2l1Y3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjEwZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2l1Y3YvaXVjdi5jCkBAIC0wLDAgKzEsMTYxOSBAQAorLyoKKyAqIElVQ1YgYmFzZSBpbmZyYXN0cnVjdHVyZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSwgMjAwNiBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCisgKiBBdXRob3Iocyk6CisgKiAgICBPcmlnaW5hbCBzb3VyY2U6CisgKglBbGFuIEFsdG1hcmsgKEFsYW5fQWx0bWFya0B1cy5pYm0uY29tKQlTZXB0LiAyMDAwCisgKglYZW5pYSBUa2F0c2Nob3cgKHhlbmlhQHVzLmlibS5jb20pCisgKiAgICAyR2IgYXdhcmVuZXNzIGFuZCBnZW5lcmFsIGNsZWFudXA6CisgKglGcml0eiBFbGZlcnQgKGVsZmVydEBkZS5pYm0uY29tLCBmZWxmZXJ0QG1pbGxlbnV4LmNvbSkKKyAqICAgIFJld3JpdHRlbiBmb3IgYWZfaXVjdjoKKyAqCU1hcnRpbiBTY2h3aWRlZnNreSA8c2Nod2lkZWZza3lAZGUuaWJtLmNvbT4KKyAqCisgKiBEb2N1bWVudGF0aW9uIHVzZWQ6CisgKiAgICBUaGUgb3JpZ2luYWwgc291cmNlCisgKiAgICBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlLCBJQk0gZG9jdW1lbnQgIyBTQzI0LTU3NjAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxuZXQvaXVjdi9pdWN2Lmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vczM5MF9leHQuaD4KKyNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorCisvKgorICogRkxBR1M6CisgKiBBbGwgZmxhZ3MgYXJlIGRlZmluZWQgaW4gdGhlIGZpZWxkIElQRkxBR1MxIG9mIGVhY2ggZnVuY3Rpb24KKyAqIGFuZCBjYW4gYmUgZm91bmQgaW4gQ1AgUHJvZ3JhbW1pbmcgU2VydmljZXMuCisgKiBJUFNSQ0NMUyAtIEluZGljYXRlcyB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBzb3VyY2UgY2xhc3MuCisgKiBJUFRSR0NMUyAtIEluZGljYXRlcyB5b3UgaGF2ZSBzcGVjaWZpZWQgYSB0YXJnZXQgY2xhc3MuCisgKiBJUEZHUElEICAtIEluZGljYXRlcyB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwYXRoaWQuCisgKiBJUEZHTUlEICAtIEluZGljYXRlcyB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBtZXNzYWdlIElELgorICogSVBOT1JQWSAgLSBJbmRpY2F0ZXMgYSBvbmUtd2F5IG1lc3NhZ2UuIE5vIHJlcGx5IGV4cGVjdGVkLgorICogSVBBTEwgICAgLSBJbmRpY2F0ZXMgdGhhdCBhbGwgcGF0aHMgYXJlIGFmZmVjdGVkLgorICovCisjZGVmaW5lIElVQ1ZfSVBTUkNDTFMJMHgwMQorI2RlZmluZSBJVUNWX0lQVFJHQ0xTCTB4MDEKKyNkZWZpbmUgSVVDVl9JUEZHUElECTB4MDIKKyNkZWZpbmUgSVVDVl9JUEZHTUlECTB4MDQKKyNkZWZpbmUgSVVDVl9JUE5PUlBZCTB4MTAKKyNkZWZpbmUgSVVDVl9JUEFMTAkweDgwCisKK3N0YXRpYyBpbnQgaXVjdl9idXNfbWF0Y2ggKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJ1c190eXBlIGl1Y3ZfYnVzID0geworCS5uYW1lID0gIml1Y3YiLAorCS5tYXRjaCA9IGl1Y3ZfYnVzX21hdGNoLAorfTsKKworc3RydWN0IGRldmljZSAqaXVjdl9yb290Oworc3RhdGljIGludCBpdWN2X2F2YWlsYWJsZTsKKworLyogR2VuZXJhbCBJVUNWIGludGVycnVwdCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBpdWN2X2lycV9kYXRhIHsKKwl1MTYgaXBwYXRoaWQ7CisJdTggIGlwZmxhZ3MxOworCXU4ICBpcHR5cGU7CisJdTMyIHJlczJbOF07Cit9OworCitzdHJ1Y3QgaXVjdl93b3JrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGl1Y3ZfaXJxX2RhdGEgZGF0YTsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoaXVjdl93b3JrX3F1ZXVlKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXVjdl93b3JrX2xvY2spOworCitzdGF0aWMgc3RydWN0IGl1Y3ZfaXJxX2RhdGEgKml1Y3ZfaXJxX2RhdGE7CitzdGF0aWMgY3B1bWFza190IGl1Y3ZfYnVmZmVyX2NwdW1hc2sgPSBDUFVfTUFTS19OT05FOworc3RhdGljIGNwdW1hc2tfdCBpdWN2X2lycV9jcHVtYXNrID0gQ1BVX01BU0tfTk9ORTsKKworc3RhdGljIHZvaWQgaXVjdl90YXNrbGV0X2hhbmRsZXIodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgREVDTEFSRV9UQVNLTEVUKGl1Y3ZfdGFza2xldCwgaXVjdl90YXNrbGV0X2hhbmRsZXIsMCk7CisKK2VudW0gaXVjdl9jb21tYW5kX2NvZGVzIHsKKwlJVUNWX1FVRVJZID0gMCwKKwlJVUNWX1JFVFJJRVZFX0JVRkZFUiA9IDIsCisJSVVDVl9TRU5EID0gNCwKKwlJVUNWX1JFQ0VJVkUgPSA1LAorCUlVQ1ZfUkVQTFkgPSA2LAorCUlVQ1ZfUkVKRUNUID0gOCwKKwlJVUNWX1BVUkdFID0gOSwKKwlJVUNWX0FDQ0VQVCA9IDEwLAorCUlVQ1ZfQ09OTkVDVCA9IDExLAorCUlVQ1ZfREVDTEFSRV9CVUZGRVIgPSAxMiwKKwlJVUNWX1FVSUVTQ0UgPSAxMywKKwlJVUNWX1JFU1VNRSA9IDE0LAorCUlVQ1ZfU0VWRVIgPSAxNSwKKwlJVUNWX1NFVE1BU0sgPSAxNiwKK307CisKKy8qCisgKiBFcnJvciBtZXNzYWdlcyB0aGF0IGFyZSB1c2VkIHdpdGggdGhlIGl1Y3Zfc2V2ZXIgZnVuY3Rpb24uIFRoZXkgZ2V0CisgKiBjb252ZXJ0ZWQgdG8gRUJDRElDLgorICovCitzdGF0aWMgY2hhciBpdWN2X2Vycm9yX25vX2xpc3RlbmVyWzE2XSA9ICJOTyBMSVNURU5FUiI7CitzdGF0aWMgY2hhciBpdWN2X2Vycm9yX25vX21lbW9yeVsxNl0gPSAiTk8gTUVNT1JZIjsKK3N0YXRpYyBjaGFyIGl1Y3ZfZXJyb3JfcGF0aGlkWzE2XSA9ICJJTlZBTElEIFBBVEhJRCI7CisKKy8qCisgKiBpdWN2X2hhbmRsZXJfbGlzdDogTGlzdCBvZiByZWdpc3RlcmVkIGhhbmRsZXJzLgorICovCitzdGF0aWMgTElTVF9IRUFEKGl1Y3ZfaGFuZGxlcl9saXN0KTsKKworLyoKKyAqIGl1Y3ZfcGF0aF90YWJsZTogYW4gYXJyYXkgb2YgaXVjdl9wYXRoIHN0cnVjdHVyZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXVjdl9wYXRoICoqaXVjdl9wYXRoX3RhYmxlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXVjdl9tYXhfcGF0aGlkOworCisvKgorICogaXVjdl9sb2NrOiBzcGlubG9jayBwcm90ZWN0aW5nIGl1Y3ZfaGFuZGxlcl9saXN0IGFuZCBpdWN2X3BhdGhpZF90YWJsZQorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGl1Y3ZfdGFibGVfbG9jayk7CisKKy8qCisgKiBpdWN2X3Rhc2tsZXRfY3B1OiBjb250YWlucyB0aGUgbnVtYmVyIG9mIHRoZSBjcHUgZXhlY3V0aW5nIHRoZSB0YXNrbGV0LgorICogTmVlZGVkIGZvciBpdWN2X3BhdGhfc2V2ZXIgY2FsbGVkIGZyb20gdGFza2xldC4KKyAqLworc3RhdGljIGludCBpdWN2X3Rhc2tsZXRfY3B1ID0gLTE7CisKKy8qCisgKiBNdXRleCBhbmQgd2FpdCBxdWV1ZSBmb3IgaXVjdl9yZWdpc3Rlci9pdWN2X3VucmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoaXVjdl9yZWdpc3Rlcl9tdXRleCk7CisKKy8qCisgKiBDb3VudGVyIGZvciBudW1iZXIgb2Ygbm9uLXNtcCBjYXBhYmxlIGhhbmRsZXJzLgorICovCitzdGF0aWMgaW50IGl1Y3Zfbm9uc21wX2hhbmRsZXI7CisKKy8qCisgKiBJVUNWIGNvbnRyb2wgZGF0YSBzdHJ1Y3R1cmUuIFVzZWQgYnkgaXVjdl9wYXRoX2FjY2VwdCwgaXVjdl9wYXRoX2Nvbm5lY3QsCisgKiBpdWN2X3BhdGhfcXVpZXNjZSBhbmQgaXVjdl9wYXRoX3NldmVyLgorICovCitzdHJ1Y3QgaXVjdl9jbWRfY29udHJvbCB7CisJdTE2IGlwcGF0aGlkOworCXU4ICBpcGZsYWdzMTsKKwl1OCAgaXByY29kZTsKKwl1MTYgaXBtc2dsaW07CisJdTE2IHJlczE7CisJdTggIGlwdm1pZFs4XTsKKwl1OCAgaXB1c2VyWzE2XTsKKwl1OCAgaXB0YXJnZXRbOF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsYWxpZ25lZCg4KSkpOworCisvKgorICogRGF0YSBpbiBwYXJhbWV0ZXIgbGlzdCBpdWN2IHN0cnVjdHVyZS4gVXNlZCBieSBpdWN2X21lc3NhZ2Vfc2VuZCwKKyAqIGl1Y3ZfbWVzc2FnZV9zZW5kMndheSBhbmQgaXVjdl9tZXNzYWdlX3JlcGx5LgorICovCitzdHJ1Y3QgaXVjdl9jbWRfZHBsIHsKKwl1MTYgaXBwYXRoaWQ7CisJdTggIGlwZmxhZ3MxOworCXU4ICBpcHJjb2RlOworCXUzMiBpcG1zZ2lkOworCXUzMiBpcHRyZ2NsczsKKwl1OCAgaXBybW1zZ1s4XTsKKwl1MzIgaXBzcmNjbHM7CisJdTMyIGlwbXNndGFnOworCXUzMiBpcGJmYWRyMjsKKwl1MzIgaXBiZmxuMmY7CisJdTMyIHJlczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCxhbGlnbmVkKDgpKSk7CisKKy8qCisgKiBEYXRhIGluIGJ1ZmZlciBpdWN2IHN0cnVjdHVyZS4gVXNlZCBieSBpdWN2X21lc3NhZ2VfcmVjZWl2ZSwKKyAqIGl1Y3ZfbWVzc2FnZV9yZWplY3QsIGl1Y3ZfbWVzc2FnZV9zZW5kLCBpdWN2X21lc3NhZ2Vfc2VuZDJ3YXkKKyAqIGFuZCBpdWN2X2RlY2xhcmVfY3B1LgorICovCitzdHJ1Y3QgaXVjdl9jbWRfZGIgeworCXUxNiBpcHBhdGhpZDsKKwl1OCAgaXBmbGFnczE7CisJdTggIGlwcmNvZGU7CisJdTMyIGlwbXNnaWQ7CisJdTMyIGlwdHJnY2xzOworCXUzMiBpcGJmYWRyMTsKKwl1MzIgaXBiZmxuMWY7CisJdTMyIGlwc3JjY2xzOworCXUzMiBpcG1zZ3RhZzsKKwl1MzIgaXBiZmFkcjI7CisJdTMyIGlwYmZsbjJmOworCXUzMiByZXM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsYWxpZ25lZCg4KSkpOworCisvKgorICogUHVyZ2UgbWVzc2FnZSBpdWN2IHN0cnVjdHVyZS4gVXNlZCBieSBpdWN2X21lc3NhZ2VfcHVyZ2UuCisgKi8KK3N0cnVjdCBpdWN2X2NtZF9wdXJnZSB7CisJdTE2IGlwcGF0aGlkOworCXU4ICBpcGZsYWdzMTsKKwl1OCAgaXByY29kZTsKKwl1MzIgaXBtc2dpZDsKKwl1OCAgaXBhdWRpdFszXTsKKwl1OCAgcmVzMVs1XTsKKwl1MzIgcmVzMjsKKwl1MzIgaXBzcmNjbHM7CisJdTMyIGlwbXNndGFnOworCXUzMiByZXMzWzNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLGFsaWduZWQoOCkpKTsKKworLyoKKyAqIFNldCBtYXNrIGl1Y3Ygc3RydWN0dXJlLiBVc2VkIGJ5IGl1Y3ZfZW5hYmxlX2NwdS4KKyAqLworc3RydWN0IGl1Y3ZfY21kX3NldF9tYXNrIHsKKwl1OCAgaXBtYXNrOworCXU4ICByZXMxWzJdOworCXU4ICBpcHJjb2RlOworCXUzMiByZXMyWzldOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLGFsaWduZWQoOCkpKTsKKwordW5pb24gaXVjdl9wYXJhbSB7CisJc3RydWN0IGl1Y3ZfY21kX2NvbnRyb2wgY3RybDsKKwlzdHJ1Y3QgaXVjdl9jbWRfZHBsIGRwbDsKKwlzdHJ1Y3QgaXVjdl9jbWRfZGIgZGI7CisJc3RydWN0IGl1Y3ZfY21kX3B1cmdlIHB1cmdlOworCXN0cnVjdCBpdWN2X2NtZF9zZXRfbWFzayBzZXRfbWFzazsKK307CisKKy8qCisgKiBBbmNob3IgZm9yIHBlci1jcHUgSVVDViBjb21tYW5kIHBhcmFtZXRlciBibG9jay4KKyAqLworc3RhdGljIHVuaW9uIGl1Y3ZfcGFyYW0gKml1Y3ZfcGFyYW07CisKKy8qKgorICogaXVjdl9jYWxsX2IyZjAKKyAqIEBjb2RlOiBpZGVudGlmaWVyIG9mIElVQ1YgY2FsbCB0byBDUC4KKyAqIEBwYXJtOiBwb2ludGVyIHRvIGEgc3RydWN0IGl1Y3ZfcGFybSBibG9jaworICoKKyAqIENhbGxzIENQIHRvIGV4ZWN1dGUgSVVDViBjb21tYW5kcy4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIENQIElVQ1YgY2FsbC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaXVjdl9jYWxsX2IyZjAoaW50IGNvbW1hbmQsIHVuaW9uIGl1Y3ZfcGFyYW0gKnBhcm0pCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWcwIGFzbSAoIjAiKTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzEgYXNtICgiMSIpOworCWludCBjY29kZTsKKworCXJlZzAgPSBjb21tYW5kOworCXJlZzEgPSB2aXJ0X3RvX3BoeXMocGFybSk7CisJYXNtIHZvbGF0aWxlKAorCQkiCS5sb25nIDB4YjJmMDEwMDBcbiIKKwkJIglpcG0JJTBcbiIKKwkJIglzcmwJJTAsMjhcbiIKKwkJOiAiPWQiIChjY29kZSksICI9bSIgKCpwYXJtKSwgIitkIiAocmVnMCksICIrYSIgKHJlZzEpCisJCTogICJtIiAoKnBhcm0pIDogImNjIik7CisJcmV0dXJuIChjY29kZSA9PSAxKSA/IHBhcm0tPmN0cmwuaXByY29kZSA6IGNjb2RlOworfQorCisvKioKKyAqIGl1Y3ZfcXVlcnlfbWF4Y29ubgorICoKKyAqIERldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgbWF5IGJlIGVzdGFibGlzaGVkLgorICoKKyAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIG9yIC1FUEVSTSBpcyBJVUNWIGlzIG5vdAorICogYXZhaWxhYmxlLgorICovCitzdGF0aWMgaW50IGl1Y3ZfcXVlcnlfbWF4Y29ubih2b2lkKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMCBhc20gKCIwIik7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWcxIGFzbSAoIjEiKTsKKwl2b2lkICpwYXJhbTsKKwlpbnQgY2NvZGU7CisKKwlwYXJhbSA9IGt6YWxsb2Moc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pLCBHRlBfS0VSTkVMfEdGUF9ETUEpOworCWlmICghcGFyYW0pCisJCXJldHVybiAtRU5PTUVNOworCXJlZzAgPSBJVUNWX1FVRVJZOworCXJlZzEgPSAodW5zaWduZWQgbG9uZykgcGFyYW07CisJYXNtIHZvbGF0aWxlICgKKwkJIgkubG9uZwkweGIyZjAxMDAwXG4iCisJCSIJaXBtCSUwXG4iCisJCSIJc3JsCSUwLDI4XG4iCisJCTogIj1kIiAoY2NvZGUpLCAiK2QiIChyZWcwKSwgIitkIiAocmVnMSkgOiA6ICJjYyIpOworCWlmIChjY29kZSA9PSAwKQorCQlpdWN2X21heF9wYXRoaWQgPSByZWcwOworCWtmcmVlKHBhcmFtKTsKKwlyZXR1cm4gY2NvZGUgPyAtRVBFUk0gOiAwOworfQorCisvKioKKyAqIGl1Y3ZfYWxsb3dfY3B1CisgKiBAZGF0YTogdW51c2VkCisgKgorICogQWxsb3cgaXVjdiBpbnRlcnJ1cHRzIG9uIHRoaXMgY3B1LgorICovCitzdGF0aWMgdm9pZCBpdWN2X2FsbG93X2NwdSh2b2lkICpkYXRhKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5pb24gaXVjdl9wYXJhbSAqcGFybTsKKworCS8qCisJICogRW5hYmxlIGFsbCBpdWN2IGludGVycnVwdHMuCisJICogaXBtYXNrIGNvbnRhaW5zIGJpdHMgZm9yIHRoZSBkaWZmZXJlbnQgaW50ZXJydXB0cworCSAqCTB4ODAgLSBGbGFnIHRvIGFsbG93IG5vbnByaW9yaXR5IG1lc3NhZ2UgcGVuZGluZyBpbnRlcnJ1cHRzCisJICoJMHg0MCAtIEZsYWcgdG8gYWxsb3cgcHJpb3JpdHkgbWVzc2FnZSBwZW5kaW5nIGludGVycnVwdHMKKwkgKgkweDIwIC0gRmxhZyB0byBhbGxvdyBub25wcmlvcml0eSBtZXNzYWdlIGNvbXBsZXRpb24gaW50ZXJydXB0cworCSAqCTB4MTAgLSBGbGFnIHRvIGFsbG93IHByaW9yaXR5IG1lc3NhZ2UgY29tcGxldGlvbiBpbnRlcnJ1cHRzCisJICoJMHgwOCAtIEZsYWcgdG8gYWxsb3cgSVVDViBjb250cm9sIGludGVycnVwdHMKKwkgKi8KKwlwYXJtID0gcGVyY3B1X3B0cihpdWN2X3BhcmFtLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCW1lbXNldChwYXJtLCAwLCBzaXplb2YodW5pb24gaXVjdl9wYXJhbSkpOworCXBhcm0tPnNldF9tYXNrLmlwbWFzayA9IDB4Zjg7CisJaXVjdl9jYWxsX2IyZjAoSVVDVl9TRVRNQVNLLCBwYXJtKTsKKworCS8qIFNldCBpbmRpY2F0aW9uIHRoYXQgaXVjdiBpbnRlcnJ1cHRzIGFyZSBhbGxvd2VkIGZvciB0aGlzIGNwdS4gKi8KKwljcHVfc2V0KGNwdSwgaXVjdl9pcnFfY3B1bWFzayk7Cit9CisKKy8qKgorICogaXVjdl9ibG9ja19jcHUKKyAqIEBkYXRhOiB1bnVzZWQKKyAqCisgKiBCbG9jayBpdWN2IGludGVycnVwdHMgb24gdGhpcyBjcHUuCisgKi8KK3N0YXRpYyB2b2lkIGl1Y3ZfYmxvY2tfY3B1KHZvaWQgKmRhdGEpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1bmlvbiBpdWN2X3BhcmFtICpwYXJtOworCisJLyogRGlzYWJsZSBhbGwgaXVjdiBpbnRlcnJ1cHRzLiAqLworCXBhcm0gPSBwZXJjcHVfcHRyKGl1Y3ZfcGFyYW0sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJbWVtc2V0KHBhcm0sIDAsIHNpemVvZih1bmlvbiBpdWN2X3BhcmFtKSk7CisJaXVjdl9jYWxsX2IyZjAoSVVDVl9TRVRNQVNLLCBwYXJtKTsKKworCS8qIENsZWFyIGluZGljYXRpb24gdGhhdCBpdWN2IGludGVycnVwdHMgYXJlIGFsbG93ZWQgZm9yIHRoaXMgY3B1LiAqLworCWNwdV9jbGVhcihjcHUsIGl1Y3ZfaXJxX2NwdW1hc2spOworfQorCisvKioKKyAqIGl1Y3ZfZGVjbGFyZV9jcHUKKyAqIEBkYXRhOiB1bnVzZWQKKyAqCisgKiBEZWNsYXJlIGEgaW50ZXJ1cHQgYnVmZmVyIG9uIHRoaXMgY3B1LgorICovCitzdGF0aWMgdm9pZCBpdWN2X2RlY2xhcmVfY3B1KHZvaWQgKmRhdGEpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1bmlvbiBpdWN2X3BhcmFtICpwYXJtOworCWludCByYzsKKworCWlmIChjcHVfaXNzZXQoY3B1LCBpdWN2X2J1ZmZlcl9jcHVtYXNrKSkKKwkJcmV0dXJuOworCisJLyogRGVjbGFyZSBpbnRlcnJ1cHQgYnVmZmVyLiAqLworCXBhcm0gPSBwZXJjcHVfcHRyKGl1Y3ZfcGFyYW0sIGNwdSk7CisJbWVtc2V0KHBhcm0sIDAsIHNpemVvZih1bmlvbiBpdWN2X3BhcmFtKSk7CisJcGFybS0+ZGIuaXBiZmFkcjEgPSB2aXJ0X3RvX3BoeXMocGVyY3B1X3B0cihpdWN2X2lycV9kYXRhLCBjcHUpKTsKKwlyYyA9IGl1Y3ZfY2FsbF9iMmYwKElVQ1ZfREVDTEFSRV9CVUZGRVIsIHBhcm0pOworCWlmIChyYykgeworCQljaGFyICplcnIgPSAiVW5rbm93biI7CisJCXN3aXRjaChyYykgeworCQljYXNlIDB4MDM6CisJCQllcnIgPSAiRGlyZWN0b3J5IGVycm9yIjsKKwkJCWJyZWFrOworCQljYXNlIDB4MGE6CisJCQllcnIgPSAiSW52YWxpZCBsZW5ndGgiOworCQkJYnJlYWs7CisJCWNhc2UgMHgxMzoKKwkJCWVyciA9ICJCdWZmZXIgYWxyZWFkeSBleGlzdHMiOworCQkJYnJlYWs7CisJCWNhc2UgMHgzZToKKwkJCWVyciA9ICJCdWZmZXIgb3ZlcmxhcCI7CisJCQlicmVhazsKKwkJY2FzZSAweDVjOgorCQkJZXJyID0gIlBhZ2luZyBvciBzdG9yYWdlIGVycm9yIjsKKwkJCWJyZWFrOworCQl9CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIml1Y3ZfcmVnaXN0ZXI6IGl1Y3ZfZGVjbGFyZV9idWZmZXIgIgorCQkgICAgICAgIm9uIGNwdSAlaSByZXR1cm5lZCBlcnJvciAweCUwMnggKCVzKVxuIiwgY3B1LCByYywgZXJyKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNldCBpbmRpY2F0aW9uIHRoYXQgYW4gaXVjdiBidWZmZXIgZXhpc3RzIGZvciB0aGlzIGNwdS4gKi8KKwljcHVfc2V0KGNwdSwgaXVjdl9idWZmZXJfY3B1bWFzayk7CisKKwlpZiAoaXVjdl9ub25zbXBfaGFuZGxlciA9PSAwIHx8IGNwdXNfZW1wdHkoaXVjdl9pcnFfY3B1bWFzaykpCisJCS8qIEVuYWJsZSBpdWN2IGludGVycnVwdHMgb24gdGhpcyBjcHUuICovCisJCWl1Y3ZfYWxsb3dfY3B1KE5VTEwpOworCWVsc2UKKwkJLyogRGlzYWJsZSBpdWN2IGludGVycnVwdHMgb24gdGhpcyBjcHUuICovCisJCWl1Y3ZfYmxvY2tfY3B1KE5VTEwpOworfQorCisvKioKKyAqIGl1Y3ZfcmV0cmlldmVfY3B1CisgKiBAZGF0YTogdW51c2VkCisgKgorICogUmV0cmlldmUgaW50ZXJydXB0IGJ1ZmZlciBvbiB0aGlzIGNwdS4KKyAqLworc3RhdGljIHZvaWQgaXVjdl9yZXRyaWV2ZV9jcHUodm9pZCAqZGF0YSkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXVuaW9uIGl1Y3ZfcGFyYW0gKnBhcm07CisKKwlpZiAoIWNwdV9pc3NldChjcHUsIGl1Y3ZfYnVmZmVyX2NwdW1hc2spKQorCQlyZXR1cm47CisKKwkvKiBCbG9jayBpdWN2IGludGVycnVwdHMuICovCisJaXVjdl9ibG9ja19jcHUoTlVMTCk7CisKKwkvKiBSZXRyaWV2ZSBpbnRlcnJ1cHQgYnVmZmVyLiAqLworCXBhcm0gPSBwZXJjcHVfcHRyKGl1Y3ZfcGFyYW0sIGNwdSk7CisJaXVjdl9jYWxsX2IyZjAoSVVDVl9SRVRSSUVWRV9CVUZGRVIsIHBhcm0pOworCisJLyogQ2xlYXIgaW5kaWNhdGlvbiB0aGF0IGFuIGl1Y3YgYnVmZmVyIGV4aXN0cyBmb3IgdGhpcyBjcHUuICovCisJY3B1X2NsZWFyKGNwdSwgaXVjdl9idWZmZXJfY3B1bWFzayk7Cit9CisKKy8qKgorICogaXVjdl9zZXRtYXNrX3NtcAorICoKKyAqIEFsbG93IGl1Y3YgaW50ZXJydXB0cyBvbiBhbGwgY3B1cy4KKyAqLworc3RhdGljIHZvaWQgaXVjdl9zZXRtYXNrX21wKHZvaWQpCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQkvKiBFbmFibGUgYWxsIGNwdXMgd2l0aCBhIGRlY2xhcmVkIGJ1ZmZlci4gKi8KKwkJaWYgKGNwdV9pc3NldChjcHUsIGl1Y3ZfYnVmZmVyX2NwdW1hc2spICYmCisJCSAgICAhY3B1X2lzc2V0KGNwdSwgaXVjdl9pcnFfY3B1bWFzaykpCisJCQlzbXBfY2FsbF9mdW5jdGlvbl9vbihpdWN2X2FsbG93X2NwdSwgTlVMTCwgMCwgMSwgY3B1KTsKK30KKworLyoqCisgKiBpdWN2X3NldG1hc2tfdXAKKyAqCisgKiBBbGxvdyBpdWN2IGludGVycnVwdHMgb24gYSBzaW5nbGUgY3B1cy4KKyAqLworc3RhdGljIHZvaWQgaXVjdl9zZXRtYXNrX3VwKHZvaWQpCit7CisJY3B1bWFza190IGNwdW1hc2s7CisJaW50IGNwdTsKKworCS8qIERpc2FibGUgYWxsIGNwdSBidXQgdGhlIGZpcnN0IGluIGNwdV9pcnFfY3B1bWFzay4gKi8KKwljcHVtYXNrID0gaXVjdl9pcnFfY3B1bWFzazsKKwljcHVfY2xlYXIoZmlyc3RfY3B1KGl1Y3ZfaXJxX2NwdW1hc2spLCBjcHVtYXNrKTsKKwlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNwdW1hc2spCisJCXNtcF9jYWxsX2Z1bmN0aW9uX29uKGl1Y3ZfYmxvY2tfY3B1LCBOVUxMLCAwLCAxLCBjcHUpOworfQorCisvKioKKyAqIGl1Y3ZfZW5hYmxlCisgKgorICogVGhpcyBmdW5jdGlvbiBtYWtlcyBpdWN2IHJlYWR5IGZvciB1c2UuIEl0IGFsbG9jYXRlcyB0aGUgcGF0aGlkCisgKiB0YWJsZSwgZGVjbGFyZXMgYW4gaXVjdiBpbnRlcnJ1cHQgYnVmZmVyIGFuZCBlbmFibGVzIHRoZSBpdWN2CisgKiBpbnRlcnJ1cHRzLiBDYWxsZWQgd2hlbiB0aGUgZmlyc3QgdXNlciBoYXMgcmVnaXN0ZXJlZCBhbiBpdWN2CisgKiBoYW5kbGVyLgorICovCitzdGF0aWMgaW50IGl1Y3ZfZW5hYmxlKHZvaWQpCit7CisJc2l6ZV90IGFsbG9jX3NpemU7CisJaW50IGNwdSwgcmM7CisKKwlyYyA9IC1FTk9NRU07CisJYWxsb2Nfc2l6ZSA9IGl1Y3ZfbWF4X3BhdGhpZCAqIHNpemVvZihzdHJ1Y3QgaXVjdl9wYXRoKTsKKwlpdWN2X3BhdGhfdGFibGUgPSBremFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghaXVjdl9wYXRoX3RhYmxlKQorCQlnb3RvIG91dDsKKwkvKiBEZWNsYXJlIHBlciBjcHUgYnVmZmVycy4gKi8KKwlyYyA9IC1FSU87CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCXNtcF9jYWxsX2Z1bmN0aW9uX29uKGl1Y3ZfZGVjbGFyZV9jcHUsIE5VTEwsIDAsIDEsIGNwdSk7CisJaWYgKGNwdXNfZW1wdHkoaXVjdl9idWZmZXJfY3B1bWFzaykpCisJCS8qIE5vIGNwdSBjb3VsZCBkZWNsYXJlIGFuIGl1Y3YgYnVmZmVyLiAqLworCQlnb3RvIG91dF9wYXRoOworCXJldHVybiAwOworCitvdXRfcGF0aDoKKwlrZnJlZShpdWN2X3BhdGhfdGFibGUpOworb3V0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBpdWN2X2Rpc2FibGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNodXRzIGRvd24gaXVjdi4gSXQgZGlzYWJsZXMgaXVjdiBpbnRlcnJ1cHRzLCByZXRyaWV2ZXMKKyAqIHRoZSBpdWN2IGludGVycnVwdCBidWZmZXIgYW5kIGZyZWVzIHRoZSBwYXRoaWQgdGFibGUuIENhbGxlZCBhZnRlciB0aGUKKyAqIGxhc3QgdXNlciB1bnJlZ2lzdGVyIGl0cyBpdWN2IGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIGl1Y3ZfZGlzYWJsZSh2b2lkKQoreworCW9uX2VhY2hfY3B1KGl1Y3ZfcmV0cmlldmVfY3B1LCBOVUxMLCAwLCAxKTsKKwlrZnJlZShpdWN2X3BhdGhfdGFibGUpOworfQorCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitzdGF0aWMgaW50IF9fY3B1aW5pdCBpdWN2X2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJY3B1bWFza190IGNwdW1hc2s7CisJbG9uZyBjcHUgPSAobG9uZykgaGNwdTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDUFVfVVBfUFJFUEFSRToKKwkJaWYgKCFwZXJjcHVfcG9wdWxhdGUoaXVjdl9pcnFfZGF0YSwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgaXVjdl9pcnFfZGF0YSksCisJCQkJICAgICBHRlBfS0VSTkVMfEdGUF9ETUEsIGNwdSkpCisJCQlyZXR1cm4gTk9USUZZX0JBRDsKKwkJaWYgKCFwZXJjcHVfcG9wdWxhdGUoaXVjdl9wYXJhbSwgc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pLAorCQkJCSAgICAgR0ZQX0tFUk5FTHxHRlBfRE1BLCBjcHUpKSB7CisJCQlwZXJjcHVfZGVwb3B1bGF0ZShpdWN2X2lycV9kYXRhLCBjcHUpOworCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CisJY2FzZSBDUFVfREVBRDoKKwkJcGVyY3B1X2RlcG9wdWxhdGUoaXVjdl9wYXJhbSwgY3B1KTsKKwkJcGVyY3B1X2RlcG9wdWxhdGUoaXVjdl9pcnFfZGF0YSwgY3B1KTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfT05MSU5FOgorCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgorCQlzbXBfY2FsbF9mdW5jdGlvbl9vbihpdWN2X2RlY2xhcmVfY3B1LCBOVUxMLCAwLCAxLCBjcHUpOworCQlicmVhazsKKwljYXNlIENQVV9ET1dOX1BSRVBBUkU6CisJCWNwdW1hc2sgPSBpdWN2X2J1ZmZlcl9jcHVtYXNrOworCQljcHVfY2xlYXIoY3B1LCBjcHVtYXNrKTsKKwkJaWYgKGNwdXNfZW1wdHkoY3B1bWFzaykpCisJCQkvKiBDYW4ndCBvZmZsaW5lIGxhc3QgSVVDViBlbmFibGVkIGNwdS4gKi8KKwkJCXJldHVybiBOT1RJRllfQkFEOworCQlzbXBfY2FsbF9mdW5jdGlvbl9vbihpdWN2X3JldHJpZXZlX2NwdSwgTlVMTCwgMCwgMSwgY3B1KTsKKwkJaWYgKGNwdXNfZW1wdHkoaXVjdl9pcnFfY3B1bWFzaykpCisJCQlzbXBfY2FsbF9mdW5jdGlvbl9vbihpdWN2X2FsbG93X2NwdSwgTlVMTCwgMCwgMSwKKwkJCQkJICAgICBmaXJzdF9jcHUoaXVjdl9idWZmZXJfY3B1bWFzaykpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBpdWN2X2NwdV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGl1Y3ZfY3B1X25vdGlmeSwKK307CisjZW5kaWYKKworLyoqCisgKiBpdWN2X3NldmVyX3BhdGhpZAorICogQHBhdGhpZDogcGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIuCisgKiBAdXNlcmRhdGE6IDE2LWJ5dGVzIG9mIHVzZXIgZGF0YS4KKyAqCisgKiBTZXZlciBhbiBpdWN2IHBhdGggdG8gZnJlZSB1cCB0aGUgcGF0aGlkLiBVc2VkIGludGVybmFsbHkuCisgKi8KK3N0YXRpYyBpbnQgaXVjdl9zZXZlcl9wYXRoaWQodTE2IHBhdGhpZCwgdTggdXNlcmRhdGFbMTZdKQoreworCXVuaW9uIGl1Y3ZfcGFyYW0gKnBhcm07CisKKwlwYXJtID0gcGVyY3B1X3B0cihpdWN2X3BhcmFtLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCW1lbXNldChwYXJtLCAwLCBzaXplb2YodW5pb24gaXVjdl9wYXJhbSkpOworCWlmICh1c2VyZGF0YSkKKwkJbWVtY3B5KHBhcm0tPmN0cmwuaXB1c2VyLCB1c2VyZGF0YSwgc2l6ZW9mKHBhcm0tPmN0cmwuaXB1c2VyKSk7CisJcGFybS0+Y3RybC5pcHBhdGhpZCA9IHBhdGhpZDsKKwlyZXR1cm4gaXVjdl9jYWxsX2IyZjAoSVVDVl9TRVZFUiwgcGFybSk7Cit9CisKKy8qKgorICogX19pdWN2X2NsZWFudXBfcGF0aGlkCisgKiBAZHVtbXk6IHVudXNlZCBkdW1teSBhcmd1bWVudAorICoKKyAqIE5vcCBmdW5jdGlvbiBjYWxsZWQgdmlhIHNtcF9jYWxsX2Z1bmN0aW9uIHRvIGZvcmNlIHdvcmsgaXRlbXMgZnJvbQorICogcGVuZGluZyBleHRlcm5hbCBpdWN2IGludGVycnVwdHMgdG8gdGhlIHdvcmsgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIF9faXVjdl9jbGVhbnVwX3BhdGhpZCh2b2lkICpkdW1teSkKK3sKK30KKworLyoqCisgKiBpdWN2X2NsZWFudXBfcGF0aGlkCisgKiBAcGF0aGlkOiAxNiBiaXQgcGF0aGlkCisgKgorICogRnVuY3Rpb24gY2FsbGVkIGFmdGVyIGEgcGF0aCBoYXMgYmVlbiBzZXZlcmVkIHRvIGZpbmQgYWxsIHJlbWFpbmluZworICogd29yayBpdGVtcyBmb3IgdGhlIG5vdyBzdGFsZSBwYXRoaWQuIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCB0aGUKKyAqIGl1Y3ZfdGFibGVfbG9jay4KKyAqLworc3RhdGljIHZvaWQgaXVjdl9jbGVhbnVwX3BhdGhpZCh1MTYgcGF0aGlkKQoreworCXN0cnVjdCBpdWN2X3dvcmsgKnAsICpuOworCisJLyoKKwkgKiBQYXRoIGlzIHNldmVyZWQsIHRoZSBwYXRoaWQgY2FuIGJlIHJldXNlZCBpbW1lZGlhdGx5IG9uCisJICogYSBpdWN2IGNvbm5lY3Qgb3IgYSBjb25uZWN0aW9uIHBlbmRpbmcgaW50ZXJydXB0LgorCSAqIGl1Y3ZfcGF0aF9jb25uZWN0IGFuZCBjb25uZWN0aW9uIHBlbmRpbmcgaW50ZXJydXB0IHdpbGwKKwkgKiB3YWl0IHVudGlsIHRoZSBpdWN2X3RhYmxlX2xvY2sgaXMgcmVsZWFzZWQgYmVmb3JlIHRoZQorCSAqIHJlY3ljbGVkIHBhdGhpZCBlbnRlcnMgdGhlIHN5c3RlbS4KKwkgKiBGb3JjZSByZW1haW5pbmcgaW50ZXJydXB0cyB0byB0aGUgd29yayBxdWV1ZSwgdGhlbgorCSAqIHNjYW4gdGhlIHdvcmsgcXVldWUgZm9yIGl0ZW1zIG9mIHRoaXMgcGF0aC4KKwkgKi8KKwlzbXBfY2FsbF9mdW5jdGlvbihfX2l1Y3ZfY2xlYW51cF9wYXRoaWQsIE5VTEwsIDAsIDEpOworCXNwaW5fbG9ja19pcnEoJml1Y3Zfd29ya19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJml1Y3Zfd29ya19xdWV1ZSwgbGlzdCkgeworCQkvKiBSZW1vdmUgd29yayBpdGVtcyBmb3IgcGF0aGlkIGV4Y2VwdCBjb25uZWN0aW9uIHBlbmRpbmcgKi8KKwkJaWYgKHAtPmRhdGEuaXBwYXRoaWQgPT0gcGF0aGlkICYmIHAtPmRhdGEuaXB0eXBlICE9IDB4MDEpIHsKKwkJCWxpc3RfZGVsKCZwLT5saXN0KTsKKwkJCWtmcmVlKHApOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycSgmaXVjdl93b3JrX2xvY2spOworfQorCisvKioKKyAqIGl1Y3ZfcmVnaXN0ZXI6CisgKiBAaGFuZGxlcjogYWRkcmVzcyBvZiBpdWN2IGhhbmRsZXIgc3RydWN0dXJlCisgKiBAc21wOiAhPSAwIGluZGljYXRlcyB0aGF0IHRoZSBoYW5kbGVyIGNhbiBkZWFsIHdpdGggb3V0IG9mIG9yZGVyIG1lc3NhZ2VzCisgKgorICogUmVnaXN0ZXJzIGEgZHJpdmVyIHdpdGggSVVDVi4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVOT01FTSBpZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBwYXRoaWQKKyAqIHRhYmxlIGZhaWxlZCwgb3IgLUVJTyBpZiBJVUNWX0RFQ0xBUkVfQlVGRkVSIGZhaWxlZCBvbiBhbGwgY3B1cy4KKyAqLworaW50IGl1Y3ZfcmVnaXN0ZXIoc3RydWN0IGl1Y3ZfaGFuZGxlciAqaGFuZGxlciwgaW50IHNtcCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoIWl1Y3ZfYXZhaWxhYmxlKQorCQlyZXR1cm4gLUVOT1NZUzsKKwltdXRleF9sb2NrKCZpdWN2X3JlZ2lzdGVyX211dGV4KTsKKwlpZiAoIXNtcCkKKwkJaXVjdl9ub25zbXBfaGFuZGxlcisrOworCWlmIChsaXN0X2VtcHR5KCZpdWN2X2hhbmRsZXJfbGlzdCkpIHsKKwkJcmMgPSBpdWN2X2VuYWJsZSgpOworCQlpZiAocmMpCisJCQlnb3RvIG91dF9tdXRleDsKKwl9IGVsc2UgaWYgKCFzbXAgJiYgaXVjdl9ub25zbXBfaGFuZGxlciA9PSAxKQorCQlpdWN2X3NldG1hc2tfdXAoKTsKKwlJTklUX0xJU1RfSEVBRCgmaGFuZGxlci0+cGF0aHMpOworCisJc3Bpbl9sb2NrX2lycSgmaXVjdl90YWJsZV9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZoYW5kbGVyLT5saXN0LCAmaXVjdl9oYW5kbGVyX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmaXVjdl90YWJsZV9sb2NrKTsKKwlyYyA9IDA7CitvdXRfbXV0ZXg6CisJbXV0ZXhfdW5sb2NrKCZpdWN2X3JlZ2lzdGVyX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXVjdl91bnJlZ2lzdGVyCisgKiBAaGFuZGxlcjogIGFkZHJlc3Mgb2YgaXVjdiBoYW5kbGVyIHN0cnVjdHVyZQorICogQHNtcDogIT0gMCBpbmRpY2F0ZXMgdGhhdCB0aGUgaGFuZGxlciBjYW4gZGVhbCB3aXRoIG91dCBvZiBvcmRlciBtZXNzYWdlcworICoKKyAqIFVucmVnaXN0ZXIgZHJpdmVyIGZyb20gSVVDVi4KKyAqLwordm9pZCBpdWN2X3VucmVnaXN0ZXIoc3RydWN0IGl1Y3ZfaGFuZGxlciAqaGFuZGxlciwgaW50IHNtcCkKK3sKKwlzdHJ1Y3QgaXVjdl9wYXRoICpwLCAqbjsKKworCW11dGV4X2xvY2soJml1Y3ZfcmVnaXN0ZXJfbXV0ZXgpOworCXNwaW5fbG9ja19iaCgmaXVjdl90YWJsZV9sb2NrKTsKKwkvKiBSZW1vdmUgaGFuZGxlciBmcm9tIHRoZSBpdWN2X2hhbmRsZXJfbGlzdC4gKi8KKwlsaXN0X2RlbF9pbml0KCZoYW5kbGVyLT5saXN0KTsKKwkvKiBTZXZlciBhbGwgcGF0aGlkcyBzdGlsbCByZWZlcmluZyB0byB0aGUgaGFuZGxlci4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJmhhbmRsZXItPnBhdGhzLCBsaXN0KSB7CisJCWl1Y3Zfc2V2ZXJfcGF0aGlkKHAtPnBhdGhpZCwgTlVMTCk7CisJCWl1Y3ZfcGF0aF90YWJsZVtwLT5wYXRoaWRdID0gTlVMTDsKKwkJbGlzdF9kZWwoJnAtPmxpc3QpOworCQlpdWN2X2NsZWFudXBfcGF0aGlkKHAtPnBhdGhpZCk7CisJCWl1Y3ZfcGF0aF9mcmVlKHApOworCX0KKwlzcGluX3VubG9ja19iaCgmaXVjdl90YWJsZV9sb2NrKTsKKwlpZiAoIXNtcCkKKwkJaXVjdl9ub25zbXBfaGFuZGxlci0tOworCWlmIChsaXN0X2VtcHR5KCZpdWN2X2hhbmRsZXJfbGlzdCkpCisJCWl1Y3ZfZGlzYWJsZSgpOworCWVsc2UgaWYgKCFzbXAgJiYgaXVjdl9ub25zbXBfaGFuZGxlciA9PSAwKQorCQlpdWN2X3NldG1hc2tfbXAoKTsKKwltdXRleF91bmxvY2soJml1Y3ZfcmVnaXN0ZXJfbXV0ZXgpOworfQorCisvKioKKyAqIGl1Y3ZfcGF0aF9hY2NlcHQKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEBoYW5kbGVyOiBhZGRyZXNzIG9mIGl1Y3YgaGFuZGxlciBzdHJ1Y3R1cmUKKyAqIEB1c2VyZGF0YTogMTYgYnl0ZXMgb2YgZGF0YSByZWZsZWN0ZWQgdG8gdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorICogQHByaXZhdGU6IHByaXZhdGUgZGF0YSBwYXNzZWQgdG8gaW50ZXJydXB0IGhhbmRsZXJzIGZvciB0aGlzIHBhdGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGlzc3VlZCBhZnRlciB0aGUgdXNlciByZWNlaXZlZCBhIGNvbm5lY3Rpb24gcGVuZGluZworICogZXh0ZXJuYWwgaW50ZXJydXB0IGFuZCBub3cgd2lzaGVzIHRvIGNvbXBsZXRlIHRoZSBJVUNWIGNvbW11bmljYXRpb24gcGF0aC4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfcGF0aF9hY2NlcHQoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfaGFuZGxlciAqaGFuZGxlciwKKwkJICAgICB1OCB1c2VyZGF0YVsxNl0sIHZvaWQgKnByaXZhdGUpCit7CisJdW5pb24gaXVjdl9wYXJhbSAqcGFybTsKKwlpbnQgcmM7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJLyogUHJlcGFyZSBwYXJhbWV0ZXIgYmxvY2suICovCisJcGFybSA9IHBlcmNwdV9wdHIoaXVjdl9wYXJhbSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwltZW1zZXQocGFybSwgMCwgc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pKTsKKwlwYXJtLT5jdHJsLmlwcGF0aGlkID0gcGF0aC0+cGF0aGlkOworCXBhcm0tPmN0cmwuaXBtc2dsaW0gPSBwYXRoLT5tc2dsaW07CisJaWYgKHVzZXJkYXRhKQorCQltZW1jcHkocGFybS0+Y3RybC5pcHVzZXIsIHVzZXJkYXRhLCBzaXplb2YocGFybS0+Y3RybC5pcHVzZXIpKTsKKwlwYXJtLT5jdHJsLmlwZmxhZ3MxID0gcGF0aC0+ZmxhZ3M7CisKKwlyYyA9IGl1Y3ZfY2FsbF9iMmYwKElVQ1ZfQUNDRVBULCBwYXJtKTsKKwlpZiAoIXJjKSB7CisJCXBhdGgtPnByaXZhdGUgPSBwcml2YXRlOworCQlwYXRoLT5tc2dsaW0gPSBwYXJtLT5jdHJsLmlwbXNnbGltOworCQlwYXRoLT5mbGFncyA9IHBhcm0tPmN0cmwuaXBmbGFnczE7CisJfQorCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpdWN2X3BhdGhfY29ubmVjdAorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQGhhbmRsZXI6IGFkZHJlc3Mgb2YgaXVjdiBoYW5kbGVyIHN0cnVjdHVyZQorICogQHVzZXJpZDogOC1ieXRlIHVzZXIgaWRlbnRpZmljYXRpb24KKyAqIEBzeXN0ZW06IDgtYnl0ZSB0YXJnZXQgc3lzdGVtIGlkZW50aWZpY2F0aW9uCisgKiBAdXNlcmRhdGE6IDE2IGJ5dGVzIG9mIGRhdGEgcmVmbGVjdGVkIHRvIHRoZSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKyAqIEBwcml2YXRlOiBwcml2YXRlIGRhdGEgcGFzc2VkIHRvIGludGVycnVwdCBoYW5kbGVycyBmb3IgdGhpcyBwYXRoCisgKgorICogVGhpcyBmdW5jdGlvbiBlc3RhYmxpc2hlcyBhbiBJVUNWIHBhdGguIEFsdGhvdWdoIHRoZSBjb25uZWN0IG1heSBjb21wbGV0ZQorICogc3VjY2Vzc2Z1bGx5LCB5b3UgYXJlIG5vdCBhYmxlIHRvIHVzZSB0aGUgcGF0aCB1bnRpbCB5b3UgcmVjZWl2ZSBhbiBJVUNWCisgKiBDb25uZWN0aW9uIENvbXBsZXRlIGV4dGVybmFsIGludGVycnVwdC4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfcGF0aF9jb25uZWN0KHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHN0cnVjdCBpdWN2X2hhbmRsZXIgKmhhbmRsZXIsCisJCSAgICAgIHU4IHVzZXJpZFs4XSwgdTggc3lzdGVtWzhdLCB1OCB1c2VyZGF0YVsxNl0sCisJCSAgICAgIHZvaWQgKnByaXZhdGUpCit7CisJdW5pb24gaXVjdl9wYXJhbSAqcGFybTsKKwlpbnQgcmM7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlpZiAoaXVjdl90YXNrbGV0X2NwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCXNwaW5fbG9ja19iaCgmaXVjdl90YWJsZV9sb2NrKTsKKwlwYXJtID0gcGVyY3B1X3B0cihpdWN2X3BhcmFtLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCW1lbXNldChwYXJtLCAwLCBzaXplb2YodW5pb24gaXVjdl9wYXJhbSkpOworCXBhcm0tPmN0cmwuaXBtc2dsaW0gPSBwYXRoLT5tc2dsaW07CisJcGFybS0+Y3RybC5pcGZsYWdzMSA9IHBhdGgtPmZsYWdzOworCWlmICh1c2VyaWQpIHsKKwkJbWVtY3B5KHBhcm0tPmN0cmwuaXB2bWlkLCB1c2VyaWQsIHNpemVvZihwYXJtLT5jdHJsLmlwdm1pZCkpOworCQlBU0NFQkMocGFybS0+Y3RybC5pcHZtaWQsIHNpemVvZihwYXJtLT5jdHJsLmlwdm1pZCkpOworCQlFQkNfVE9VUFBFUihwYXJtLT5jdHJsLmlwdm1pZCwgc2l6ZW9mKHBhcm0tPmN0cmwuaXB2bWlkKSk7CisJfQorCWlmIChzeXN0ZW0pIHsKKwkJbWVtY3B5KHBhcm0tPmN0cmwuaXB0YXJnZXQsIHN5c3RlbSwKKwkJICAgICAgIHNpemVvZihwYXJtLT5jdHJsLmlwdGFyZ2V0KSk7CisJCUFTQ0VCQyhwYXJtLT5jdHJsLmlwdGFyZ2V0LCBzaXplb2YocGFybS0+Y3RybC5pcHRhcmdldCkpOworCQlFQkNfVE9VUFBFUihwYXJtLT5jdHJsLmlwdGFyZ2V0LCBzaXplb2YocGFybS0+Y3RybC5pcHRhcmdldCkpOworCX0KKwlpZiAodXNlcmRhdGEpCisJCW1lbWNweShwYXJtLT5jdHJsLmlwdXNlciwgdXNlcmRhdGEsIHNpemVvZihwYXJtLT5jdHJsLmlwdXNlcikpOworCisJcmMgPSBpdWN2X2NhbGxfYjJmMChJVUNWX0NPTk5FQ1QsIHBhcm0pOworCWlmICghcmMpIHsKKwkJaWYgKHBhcm0tPmN0cmwuaXBwYXRoaWQgPCBpdWN2X21heF9wYXRoaWQpIHsKKwkJCXBhdGgtPnBhdGhpZCA9IHBhcm0tPmN0cmwuaXBwYXRoaWQ7CisJCQlwYXRoLT5tc2dsaW0gPSBwYXJtLT5jdHJsLmlwbXNnbGltOworCQkJcGF0aC0+ZmxhZ3MgPSBwYXJtLT5jdHJsLmlwZmxhZ3MxOworCQkJcGF0aC0+aGFuZGxlciA9IGhhbmRsZXI7CisJCQlwYXRoLT5wcml2YXRlID0gcHJpdmF0ZTsKKwkJCWxpc3RfYWRkX3RhaWwoJnBhdGgtPmxpc3QsICZoYW5kbGVyLT5wYXRocyk7CisJCQlpdWN2X3BhdGhfdGFibGVbcGF0aC0+cGF0aGlkXSA9IHBhdGg7CisJCX0gZWxzZSB7CisJCQlpdWN2X3NldmVyX3BhdGhpZChwYXJtLT5jdHJsLmlwcGF0aGlkLAorCQkJCQkgIGl1Y3ZfZXJyb3JfcGF0aGlkKTsKKwkJCXJjID0gLUVJTzsKKwkJfQorCX0KKwlpZiAoaXVjdl90YXNrbGV0X2NwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCXNwaW5fdW5sb2NrX2JoKCZpdWN2X3RhYmxlX2xvY2spOworCXByZWVtcHRfZW5hYmxlKCk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGl1Y3ZfcGF0aF9xdWllc2NlOgorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQHVzZXJkYXRhOiAxNiBieXRlcyBvZiBkYXRhIHJlZmxlY3RlZCB0byB0aGUgY29tbXVuaWNhdGlvbiBwYXJ0bmVyCisgKgorICogVGhpcyBmdW5jdGlvbiB0ZW1wb3JhcmlseSBzdXNwZW5kcyBpbmNvbWluZyBtZXNzYWdlcyBvbiBhbiBJVUNWIHBhdGguCisgKiBZb3UgY2FuIGxhdGVyIHJlYWN0aXZhdGUgdGhlIHBhdGggYnkgaW52b2tpbmcgdGhlIGl1Y3ZfcmVzdW1lIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBmcm9tIHRoZSBDUCBJVUNWIGNhbGwuCisgKi8KK2ludCBpdWN2X3BhdGhfcXVpZXNjZShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCB1OCB1c2VyZGF0YVsxNl0pCit7CisJdW5pb24gaXVjdl9wYXJhbSAqcGFybTsKKwlpbnQgcmM7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJcGFybSA9IHBlcmNwdV9wdHIoaXVjdl9wYXJhbSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwltZW1zZXQocGFybSwgMCwgc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pKTsKKwlpZiAodXNlcmRhdGEpCisJCW1lbWNweShwYXJtLT5jdHJsLmlwdXNlciwgdXNlcmRhdGEsIHNpemVvZihwYXJtLT5jdHJsLmlwdXNlcikpOworCXBhcm0tPmN0cmwuaXBwYXRoaWQgPSBwYXRoLT5wYXRoaWQ7CisJcmMgPSBpdWN2X2NhbGxfYjJmMChJVUNWX1FVSUVTQ0UsIHBhcm0pOworCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpdWN2X3BhdGhfcmVzdW1lOgorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQHVzZXJkYXRhOiAxNiBieXRlcyBvZiBkYXRhIHJlZmxlY3RlZCB0byB0aGUgY29tbXVuaWNhdGlvbiBwYXJ0bmVyCisgKgorICogVGhpcyBmdW5jdGlvbiByZXN1bWVzIGluY29taW5nIG1lc3NhZ2VzIG9uIGFuIElVQ1YgcGF0aCB0aGF0IGhhcworICogYmVlbiBzdG9wcGVkIHdpdGggaXVjdl9wYXRoX3F1aWVzY2UuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfcGF0aF9yZXN1bWUoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgdTggdXNlcmRhdGFbMTZdKQoreworCXVuaW9uIGl1Y3ZfcGFyYW0gKnBhcm07CisJaW50IHJjOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCXBhcm0gPSBwZXJjcHVfcHRyKGl1Y3ZfcGFyYW0sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJbWVtc2V0KHBhcm0sIDAsIHNpemVvZih1bmlvbiBpdWN2X3BhcmFtKSk7CisJaWYgKHVzZXJkYXRhKQorCQltZW1jcHkocGFybS0+Y3RybC5pcHVzZXIsIHVzZXJkYXRhLCBzaXplb2YocGFybS0+Y3RybC5pcHVzZXIpKTsKKwlwYXJtLT5jdHJsLmlwcGF0aGlkID0gcGF0aC0+cGF0aGlkOworCXJjID0gaXVjdl9jYWxsX2IyZjAoSVVDVl9SRVNVTUUsIHBhcm0pOworCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpdWN2X3BhdGhfc2V2ZXIKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEB1c2VyZGF0YTogMTYgYnl0ZXMgb2YgZGF0YSByZWZsZWN0ZWQgdG8gdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyBhbiBJVUNWIHBhdGguCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfcGF0aF9zZXZlcihzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCB1OCB1c2VyZGF0YVsxNl0pCit7CisJaW50IHJjOworCisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlpZiAoaXVjdl90YXNrbGV0X2NwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCXNwaW5fbG9ja19iaCgmaXVjdl90YWJsZV9sb2NrKTsKKwlyYyA9IGl1Y3Zfc2V2ZXJfcGF0aGlkKHBhdGgtPnBhdGhpZCwgdXNlcmRhdGEpOworCWlmICghcmMpIHsKKwkJaXVjdl9wYXRoX3RhYmxlW3BhdGgtPnBhdGhpZF0gPSBOVUxMOworCQlsaXN0X2RlbF9pbml0KCZwYXRoLT5saXN0KTsKKwkJaXVjdl9jbGVhbnVwX3BhdGhpZChwYXRoLT5wYXRoaWQpOworCX0KKwlpZiAoaXVjdl90YXNrbGV0X2NwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCXNwaW5fdW5sb2NrX2JoKCZpdWN2X3RhYmxlX2xvY2spOworCXByZWVtcHRfZW5hYmxlKCk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGl1Y3ZfbWVzc2FnZV9wdXJnZQorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQG1zZzogYWRkcmVzcyBvZiBpdWN2IG1zZyBzdHJ1Y3R1cmUKKyAqIEBzcmNjbHM6IHNvdXJjZSBjbGFzcyBvZiBtZXNzYWdlCisgKgorICogQ2FuY2VscyBhIG1lc3NhZ2UgeW91IGhhdmUgc2VudC4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgZnJvbSB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9tZXNzYWdlX3B1cmdlKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZywKKwkJICAgICAgIHUzMiBzcmNjbHMpCit7CisJdW5pb24gaXVjdl9wYXJhbSAqcGFybTsKKwlpbnQgcmM7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJcGFybSA9IHBlcmNwdV9wdHIoaXVjdl9wYXJhbSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwltZW1zZXQocGFybSwgMCwgc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pKTsKKwlwYXJtLT5wdXJnZS5pcHBhdGhpZCA9IHBhdGgtPnBhdGhpZDsKKwlwYXJtLT5wdXJnZS5pcG1zZ2lkID0gbXNnLT5pZDsKKwlwYXJtLT5wdXJnZS5pcHNyY2NscyA9IHNyY2NsczsKKwlwYXJtLT5wdXJnZS5pcGZsYWdzMSA9IElVQ1ZfSVBTUkNDTFMgfCBJVUNWX0lQRkdNSUQgfCBJVUNWX0lQRkdQSUQ7CisJcmMgPSBpdWN2X2NhbGxfYjJmMChJVUNWX1BVUkdFLCBwYXJtKTsKKwlpZiAoIXJjKSB7CisJCW1zZy0+YXVkaXQgPSAoKih1MzIgKikgJnBhcm0tPnB1cmdlLmlwYXVkaXQpID4+IDg7CisJCW1zZy0+dGFnID0gcGFybS0+cHVyZ2UuaXBtc2d0YWc7CisJfQorCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpdWN2X21lc3NhZ2VfcmVjZWl2ZQorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQG1zZzogYWRkcmVzcyBvZiBpdWN2IG1zZyBzdHJ1Y3R1cmUKKyAqIEBmbGFnczogaG93IHRoZSBtZXNzYWdlIGlzIHJlY2VpdmVkIChJVUNWX0lQQlVGTFNUKQorICogQGJ1ZmZlcjogYWRkcmVzcyBvZiBkYXRhIGJ1ZmZlciBvciBhZGRyZXNzIG9mIHN0cnVjdCBpdWN2X2FycmF5CisgKiBAc2l6ZTogbGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgKiBAcmVzaWR1YWw6CisgKgorICogVGhpcyBmdW5jdGlvbiByZWNlaXZlcyBtZXNzYWdlcyB0aGF0IGFyZSBiZWluZyBzZW50IHRvIHlvdSBvdmVyCisgKiBlc3RhYmxpc2hlZCBwYXRocy4gVGhpcyBmdW5jdGlvbiB3aWxsIGRlYWwgd2l0aCBSTURBVEEgbWVzc2FnZXMKKyAqIGVtYmVkZGVkIGluIHN0cnVjdCBpdWN2X21lc3NhZ2UgYXMgd2VsbC4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgZnJvbSB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9tZXNzYWdlX3JlY2VpdmUoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnLAorCQkJIHU4IGZsYWdzLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBzaXplX3QgKnJlc2lkdWFsKQoreworCXVuaW9uIGl1Y3ZfcGFyYW0gKnBhcm07CisJc3RydWN0IGl1Y3ZfYXJyYXkgKmFycmF5OworCXU4ICpybW1zZzsKKwlzaXplX3QgY29weTsKKwlpbnQgcmM7CisKKwlpZiAobXNnLT5mbGFncyAmIElVQ1ZfSVBSTURBVEEpIHsKKwkJLyoKKwkJICogTWVzc2FnZSBpcyA4IGJ5dGVzIGxvbmcgYW5kIGhhcyBiZWVuIHN0b3JlZCB0byB0aGUKKwkJICogbWVzc2FnZSBkZXNjcmlwdG9yIGl0c2VsZi4KKwkJICovCisJCXJjID0gKHNpemUgPCA4KSA/IDUgOiAwOworCQlpZiAocmVzaWR1YWwpCisJCQkqcmVzaWR1YWwgPSBhYnMoc2l6ZSAtIDgpOworCQlybW1zZyA9IG1zZy0+cm1tc2c7CisJCWlmIChmbGFncyAmIElVQ1ZfSVBCVUZMU1QpIHsKKwkJCS8qIENvcHkgdG8gc3RydWN0IGl1Y3ZfYXJyYXkuICovCisJCQlzaXplID0gKHNpemUgPCA4KSA/IHNpemUgOiA4OworCQkJZm9yIChhcnJheSA9IGJ1ZmZlcjsgc2l6ZSA+IDA7IGFycmF5KyspIHsKKwkJCQljb3B5ID0gbWluX3Qoc2l6ZV90LCBzaXplLCBhcnJheS0+bGVuZ3RoKTsKKwkJCQltZW1jcHkoKHU4ICopKGFkZHJfdCkgYXJyYXktPmFkZHJlc3MsCisJCQkJICAgICAgIHJtbXNnLCBjb3B5KTsKKwkJCQlybW1zZyArPSBjb3B5OworCQkJCXNpemUgLT0gY29weTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIENvcHkgdG8gZGlyZWN0IGJ1ZmZlci4gKi8KKwkJCW1lbWNweShidWZmZXIsIHJtbXNnLCBtaW5fdChzaXplX3QsIHNpemUsIDgpKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJcGFybSA9IHBlcmNwdV9wdHIoaXVjdl9wYXJhbSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwltZW1zZXQocGFybSwgMCwgc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pKTsKKwlwYXJtLT5kYi5pcGJmYWRyMSA9ICh1MzIpKGFkZHJfdCkgYnVmZmVyOworCXBhcm0tPmRiLmlwYmZsbjFmID0gKHUzMikgc2l6ZTsKKwlwYXJtLT5kYi5pcG1zZ2lkID0gbXNnLT5pZDsKKwlwYXJtLT5kYi5pcHBhdGhpZCA9IHBhdGgtPnBhdGhpZDsKKwlwYXJtLT5kYi5pcHRyZ2NscyA9IG1zZy0+Y2xhc3M7CisJcGFybS0+ZGIuaXBmbGFnczEgPSAoZmxhZ3MgfCBJVUNWX0lQRkdQSUQgfAorCQkJICAgICBJVUNWX0lQRkdNSUQgfCBJVUNWX0lQVFJHQ0xTKTsKKwlyYyA9IGl1Y3ZfY2FsbF9iMmYwKElVQ1ZfUkVDRUlWRSwgcGFybSk7CisJaWYgKCFyYyB8fCByYyA9PSA1KSB7CisJCW1zZy0+ZmxhZ3MgPSBwYXJtLT5kYi5pcGZsYWdzMTsKKwkJaWYgKHJlc2lkdWFsKQorCQkJKnJlc2lkdWFsID0gcGFybS0+ZGIuaXBiZmxuMWY7CisJfQorCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpdWN2X21lc3NhZ2VfcmVqZWN0CisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAbXNnOiBhZGRyZXNzIG9mIGl1Y3YgbXNnIHN0cnVjdHVyZQorICoKKyAqIFRoZSByZWplY3QgZnVuY3Rpb24gcmVmdXNlcyBhIHNwZWNpZmllZCBtZXNzYWdlLiBCZXR3ZWVuIHRoZSB0aW1lIHlvdQorICogYXJlIG5vdGlmaWVkIG9mIGEgbWVzc2FnZSBhbmQgdGhlIHRpbWUgdGhhdCB5b3UgY29tcGxldGUgdGhlIG1lc3NhZ2UsCisgKiB0aGUgbWVzc2FnZSBtYXkgYmUgcmVqZWN0ZWQuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfbWVzc2FnZV9yZWplY3Qoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnKQoreworCXVuaW9uIGl1Y3ZfcGFyYW0gKnBhcm07CisJaW50IHJjOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCXBhcm0gPSBwZXJjcHVfcHRyKGl1Y3ZfcGFyYW0sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJbWVtc2V0KHBhcm0sIDAsIHNpemVvZih1bmlvbiBpdWN2X3BhcmFtKSk7CisJcGFybS0+ZGIuaXBwYXRoaWQgPSBwYXRoLT5wYXRoaWQ7CisJcGFybS0+ZGIuaXBtc2dpZCA9IG1zZy0+aWQ7CisJcGFybS0+ZGIuaXB0cmdjbHMgPSBtc2ctPmNsYXNzOworCXBhcm0tPmRiLmlwZmxhZ3MxID0gKElVQ1ZfSVBUUkdDTFMgfCBJVUNWX0lQRkdNSUQgfCBJVUNWX0lQRkdQSUQpOworCXJjID0gaXVjdl9jYWxsX2IyZjAoSVVDVl9SRUpFQ1QsIHBhcm0pOworCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpdWN2X21lc3NhZ2VfcmVwbHkKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEBtc2c6IGFkZHJlc3Mgb2YgaXVjdiBtc2cgc3RydWN0dXJlCisgKiBAZmxhZ3M6IGhvdyB0aGUgcmVwbHkgaXMgc2VudCAoSVVDVl9JUFJNREFUQSwgSVVDVl9JUFBSVFksIElVQ1ZfSVBCVUZMU1QpCisgKiBAcmVwbHk6IGFkZHJlc3Mgb2YgcmVwbHkgZGF0YSBidWZmZXIgb3IgYWRkcmVzcyBvZiBzdHJ1Y3QgaXVjdl9hcnJheQorICogQHNpemU6IGxlbmd0aCBvZiByZXBseSBkYXRhIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzcG9uZHMgdG8gdGhlIHR3by13YXkgbWVzc2FnZXMgdGhhdCB5b3UgcmVjZWl2ZS4gWW91CisgKiBtdXN0IGlkZW50aWZ5IGNvbXBsZXRlbHkgdGhlIG1lc3NhZ2UgdG8gd2hpY2ggeW91IHdpc2ggdG8gcmVwbHkuIGllLAorICogcGF0aGlkLCBtc2dpZCwgYW5kIHRyZ2Nscy4gUHJtbXNnIHNpZ25pZmllcyB0aGUgZGF0YSBpcyBtb3ZlZCBpbnRvCisgKiB0aGUgcGFyYW1ldGVyIGxpc3QuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfbWVzc2FnZV9yZXBseShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2csCisJCSAgICAgICB1OCBmbGFncywgdm9pZCAqcmVwbHksIHNpemVfdCBzaXplKQoreworCXVuaW9uIGl1Y3ZfcGFyYW0gKnBhcm07CisJaW50IHJjOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCXBhcm0gPSBwZXJjcHVfcHRyKGl1Y3ZfcGFyYW0sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJbWVtc2V0KHBhcm0sIDAsIHNpemVvZih1bmlvbiBpdWN2X3BhcmFtKSk7CisJaWYgKGZsYWdzICYgSVVDVl9JUFJNREFUQSkgeworCQlwYXJtLT5kcGwuaXBwYXRoaWQgPSBwYXRoLT5wYXRoaWQ7CisJCXBhcm0tPmRwbC5pcGZsYWdzMSA9IGZsYWdzOworCQlwYXJtLT5kcGwuaXBtc2dpZCA9IG1zZy0+aWQ7CisJCXBhcm0tPmRwbC5pcHRyZ2NscyA9IG1zZy0+Y2xhc3M7CisJCW1lbWNweShwYXJtLT5kcGwuaXBybW1zZywgcmVwbHksIG1pbl90KHNpemVfdCwgc2l6ZSwgOCkpOworCX0gZWxzZSB7CisJCXBhcm0tPmRiLmlwYmZhZHIxID0gKHUzMikoYWRkcl90KSByZXBseTsKKwkJcGFybS0+ZGIuaXBiZmxuMWYgPSAodTMyKSBzaXplOworCQlwYXJtLT5kYi5pcHBhdGhpZCA9IHBhdGgtPnBhdGhpZDsKKwkJcGFybS0+ZGIuaXBmbGFnczEgPSBmbGFnczsKKwkJcGFybS0+ZGIuaXBtc2dpZCA9IG1zZy0+aWQ7CisJCXBhcm0tPmRiLmlwdHJnY2xzID0gbXNnLT5jbGFzczsKKwl9CisJcmMgPSBpdWN2X2NhbGxfYjJmMChJVUNWX1JFUExZLCBwYXJtKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXVjdl9tZXNzYWdlX3NlbmQKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEBtc2c6IGFkZHJlc3Mgb2YgaXVjdiBtc2cgc3RydWN0dXJlCisgKiBAZmxhZ3M6IGhvdyB0aGUgbWVzc2FnZSBpcyBzZW50IChJVUNWX0lQUk1EQVRBLCBJVUNWX0lQUFJUWSwgSVVDVl9JUEJVRkxTVCkKKyAqIEBzcmNjbHM6IHNvdXJjZSBjbGFzcyBvZiBtZXNzYWdlCisgKiBAYnVmZmVyOiBhZGRyZXNzIG9mIHNlbmQgYnVmZmVyIG9yIGFkZHJlc3Mgb2Ygc3RydWN0IGl1Y3ZfYXJyYXkKKyAqIEBzaXplOiBsZW5ndGggb2Ygc2VuZCBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zbWl0cyBkYXRhIHRvIGFub3RoZXIgYXBwbGljYXRpb24uIERhdGEgdG8gYmUKKyAqIHRyYW5zbWl0dGVkIGlzIGluIGEgYnVmZmVyIGFuZCB0aGlzIGlzIGEgb25lLXdheSBtZXNzYWdlIGFuZCB0aGUKKyAqIHJlY2VpdmVyIHdpbGwgbm90IHJlcGx5IHRvIHRoZSBtZXNzYWdlLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBmcm9tIHRoZSBDUCBJVUNWIGNhbGwuCisgKi8KK2ludCBpdWN2X21lc3NhZ2Vfc2VuZChzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2csCisJCSAgICAgIHU4IGZsYWdzLCB1MzIgc3JjY2xzLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXVuaW9uIGl1Y3ZfcGFyYW0gKnBhcm07CisJaW50IHJjOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCXBhcm0gPSBwZXJjcHVfcHRyKGl1Y3ZfcGFyYW0sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJbWVtc2V0KHBhcm0sIDAsIHNpemVvZih1bmlvbiBpdWN2X3BhcmFtKSk7CisJaWYgKGZsYWdzICYgSVVDVl9JUFJNREFUQSkgeworCQkvKiBNZXNzYWdlIG9mIDggYnl0ZXMgY2FuIGJlIHBsYWNlZCBpbnRvIHRoZSBwYXJhbWV0ZXIgbGlzdC4gKi8KKwkJcGFybS0+ZHBsLmlwcGF0aGlkID0gcGF0aC0+cGF0aGlkOworCQlwYXJtLT5kcGwuaXBmbGFnczEgPSBmbGFncyB8IElVQ1ZfSVBOT1JQWTsKKwkJcGFybS0+ZHBsLmlwdHJnY2xzID0gbXNnLT5jbGFzczsKKwkJcGFybS0+ZHBsLmlwc3JjY2xzID0gc3JjY2xzOworCQlwYXJtLT5kcGwuaXBtc2d0YWcgPSBtc2ctPnRhZzsKKwkJbWVtY3B5KHBhcm0tPmRwbC5pcHJtbXNnLCBidWZmZXIsIDgpOworCX0gZWxzZSB7CisJCXBhcm0tPmRiLmlwYmZhZHIxID0gKHUzMikoYWRkcl90KSBidWZmZXI7CisJCXBhcm0tPmRiLmlwYmZsbjFmID0gKHUzMikgc2l6ZTsKKwkJcGFybS0+ZGIuaXBwYXRoaWQgPSBwYXRoLT5wYXRoaWQ7CisJCXBhcm0tPmRiLmlwZmxhZ3MxID0gZmxhZ3MgfCBJVUNWX0lQTk9SUFk7CisJCXBhcm0tPmRiLmlwdHJnY2xzID0gbXNnLT5jbGFzczsKKwkJcGFybS0+ZGIuaXBzcmNjbHMgPSBzcmNjbHM7CisJCXBhcm0tPmRiLmlwbXNndGFnID0gbXNnLT50YWc7CisJfQorCXJjID0gaXVjdl9jYWxsX2IyZjAoSVVDVl9TRU5ELCBwYXJtKTsKKwlpZiAoIXJjKQorCQltc2ctPmlkID0gcGFybS0+ZGIuaXBtc2dpZDsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXVjdl9tZXNzYWdlX3NlbmQyd2F5CisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAbXNnOiBhZGRyZXNzIG9mIGl1Y3YgbXNnIHN0cnVjdHVyZQorICogQGZsYWdzOiBob3cgdGhlIG1lc3NhZ2UgaXMgc2VudCBhbmQgdGhlIHJlcGx5IGlzIHJlY2VpdmVkCisgKgkgICAoSVVDVl9JUFJNREFUQSwgSVVDVl9JUEJVRkxTVCwgSVVDVl9JUFBSVFksIElVQ1ZfQU5TTFNUKQorICogQHNyY2Nsczogc291cmNlIGNsYXNzIG9mIG1lc3NhZ2UKKyAqIEBidWZmZXI6IGFkZHJlc3Mgb2Ygc2VuZCBidWZmZXIgb3IgYWRkcmVzcyBvZiBzdHJ1Y3QgaXVjdl9hcnJheQorICogQHNpemU6IGxlbmd0aCBvZiBzZW5kIGJ1ZmZlcgorICogQGFuc2J1ZjogYWRkcmVzcyBvZiBhbnN3ZXIgYnVmZmVyIG9yIGFkZHJlc3Mgb2Ygc3RydWN0IGl1Y3ZfYXJyYXkKKyAqIEBhc2l6ZTogc2l6ZSBvZiByZXBseSBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zbWl0cyBkYXRhIHRvIGFub3RoZXIgYXBwbGljYXRpb24uIERhdGEgdG8gYmUKKyAqIHRyYW5zbWl0dGVkIGlzIGluIGEgYnVmZmVyLiBUaGUgcmVjZWl2ZXIgb2YgdGhlIHNlbmQgaXMgZXhwZWN0ZWQgdG8KKyAqIHJlcGx5IHRvIHRoZSBtZXNzYWdlIGFuZCBhIGJ1ZmZlciBpcyBwcm92aWRlZCBpbnRvIHdoaWNoIElVQ1YgbW92ZXMKKyAqIHRoZSByZXBseSB0byB0aGlzIG1lc3NhZ2UuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfbWVzc2FnZV9zZW5kMndheShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2csCisJCQkgIHU4IGZsYWdzLCB1MzIgc3JjY2xzLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLAorCQkJICB2b2lkICphbnN3ZXIsIHNpemVfdCBhc2l6ZSwgc2l6ZV90ICpyZXNpZHVhbCkKK3sKKwl1bmlvbiBpdWN2X3BhcmFtICpwYXJtOworCWludCByYzsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwlwYXJtID0gcGVyY3B1X3B0cihpdWN2X3BhcmFtLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCW1lbXNldChwYXJtLCAwLCBzaXplb2YodW5pb24gaXVjdl9wYXJhbSkpOworCWlmIChmbGFncyAmIElVQ1ZfSVBSTURBVEEpIHsKKwkJcGFybS0+ZHBsLmlwcGF0aGlkID0gcGF0aC0+cGF0aGlkOworCQlwYXJtLT5kcGwuaXBmbGFnczEgPSBwYXRoLT5mbGFnczsJLyogcHJpb3JpdHkgbWVzc2FnZSAqLworCQlwYXJtLT5kcGwuaXB0cmdjbHMgPSBtc2ctPmNsYXNzOworCQlwYXJtLT5kcGwuaXBzcmNjbHMgPSBzcmNjbHM7CisJCXBhcm0tPmRwbC5pcG1zZ3RhZyA9IG1zZy0+dGFnOworCQlwYXJtLT5kcGwuaXBiZmFkcjIgPSAodTMyKShhZGRyX3QpIGFuc3dlcjsKKwkJcGFybS0+ZHBsLmlwYmZsbjJmID0gKHUzMikgYXNpemU7CisJCW1lbWNweShwYXJtLT5kcGwuaXBybW1zZywgYnVmZmVyLCA4KTsKKwl9IGVsc2UgeworCQlwYXJtLT5kYi5pcHBhdGhpZCA9IHBhdGgtPnBhdGhpZDsKKwkJcGFybS0+ZGIuaXBmbGFnczEgPSBwYXRoLT5mbGFnczsJLyogcHJpb3JpdHkgbWVzc2FnZSAqLworCQlwYXJtLT5kYi5pcHRyZ2NscyA9IG1zZy0+Y2xhc3M7CisJCXBhcm0tPmRiLmlwc3JjY2xzID0gc3JjY2xzOworCQlwYXJtLT5kYi5pcG1zZ3RhZyA9IG1zZy0+dGFnOworCQlwYXJtLT5kYi5pcGJmYWRyMSA9ICh1MzIpKGFkZHJfdCkgYnVmZmVyOworCQlwYXJtLT5kYi5pcGJmbG4xZiA9ICh1MzIpIHNpemU7CisJCXBhcm0tPmRiLmlwYmZhZHIyID0gKHUzMikoYWRkcl90KSBhbnN3ZXI7CisJCXBhcm0tPmRiLmlwYmZsbjJmID0gKHUzMikgYXNpemU7CisJfQorCXJjID0gaXVjdl9jYWxsX2IyZjAoSVVDVl9TRU5ELCBwYXJtKTsKKwlpZiAoIXJjKQorCQltc2ctPmlkID0gcGFybS0+ZGIuaXBtc2dpZDsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXVjdl9wYXRoX3BlbmRpbmcKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGV4dGVybmFsIGludGVycnVwdCBidWZmZXIKKyAqCisgKiBQcm9jZXNzIGNvbm5lY3Rpb24gcGVuZGluZyB3b3JrIGl0ZW0uIENhbGxlZCBmcm9tIHRhc2tsZXQgd2hpbGUgaG9sZGluZworICogaXVjdl90YWJsZV9sb2NrLgorICovCitzdHJ1Y3QgaXVjdl9wYXRoX3BlbmRpbmcgeworCXUxNiBpcHBhdGhpZDsKKwl1OCAgaXBmbGFnczE7CisJdTggIGlwdHlwZTsKKwl1MTYgaXBtc2dsaW07CisJdTE2IHJlczE7CisJdTggIGlwdm1pZFs4XTsKKwl1OCAgaXB1c2VyWzE2XTsKKwl1MzIgcmVzMzsKKwl1OCAgaXBwb2xsZmc7CisJdTggIHJlczRbM107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIHZvaWQgaXVjdl9wYXRoX3BlbmRpbmcoc3RydWN0IGl1Y3ZfaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGl1Y3ZfcGF0aF9wZW5kaW5nICppcHAgPSAodm9pZCAqKSBkYXRhOworCXN0cnVjdCBpdWN2X2hhbmRsZXIgKmhhbmRsZXI7CisJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aDsKKwljaGFyICplcnJvcjsKKworCUJVR19PTihpdWN2X3BhdGhfdGFibGVbaXBwLT5pcHBhdGhpZF0pOworCS8qIE5ldyBwYXRoaWQsIGhhbmRsZXIgZm91bmQuIENyZWF0ZSBhIG5ldyBwYXRoIHN0cnVjdC4gKi8KKwllcnJvciA9IGl1Y3ZfZXJyb3Jfbm9fbWVtb3J5OworCXBhdGggPSBpdWN2X3BhdGhfYWxsb2MoaXBwLT5pcG1zZ2xpbSwgaXBwLT5pcGZsYWdzMSwgR0ZQX0FUT01JQyk7CisJaWYgKCFwYXRoKQorCQlnb3RvIG91dF9zZXZlcjsKKwlwYXRoLT5wYXRoaWQgPSBpcHAtPmlwcGF0aGlkOworCWl1Y3ZfcGF0aF90YWJsZVtwYXRoLT5wYXRoaWRdID0gcGF0aDsKKwlFQkNBU0MoaXBwLT5pcHZtaWQsIDgpOworCisJLyogQ2FsbCByZWdpc3RlcmVkIGhhbmRsZXIgdW50aWwgb25lIGlzIGZvdW5kIHRoYXQgd2FudHMgdGhlIHBhdGguICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShoYW5kbGVyLCAmaXVjdl9oYW5kbGVyX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFoYW5kbGVyLT5wYXRoX3BlbmRpbmcpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogQWRkIHBhdGggdG8gaGFuZGxlciB0byBhbGxvdyBhIGNhbGwgdG8gaXVjdl9wYXRoX3NldmVyCisJCSAqIGluc2lkZSB0aGUgcGF0aF9wZW5kaW5nIGZ1bmN0aW9uLiBJZiB0aGUgaGFuZGxlciByZXR1cm5zCisJCSAqIGFuIGVycm9yIHJlbW92ZSB0aGUgcGF0aCBmcm9tIHRoZSBoYW5kbGVyIGFnYWluLgorCQkgKi8KKwkJbGlzdF9hZGQoJnBhdGgtPmxpc3QsICZoYW5kbGVyLT5wYXRocyk7CisJCXBhdGgtPmhhbmRsZXIgPSBoYW5kbGVyOworCQlpZiAoIWhhbmRsZXItPnBhdGhfcGVuZGluZyhwYXRoLCBpcHAtPmlwdm1pZCwgaXBwLT5pcHVzZXIpKQorCQkJcmV0dXJuOworCQlsaXN0X2RlbCgmcGF0aC0+bGlzdCk7CisJCXBhdGgtPmhhbmRsZXIgPSBOVUxMOworCX0KKwkvKiBObyBoYW5kbGVyIHdhbnRlZCB0aGUgcGF0aC4gKi8KKwlpdWN2X3BhdGhfdGFibGVbcGF0aC0+cGF0aGlkXSA9IE5VTEw7CisJaXVjdl9wYXRoX2ZyZWUocGF0aCk7CisJZXJyb3IgPSBpdWN2X2Vycm9yX25vX2xpc3RlbmVyOworb3V0X3NldmVyOgorCWl1Y3Zfc2V2ZXJfcGF0aGlkKGlwcC0+aXBwYXRoaWQsIGVycm9yKTsKK30KKworLyoqCisgKiBpdWN2X3BhdGhfY29tcGxldGUKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGV4dGVybmFsIGludGVycnVwdCBidWZmZXIKKyAqCisgKiBQcm9jZXNzIGNvbm5lY3Rpb24gY29tcGxldGUgd29yayBpdGVtLiBDYWxsZWQgZnJvbSB0YXNrbGV0IHdoaWxlIGhvbGRpbmcKKyAqIGl1Y3ZfdGFibGVfbG9jay4KKyAqLworc3RydWN0IGl1Y3ZfcGF0aF9jb21wbGV0ZSB7CisJdTE2IGlwcGF0aGlkOworCXU4ICBpcGZsYWdzMTsKKwl1OCAgaXB0eXBlOworCXUxNiBpcG1zZ2xpbTsKKwl1MTYgcmVzMTsKKwl1OCAgcmVzMls4XTsKKwl1OCAgaXB1c2VyWzE2XTsKKwl1MzIgcmVzMzsKKwl1OCAgaXBwb2xsZmc7CisJdTggIHJlczRbM107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIHZvaWQgaXVjdl9wYXRoX2NvbXBsZXRlKHN0cnVjdCBpdWN2X2lycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBpdWN2X3BhdGhfY29tcGxldGUgKmlwYyA9ICh2b2lkICopIGRhdGE7CisJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCA9IGl1Y3ZfcGF0aF90YWJsZVtpcGMtPmlwcGF0aGlkXTsKKworCUJVR19PTighcGF0aCB8fCAhcGF0aC0+aGFuZGxlcik7CisJaWYgKHBhdGgtPmhhbmRsZXItPnBhdGhfY29tcGxldGUpCisJCXBhdGgtPmhhbmRsZXItPnBhdGhfY29tcGxldGUocGF0aCwgaXBjLT5pcHVzZXIpOworfQorCisvKioKKyAqIGl1Y3ZfcGF0aF9zZXZlcmVkCisgKiBAZGF0YTogUG9pbnRlciB0byBleHRlcm5hbCBpbnRlcnJ1cHQgYnVmZmVyCisgKgorICogUHJvY2VzcyBjb25uZWN0aW9uIHNldmVyZWQgd29yayBpdGVtLiBDYWxsZWQgZnJvbSB0YXNrbGV0IHdoaWxlIGhvbGRpbmcKKyAqIGl1Y3ZfdGFibGVfbG9jay4KKyAqLworc3RydWN0IGl1Y3ZfcGF0aF9zZXZlcmVkIHsKKwl1MTYgaXBwYXRoaWQ7CisJdTggIHJlczE7CisJdTggIGlwdHlwZTsKKwl1MzIgcmVzMjsKKwl1OCAgcmVzM1s4XTsKKwl1OCAgaXB1c2VyWzE2XTsKKwl1MzIgcmVzNDsKKwl1OCAgaXBwb2xsZmc7CisJdTggIHJlczVbM107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIHZvaWQgaXVjdl9wYXRoX3NldmVyZWQoc3RydWN0IGl1Y3ZfaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGl1Y3ZfcGF0aF9zZXZlcmVkICppcHMgPSAodm9pZCAqKSBkYXRhOworCXN0cnVjdCBpdWN2X3BhdGggKnBhdGggPSBpdWN2X3BhdGhfdGFibGVbaXBzLT5pcHBhdGhpZF07CisKKwlCVUdfT04oIXBhdGggfHwgIXBhdGgtPmhhbmRsZXIpOworCWlmIChwYXRoLT5oYW5kbGVyLT5wYXRoX3NldmVyZWQpCisJCXBhdGgtPmhhbmRsZXItPnBhdGhfc2V2ZXJlZChwYXRoLCBpcHMtPmlwdXNlcik7CisJZWxzZSB7CisJCWl1Y3Zfc2V2ZXJfcGF0aGlkKHBhdGgtPnBhdGhpZCwgTlVMTCk7CisJCWl1Y3ZfcGF0aF90YWJsZVtwYXRoLT5wYXRoaWRdID0gTlVMTDsKKwkJbGlzdF9kZWxfaW5pdCgmcGF0aC0+bGlzdCk7CisJCWl1Y3ZfY2xlYW51cF9wYXRoaWQocGF0aC0+cGF0aGlkKTsKKwkJaXVjdl9wYXRoX2ZyZWUocGF0aCk7CisJfQorfQorCisvKioKKyAqIGl1Y3ZfcGF0aF9xdWllc2NlZAorICogQGRhdGE6IFBvaW50ZXIgdG8gZXh0ZXJuYWwgaW50ZXJydXB0IGJ1ZmZlcgorICoKKyAqIFByb2Nlc3MgY29ubmVjdGlvbiBxdWllc2NlZCB3b3JrIGl0ZW0uIENhbGxlZCBmcm9tIHRhc2tsZXQgd2hpbGUgaG9sZGluZworICogaXVjdl90YWJsZV9sb2NrLgorICovCitzdHJ1Y3QgaXVjdl9wYXRoX3F1aWVzY2VkIHsKKwl1MTYgaXBwYXRoaWQ7CisJdTggIHJlczE7CisJdTggIGlwdHlwZTsKKwl1MzIgcmVzMjsKKwl1OCAgcmVzM1s4XTsKKwl1OCAgaXB1c2VyWzE2XTsKKwl1MzIgcmVzNDsKKwl1OCAgaXBwb2xsZmc7CisJdTggIHJlczVbM107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIHZvaWQgaXVjdl9wYXRoX3F1aWVzY2VkKHN0cnVjdCBpdWN2X2lycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBpdWN2X3BhdGhfcXVpZXNjZWQgKmlwcSA9ICh2b2lkICopIGRhdGE7CisJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCA9IGl1Y3ZfcGF0aF90YWJsZVtpcHEtPmlwcGF0aGlkXTsKKworCUJVR19PTighcGF0aCB8fCAhcGF0aC0+aGFuZGxlcik7CisJaWYgKHBhdGgtPmhhbmRsZXItPnBhdGhfcXVpZXNjZWQpCisJCXBhdGgtPmhhbmRsZXItPnBhdGhfcXVpZXNjZWQocGF0aCwgaXBxLT5pcHVzZXIpOworfQorCisvKioKKyAqIGl1Y3ZfcGF0aF9yZXN1bWVkCisgKiBAZGF0YTogUG9pbnRlciB0byBleHRlcm5hbCBpbnRlcnJ1cHQgYnVmZmVyCisgKgorICogUHJvY2VzcyBjb25uZWN0aW9uIHJlc3VtZWQgd29yayBpdGVtLiBDYWxsZWQgZnJvbSB0YXNrbGV0IHdoaWxlIGhvbGRpbmcKKyAqIGl1Y3ZfdGFibGVfbG9jay4KKyAqLworc3RydWN0IGl1Y3ZfcGF0aF9yZXN1bWVkIHsKKwl1MTYgaXBwYXRoaWQ7CisJdTggIHJlczE7CisJdTggIGlwdHlwZTsKKwl1MzIgcmVzMjsKKwl1OCAgcmVzM1s4XTsKKwl1OCAgaXB1c2VyWzE2XTsKKwl1MzIgcmVzNDsKKwl1OCAgaXBwb2xsZmc7CisJdTggIHJlczVbM107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIHZvaWQgaXVjdl9wYXRoX3Jlc3VtZWQoc3RydWN0IGl1Y3ZfaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGl1Y3ZfcGF0aF9yZXN1bWVkICppcHIgPSAodm9pZCAqKSBkYXRhOworCXN0cnVjdCBpdWN2X3BhdGggKnBhdGggPSBpdWN2X3BhdGhfdGFibGVbaXByLT5pcHBhdGhpZF07CisKKwlCVUdfT04oIXBhdGggfHwgIXBhdGgtPmhhbmRsZXIpOworCWlmIChwYXRoLT5oYW5kbGVyLT5wYXRoX3Jlc3VtZWQpCisJCXBhdGgtPmhhbmRsZXItPnBhdGhfcmVzdW1lZChwYXRoLCBpcHItPmlwdXNlcik7Cit9CisKKy8qKgorICogaXVjdl9tZXNzYWdlX2NvbXBsZXRlCisgKiBAZGF0YTogUG9pbnRlciB0byBleHRlcm5hbCBpbnRlcnJ1cHQgYnVmZmVyCisgKgorICogUHJvY2VzcyBtZXNzYWdlIGNvbXBsZXRlIHdvcmsgaXRlbS4gQ2FsbGVkIGZyb20gdGFza2xldCB3aGlsZSBob2xkaW5nCisgKiBpdWN2X3RhYmxlX2xvY2suCisgKi8KK3N0cnVjdCBpdWN2X21lc3NhZ2VfY29tcGxldGUgeworCXUxNiBpcHBhdGhpZDsKKwl1OCAgaXBmbGFnczE7CisJdTggIGlwdHlwZTsKKwl1MzIgaXBtc2dpZDsKKwl1MzIgaXBhdWRpdDsKKwl1OCAgaXBybW1zZ1s4XTsKKwl1MzIgaXBzcmNjbHM7CisJdTMyIGlwbXNndGFnOworCXUzMiByZXM7CisJdTMyIGlwYmZsbjJmOworCXU4ICBpcHBvbGxmZzsKKwl1OCAgcmVzMlszXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgdm9pZCBpdWN2X21lc3NhZ2VfY29tcGxldGUoc3RydWN0IGl1Y3ZfaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGl1Y3ZfbWVzc2FnZV9jb21wbGV0ZSAqaW1jID0gKHZvaWQgKikgZGF0YTsKKwlzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoID0gaXVjdl9wYXRoX3RhYmxlW2ltYy0+aXBwYXRoaWRdOworCXN0cnVjdCBpdWN2X21lc3NhZ2UgbXNnOworCisJQlVHX09OKCFwYXRoIHx8ICFwYXRoLT5oYW5kbGVyKTsKKwlpZiAocGF0aC0+aGFuZGxlci0+bWVzc2FnZV9jb21wbGV0ZSkgeworCQltc2cuZmxhZ3MgPSBpbWMtPmlwZmxhZ3MxOworCQltc2cuaWQgPSBpbWMtPmlwbXNnaWQ7CisJCW1zZy5hdWRpdCA9IGltYy0+aXBhdWRpdDsKKwkJbWVtY3B5KG1zZy5ybW1zZywgaW1jLT5pcHJtbXNnLCA4KTsKKwkJbXNnLmNsYXNzID0gaW1jLT5pcHNyY2NsczsKKwkJbXNnLnRhZyA9IGltYy0+aXBtc2d0YWc7CisJCW1zZy5sZW5ndGggPSBpbWMtPmlwYmZsbjJmOworCQlwYXRoLT5oYW5kbGVyLT5tZXNzYWdlX2NvbXBsZXRlKHBhdGgsICZtc2cpOworCX0KK30KKworLyoqCisgKiBpdWN2X21lc3NhZ2VfcGVuZGluZworICogQGRhdGE6IFBvaW50ZXIgdG8gZXh0ZXJuYWwgaW50ZXJydXB0IGJ1ZmZlcgorICoKKyAqIFByb2Nlc3MgbWVzc2FnZSBwZW5kaW5nIHdvcmsgaXRlbS4gQ2FsbGVkIGZyb20gdGFza2xldCB3aGlsZSBob2xkaW5nCisgKiBpdWN2X3RhYmxlX2xvY2suCisgKi8KK3N0cnVjdCBpdWN2X21lc3NhZ2VfcGVuZGluZyB7CisJdTE2IGlwcGF0aGlkOworCXU4ICBpcGZsYWdzMTsKKwl1OCAgaXB0eXBlOworCXUzMiBpcG1zZ2lkOworCXUzMiBpcHRyZ2NsczsKKwl1bmlvbiB7CisJCXUzMiBpcHJtbXNnMV91MzI7CisJCXU4ICBpcHJtbXNnMVs0XTsKKwl9IGxuMW1zZzE7CisJdW5pb24geworCQl1MzIgaXBiZmxuMWY7CisJCXU4ICBpcHJtbXNnMls0XTsKKwl9IGxuMW1zZzI7CisJdTMyIHJlczFbM107CisJdTMyIGlwYmZsbjJmOworCXU4ICBpcHBvbGxmZzsKKwl1OCAgcmVzMlszXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgdm9pZCBpdWN2X21lc3NhZ2VfcGVuZGluZyhzdHJ1Y3QgaXVjdl9pcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXVjdl9tZXNzYWdlX3BlbmRpbmcgKmltcCA9ICh2b2lkICopIGRhdGE7CisJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCA9IGl1Y3ZfcGF0aF90YWJsZVtpbXAtPmlwcGF0aGlkXTsKKwlzdHJ1Y3QgaXVjdl9tZXNzYWdlIG1zZzsKKworCUJVR19PTighcGF0aCB8fCAhcGF0aC0+aGFuZGxlcik7CisJaWYgKHBhdGgtPmhhbmRsZXItPm1lc3NhZ2VfcGVuZGluZykgeworCQltc2cuZmxhZ3MgPSBpbXAtPmlwZmxhZ3MxOworCQltc2cuaWQgPSBpbXAtPmlwbXNnaWQ7CisJCW1zZy5jbGFzcyA9IGltcC0+aXB0cmdjbHM7CisJCWlmIChpbXAtPmlwZmxhZ3MxICYgSVVDVl9JUFJNREFUQSkgeworCQkJbWVtY3B5KG1zZy5ybW1zZywgaW1wLT5sbjFtc2cxLmlwcm1tc2cxLCA4KTsKKwkJCW1zZy5sZW5ndGggPSA4OworCQl9IGVsc2UKKwkJCW1zZy5sZW5ndGggPSBpbXAtPmxuMW1zZzIuaXBiZmxuMWY7CisJCW1zZy5yZXBseV9zaXplID0gaW1wLT5pcGJmbG4yZjsKKwkJcGF0aC0+aGFuZGxlci0+bWVzc2FnZV9wZW5kaW5nKHBhdGgsICZtc2cpOworCX0KK30KKworLyoqCisgKiBpdWN2X3Rhc2tsZXRfaGFuZGxlcjoKKyAqCisgKiBUaGlzIHRhc2tsZXQgbG9vcHMgb3ZlciB0aGUgcXVldWUgb2YgaXJxIGJ1ZmZlcnMgY3JlYXRlZCBieQorICogaXVjdl9leHRlcm5hbF9pbnRlcnJ1cHQsIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gaGFuZGxlcgorICogYW5kIHRoZW4gZnJlZXMgdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgaXVjdl90YXNrbGV0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBpZ25vcmVkKQoreworCXR5cGVkZWYgdm9pZCBpdWN2X2lycV9mbihzdHJ1Y3QgaXVjdl9pcnFfZGF0YSAqKTsKKwlzdGF0aWMgaXVjdl9pcnFfZm4gKmlycV9mbltdID0geworCQlbMHgwMV0gPSBpdWN2X3BhdGhfcGVuZGluZywKKwkJWzB4MDJdID0gaXVjdl9wYXRoX2NvbXBsZXRlLAorCQlbMHgwM10gPSBpdWN2X3BhdGhfc2V2ZXJlZCwKKwkJWzB4MDRdID0gaXVjdl9wYXRoX3F1aWVzY2VkLAorCQlbMHgwNV0gPSBpdWN2X3BhdGhfcmVzdW1lZCwKKwkJWzB4MDZdID0gaXVjdl9tZXNzYWdlX2NvbXBsZXRlLAorCQlbMHgwN10gPSBpdWN2X21lc3NhZ2VfY29tcGxldGUsCisJCVsweDA4XSA9IGl1Y3ZfbWVzc2FnZV9wZW5kaW5nLAorCQlbMHgwOV0gPSBpdWN2X21lc3NhZ2VfcGVuZGluZywKKwl9OworCXN0cnVjdCBpdWN2X3dvcmsgKnA7CisKKwkvKiBTZXJpYWxpemUgdGFza2xldCwgaXVjdl9wYXRoX3NldmVyIGFuZCBpdWN2X3BhdGhfY29ubmVjdC4gKi8KKwlzcGluX2xvY2soJml1Y3ZfdGFibGVfbG9jayk7CisJaXVjdl90YXNrbGV0X2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXNwaW5fbG9ja19pcnEoJml1Y3Zfd29ya19sb2NrKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJml1Y3Zfd29ya19xdWV1ZSkpIHsKKwkJcCA9IGxpc3RfZW50cnkoaXVjdl93b3JrX3F1ZXVlLm5leHQsIHN0cnVjdCBpdWN2X3dvcmssIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KCZwLT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZpdWN2X3dvcmtfbG9jayk7CisJCWlycV9mbltwLT5kYXRhLmlwdHlwZV0oJnAtPmRhdGEpOworCQlrZnJlZShwKTsKKwkJc3Bpbl9sb2NrX2lycSgmaXVjdl93b3JrX2xvY2spOworCX0KKwlzcGluX3VubG9ja19pcnEoJml1Y3Zfd29ya19sb2NrKTsKKworCWl1Y3ZfdGFza2xldF9jcHUgPSAtMTsKKwlzcGluX3VubG9jaygmaXVjdl90YWJsZV9sb2NrKTsKK30KKworLyoqCisgKiBpdWN2X2V4dGVybmFsX2ludGVycnVwdAorICogQGNvZGU6IGlycSBjb2RlCisgKgorICogSGFuZGxlcyBleHRlcm5hbCBpbnRlcnJ1cHRzIGNvbWluZyBpbiBmcm9tIENQLgorICogUGxhY2VzIHRoZSBpbnRlcnJ1cHQgYnVmZmVyIG9uIGEgcXVldWUgYW5kIHNjaGVkdWxlcyBpdWN2X3Rhc2tsZXRfaGFuZGxlcigpLgorICovCitzdGF0aWMgdm9pZCBpdWN2X2V4dGVybmFsX2ludGVycnVwdCh1MTYgY29kZSkKK3sKKwlzdHJ1Y3QgaXVjdl9pcnFfZGF0YSAqcDsKKwlzdHJ1Y3QgaXVjdl93b3JrICp3b3JrOworCisJcCA9IHBlcmNwdV9wdHIoaXVjdl9pcnFfZGF0YSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlpZiAocC0+aXBwYXRoaWQgPj0gaXVjdl9tYXhfcGF0aGlkKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIml1Y3ZfZG9faW50OiBHb3QgaW50ZXJydXB0IHdpdGggIgorCQkgICAgICAgInBhdGhpZCAlZCA+IG1heF9jb25uZWN0aW9ucyAoJWxkKVxuIiwKKwkJICAgICAgIHAtPmlwcGF0aGlkLCBpdWN2X21heF9wYXRoaWQgLSAxKTsKKwkJaXVjdl9zZXZlcl9wYXRoaWQocC0+aXBwYXRoaWQsIGl1Y3ZfZXJyb3Jfbm9fbGlzdGVuZXIpOworCQlyZXR1cm47CisJfQorCWlmIChwLT5pcHR5cGUgIDwgMHgwMSB8fCBwLT5pcHR5cGUgPiAweDA5KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXVjdl9kb19pbnQ6IHVua25vd24gaXVjdiBpbnRlcnJ1cHRcbiIpOworCQlyZXR1cm47CisJfQorCXdvcmsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXVjdl93b3JrKSwgR0ZQX0FUT01JQyk7CisJaWYgKCF3b3JrKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIml1Y3ZfZXh0ZXJuYWxfaW50ZXJydXB0OiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKwltZW1jcHkoJndvcmstPmRhdGEsIHAsIHNpemVvZih3b3JrLT5kYXRhKSk7CisJc3Bpbl9sb2NrKCZpdWN2X3dvcmtfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmd29yay0+bGlzdCwgJml1Y3Zfd29ya19xdWV1ZSk7CisJc3Bpbl91bmxvY2soJml1Y3Zfd29ya19sb2NrKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZpdWN2X3Rhc2tsZXQpOworfQorCisvKioKKyAqIGl1Y3ZfaW5pdAorICoKKyAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdmFyaW91cyBkYXRhIHN0cnVjdHVyZXMuCisgKi8KK3N0YXRpYyBpbnQgaXVjdl9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJaWYgKCFNQUNISU5FX0lTX1ZNKSB7CisJCXJjID0gLUVQUk9UT05PU1VQUE9SVDsKKwkJZ290byBvdXQ7CisJfQorCXJjID0gaXVjdl9xdWVyeV9tYXhjb25uKCk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwlyYyA9IHJlZ2lzdGVyX2V4dGVybmFsX2ludGVycnVwdCAoMHg0MDAwLCBpdWN2X2V4dGVybmFsX2ludGVycnVwdCk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwlyYyA9IGJ1c19yZWdpc3RlcigmaXVjdl9idXMpOworCWlmIChyYykKKwkJZ290byBvdXRfaW50OworCWl1Y3Zfcm9vdCA9IHMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIoIml1Y3YiKTsKKwlpZiAoSVNfRVJSKGl1Y3Zfcm9vdCkpIHsKKwkJcmMgPSBQVFJfRVJSKGl1Y3Zfcm9vdCk7CisJCWdvdG8gb3V0X2J1czsKKwl9CisJLyogTm90ZTogR0ZQX0RNQSB1c2VkIHVzZWQgdG8gZ2V0IG1lbW9yeSBiZWxvdyAyRyAqLworCWl1Y3ZfaXJxX2RhdGEgPSBwZXJjcHVfYWxsb2Moc2l6ZW9mKHN0cnVjdCBpdWN2X2lycV9kYXRhKSwKKwkJCQkgICAgIEdGUF9LRVJORUx8R0ZQX0RNQSk7CisJaWYgKCFpdWN2X2lycV9kYXRhKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfcm9vdDsKKwl9CisJLyogQWxsb2NhdGUgcGFyYW1ldGVyIGJsb2Nrcy4gKi8KKwlpdWN2X3BhcmFtID0gcGVyY3B1X2FsbG9jKHNpemVvZih1bmlvbiBpdWN2X3BhcmFtKSwKKwkJCQkgIEdGUF9LRVJORUx8R0ZQX0RNQSk7CisJaWYgKCFpdWN2X3BhcmFtKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfZXh0aW50OworCX0KKwlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJml1Y3ZfY3B1X25vdGlmaWVyKTsKKwlBU0NFQkMoaXVjdl9lcnJvcl9ub19saXN0ZW5lciwgMTYpOworCUFTQ0VCQyhpdWN2X2Vycm9yX25vX21lbW9yeSwgMTYpOworCUFTQ0VCQyhpdWN2X2Vycm9yX3BhdGhpZCwgMTYpOworCWl1Y3ZfYXZhaWxhYmxlID0gMTsKKwlyZXR1cm4gMDsKKworb3V0X2V4dGludDoKKwlwZXJjcHVfZnJlZShpdWN2X2lycV9kYXRhKTsKK291dF9yb290OgorCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihpdWN2X3Jvb3QpOworb3V0X2J1czoKKwlidXNfdW5yZWdpc3RlcigmaXVjdl9idXMpOworb3V0X2ludDoKKwl1bnJlZ2lzdGVyX2V4dGVybmFsX2ludGVycnVwdCgweDQwMDAsIGl1Y3ZfZXh0ZXJuYWxfaW50ZXJydXB0KTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXVjdl9leGl0CisgKgorICogRnJlZXMgZXZlcnl0aGluZyBhbGxvY2F0ZWQgZnJvbSBpdWN2X2luaXQuCisgKi8KK3N0YXRpYyB2b2lkIGl1Y3ZfZXhpdCh2b2lkKQoreworCXN0cnVjdCBpdWN2X3dvcmsgKnAsICpuOworCisJc3Bpbl9sb2NrX2lycSgmaXVjdl93b3JrX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmaXVjdl93b3JrX3F1ZXVlLCBsaXN0KQorCQlrZnJlZShwKTsKKwlzcGluX3VubG9ja19pcnEoJml1Y3Zfd29ya19sb2NrKTsKKwl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmaXVjdl9jcHVfbm90aWZpZXIpOworCXBlcmNwdV9mcmVlKGl1Y3ZfcGFyYW0pOworCXBlcmNwdV9mcmVlKGl1Y3ZfaXJxX2RhdGEpOworCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihpdWN2X3Jvb3QpOworCWJ1c191bnJlZ2lzdGVyKCZpdWN2X2J1cyk7CisJdW5yZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQoMHg0MDAwLCBpdWN2X2V4dGVybmFsX2ludGVycnVwdCk7Cit9CisKK3N1YnN5c19pbml0Y2FsbChpdWN2X2luaXQpOworbW9kdWxlX2V4aXQoaXVjdl9leGl0KTsKKworLyoqCisgKiBFeHBvcnQgYWxsIHB1YmxpYyBzdHVmZgorICovCitFWFBPUlRfU1lNQk9MIChpdWN2X2J1cyk7CitFWFBPUlRfU1lNQk9MIChpdWN2X3Jvb3QpOworRVhQT1JUX1NZTUJPTCAoaXVjdl9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MIChpdWN2X3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTCAoaXVjdl9wYXRoX2FjY2VwdCk7CitFWFBPUlRfU1lNQk9MIChpdWN2X3BhdGhfY29ubmVjdCk7CitFWFBPUlRfU1lNQk9MIChpdWN2X3BhdGhfcXVpZXNjZSk7CitFWFBPUlRfU1lNQk9MIChpdWN2X3BhdGhfc2V2ZXIpOworRVhQT1JUX1NZTUJPTCAoaXVjdl9tZXNzYWdlX3B1cmdlKTsKK0VYUE9SVF9TWU1CT0wgKGl1Y3ZfbWVzc2FnZV9yZWNlaXZlKTsKK0VYUE9SVF9TWU1CT0wgKGl1Y3ZfbWVzc2FnZV9yZWplY3QpOworRVhQT1JUX1NZTUJPTCAoaXVjdl9tZXNzYWdlX3JlcGx5KTsKK0VYUE9SVF9TWU1CT0wgKGl1Y3ZfbWVzc2FnZV9zZW5kKTsKK0VYUE9SVF9TWU1CT0wgKGl1Y3ZfbWVzc2FnZV9zZW5kMndheSk7CisKK01PRFVMRV9BVVRIT1IoIihDKSAyMDAxIElCTSBDb3JwLiBieSBGcml0eiBFbGZlcnQgKGZlbGZlcnRAbWlsbGVudXguY29tKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW51eCBmb3IgUy8zOTAgSVVDViBsb3dsZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9rZXkvYWZfa2V5LmMgYi9uZXQva2V5L2FmX2tleS5jCmluZGV4IDVkZDUwOTQuLmI0ZTQ0NDAgMTAwNjQ0Ci0tLSBhL25ldC9rZXkvYWZfa2V5LmMKKysrIGIvbmV0L2tleS9hZl9rZXkuYwpAQCAtMjM0NSw2ICsyMzQ1LDE5NiBAQAogCXJldHVybiBlcnI7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUX0tFWV9NSUdSQVRFCitzdGF0aWMgaW50IHBma2V5X3NvY2thZGRyX3BhaXJfc2l6ZShzYV9mYW1pbHlfdCBmYW1pbHkpCit7CisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiBQRktFWV9BTElHTjgoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgKiAyKTsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwljYXNlIEFGX0lORVQ2OgorCQlyZXR1cm4gUEZLRVlfQUxJR044KHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSAqIDIpOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIGludCBwYXJzZV9zb2NrYWRkcl9wYWlyKHN0cnVjdCBzYWRiX3hfaXBzZWNyZXF1ZXN0ICpycSwKKwkJCSAgICAgICB4ZnJtX2FkZHJlc3NfdCAqc2FkZHIsIHhmcm1fYWRkcmVzc190ICpkYWRkciwKKwkJCSAgICAgICB1MTYgKmZhbWlseSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKShycSArIDEpOworCWlmIChycS0+c2FkYl94X2lwc2VjcmVxdWVzdF9sZW4gPAorCSAgICBwZmtleV9zb2NrYWRkcl9wYWlyX3NpemUoc2EtPnNhX2ZhbWlseSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChzYS0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQl7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKwkJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYTsKKwkJCWlmICgoc2luKzEpLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQltZW1jcHkoJnNhZGRyLT5hNCwgJnNpbi0+c2luX2FkZHIsIHNpemVvZihzYWRkci0+YTQpKTsKKwkJCXNpbisrOworCQkJbWVtY3B5KCZkYWRkci0+YTQsICZzaW4tPnNpbl9hZGRyLCBzaXplb2YoZGFkZHItPmE0KSk7CisJCQkqZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWJyZWFrOworCQl9CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJY2FzZSBBRl9JTkVUNjoKKwkJeworCQkJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKKwkJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhOworCQkJaWYgKChzaW42KzEpLT5zaW42X2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW1lbWNweSgmc2FkZHItPmE2LCAmc2luNi0+c2luNl9hZGRyLAorCQkJICAgICAgIHNpemVvZihzYWRkci0+YTYpKTsKKwkJCXNpbjYrKzsKKwkJCW1lbWNweSgmZGFkZHItPmE2LCAmc2luNi0+c2luNl9hZGRyLAorCQkJICAgICAgIHNpemVvZihkYWRkci0+YTYpKTsKKwkJCSpmYW1pbHkgPSBBRl9JTkVUNjsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHNlY3JlcXVlc3RzX3RvX21pZ3JhdGUoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QgKnJxMSwgaW50IGxlbiwKKwkJCQkgICAgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzYWRiX3hfaXBzZWNyZXF1ZXN0ICpycTI7CisKKwlpZiAobGVuIDw9IHNpemVvZihzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCkgfHwKKwkgICAgbGVuIDwgcnExLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBvbGQgZW5kb2ludHMgKi8KKwllcnIgPSBwYXJzZV9zb2NrYWRkcl9wYWlyKHJxMSwgJm0tPm9sZF9zYWRkciwgJm0tPm9sZF9kYWRkciwKKwkJCQkgICZtLT5vbGRfZmFtaWx5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcnEyID0gKHN0cnVjdCBzYWRiX3hfaXBzZWNyZXF1ZXN0ICopKCh1OCAqKXJxMSArIHJxMS0+c2FkYl94X2lwc2VjcmVxdWVzdF9sZW4pOworCWxlbiAtPSBycTEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbGVuOworCisJaWYgKGxlbiA8PSBzaXplb2Yoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QpIHx8CisJICAgIGxlbiA8IHJxMi0+c2FkYl94X2lwc2VjcmVxdWVzdF9sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJLyogbmV3IGVuZHBvaW50cyAqLworCWVyciA9IHBhcnNlX3NvY2thZGRyX3BhaXIocnEyLCAmbS0+bmV3X3NhZGRyLCAmbS0+bmV3X2RhZGRyLAorCQkJCSAgJm0tPm5ld19mYW1pbHkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAocnExLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X3Byb3RvICE9IHJxMi0+c2FkYl94X2lwc2VjcmVxdWVzdF9wcm90byB8fAorCSAgICBycTEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbW9kZSAhPSBycTItPnNhZGJfeF9pcHNlY3JlcXVlc3RfbW9kZSB8fAorCSAgICBycTEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfcmVxaWQgIT0gcnEyLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X3JlcWlkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW0tPnByb3RvID0gcnExLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X3Byb3RvOworCW0tPm1vZGUgPSBycTEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbW9kZSAtIDE7CisJbS0+cmVxaWQgPSBycTEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfcmVxaWQ7CisKKwlyZXR1cm4gKChpbnQpKHJxMS0+c2FkYl94X2lwc2VjcmVxdWVzdF9sZW4gKworCQkgICAgICBycTItPnNhZGJfeF9pcHNlY3JlcXVlc3RfbGVuKSk7Cit9CisKK3N0YXRpYyBpbnQgcGZrZXlfbWlncmF0ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IHNhZGJfbXNnICpoZHIsIHZvaWQgKipleHRfaGRycykKK3sKKwlpbnQgaSwgbGVuLCByZXQsIGVyciA9IC1FSU5WQUw7CisJdTggZGlyOworCXN0cnVjdCBzYWRiX2FkZHJlc3MgKnNhOworCXN0cnVjdCBzYWRiX3hfcG9saWN5ICpwb2w7CisJc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QgKnJxOworCXN0cnVjdCB4ZnJtX3NlbGVjdG9yIHNlbDsKKwlzdHJ1Y3QgeGZybV9taWdyYXRlIG1bWEZSTV9NQVhfREVQVEhdOworCisJaWYgKCFwcmVzZW50X2FuZF9zYW1lX2ZhbWlseShleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX1NSQyAtIDFdLAorCSAgICBleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX0RTVCAtIDFdKSB8fAorCSAgICAhZXh0X2hkcnNbU0FEQl9YX0VYVF9QT0xJQ1kgLSAxXSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlwb2wgPSBleHRfaGRyc1tTQURCX1hfRVhUX1BPTElDWSAtIDFdOworCWlmICghcG9sKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwb2wtPnNhZGJfeF9wb2xpY3lfZGlyID49IElQU0VDX0RJUl9NQVgpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZGlyID0gcG9sLT5zYWRiX3hfcG9saWN5X2RpciAtIDE7CisJbWVtc2V0KCZzZWwsIDAsIHNpemVvZihzZWwpKTsKKworCS8qIHNldCBzb3VyY2UgYWRkcmVzcyBpbmZvIG9mIHNlbGVjdG9yICovCisJc2EgPSBleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX1NSQyAtIDFdOworCXNlbC5mYW1pbHkgPSBwZmtleV9zYWRiX2FkZHIyeGZybV9hZGRyKHNhLCAmc2VsLnNhZGRyKTsKKwlzZWwucHJlZml4bGVuX3MgPSBzYS0+c2FkYl9hZGRyZXNzX3ByZWZpeGxlbjsKKwlzZWwucHJvdG8gPSBwZmtleV9wcm90b190b194ZnJtKHNhLT5zYWRiX2FkZHJlc3NfcHJvdG8pOworCXNlbC5zcG9ydCA9ICgoc3RydWN0IHNvY2thZGRyX2luICopKHNhICsgMSkpLT5zaW5fcG9ydDsKKwlpZiAoc2VsLnNwb3J0KQorCQlzZWwuc3BvcnRfbWFzayA9IH4wOworCisJLyogc2V0IGRlc3RpbmF0aW9uIGFkZHJlc3MgaW5mbyBvZiBzZWxlY3RvciAqLworCXNhID0gZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19EU1QgLSAxXSwKKwlwZmtleV9zYWRiX2FkZHIyeGZybV9hZGRyKHNhLCAmc2VsLmRhZGRyKTsKKwlzZWwucHJlZml4bGVuX2QgPSBzYS0+c2FkYl9hZGRyZXNzX3ByZWZpeGxlbjsKKwlzZWwucHJvdG8gPSBwZmtleV9wcm90b190b194ZnJtKHNhLT5zYWRiX2FkZHJlc3NfcHJvdG8pOworCXNlbC5kcG9ydCA9ICgoc3RydWN0IHNvY2thZGRyX2luICopKHNhICsgMSkpLT5zaW5fcG9ydDsKKwlpZiAoc2VsLmRwb3J0KQorCQlzZWwuZHBvcnRfbWFzayA9IH4wOworCisJcnEgPSAoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QgKikocG9sICsgMSk7CisKKwkvKiBleHRyYWN0IGlwc2VjcmVxdWVzdHMgKi8KKwlpID0gMDsKKwlsZW4gPSBwb2wtPnNhZGJfeF9wb2xpY3lfbGVuICogOCAtIHNpemVvZihzdHJ1Y3Qgc2FkYl94X3BvbGljeSk7CisKKwl3aGlsZSAobGVuID4gMCAmJiBpIDwgWEZSTV9NQVhfREVQVEgpIHsKKwkJcmV0ID0gaXBzZWNyZXF1ZXN0c190b19taWdyYXRlKHJxLCBsZW4sICZtW2ldKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVyciA9IHJldDsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJcnEgPSAoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QgKikoKHU4ICopcnEgKyByZXQpOworCQkJbGVuIC09IHJldDsKKwkJCWkrKzsKKwkJfQorCX0KKworCWlmICghaSB8fCBsZW4gPiAwKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldHVybiB4ZnJtX21pZ3JhdGUoJnNlbCwgZGlyLCBYRlJNX1BPTElDWV9UWVBFX01BSU4sIG0sIGkpOworCisgb3V0OgorCXJldHVybiBlcnI7Cit9CisjZWxzZQorc3RhdGljIGludCBwZmtleV9taWdyYXRlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSBzdHJ1Y3Qgc2FkYl9tc2cgKmhkciwgdm9pZCAqKmV4dF9oZHJzKQoreworCXJldHVybiAtRU5PUFJPVE9PUFQ7Cit9CisjZW5kaWYKKworCiBzdGF0aWMgaW50IHBma2V5X3NwZGdldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzYWRiX21zZyAqaGRyLCB2b2lkICoqZXh0X2hkcnMpCiB7CiAJdW5zaWduZWQgaW50IGRpcjsKQEAgLTI0NzMsNiArMjY2Myw3IEBACiAJW1NBREJfWF9TUERGTFVTSF0JPSBwZmtleV9zcGRmbHVzaCwKIAlbU0FEQl9YX1NQRFNFVElEWF0JPSBwZmtleV9zcGRhZGQsCiAJW1NBREJfWF9TUERERUxFVEUyXQk9IHBma2V5X3NwZGdldCwKKwlbU0FEQl9YX01JR1JBVEVdCT0gcGZrZXlfbWlncmF0ZSwKIH07CiAKIHN0YXRpYyBpbnQgcGZrZXlfcHJvY2VzcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzYWRiX21zZyAqaGRyKQpAQCAtMzExOCw2ICszMzA5LDIzNiBAQAogCXJldHVybiBwZmtleV9icm9hZGNhc3Qoc2tiLCBHRlBfQVRPTUlDLCBCUk9BRENBU1RfUkVHSVNURVJFRCwgTlVMTCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUX0tFWV9NSUdSQVRFCitzdGF0aWMgaW50IHNldF9zYWRiX2FkZHJlc3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHNhc2l6ZSwgaW50IHR5cGUsCisJCQkgICAgc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCkKK3sKKwlzdHJ1Y3Qgc2FkYl9hZGRyZXNzICphZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CisjZW5kaWYKKwlhZGRyID0gKHN0cnVjdCBzYWRiX2FkZHJlc3MgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBzYWRiX2FkZHJlc3MpICsgc2FzaXplKTsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfbGVuID0gKHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKSArIHNhc2l6ZSkvODsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfZXh0dHlwZSA9IHR5cGU7CisJYWRkci0+c2FkYl9hZGRyZXNzX3Byb3RvID0gc2VsLT5wcm90bzsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfcmVzZXJ2ZWQgPSAwOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTQURCX0VYVF9BRERSRVNTX1NSQzoKKwkJaWYgKHNlbC0+ZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJCWFkZHItPnNhZGJfYWRkcmVzc19wcmVmaXhsZW4gPSBzZWwtPnByZWZpeGxlbl9zOworCQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShhZGRyICsgMSk7CisJCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJbWVtY3B5KCZzaW4tPnNpbl9hZGRyLnNfYWRkciwgJnNlbC0+c2FkZHIsCisJCQkgICAgICAgc2l6ZW9mKHNpbi0+c2luX2FkZHIuc19hZGRyKSk7CisJCQlzaW4tPnNpbl9wb3J0ID0gMDsKKwkJCW1lbXNldChzaW4tPnNpbl96ZXJvLCAwLCBzaXplb2Yoc2luLT5zaW5femVybykpOworCQl9CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJCWVsc2UgaWYgKHNlbC0+ZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCQlhZGRyLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID0gc2VsLT5wcmVmaXhsZW5fczsKKwkJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKShhZGRyICsgMSk7CisJCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJc2luNi0+c2luNl9wb3J0ID0gMDsKKwkJCXNpbjYtPnNpbjZfZmxvd2luZm8gPSAwOworCQkJc2luNi0+c2luNl9zY29wZV9pZCA9IDA7CisJCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkci5zNl9hZGRyLCAmc2VsLT5zYWRkciwKKwkJCSAgICAgICBzaXplb2Yoc2luNi0+c2luNl9hZGRyLnM2X2FkZHIpKTsKKwkJfQorI2VuZGlmCisJCWJyZWFrOworCWNhc2UgU0FEQl9FWFRfQUREUkVTU19EU1Q6CisJCWlmIChzZWwtPmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCQlhZGRyLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID0gc2VsLT5wcmVmaXhsZW5fZDsKKwkJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoYWRkciArIDEpOworCQkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCW1lbWNweSgmc2luLT5zaW5fYWRkci5zX2FkZHIsICZzZWwtPmRhZGRyLAorCQkJICAgICAgIHNpemVvZihzaW4tPnNpbl9hZGRyLnNfYWRkcikpOworCQkJc2luLT5zaW5fcG9ydCA9IDA7CisJCQltZW1zZXQoc2luLT5zaW5femVybywgMCwgc2l6ZW9mKHNpbi0+c2luX3plcm8pKTsKKwkJfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCQllbHNlIGlmIChzZWwtPmZhbWlseSA9PSBBRl9JTkVUNikgeworCQkJYWRkci0+c2FkYl9hZGRyZXNzX3ByZWZpeGxlbiA9IHNlbC0+cHJlZml4bGVuX2Q7CisJCQlzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikoYWRkciArIDEpOworCQkJc2luNi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJCXNpbjYtPnNpbjZfcG9ydCA9IDA7CisJCQlzaW42LT5zaW42X2Zsb3dpbmZvID0gMDsKKwkJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOworCQkJbWVtY3B5KCZzaW42LT5zaW42X2FkZHIuczZfYWRkciwgJnNlbC0+ZGFkZHIsCisJCQkgICAgICAgc2l6ZW9mKHNpbjYtPnNpbjZfYWRkci5zNl9hZGRyKSk7CisJCX0KKyNlbmRpZgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfaXBzZWNyZXF1ZXN0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgdWludDhfdCBwcm90bywgdWludDhfdCBtb2RlLCBpbnQgbGV2ZWwsCisJCQkgICAgdWludDMyX3QgcmVxaWQsIHVpbnQ4X3QgZmFtaWx5LAorCQkJICAgIHhmcm1fYWRkcmVzc190ICpzcmMsIHhmcm1fYWRkcmVzc190ICpkc3QpCit7CisJc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QgKnJxOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CisjZW5kaWYKKwlpbnQgc2l6ZV9yZXE7CisKKwlzaXplX3JlcSA9IHNpemVvZihzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCkgKworCQkgICBwZmtleV9zb2NrYWRkcl9wYWlyX3NpemUoZmFtaWx5KTsKKworCXJxID0gKHN0cnVjdCBzYWRiX3hfaXBzZWNyZXF1ZXN0ICopc2tiX3B1dChza2IsIHNpemVfcmVxKTsKKwltZW1zZXQocnEsIDAsIHNpemVfcmVxKTsKKwlycS0+c2FkYl94X2lwc2VjcmVxdWVzdF9sZW4gPSBzaXplX3JlcTsKKwlycS0+c2FkYl94X2lwc2VjcmVxdWVzdF9wcm90byA9IHByb3RvOworCXJxLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X21vZGUgPSBtb2RlOworCXJxLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X2xldmVsID0gbGV2ZWw7CisJcnEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfcmVxaWQgPSByZXFpZDsKKworCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopKHJxICsgMSk7CisJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCW1lbWNweSgmc2luLT5zaW5fYWRkci5zX2FkZHIsIHNyYywKKwkJICAgICAgIHNpemVvZihzaW4tPnNpbl9hZGRyLnNfYWRkcikpOworCQlzaW4rKzsKKwkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJbWVtY3B5KCZzaW4tPnNpbl9hZGRyLnNfYWRkciwgZHN0LAorCQkgICAgICAgc2l6ZW9mKHNpbi0+c2luX2FkZHIuc19hZGRyKSk7CisJCWJyZWFrOworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCWNhc2UgQUZfSU5FVDY6CisJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKShycSArIDEpOworCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQlzaW42LT5zaW42X3BvcnQgPSAwOworCQlzaW42LT5zaW42X2Zsb3dpbmZvID0gMDsKKwkJc2luNi0+c2luNl9zY29wZV9pZCA9IDA7CisJCW1lbWNweSgmc2luNi0+c2luNl9hZGRyLnM2X2FkZHIsIHNyYywKKwkJICAgICAgIHNpemVvZihzaW42LT5zaW42X2FkZHIuczZfYWRkcikpOworCQlzaW42Kys7CisJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCXNpbjYtPnNpbjZfcG9ydCA9IDA7CisJCXNpbjYtPnNpbjZfZmxvd2luZm8gPSAwOworCQlzaW42LT5zaW42X3Njb3BlX2lkID0gMDsKKwkJbWVtY3B5KCZzaW42LT5zaW42X2FkZHIuczZfYWRkciwgZHN0LAorCQkgICAgICAgc2l6ZW9mKHNpbjYtPnNpbjZfYWRkci5zNl9hZGRyKSk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ORVRfS0VZX01JR1JBVEUKK3N0YXRpYyBpbnQgcGZrZXlfc2VuZF9taWdyYXRlKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHU4IGRpciwgdTggdHlwZSwKKwkJCSAgICAgIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fYnVuZGxlcykKK3sKKwlpbnQgaTsKKwlpbnQgc2FzaXplX3NlbDsKKwlpbnQgc2l6ZSA9IDA7CisJaW50IHNpemVfcG9sID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzYWRiX21zZyAqaGRyOworCXN0cnVjdCBzYWRiX3hfcG9saWN5ICpwb2w7CisJc3RydWN0IHhmcm1fbWlncmF0ZSAqbXA7CisKKwlpZiAodHlwZSAhPSBYRlJNX1BPTElDWV9UWVBFX01BSU4pCisJCXJldHVybiAwOworCisJaWYgKG51bV9idW5kbGVzIDw9IDAgfHwgbnVtX2J1bmRsZXMgPiBYRlJNX01BWF9ERVBUSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzZWxlY3RvciAqLworCXNhc2l6ZV9zZWwgPSBwZmtleV9zb2NrYWRkcl9zaXplKHNlbC0+ZmFtaWx5KTsKKwlpZiAoIXNhc2l6ZV9zZWwpCisJCXJldHVybiAtRUlOVkFMOworCXNpemUgKz0gKHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKSArIHNhc2l6ZV9zZWwpICogMjsKKworCS8qIHBvbGljeSBpbmZvICovCisJc2l6ZV9wb2wgKz0gc2l6ZW9mKHN0cnVjdCBzYWRiX3hfcG9saWN5KTsKKworCS8qIGlwc2VjcmVxdWVzdHMgKi8KKwlmb3IgKGkgPSAwLCBtcCA9IG07IGkgPCBudW1fYnVuZGxlczsgaSsrLCBtcCsrKSB7CisJCS8qIG9sZCBsb2NhdG9yIHBhaXIgKi8KKwkJc2l6ZV9wb2wgKz0gc2l6ZW9mKHN0cnVjdCBzYWRiX3hfaXBzZWNyZXF1ZXN0KSArCisJCQkgICAgcGZrZXlfc29ja2FkZHJfcGFpcl9zaXplKG1wLT5vbGRfZmFtaWx5KTsKKwkJLyogbmV3IGxvY2F0b3IgcGFpciAqLworCQlzaXplX3BvbCArPSBzaXplb2Yoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QpICsKKwkJCSAgICBwZmtleV9zb2NrYWRkcl9wYWlyX3NpemUobXAtPm5ld19mYW1pbHkpOworCX0KKworCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBzYWRiX21zZykgKyBzaXplX3BvbDsKKworCS8qIGFsbG9jIGJ1ZmZlciAqLworCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaGRyID0gKHN0cnVjdCBzYWRiX21zZyAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHNhZGJfbXNnKSk7CisJaGRyLT5zYWRiX21zZ192ZXJzaW9uID0gUEZfS0VZX1YyOworCWhkci0+c2FkYl9tc2dfdHlwZSA9IFNBREJfWF9NSUdSQVRFOworCWhkci0+c2FkYl9tc2dfc2F0eXBlID0gcGZrZXlfcHJvdG8yc2F0eXBlKG0tPnByb3RvKTsKKwloZHItPnNhZGJfbXNnX2xlbiA9IHNpemUgLyA4OworCWhkci0+c2FkYl9tc2dfZXJybm8gPSAwOworCWhkci0+c2FkYl9tc2dfcmVzZXJ2ZWQgPSAwOworCWhkci0+c2FkYl9tc2dfc2VxID0gMDsKKwloZHItPnNhZGJfbXNnX3BpZCA9IDA7CisKKwkvKiBzZWxlY3RvciBzcmMgKi8KKwlzZXRfc2FkYl9hZGRyZXNzKHNrYiwgc2FzaXplX3NlbCwgU0FEQl9FWFRfQUREUkVTU19TUkMsIHNlbCk7CisKKwkvKiBzZWxlY3RvciBkc3QgKi8KKwlzZXRfc2FkYl9hZGRyZXNzKHNrYiwgc2FzaXplX3NlbCwgU0FEQl9FWFRfQUREUkVTU19EU1QsIHNlbCk7CisKKwkvKiBwb2xpY3kgaW5mb3JtYXRpb24gKi8KKwlwb2wgPSAoc3RydWN0IHNhZGJfeF9wb2xpY3kgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBzYWRiX3hfcG9saWN5KSk7CisJcG9sLT5zYWRiX3hfcG9saWN5X2xlbiA9IHNpemVfcG9sIC8gODsKKwlwb2wtPnNhZGJfeF9wb2xpY3lfZXh0dHlwZSA9IFNBREJfWF9FWFRfUE9MSUNZOworCXBvbC0+c2FkYl94X3BvbGljeV90eXBlID0gSVBTRUNfUE9MSUNZX0lQU0VDOworCXBvbC0+c2FkYl94X3BvbGljeV9kaXIgPSBkaXIgKyAxOworCXBvbC0+c2FkYl94X3BvbGljeV9pZCA9IDA7CisJcG9sLT5zYWRiX3hfcG9saWN5X3ByaW9yaXR5ID0gMDsKKworCWZvciAoaSA9IDAsIG1wID0gbTsgaSA8IG51bV9idW5kbGVzOyBpKyssIG1wKyspIHsKKwkJLyogb2xkIGlwc2VjcmVxdWVzdCAqLworCQlpZiAoc2V0X2lwc2VjcmVxdWVzdChza2IsIG1wLT5wcm90bywgbXAtPm1vZGUgKyAxLAorCQkJCSAgICAgKG1wLT5yZXFpZCA/ICBJUFNFQ19MRVZFTF9VTklRVUUgOiBJUFNFQ19MRVZFTF9SRVFVSVJFKSwKKwkJCQkgICAgIG1wLT5yZXFpZCwgbXAtPm9sZF9mYW1pbHksCisJCQkJICAgICAmbXAtPm9sZF9zYWRkciwgJm1wLT5vbGRfZGFkZHIpIDwgMCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBuZXcgaXBzZWNyZXF1ZXN0ICovCisJCWlmIChzZXRfaXBzZWNyZXF1ZXN0KHNrYiwgbXAtPnByb3RvLCBtcC0+bW9kZSArIDEsCisJCQkJICAgICAobXAtPnJlcWlkID8gSVBTRUNfTEVWRUxfVU5JUVVFIDogSVBTRUNfTEVWRUxfUkVRVUlSRSksCisJCQkJICAgICBtcC0+cmVxaWQsIG1wLT5uZXdfZmFtaWx5LAorCQkJCSAgICAgJm1wLT5uZXdfc2FkZHIsICZtcC0+bmV3X2RhZGRyKSA8IDApIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogYnJvYWRjYXN0IG1pZ3JhdGUgbWVzc2FnZSB0byBzb2NrZXRzICovCisJcGZrZXlfYnJvYWRjYXN0KHNrYiwgR0ZQX0FUT01JQywgQlJPQURDQVNUX0FMTCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IHBma2V5X3NlbmRfbWlncmF0ZShzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCB1OCBkaXIsIHU4IHR5cGUsCisJCQkgICAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX2J1bmRsZXMpCit7CisJcmV0dXJuIC1FTk9QUk9UT09QVDsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IHBma2V5X3NlbmRtc2coc3RydWN0IGtpb2NiICpraW9jYiwKIAkJCSBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCiB7CkBAIC0zMjg3LDYgKzM3MDgsNyBAQAogCS5jb21waWxlX3BvbGljeQk9IHBma2V5X2NvbXBpbGVfcG9saWN5LAogCS5uZXdfbWFwcGluZwk9IHBma2V5X3NlbmRfbmV3X21hcHBpbmcsCiAJLm5vdGlmeV9wb2xpY3kJPSBwZmtleV9zZW5kX3BvbGljeV9ub3RpZnksCisJLm1pZ3JhdGUJPSBwZmtleV9zZW5kX21pZ3JhdGUsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXBzZWNfcGZrZXlfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDgwMTA3ZDQuLjc0OGY3ZjAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTIzNSw2ICsyMzUsMTkgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBORl9DT05OVFJBQ0tfU0FORQorCXRyaXN0YXRlICJTQU5FIHByb3RvY29sIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkZfQ09OTlRSQUNLCisJaGVscAorCSAgU0FORSBpcyBhIHByb3RvY29sIGZvciByZW1vdGUgYWNjZXNzIHRvIHNjYW5uZXJzIGFzIGltcGxlbWVudGVkCisJICBieSB0aGUgJ3NhbmVkJyBkYWVtb24uIExpa2UgRlRQLCBpdCB1c2VzIHNlcGFyYXRlIGNvbnRyb2wgYW5kCisJICBkYXRhIGNvbm5lY3Rpb25zLgorCisJICBXaXRoIHRoaXMgbW9kdWxlIHlvdSBjYW4gc3VwcG9ydCBTQU5FIG9uIGEgY29ubmVjdGlvbiB0cmFja2luZworCSAgZmlyZXdhbGwuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgTkZfQ09OTlRSQUNLX1NJUAogCXRyaXN0YXRlICJTSVAgcHJvdG9jb2wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBORl9DT05OVFJBQ0sKQEAgLTM4Miw2ICszOTUsMzIgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUworCXRyaXN0YXRlICciVENQTVNTIiB0YXJnZXQgc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTICYmIChJUFY2IHx8IElQVjY9bikKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYFRDUE1TUycgdGFyZ2V0LCB3aGljaCBhbGxvd3MgeW91IHRvIGFsdGVyIHRoZQorCSAgTVNTIHZhbHVlIG9mIFRDUCBTWU4gcGFja2V0cywgdG8gY29udHJvbCB0aGUgbWF4aW11bSBzaXplIGZvciB0aGF0CisJICBjb25uZWN0aW9uICh1c3VhbGx5IGxpbWl0aW5nIGl0IHRvIHlvdXIgb3V0Z29pbmcgaW50ZXJmYWNlJ3MgTVRVCisJICBtaW51cyA0MCkuCisKKwkgIFRoaXMgaXMgdXNlZCB0byBvdmVyY29tZSBjcmltaW5hbGx5IGJyYWluZGVhZCBJU1BzIG9yIHNlcnZlcnMgd2hpY2gKKwkgIGJsb2NrIElDTVAgRnJhZ21lbnRhdGlvbiBOZWVkZWQgcGFja2V0cy4gIFRoZSBzeW1wdG9tcyBvZiB0aGlzCisJICBwcm9ibGVtIGFyZSB0aGF0IGV2ZXJ5dGhpbmcgd29ya3MgZmluZSBmcm9tIHlvdXIgTGludXgKKwkgIGZpcmV3YWxsL3JvdXRlciwgYnV0IG1hY2hpbmVzIGJlaGluZCBpdCBjYW4gbmV2ZXIgZXhjaGFuZ2UgbGFyZ2UKKwkgIHBhY2tldHM6CisJICAgICAgICAxKSBXZWIgYnJvd3NlcnMgY29ubmVjdCwgdGhlbiBoYW5nIHdpdGggbm8gZGF0YSByZWNlaXZlZC4KKwkgICAgICAgIDIpIFNtYWxsIG1haWwgd29ya3MgZmluZSwgYnV0IGxhcmdlIGVtYWlscyBoYW5nLgorCSAgICAgICAgMykgc3NoIHdvcmtzIGZpbmUsIGJ1dCBzY3AgaGFuZ3MgYWZ0ZXIgaW5pdGlhbCBoYW5kc2hha2luZy4KKworCSAgV29ya2Fyb3VuZDogYWN0aXZhdGUgdGhpcyBvcHRpb24gYW5kIGFkZCBhIHJ1bGUgdG8geW91ciBmaXJld2FsbAorCSAgY29uZmlndXJhdGlvbiBsaWtlOgorCisJICBpcHRhYmxlcyAtQSBGT1JXQVJEIC1wIHRjcCAtLXRjcC1mbGFncyBTWU4sUlNUIFNZTiBcCisJICAgICAgICAgICAgICAgICAtaiBUQ1BNU1MgLS1jbGFtcC1tc3MtdG8tcG10dQorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UCiAJdHJpc3RhdGUgICciY29tbWVudCIgbWF0Y2ggc3VwcG9ydCcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQppbmRleCA1ZGM1NTc0Li5iMmI1Yzc1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTI5LDYgKzI5LDcgQEAKIG9iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfSVJDKSArPSBuZl9jb25udHJhY2tfaXJjLm8KIG9iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfTkVUQklPU19OUykgKz0gbmZfY29ubnRyYWNrX25ldGJpb3NfbnMubwogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19QUFRQKSArPSBuZl9jb25udHJhY2tfcHB0cC5vCitvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLX1NBTkUpICs9IG5mX2Nvbm50cmFja19zYW5lLm8KIG9iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfU0lQKSArPSBuZl9jb25udHJhY2tfc2lwLm8KIG9iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfVEZUUCkgKz0gbmZfY29ubnRyYWNrX3RmdHAubwogCkBAIC00NCw2ICs0NSw3IEBACiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRykgKz0geHRfTkZMT0cubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTk9UUkFDSykgKz0geHRfTk9UUkFDSy5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9TRUNNQVJLKSArPSB4dF9TRUNNQVJLLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUykgKz0geHRfVENQTVNTLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5TRUNNQVJLKSArPSB4dF9DT05OU0VDTUFSSy5vCiAKICMgbWF0Y2hlcwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdGNwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYwppbmRleCA2MjZiMDAxLi42ZmNjZGNmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYwpAQCAtNjAsMTIgKzYwLDkgQEAKICAgICBJZiBpdCdzIG5vbi16ZXJvLCB3ZSBtYXJrIG9ubHkgb3V0IG9mIHdpbmRvdyBSU1Qgc2VnbWVudHMgYXMgSU5WQUxJRC4gKi8KIGludCBuZl9jdF90Y3BfYmVfbGliZXJhbCBfX3JlYWRfbW9zdGx5ID0gMDsKIAotLyogV2hlbiBjb25uZWN0aW9uIGlzIHBpY2tlZCB1cCBmcm9tIHRoZSBtaWRkbGUsIGhvdyBtYW55IHBhY2tldHMgYXJlIHJlcXVpcmVkCi0gICB0byBwYXNzIGluIGVhY2ggZGlyZWN0aW9uIHdoZW4gd2UgYXNzdW1lIHdlIGFyZSBpbiBzeW5jIC0gaWYgYW55IHNpZGUgdXNlcwotICAgd2luZG93IHNjYWxpbmcsIHdlIGxvc3QgdGhlIGdhbWUuIAotICAgSWYgaXQgaXMgc2V0IHRvIHplcm8sIHdlIGRpc2FibGUgcGlja2luZyB1cCBhbHJlYWR5IGVzdGFibGlzaGVkIAorLyogSWYgaXQgaXMgc2V0IHRvIHplcm8sIHdlIGRpc2FibGUgcGlja2luZyB1cCBhbHJlYWR5IGVzdGFibGlzaGVkCiAgICBjb25uZWN0aW9ucy4gKi8KLWludCBuZl9jdF90Y3BfbG9vc2UgX19yZWFkX21vc3RseSA9IDM7CitpbnQgbmZfY3RfdGNwX2xvb3NlIF9fcmVhZF9tb3N0bHkgPSAxOwogCiAvKiBNYXggbnVtYmVyIG9mIHRoZSByZXRyYW5zbWl0dGVkIHBhY2tldHMgd2l0aG91dCByZWNlaXZpbmcgYW4gKGFjY2VwdGFibGUpIAogICAgQUNLIGZyb20gdGhlIGRlc3RpbmF0aW9uLiBJZiB0aGlzIG51bWJlciBpcyByZWFjaGVkLCBhIHNob3J0ZXIgdGltZXIgCkBAIC02NTAsMTEgKzY0NywxMCBAQAogCSAgICAJYmVmb3JlKHNhY2ssIHJlY2VpdmVyLT50ZF9lbmQgKyAxKSwKIAkgICAgCWFmdGVyKGFjaywgcmVjZWl2ZXItPnRkX2VuZCAtIE1BWEFDS1dJTkRPVyhzZW5kZXIpKSk7CiAKLQlpZiAoc2VuZGVyLT5sb29zZSB8fCByZWNlaXZlci0+bG9vc2UgfHwKLQkgICAgKGJlZm9yZShzZXEsIHNlbmRlci0+dGRfbWF4ZW5kICsgMSkgJiYKLQkgICAgIGFmdGVyKGVuZCwgc2VuZGVyLT50ZF9lbmQgLSByZWNlaXZlci0+dGRfbWF4d2luIC0gMSkgJiYKLQkgICAgIGJlZm9yZShzYWNrLCByZWNlaXZlci0+dGRfZW5kICsgMSkgJiYKLQkgICAgIGFmdGVyKGFjaywgcmVjZWl2ZXItPnRkX2VuZCAtIE1BWEFDS1dJTkRPVyhzZW5kZXIpKSkpIHsKKwlpZiAoYmVmb3JlKHNlcSwgc2VuZGVyLT50ZF9tYXhlbmQgKyAxKSAmJgorCSAgICBhZnRlcihlbmQsIHNlbmRlci0+dGRfZW5kIC0gcmVjZWl2ZXItPnRkX21heHdpbiAtIDEpICYmCisJICAgIGJlZm9yZShzYWNrLCByZWNlaXZlci0+dGRfZW5kICsgMSkgJiYKKwkgICAgYWZ0ZXIoYWNrLCByZWNlaXZlci0+dGRfZW5kIC0gTUFYQUNLV0lORE9XKHNlbmRlcikpKSB7CiAJICAgIAkvKgogCQkgKiBUYWtlIGludG8gYWNjb3VudCB3aW5kb3cgc2NhbGluZyAoUkZDIDEzMjMpLgogCQkgKi8KQEAgLTY5OSwxNSArNjk1LDEzIEBACiAJCQkJc3RhdGUtPnJldHJhbnMgPSAwOwogCQkJfQogCQl9Ci0JCS8qCi0JCSAqIENsb3NlIHRoZSB3aW5kb3cgb2YgZGlzYWJsZWQgd2luZG93IHRyYWNraW5nIDotKQotCQkgKi8KLQkJaWYgKHNlbmRlci0+bG9vc2UpCi0JCQlzZW5kZXItPmxvb3NlLS07Ci0KIAkJcmVzID0gMTsKIAl9IGVsc2UgewotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19UQ1ApKQorCQlyZXMgPSAwOworCQlpZiAoc2VuZGVyLT5mbGFncyAmIElQX0NUX1RDUF9GTEFHX0JFX0xJQkVSQUwgfHwKKwkJICAgIG5mX2N0X3RjcF9iZV9saWJlcmFsKQorCQkJcmVzID0gMTsKKwkJaWYgKCFyZXMgJiYgTE9HX0lOVkFMSUQoSVBQUk9UT19UQ1ApKQogCQkJbmZfbG9nX3BhY2tldChwZiwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAogCQkJIm5mX2N0X3RjcDogJXMgIiwKIAkJCWJlZm9yZShzZXEsIHNlbmRlci0+dGRfbWF4ZW5kICsgMSkgPwpAQCAtNzE4LDggKzcxMiw2IEBACiAJCQk6ICJBQ0sgaXMgb3ZlciB0aGUgdXBwZXIgYm91bmQgKEFDS2VkIGRhdGEgbm90IHNlZW4geWV0KSIKIAkJCTogIlNFUSBpcyB1bmRlciB0aGUgbG93ZXIgYm91bmQgKGFscmVhZHkgQUNLZWQgZGF0YSByZXRyYW5zbWl0dGVkKSIKIAkJCTogIlNFUSBpcyBvdmVyIHRoZSB1cHBlciBib3VuZCAob3ZlciB0aGUgd2luZG93IG9mIHRoZSByZWNlaXZlcikiKTsKLQotCQlyZXMgPSBuZl9jdF90Y3BfYmVfbGliZXJhbDsKICAgCX0KICAgCiAJREVCVUdQKCJ0Y3BfaW5fd2luZG93OiByZXM9JWkgc2VuZGVyIGVuZD0ldSBtYXhlbmQ9JXUgbWF4d2luPSV1ICIKQEAgLTEwNjMsOCArMTA1NSw2IEBACiAKIAkJdGNwX29wdGlvbnMoc2tiLCBkYXRhb2ZmLCB0aCwgJmNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0pOwogCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLmZsYWdzID0gMDsKLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS5sb29zZSA9IAotCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLmxvb3NlID0gMDsKIAl9IGVsc2UgaWYgKG5mX2N0X3RjcF9sb29zZSA9PSAwKSB7CiAJCS8qIERvbid0IHRyeSB0byBwaWNrIHVwIGNvbm5lY3Rpb25zLiAqLwogCQlyZXR1cm4gMDsKQEAgLTEwODUsMTEgKzEwNzUsMTEgQEAKIAkJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfbWF4d2luOwogCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX3NjYWxlID0gMDsKIAotCQkvKiBXZSBhc3N1bWUgU0FDSy4gU2hvdWxkIHdlIGFzc3VtZSB3aW5kb3cgc2NhbGluZyB0b28/ICovCisJCS8qIFdlIGFzc3VtZSBTQUNLIGFuZCBsaWJlcmFsIHdpbmRvdyBjaGVja2luZyB0byBoYW5kbGUKKwkJICogd2luZG93IHNjYWxpbmcgKi8KIAkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS5mbGFncyA9Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0uZmxhZ3MgPSBJUF9DVF9UQ1BfRkxBR19TQUNLX1BFUk07Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0ubG9vc2UgPSAKLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS5sb29zZSA9IG5mX2N0X3RjcF9sb29zZTsKKwkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS5mbGFncyA9IElQX0NUX1RDUF9GTEFHX1NBQ0tfUEVSTSB8CisJCQkJCQkgICAgIElQX0NUX1RDUF9GTEFHX0JFX0xJQkVSQUw7CiAJfQogICAgIAogCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0udGRfZW5kID0gMDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NhbmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NhbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjJkMWRjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5jCkBAIC0wLDAgKzEsMjQyIEBACisvKiBTQU5FIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyCisgKiAoU0FORSA9IFNjYW5uZXIgQWNjZXNzIE5vdyBFYXN5KQorICogRm9yIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIFNBTkUgbmV0d29yayBwcm90b2NvbCBzZWUKKyAqIGh0dHA6Ly93d3cuc2FuZS1wcm9qZWN0Lm9yZy9odG1sL2RvYzAxNS5odG1sCisgKi8KKworLyogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4KKyAqIEF1dGhvcjogTWljaGFsIFNjaG1pZHQgPG1zY2htaWR0QHJlZGhhdC5jb20+CisgKiBCYXNlZCBvbiB0aGUgRlRQIGNvbm50cmFjayBoZWxwZXIgKG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jKToKKyAqICAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAgKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICogIChDKSAyMDAzLDIwMDQgVVNBR0kvV0lERSBQcm9qZWN0IDxodHRwOi8vd3d3LmxpbnV4LWlwdjYub3JnPgorICogIChDKSAyMDAzIFlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zYW5lLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1pY2hhbCBTY2htaWR0IDxtc2NobWlkdEByZWRoYXQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQU5FIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIik7CisKK3N0YXRpYyBjaGFyICpzYW5lX2J1ZmZlcjsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhuZl9zYW5lX2xvY2spOworCisjZGVmaW5lIE1BWF9QT1JUUyA4CitzdGF0aWMgdV9pbnQxNl90IHBvcnRzW01BWF9QT1JUU107CitzdGF0aWMgdW5zaWduZWQgaW50IHBvcnRzX2M7Cittb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgJnBvcnRzX2MsIDA0MDApOworCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKK3N0cnVjdCBzYW5lX3JlcXVlc3QgeworCV9fYmUzMiBSUENfY29kZTsKKyNkZWZpbmUgU0FORV9ORVRfU1RBUlQgICAgICA3ICAgLyogUlBDIGNvZGUgKi8KKworCV9fYmUzMiBoYW5kbGU7Cit9OworCitzdHJ1Y3Qgc2FuZV9yZXBseV9uZXRfc3RhcnQgeworCV9fYmUzMiBzdGF0dXM7CisjZGVmaW5lIFNBTkVfU1RBVFVTX1NVQ0NFU1MgMAorCisJX19iZTE2IHplcm87CisJX19iZTE2IHBvcnQ7CisJLyogb3RoZXIgZmllbGRzIGFyZW4ndCBpbnRlcmVzdGluZyBmb3IgY29ubnRyYWNrICovCit9OworCitzdGF0aWMgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQl1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJc3RydWN0IG5mX2Nvbm4gKmN0LAorCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YW9mZiwgZGF0YWxlbjsKKwlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CisJY2hhciAqc2JfcHRyOworCWludCByZXQgPSBORl9BQ0NFUFQ7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlzdHJ1Y3QgbmZfY3Rfc2FuZV9tYXN0ZXIgKmN0X3NhbmVfaW5mbzsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOworCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlOworCXN0cnVjdCBzYW5lX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3Qgc2FuZV9yZXBseV9uZXRfc3RhcnQgKnJlcGx5OworCWludCBmYW1pbHkgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmwzbnVtOworCisJY3Rfc2FuZV9pbmZvID0gJm5mY3RfaGVscChjdCktPmhlbHAuY3Rfc2FuZV9pbmZvOworCS8qIFVudGlsIHRoZXJlJ3MgYmVlbiB0cmFmZmljIGJvdGggd2F5cywgZG9uJ3QgbG9vayBpbiBwYWNrZXRzLiAqLworCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYKKwkgICAgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEK0lQX0NUX0lTX1JFUExZKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJLyogTm90IGEgZnVsbCB0Y3AgaGVhZGVyPyAqLworCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBwcm90b2ZmLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCWlmICh0aCA9PSBOVUxMKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJLyogTm8gZGF0YT8gKi8KKwlkYXRhb2ZmID0gcHJvdG9mZiArIHRoLT5kb2ZmICogNDsKKwlpZiAoZGF0YW9mZiA+PSAoKnBza2IpLT5sZW4pCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gZGF0YW9mZjsKKworCXNwaW5fbG9ja19iaCgmbmZfc2FuZV9sb2NrKTsKKwlzYl9wdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIGRhdGFvZmYsIGRhdGFsZW4sIHNhbmVfYnVmZmVyKTsKKwlCVUdfT04oc2JfcHRyID09IE5VTEwpOworCisJaWYgKGRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpIHsKKwkJaWYgKGRhdGFsZW4gIT0gc2l6ZW9mKHN0cnVjdCBzYW5lX3JlcXVlc3QpKQorCQkJZ290byBvdXQ7CisKKwkJcmVxID0gKHN0cnVjdCBzYW5lX3JlcXVlc3QgKilzYl9wdHI7CisJCWlmIChyZXEtPlJQQ19jb2RlICE9IGh0b25sKFNBTkVfTkVUX1NUQVJUKSkgeworCQkJLyogTm90IGFuIGludGVyZXN0aW5nIGNvbW1hbmQgKi8KKwkJCWN0X3NhbmVfaW5mby0+c3RhdGUgPSBTQU5FX1NUQVRFX05PUk1BTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogV2UncmUgaW50ZXJlc3RlZCBpbiB0aGUgbmV4dCByZXBseSAqLworCQljdF9zYW5lX2luZm8tPnN0YXRlID0gU0FORV9TVEFURV9TVEFSVF9SRVFVRVNURUQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qIElzIGl0IGEgcmVwbHkgdG8gYW4gdW5pbnRlcmVzdGluZyBjb21tYW5kPyAqLworCWlmIChjdF9zYW5lX2luZm8tPnN0YXRlICE9IFNBTkVfU1RBVEVfU1RBUlRfUkVRVUVTVEVEKQorCQlnb3RvIG91dDsKKworCS8qIEl0J3MgYSByZXBseSB0byBTQU5FX05FVF9TVEFSVC4gKi8KKwljdF9zYW5lX2luZm8tPnN0YXRlID0gU0FORV9TVEFURV9OT1JNQUw7CisKKwlpZiAoZGF0YWxlbiA8IHNpemVvZihzdHJ1Y3Qgc2FuZV9yZXBseV9uZXRfc3RhcnQpKSB7CisJCURFQlVHUCgibmZfY3Rfc2FuZTogTkVUX1NUQVJUIHJlcGx5IHRvbyBzaG9ydFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJlcGx5ID0gKHN0cnVjdCBzYW5lX3JlcGx5X25ldF9zdGFydCAqKXNiX3B0cjsKKwlpZiAocmVwbHktPnN0YXR1cyAhPSBodG9ubChTQU5FX1NUQVRVU19TVUNDRVNTKSkgeworCQkvKiBzYW5lZCByZWZ1c2VkIHRoZSBjb21tYW5kICovCisJCURFQlVHUCgibmZfY3Rfc2FuZTogdW5zdWNjZXNzZnVsIFNBTkVfU1RBVFVTID0gJXVcbiIsCisJCQludG9obChyZXBseS0+c3RhdHVzKSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEludmFsaWQgc2FuZWQgcmVwbHk/IElnbm9yZSBpdC4gKi8KKwlpZiAocmVwbHktPnplcm8gIT0gMCkKKwkJZ290byBvdXQ7CisKKwlleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKKwlpZiAoZXhwID09IE5VTEwpIHsKKwkJcmV0ID0gTkZfRFJPUDsKKwkJZ290byBvdXQ7CisJfQorCisJdHVwbGUgPSAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlOworCW5mX2Nvbm50cmFja19leHBlY3RfaW5pdChleHAsIGZhbWlseSwKKwkJCQkgJnR1cGxlLT5zcmMudTMsICZ0dXBsZS0+ZHN0LnUzLAorCQkJCSBJUFBST1RPX1RDUCwKKwkJCQkgTlVMTCwgJnJlcGx5LT5wb3J0KTsKKworCURFQlVHUCgibmZfY3Rfc2FuZTogZXhwZWN0OiAiKTsKKwlORl9DVF9EVU1QX1RVUExFKCZleHAtPnR1cGxlKTsKKwlORl9DVF9EVU1QX1RVUExFKCZleHAtPm1hc2spOworCisJLyogQ2FuJ3QgZXhwZWN0IHRoaXM/ICBCZXN0IHRvIGRyb3AgcGFja2V0IG5vdy4gKi8KKwlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKKwkJcmV0ID0gTkZfRFJPUDsKKworCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CisKK291dDoKKwlzcGluX3VubG9ja19iaCgmbmZfc2FuZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgc2FuZVtNQVhfUE9SVFNdWzJdOworc3RhdGljIGNoYXIgc2FuZV9uYW1lc1tNQVhfUE9SVFNdWzJdW3NpemVvZigic2FuZS02NTUzNSIpXTsKKworLyogZG9uJ3QgbWFrZSB0aGlzIF9fZXhpdCwgc2luY2UgaXQncyBjYWxsZWQgZnJvbSBfX2luaXQgISAqLworc3RhdGljIHZvaWQgbmZfY29ubnRyYWNrX3NhbmVfZmluaSh2b2lkKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQlERUJVR1AoIm5mX2N0X3NhbmU6IHVucmVnaXN0ZXJpbmcgaGVscGVyIGZvciBwZjogJWQgIgorCQkJICAgICAgICJwb3J0OiAlZFxuIiwKKwkJCQlzYW5lW2ldW2pdLnR1cGxlLnNyYy5sM251bSwgcG9ydHNbaV0pOworCQkJbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZzYW5lW2ldW2pdKTsKKwkJfQorCX0KKworCWtmcmVlKHNhbmVfYnVmZmVyKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbmZfY29ubnRyYWNrX3NhbmVfaW5pdCh2b2lkKQoreworCWludCBpLCBqID0gLTEsIHJldCA9IDA7CisJY2hhciAqdG1wbmFtZTsKKworCXNhbmVfYnVmZmVyID0ga21hbGxvYyg2NTUzNiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYW5lX2J1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAocG9ydHNfYyA9PSAwKQorCQlwb3J0c1twb3J0c19jKytdID0gU0FORV9QT1JUOworCisJLyogRklYTUUgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZSB3aGV0aGVyIElQdjQgYW5kIElQdjYgY29ubmVjdGlvbnMKKwkJIGFyZSB0cmFja2VkIG9yIG5vdCAtIFlLICovCisJZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgeworCQlzYW5lW2ldWzBdLnR1cGxlLnNyYy5sM251bSA9IFBGX0lORVQ7CisJCXNhbmVbaV1bMV0udHVwbGUuc3JjLmwzbnVtID0gUEZfSU5FVDY7CisJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCXNhbmVbaV1bal0udHVwbGUuc3JjLnUudGNwLnBvcnQgPSBodG9ucyhwb3J0c1tpXSk7CisJCQlzYW5lW2ldW2pdLnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOworCQkJc2FuZVtpXVtqXS5tYXNrLnNyYy51LnRjcC5wb3J0ID0gMHhGRkZGOworCQkJc2FuZVtpXVtqXS5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7CisJCQlzYW5lW2ldW2pdLm1heF9leHBlY3RlZCA9IDE7CisJCQlzYW5lW2ldW2pdLnRpbWVvdXQgPSA1ICogNjA7CS8qIDUgTWludXRlcyAqLworCQkJc2FuZVtpXVtqXS5tZSA9IFRISVNfTU9EVUxFOworCQkJc2FuZVtpXVtqXS5oZWxwID0gaGVscDsKKwkJCXRtcG5hbWUgPSAmc2FuZV9uYW1lc1tpXVtqXVswXTsKKwkJCWlmIChwb3J0c1tpXSA9PSBTQU5FX1BPUlQpCisJCQkJc3ByaW50Zih0bXBuYW1lLCAic2FuZSIpOworCQkJZWxzZQorCQkJCXNwcmludGYodG1wbmFtZSwgInNhbmUtJWQiLCBwb3J0c1tpXSk7CisJCQlzYW5lW2ldW2pdLm5hbWUgPSB0bXBuYW1lOworCisJCQlERUJVR1AoIm5mX2N0X3NhbmU6IHJlZ2lzdGVyaW5nIGhlbHBlciBmb3IgcGY6ICVkICIKKwkJCSAgICAgICAicG9ydDogJWRcbiIsCisJCQkJc2FuZVtpXVtqXS50dXBsZS5zcmMubDNudW0sIHBvcnRzW2ldKTsKKwkJCXJldCA9IG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJnNhbmVbaV1bal0pOworCQkJaWYgKHJldCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAibmZfY3Rfc2FuZTogZmFpbGVkIHRvICIKKwkJCQkgICAgICAgInJlZ2lzdGVyIGhlbHBlciBmb3IgcGY6ICVkIHBvcnQ6ICVkXG4iLAorCQkJCQlzYW5lW2ldW2pdLnR1cGxlLnNyYy5sM251bSwgcG9ydHNbaV0pOworCQkJCW5mX2Nvbm50cmFja19zYW5lX2ZpbmkoKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KG5mX2Nvbm50cmFja19zYW5lX2luaXQpOworbW9kdWxlX2V4aXQobmZfY29ubnRyYWNrX3NhbmVfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmMKaW5kZXggNTBkZTk2NS4uMTk1ZTkyOSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9DTEFTU0lGWS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuYwpAQCAtMzMsOSArMzMsNyBAQAogewogCWNvbnN0IHN0cnVjdCB4dF9jbGFzc2lmeV90YXJnZXRfaW5mbyAqY2xpbmZvID0gdGFyZ2luZm87CiAKLQlpZiAoKCpwc2tiKS0+cHJpb3JpdHkgIT0gY2xpbmZvLT5wcmlvcml0eSkKLQkJKCpwc2tiKS0+cHJpb3JpdHkgPSBjbGluZm8tPnByaW9yaXR5OwotCisJKCpwc2tiKS0+cHJpb3JpdHkgPSBjbGluZm8tPnByaW9yaXR5OwogCXJldHVybiBYVF9DT05USU5VRTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9DT05OTUFSSy5jIGIvbmV0L25ldGZpbHRlci94dF9DT05OTUFSSy5jCmluZGV4IDA1MzRiZmEuLjc5NWMwNTggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMKQEAgLTYxLDcgKzYxLDcgQEAKICNlbHNlCiAJCQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfTUFSSywgKnBza2IpOwogI2VuZGlmCi0JCX0KKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFhUX0NPTk5NQVJLX1NBVkU6CiAJCQluZXdtYXJrID0gKCpjdG1hcmsgJiB+bWFya2luZm8tPm1hc2spIHwKQEAgLTc4LDggKzc4LDcgQEAKIAkJY2FzZSBYVF9DT05OTUFSS19SRVNUT1JFOgogCQkJbWFyayA9ICgqcHNrYiktPm1hcms7CiAJCQlkaWZmID0gKCpjdG1hcmsgXiBtYXJrKSAmIG1hcmtpbmZvLT5tYXNrOwotCQkJaWYgKGRpZmYgIT0gMCkKLQkJCQkoKnBza2IpLT5tYXJrID0gbWFyayBeIGRpZmY7CisJCQkoKnBza2IpLT5tYXJrID0gbWFyayBeIGRpZmY7CiAJCQlicmVhazsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfQ09OTlNFQ01BUksuYyBiL25ldC9uZXRmaWx0ZXIveHRfQ09OTlNFQ01BUksuYwppbmRleCBhM2ZlM2MzLi4xYWIwZGI2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5TRUNNQVJLLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5jCkBAIC00MSw4ICs0MSw3IEBACiAKIAkJY29ubnNlY21hcmsgPSBuZl9jdF9nZXRfc2VjbWFyayhza2IsICZjdGluZm8pOwogCQlpZiAoY29ubnNlY21hcmsgJiYgISpjb25uc2VjbWFyaykKLQkJCWlmICgqY29ubnNlY21hcmsgIT0gc2tiLT5zZWNtYXJrKQotCQkJCSpjb25uc2VjbWFyayA9IHNrYi0+c2VjbWFyazsKKwkJCSpjb25uc2VjbWFyayA9IHNrYi0+c2VjbWFyazsKIAl9CiB9CiAKQEAgLTU4LDggKzU3LDcgQEAKIAogCQljb25uc2VjbWFyayA9IG5mX2N0X2dldF9zZWNtYXJrKHNrYiwgJmN0aW5mbyk7CiAJCWlmIChjb25uc2VjbWFyayAmJiAqY29ubnNlY21hcmspCi0JCQlpZiAoc2tiLT5zZWNtYXJrICE9ICpjb25uc2VjbWFyaykKLQkJCQlza2ItPnNlY21hcmsgPSAqY29ubnNlY21hcms7CisJCQlza2ItPnNlY21hcmsgPSAqY29ubnNlY21hcms7CiAJfQogfQogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X01BUksuYyBiL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCmluZGV4IDBiNDg1NDcuLmNmYzQ1YWYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCkBAIC0zMSw5ICszMSw3IEBACiB7CiAJY29uc3Qgc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm8gKm1hcmtpbmZvID0gdGFyZ2luZm87CiAKLQlpZigoKnBza2IpLT5tYXJrICE9IG1hcmtpbmZvLT5tYXJrKQotCQkoKnBza2IpLT5tYXJrID0gbWFya2luZm8tPm1hcms7Ci0KKwkoKnBza2IpLT5tYXJrID0gbWFya2luZm8tPm1hcms7CiAJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCkBAIC02Miw5ICs2MCw3IEBACiAJCWJyZWFrOwogCX0KIAotCWlmKCgqcHNrYiktPm1hcmsgIT0gbWFyaykKLQkJKCpwc2tiKS0+bWFyayA9IG1hcms7Ci0KKwkoKnBza2IpLT5tYXJrID0gbWFyazsKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfU0VDTUFSSy5jIGIvbmV0L25ldGZpbHRlci94dF9TRUNNQVJLLmMKaW5kZXggYWRkNzUyMS4uZjExMzFjMyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9TRUNNQVJLLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9TRUNNQVJLLmMKQEAgLTQ3LDkgKzQ3LDcgQEAKIAkJQlVHKCk7CiAJfQogCi0JaWYgKCgqcHNrYiktPnNlY21hcmsgIT0gc2VjbWFyaykKLQkJKCpwc2tiKS0+c2VjbWFyayA9IHNlY21hcms7Ci0KKwkoKnBza2IpLT5zZWNtYXJrID0gc2VjbWFyazsKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiN2UzOGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBNU1Mgb3B0aW9uIGluIFRDUCBwYWNrZXRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X1RDUE1TUy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigieF90YWJsZXMgVENQIE1TUyBtb2RpZmljYXRpb24gbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9UQ1BNU1MiKTsKK01PRFVMRV9BTElBUygiaXA2dF9UQ1BNU1MiKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK29wdGxlbihjb25zdCB1X2ludDhfdCAqb3B0LCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCS8qIEJld2FyZSB6ZXJvLWxlbmd0aCBvcHRpb25zOiBtYWtlIGZpbml0ZSBwcm9ncmVzcyAqLworCWlmIChvcHRbb2Zmc2V0XSA8PSBUQ1BPUFRfTk9QIHx8IG9wdFtvZmZzZXQrMV0gPT0gMCkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gb3B0W29mZnNldCsxXTsKK30KKworc3RhdGljIGludAordGNwbXNzX21hbmdsZV9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgICAgIGNvbnN0IHN0cnVjdCB4dF90Y3Btc3NfaW5mbyAqaW5mbywKKwkJICAgICB1bnNpZ25lZCBpbnQgdGNwaG9mZiwKKwkJICAgICB1bnNpZ25lZCBpbnQgbWlubGVuKQoreworCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CisJdW5zaWduZWQgaW50IHRjcGxlbiwgaTsKKwlfX2JlMTYgb2xkdmFsOworCXUxNiBuZXdtc3M7CisJdTggKm9wdDsKKworCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bGVuKSkKKwkJcmV0dXJuIC0xOworCisJdGNwbGVuID0gKCpwc2tiKS0+bGVuIC0gdGNwaG9mZjsKKwl0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikoKCpwc2tiKS0+bmgucmF3ICsgdGNwaG9mZik7CisKKwkvKiBTaW5jZSBpdCBwYXNzZWQgZmxhZ3MgdGVzdCBpbiB0Y3AgbWF0Y2gsIHdlIGtub3cgaXQgaXMgaXMKKwkgICBub3QgYSBmcmFnbWVudCwgYW5kIGhhcyBkYXRhID49IHRjcCBoZWFkZXIgbGVuZ3RoLiAgU1lOCisJICAgcGFja2V0cyBzaG91bGQgbm90IGNvbnRhaW4gZGF0YTogaWYgdGhleSBkaWQsIHRoZW4gd2UgcmlzaworCSAgIHJ1bm5pbmcgb3ZlciBNVFUsIHNlbmRpbmcgRnJhZyBOZWVkZWQgYW5kIGJyZWFraW5nIHRoaW5ncworCSAgIGJhZGx5LiAtLVJSICovCisJaWYgKHRjcGxlbiAhPSB0Y3BoLT5kb2ZmKjQpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0VSUiAieHRfVENQTVNTOiBiYWQgbGVuZ3RoICgldSBieXRlcylcbiIsCisJCQkgICAgICAgKCpwc2tiKS0+bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChpbmZvLT5tc3MgPT0gWFRfVENQTVNTX0NMQU1QX1BNVFUpIHsKKwkJaWYgKGRzdF9tdHUoKCpwc2tiKS0+ZHN0KSA8PSBtaW5sZW4pIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJ4dF9UQ1BNU1M6ICIKKwkJCQkgICAgICAgInVua25vd24gb3IgaW52YWxpZCBwYXRoLU1UVSAoJXUpXG4iLAorCQkJCSAgICAgICBkc3RfbXR1KCgqcHNrYiktPmRzdCkpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW5ld21zcyA9IGRzdF9tdHUoKCpwc2tiKS0+ZHN0KSAtIG1pbmxlbjsKKwl9IGVsc2UKKwkJbmV3bXNzID0gaW5mby0+bXNzOworCisJb3B0ID0gKHVfaW50OF90ICopdGNwaDsKKwlmb3IgKGkgPSBzaXplb2Yoc3RydWN0IHRjcGhkcik7IGkgPCB0Y3BoLT5kb2ZmKjQ7IGkgKz0gb3B0bGVuKG9wdCwgaSkpIHsKKwkJaWYgKG9wdFtpXSA9PSBUQ1BPUFRfTVNTICYmIHRjcGgtPmRvZmYqNCAtIGkgPj0gVENQT0xFTl9NU1MgJiYKKwkJICAgIG9wdFtpKzFdID09IFRDUE9MRU5fTVNTKSB7CisJCQl1X2ludDE2X3Qgb2xkbXNzOworCisJCQlvbGRtc3MgPSAob3B0W2krMl0gPDwgOCkgfCBvcHRbaSszXTsKKworCQkJaWYgKGluZm8tPm1zcyA9PSBYVF9UQ1BNU1NfQ0xBTVBfUE1UVSAmJgorCQkJICAgIG9sZG1zcyA8PSBuZXdtc3MpCisJCQkJcmV0dXJuIDA7CisKKwkJCW9wdFtpKzJdID0gKG5ld21zcyAmIDB4ZmYwMCkgPj4gODsKKwkJCW9wdFtpKzNdID0gKG5ld21zcyAmIDB4MDBmZik7CisKKwkJCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJnRjcGgtPmNoZWNrLCAqcHNrYiwKKwkJCQkJICAgICAgIGh0b25zKG9sZG1zcyksIGh0b25zKG5ld21zcyksIDApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKgorCSAqIE1TUyBPcHRpb24gbm90IGZvdW5kID8hIGFkZCBpdC4uCisJICovCisJaWYgKHNrYl90YWlscm9vbSgoKnBza2IpKSA8IFRDUE9MRU5fTVNTKSB7CisJCXN0cnVjdCBza19idWZmICpuZXdza2I7CisKKwkJbmV3c2tiID0gc2tiX2NvcHlfZXhwYW5kKCpwc2tiLCBza2JfaGVhZHJvb20oKnBza2IpLAorCQkJCQkgVENQT0xFTl9NU1MsIEdGUF9BVE9NSUMpOworCQlpZiAoIW5ld3NrYikKKwkJCXJldHVybiAtMTsKKwkJa2ZyZWVfc2tiKCpwc2tiKTsKKwkJKnBza2IgPSBuZXdza2I7CisJCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKSgoKnBza2IpLT5uaC5yYXcgKyB0Y3Bob2ZmKTsKKwl9CisKKwlza2JfcHV0KCgqcHNrYiksIFRDUE9MRU5fTVNTKTsKKworCW9wdCA9ICh1X2ludDhfdCAqKXRjcGggKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisJbWVtbW92ZShvcHQgKyBUQ1BPTEVOX01TUywgb3B0LCB0Y3BsZW4gLSBzaXplb2Yoc3RydWN0IHRjcGhkcikpOworCisJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssICpwc2tiLAorCQkJICAgICAgIGh0b25zKHRjcGxlbiksIGh0b25zKHRjcGxlbiArIFRDUE9MRU5fTVNTKSwgMSk7CisJb3B0WzBdID0gVENQT1BUX01TUzsKKwlvcHRbMV0gPSBUQ1BPTEVOX01TUzsKKwlvcHRbMl0gPSAobmV3bXNzICYgMHhmZjAwKSA+PiA4OworCW9wdFszXSA9IChuZXdtc3MgJiAweDAwZmYpOworCisJbmZfcHJvdG9fY3N1bV9yZXBsYWNlNCgmdGNwaC0+Y2hlY2ssICpwc2tiLCAwLCAqKChfX2JlMzIgKilvcHQpLCAwKTsKKworCW9sZHZhbCA9ICgoX19iZTE2ICopdGNwaClbNl07CisJdGNwaC0+ZG9mZiArPSBUQ1BPTEVOX01TUy80OworCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJnRjcGgtPmNoZWNrLCAqcHNrYiwKKwkJCQlvbGR2YWwsICgoX19iZTE2ICopdGNwaClbNl0sIDApOworCXJldHVybiBUQ1BPTEVOX01TUzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoreHRfdGNwbXNzX3RhcmdldDQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkgIHVuc2lnbmVkIGludCBob29rbnVtLAorCQkgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKKwkJICBjb25zdCB2b2lkICp0YXJnaW5mbykKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlfX2JlMTYgbmV3bGVuOworCWludCByZXQ7CisKKwlyZXQgPSB0Y3Btc3NfbWFuZ2xlX3BhY2tldChwc2tiLCB0YXJnaW5mbywgaXBoLT5paGwgKiA0LAorCQkJCSAgIHNpemVvZigqaXBoKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBORl9EUk9QOworCWlmIChyZXQgPiAwKSB7CisJCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwkJbmV3bGVuID0gaHRvbnMobnRvaHMoaXBoLT50b3RfbGVuKSArIHJldCk7CisJCW5mX2NzdW1fcmVwbGFjZTIoJmlwaC0+Y2hlY2ssIGlwaC0+dG90X2xlbiwgbmV3bGVuKTsKKwkJaXBoLT50b3RfbGVuID0gbmV3bGVuOworCX0KKwlyZXR1cm4gWFRfQ09OVElOVUU7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpIHx8IGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFU19NT0RVTEUpCitzdGF0aWMgdW5zaWduZWQgaW50Cit4dF90Y3Btc3NfdGFyZ2V0NihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCSAgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCSAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAorCQkgIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQoreworCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9ICgqcHNrYiktPm5oLmlwdjZoOworCXU4IG5leHRoZHI7CisJaW50IHRjcGhvZmY7CisJaW50IHJldDsKKworCW5leHRoZHIgPSBpcHY2aC0+bmV4dGhkcjsKKwl0Y3Bob2ZmID0gaXB2Nl9za2lwX2V4dGhkcigqcHNrYiwgc2l6ZW9mKCppcHY2aCksICZuZXh0aGRyKTsKKwlpZiAodGNwaG9mZiA8IDApIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIE5GX0RST1A7CisJfQorCXJldCA9IHRjcG1zc19tYW5nbGVfcGFja2V0KHBza2IsIHRhcmdpbmZvLCB0Y3Bob2ZmLAorCQkJCSAgIHNpemVvZigqaXB2NmgpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIE5GX0RST1A7CisJaWYgKHJldCA+IDApIHsKKwkJaXB2NmggPSAoKnBza2IpLT5uaC5pcHY2aDsKKwkJaXB2NmgtPnBheWxvYWRfbGVuID0gaHRvbnMobnRvaHMoaXB2NmgtPnBheWxvYWRfbGVuKSArIHJldCk7CisJfQorCXJldHVybiBYVF9DT05USU5VRTsKK30KKyNlbmRpZgorCisjZGVmaW5lIFRIX1NZTiAweDAyCisKKy8qIE11c3Qgc3BlY2lmeSAtcCB0Y3AgLS1zeW4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZpbmRfc3luX21hdGNoKGNvbnN0IHN0cnVjdCB4dF9lbnRyeV9tYXRjaCAqbSkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfdGNwICp0Y3BpbmZvID0gKGNvbnN0IHN0cnVjdCB4dF90Y3AgKiltLT5kYXRhOworCisJaWYgKHN0cmNtcChtLT51Lmtlcm5lbC5tYXRjaC0+bmFtZSwgInRjcCIpID09IDAgJiYKKwkgICAgdGNwaW5mby0+ZmxnX2NtcCAmIFRIX1NZTiAmJgorCSAgICAhKHRjcGluZm8tPmludmZsYWdzICYgWFRfVENQX0lOVl9GTEFHUykpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3h0X3RjcG1zc19jaGVja2VudHJ5NChjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSAgICAgIGNvbnN0IHZvaWQgKmVudHJ5LAorCQkgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCisJCSAgICAgIHZvaWQgKnRhcmdpbmZvLAorCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCB4dF90Y3Btc3NfaW5mbyAqaW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUgPSBlbnRyeTsKKworCWlmIChpbmZvLT5tc3MgPT0gWFRfVENQTVNTX0NMQU1QX1BNVFUgJiYKKwkgICAgKGhvb2tfbWFzayAmIH4oKDEgPDwgTkZfSVBfRk9SV0FSRCkgfAorCQkJICAgKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSB8CisJCQkgICAoMSA8PCBORl9JUF9QT1NUX1JPVVRJTkcpKSkgIT0gMCkgeworCQlwcmludGsoInh0X1RDUE1TUzogcGF0aC1NVFUgY2xhbXBpbmcgb25seSBzdXBwb3J0ZWQgaW4gIgorCQkgICAgICAgIkZPUldBUkQsIE9VVFBVVCBhbmQgUE9TVFJPVVRJTkcgaG9va3NcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKElQVF9NQVRDSF9JVEVSQVRFKGUsIGZpbmRfc3luX21hdGNoKSkKKwkJcmV0dXJuIDE7CisJcHJpbnRrKCJ4dF9UQ1BNU1M6IE9ubHkgd29ya3Mgb24gVENQIFNZTiBwYWNrZXRzXG4iKTsKKwlyZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTX01PRFVMRSkKK3N0YXRpYyBpbnQKK3h0X3RjcG1zc19jaGVja2VudHJ5Nihjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSAgICAgIGNvbnN0IHZvaWQgKmVudHJ5LAorCQkgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCisJCSAgICAgIHZvaWQgKnRhcmdpbmZvLAorCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCB4dF90Y3Btc3NfaW5mbyAqaW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5ICplID0gZW50cnk7CisKKwlpZiAoaW5mby0+bXNzID09IFhUX1RDUE1TU19DTEFNUF9QTVRVICYmCisJICAgIChob29rX21hc2sgJiB+KCgxIDw8IE5GX0lQNl9GT1JXQVJEKSB8CisJCQkgICAoMSA8PCBORl9JUDZfTE9DQUxfT1VUKSB8CisJCQkgICAoMSA8PCBORl9JUDZfUE9TVF9ST1VUSU5HKSkpICE9IDApIHsKKwkJcHJpbnRrKCJ4dF9UQ1BNU1M6IHBhdGgtTVRVIGNsYW1waW5nIG9ubHkgc3VwcG9ydGVkIGluICIKKwkJICAgICAgICJGT1JXQVJELCBPVVRQVVQgYW5kIFBPU1RST1VUSU5HIGhvb2tzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChJUDZUX01BVENIX0lURVJBVEUoZSwgZmluZF9zeW5fbWF0Y2gpKQorCQlyZXR1cm4gMTsKKwlwcmludGsoInh0X1RDUE1TUzogT25seSB3b3JrcyBvbiBUQ1AgU1lOIHBhY2tldHNcbiIpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHh0X3RjcG1zc19yZWdbXSA9IHsKKwl7CisJCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkJLm5hbWUJCT0gIlRDUE1TUyIsCisJCS5jaGVja2VudHJ5CT0geHRfdGNwbXNzX2NoZWNrZW50cnk0LAorCQkudGFyZ2V0CQk9IHh0X3RjcG1zc190YXJnZXQ0LAorCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfdGNwbXNzX2luZm8pLAorCQkucHJvdG8JCT0gSVBQUk9UT19UQ1AsCisJCS5tZQkJPSBUSElTX01PRFVMRSwKKwl9LAorI2lmIGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTX01PRFVMRSkKKwl7CisJCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5uYW1lCQk9ICJUQ1BNU1MiLAorCQkuY2hlY2tlbnRyeQk9IHh0X3RjcG1zc19jaGVja2VudHJ5NiwKKwkJLnRhcmdldAkJPSB4dF90Y3Btc3NfdGFyZ2V0NiwKKwkJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3RjcG1zc19pbmZvKSwKKwkJLnByb3RvCQk9IElQUFJPVE9fVENQLAorCQkubWUJCT0gVEhJU19NT0RVTEUsCisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQgeHRfdGNwbXNzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0cyh4dF90Y3Btc3NfcmVnLCBBUlJBWV9TSVpFKHh0X3RjcG1zc19yZWcpKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHh0X3RjcG1zc19maW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXRzKHh0X3RjcG1zc19yZWcsIEFSUkFZX1NJWkUoeHRfdGNwbXNzX3JlZykpOworfQorCittb2R1bGVfaW5pdCh4dF90Y3Btc3NfaW5pdCk7Cittb2R1bGVfZXhpdCh4dF90Y3Btc3NfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jIGIvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYwppbmRleCBmMjhiZjY5Li5iZDFmN2EyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKQEAgLTQxNCw2ICs0MTQsNyBAQAogCXN3aXRjaCAobmV4dGhkcikgewogCWNhc2UgSVBQUk9UT19UQ1A6CiAJY2FzZSBJUFBST1RPX1VEUDoKKwljYXNlIElQUFJPVE9fVURQTElURToKIAljYXNlIElQUFJPVE9fU0NUUDoKIAljYXNlIElQUFJPVE9fRENDUDoKIAkJcG9ydHMgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX3BvcnRzKSwKZGlmZiAtLWdpdCBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCmluZGV4IDZkYzAxYmQuLmE2ZmE0ODcgMTAwNjQ0Ci0tLSBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKKysrIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwpAQCAtNjAsNiArNjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgpAQCAtMjAwLDcgKzIwMSw4IEBACiAjZW5kaWYKIAlzdHJ1Y3QgcGFja2V0X3R5cGUJcHJvdF9ob29rOwogCXNwaW5sb2NrX3QJCWJpbmRfbG9jazsKLQljaGFyCQkJcnVubmluZzsJLyogcHJvdF9ob29rIGlzIGF0dGFjaGVkKi8KKwl1bnNpZ25lZCBpbnQJCXJ1bm5pbmc6MSwJLyogcHJvdF9ob29rIGlzIGF0dGFjaGVkKi8KKwkJCQlhdXhkYXRhOjE7CiAJaW50CQkJaWZpbmRleDsJLyogYm91bmQgZGV2aWNlCQkqLwogCV9fYmUxNgkJCW51bTsKICNpZmRlZiBDT05GSUdfUEFDS0VUX01VTFRJQ0FTVApAQCAtMjE0LDYgKzIxNiwxNiBAQAogI2VuZGlmCiB9OwogCitzdHJ1Y3QgcGFja2V0X3NrYl9jYiB7CisJdW5zaWduZWQgaW50IG9yaWdsZW47CisJdW5pb24geworCQlzdHJ1Y3Qgc29ja2FkZHJfcGt0IHBrdDsKKwkJc3RydWN0IHNvY2thZGRyX2xsIGxsOworCX0gc2E7Cit9OworCisjZGVmaW5lIFBBQ0tFVF9TS0JfQ0IoX19za2IpCSgoc3RydWN0IHBhY2tldF9za2JfY2IgKikoKF9fc2tiKS0+Y2IpKQorCiAjaWZkZWYgQ09ORklHX1BBQ0tFVF9NTUFQCiAKIHN0YXRpYyBpbmxpbmUgY2hhciAqcGFja2V0X2xvb2t1cF9mcmFtZShzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLCB1bnNpZ25lZCBpbnQgcG9zaXRpb24pCkBAIC0yOTMsNyArMzA1LDcgQEAKIAkvKiBkcm9wIGNvbm50cmFjayByZWZlcmVuY2UgKi8KIAluZl9yZXNldChza2IpOwogCi0Jc3BrdCA9IChzdHJ1Y3Qgc29ja2FkZHJfcGt0Kilza2ItPmNiOworCXNwa3QgPSAmUEFDS0VUX1NLQl9DQihza2IpLT5zYS5wa3Q7CiAKIAlza2JfcHVzaChza2IsIHNrYi0+ZGF0YS1za2ItPm1hYy5yYXcpOwogCkBAIC01MTIsNyArNTI0LDEwIEBACiAJCXNrYiA9IG5za2I7CiAJfQogCi0Jc2xsID0gKHN0cnVjdCBzb2NrYWRkcl9sbCopc2tiLT5jYjsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKCpQQUNLRVRfU0tCX0NCKHNrYikpICsgTUFYX0FERFJfTEVOIC0gOCA+CisJCSAgICAgc2l6ZW9mKHNrYi0+Y2IpKTsKKworCXNsbCA9ICZQQUNLRVRfU0tCX0NCKHNrYiktPnNhLmxsOwogCXNsbC0+c2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKIAlzbGwtPnNsbF9oYXR5cGUgPSBkZXYtPnR5cGU7CiAJc2xsLT5zbGxfcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOwpAQCAtNTIzLDYgKzUzOCw4IEBACiAJaWYgKGRldi0+aGFyZF9oZWFkZXJfcGFyc2UpCiAJCXNsbC0+c2xsX2hhbGVuID0gZGV2LT5oYXJkX2hlYWRlcl9wYXJzZShza2IsIHNsbC0+c2xsX2FkZHIpOwogCisJUEFDS0VUX1NLQl9DQihza2IpLT5vcmlnbGVuID0gc2tiLT5sZW47CisKIAlpZiAocHNrYl90cmltKHNrYiwgc25hcGxlbikpCiAJCWdvdG8gZHJvcF9uX2FjY3Q7CiAKQEAgLTU4MiwxMSArNTk5LDEyIEBACiAJCWVsc2UgaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09VVEdPSU5HKSB7CiAJCQkvKiBTcGVjaWFsIGNhc2U6IG91dGdvaW5nIHBhY2tldHMgaGF2ZSBsbCBoZWFkZXIgYXQgaGVhZCAqLwogCQkJc2tiX3B1bGwoc2tiLCBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7Ci0JCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKLQkJCQlzdGF0dXMgfD0gVFBfU1RBVFVTX0NTVU1OT1RSRUFEWTsKIAkJfQogCX0KIAorCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQorCQlzdGF0dXMgfD0gVFBfU1RBVFVTX0NTVU1OT1RSRUFEWTsKKwogCXNuYXBsZW4gPSBza2ItPmxlbjsKIAogCXJlcyA9IHJ1bl9maWx0ZXIoc2tiLCBzaywgc25hcGxlbik7CkBAIC0xMDkyLDcgKzExMTAsNyBAQAogCSAqCWl0IGluIG5vdy4KIAkgKi8KIAotCXNsbCA9IChzdHJ1Y3Qgc29ja2FkZHJfbGwqKXNrYi0+Y2I7CisJc2xsID0gJlBBQ0tFVF9TS0JfQ0Ioc2tiKS0+c2EubGw7CiAJaWYgKHNvY2stPnR5cGUgPT0gU09DS19QQUNLRVQpCiAJCW1zZy0+bXNnX25hbWVsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3BrdCk7CiAJZWxzZQpAQCAtMTExNyw3ICsxMTM1LDIyIEBACiAJc29ja19yZWN2X3RpbWVzdGFtcChtc2csIHNrLCBza2IpOwogCiAJaWYgKG1zZy0+bXNnX25hbWUpCi0JCW1lbWNweShtc2ctPm1zZ19uYW1lLCBza2ItPmNiLCBtc2ctPm1zZ19uYW1lbGVuKTsKKwkJbWVtY3B5KG1zZy0+bXNnX25hbWUsICZQQUNLRVRfU0tCX0NCKHNrYiktPnNhLAorCQkgICAgICAgbXNnLT5tc2dfbmFtZWxlbik7CisKKwlpZiAocGt0X3NrKHNrKS0+YXV4ZGF0YSkgeworCQlzdHJ1Y3QgdHBhY2tldF9hdXhkYXRhIGF1eDsKKworCQlhdXgudHBfc3RhdHVzID0gVFBfU1RBVFVTX1VTRVI7CisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQorCQkJYXV4LnRwX3N0YXR1cyB8PSBUUF9TVEFUVVNfQ1NVTU5PVFJFQURZOworCQlhdXgudHBfbGVuID0gUEFDS0VUX1NLQl9DQihza2IpLT5vcmlnbGVuOworCQlhdXgudHBfc25hcGxlbiA9IHNrYi0+bGVuOworCQlhdXgudHBfbWFjID0gMDsKKwkJYXV4LnRwX25ldCA9IHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhOworCisJCXB1dF9jbXNnKG1zZywgU09MX1BBQ0tFVCwgUEFDS0VUX0FVWERBVEEsIHNpemVvZihhdXgpLCAmYXV4KTsKKwl9CiAKIAkvKgogCSAqCUZyZWUgb3IgcmV0dXJuIHRoZSBidWZmZXIgYXMgYXBwcm9wcmlhdGUuIEFnYWluIHRoaXMKQEAgLTEzMTcsNiArMTM1MCw3IEBACiBwYWNrZXRfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBwYWNrZXRfc29jayAqcG8gPSBwa3Rfc2soc2spOwogCWludCByZXQ7CiAKIAlpZiAobGV2ZWwgIT0gU09MX1BBQ0tFVCkKQEAgLTEzNjksNiArMTQwMywxOCBAQAogCQlyZXR1cm4gMDsKIAl9CiAjZW5kaWYKKwljYXNlIFBBQ0tFVF9BVVhEQVRBOgorCXsKKwkJaW50IHZhbDsKKworCQlpZiAob3B0bGVuIDwgc2l6ZW9mKHZhbCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIG9wdHZhbCwgc2l6ZW9mKHZhbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcG8tPmF1eGRhdGEgPSAhIXZhbDsKKwkJcmV0dXJuIDA7CisJfQogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAJfQpAQCAtMTM3OCw4ICsxNDI0LDExIEBACiAJCQkgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKIAlpbnQgbGVuOworCWludCB2YWw7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHBhY2tldF9zb2NrICpwbyA9IHBrdF9zayhzayk7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgdHBhY2tldF9zdGF0cyBzdDsKIAogCWlmIChsZXZlbCAhPSBTT0xfUEFDS0VUKQogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwpAQCAtMTM5Miw5ICsxNDQxLDYgQEAKIAkJCiAJc3dpdGNoKG9wdG5hbWUpCXsKIAljYXNlIFBBQ0tFVF9TVEFUSVNUSUNTOgotCXsKLQkJc3RydWN0IHRwYWNrZXRfc3RhdHMgc3Q7Ci0KIAkJaWYgKGxlbiA+IHNpemVvZihzdHJ1Y3QgdHBhY2tldF9zdGF0cykpCiAJCQlsZW4gPSBzaXplb2Yoc3RydWN0IHRwYWNrZXRfc3RhdHMpOwogCQlzcGluX2xvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwpAQCAtMTQwMywxNiArMTQ0OSwyMyBAQAogCQlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CiAJCXN0LnRwX3BhY2tldHMgKz0gc3QudHBfZHJvcHM7CiAKLQkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZzdCwgbGVuKSkKLQkJCXJldHVybiAtRUZBVUxUOworCQlkYXRhID0gJnN0OwogCQlicmVhazsKLQl9CisJY2FzZSBQQUNLRVRfQVVYREFUQToKKwkJaWYgKGxlbiA+IHNpemVvZihpbnQpKQorCQkJbGVuID0gc2l6ZW9mKGludCk7CisJCXZhbCA9IHBvLT5hdXhkYXRhOworCisJCWRhdGEgPSAmdmFsOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCX0KIAogCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCiAJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCBkYXRhLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9pcHQuYyBiL25ldC9zY2hlZC9hY3RfaXB0LmMKaW5kZXggMDFlNjkxMy4uNGM2OGM3MSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9pcHQuYworKysgYi9uZXQvc2NoZWQvYWN0X2lwdC5jCkBAIC01Miw3ICs1Miw3IEBACiAKIHN0YXRpYyBpbnQgaXB0X2luaXRfdGFyZ2V0KHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0LCBjaGFyICp0YWJsZSwgdW5zaWduZWQgaW50IGhvb2spCiB7Ci0Jc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldDsKKwlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CiAJaW50IHJldCA9IDA7CiAKIAl0YXJnZXQgPSB4dF9yZXF1ZXN0X2ZpbmRfdGFyZ2V0KEFGX0lORVQsIHQtPnUudXNlci5uYW1lLApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwppbmRleCBiYzExNmJkLi4zYjZlNmE3IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYworKysgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJCQkJICAgICAgIGRldi0+bmFtZSk7CiAJCQkJZGV2LT50eF90aW1lb3V0KGRldik7CiAJCQl9Ci0JCQlpZiAoIW1vZF90aW1lcigmZGV2LT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIGRldi0+d2F0Y2hkb2dfdGltZW8pKQorCQkJaWYgKCFtb2RfdGltZXIoJmRldi0+d2F0Y2hkb2dfdGltZXIsIHJvdW5kX2ppZmZpZXMoamlmZmllcyArIGRldi0+d2F0Y2hkb2dfdGltZW8pKSkKIAkJCQlkZXZfaG9sZChkZXYpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9wcmlvLmMgYi9uZXQvc2NoZWQvc2NoX3ByaW8uYwppbmRleCAyNTY3YjRjLi4wMDBlMDQzIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3ByaW8uYworKysgYi9uZXQvc2NoZWQvc2NoX3ByaW8uYwpAQCAtMzcyLDYgKzM3MiwyMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHByaW9fZHVtcF9jbGFzc19zdGF0cyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBjbCwKKwkJCQkgc3RydWN0IGduZXRfZHVtcCAqZCkKK3sKKwlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBRZGlzYyAqY2xfcTsKKworCWNsX3EgPSBxLT5xdWV1ZXNbY2wgLSAxXTsKKwlpZiAoZ25ldF9zdGF0c19jb3B5X2Jhc2ljKGQsICZjbF9xLT5ic3RhdHMpIDwgMCB8fAorCSAgICBnbmV0X3N0YXRzX2NvcHlfcXVldWUoZCwgJmNsX3EtPnFzdGF0cykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgcHJpb193YWxrKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgcWRpc2Nfd2Fsa2VyICphcmcpCiB7CiAJc3RydWN0IHByaW9fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKQEAgLTQxNCw2ICs0MjgsNyBAQAogCS5iaW5kX3RjZgk9CXByaW9fYmluZCwKIAkudW5iaW5kX3RjZgk9CXByaW9fcHV0LAogCS5kdW1wCQk9CXByaW9fZHVtcF9jbGFzcywKKwkuZHVtcF9zdGF0cwk9CXByaW9fZHVtcF9jbGFzc19zdGF0cywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgUWRpc2Nfb3BzIHByaW9fcWRpc2Nfb3BzID0gewpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9zZnEuYyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKaW5kZXggNDU5Y2RhMi4uODI4NDQ4MCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9zZnEuYworKysgYi9uZXQvc2NoZWQvc2NoX3NmcS5jCkBAIC0xNDMsNiArMTQzLDcgQEAKIAkJaWYgKCEoaXBoLT5mcmFnX29mZiZodG9ucyhJUF9NRnxJUF9PRkZTRVQpKSAmJgogCQkgICAgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1AgfHwKIAkJICAgICBpcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQIHx8CisJCSAgICAgaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUExJVEUgfHwKIAkJICAgICBpcGgtPnByb3RvY29sID09IElQUFJPVE9fU0NUUCB8fAogCQkgICAgIGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19EQ0NQIHx8CiAJCSAgICAgaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0VTUCkpCkBAIC0xNTYsNiArMTU3LDcgQEAKIAkJaDIgPSBpcGgtPnNhZGRyLnM2X2FkZHIzMlszXV5pcGgtPm5leHRoZHI7CiAJCWlmIChpcGgtPm5leHRoZHIgPT0gSVBQUk9UT19UQ1AgfHwKIAkJICAgIGlwaC0+bmV4dGhkciA9PSBJUFBST1RPX1VEUCB8fAorCQkgICAgaXBoLT5uZXh0aGRyID09IElQUFJPVE9fVURQTElURSB8fAogCQkgICAgaXBoLT5uZXh0aGRyID09IElQUFJPVE9fU0NUUCB8fAogCQkgICAgaXBoLT5uZXh0aGRyID09IElQUFJPVE9fRENDUCB8fAogCQkgICAgaXBoLT5uZXh0aGRyID09IElQUFJPVE9fRVNQKQpkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCmluZGV4IDRlMzk2MzEuLjVmMzc0ZTEgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYworKysgYi9uZXQvc29ja2V0LmMKQEAgLTQwNywyNCArNDA3LDExIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc29ja2V0ICpzb2NrX2Zyb21fZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50ICplcnIpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwotCiAJaWYgKGZpbGUtPmZfb3AgPT0gJnNvY2tldF9maWxlX29wcykKIAkJcmV0dXJuIGZpbGUtPnByaXZhdGVfZGF0YTsJLyogc2V0IGluIHNvY2tfbWFwX2ZkICovCiAKLQlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JaWYgKCFTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSkgewotCQkqZXJyID0gLUVOT1RTT0NLOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlzb2NrID0gU09DS0VUX0koaW5vZGUpOwotCWlmIChzb2NrLT5maWxlICE9IGZpbGUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzb2NraV9sb29rdXA6IHNvY2tldCBmaWxlIGNoYW5nZWQhXG4iKTsKLQkJc29jay0+ZmlsZSA9IGZpbGU7Ci0JfQotCXJldHVybiBzb2NrOworCSplcnIgPSAtRU5PVFNPQ0s7CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgpAQCAtMTUyNyw4ICsxNTE0LDkgQEAKIAlzdHJ1Y3QgZmlsZSAqc29ja19maWxlOwogCiAJc29ja19maWxlID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKKwllcnIgPSAtRUJBREY7CiAJaWYgKCFzb2NrX2ZpbGUpCi0JCXJldHVybiAtRUJBREY7CisJCWdvdG8gb3V0OwogCiAJc29jayA9IHNvY2tfZnJvbV9maWxlKHNvY2tfZmlsZSwgJmVycik7CiAJaWYgKCFzb2NrKQpAQCAtMTU1NSw2ICsxNTQzLDcgQEAKIAogb3V0X3B1dDoKIAlmcHV0X2xpZ2h0KHNvY2tfZmlsZSwgZnB1dF9uZWVkZWQpOworb3V0OgogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE1ODYsMTIgKzE1NzUsMTMgQEAKIAlpbnQgZnB1dF9uZWVkZWQ7CiAKIAlzb2NrX2ZpbGUgPSBmZ2V0X2xpZ2h0KGZkLCAmZnB1dF9uZWVkZWQpOworCWVyciA9IC1FQkFERjsKIAlpZiAoIXNvY2tfZmlsZSkKLQkJcmV0dXJuIC1FQkFERjsKKwkJZ290byBvdXQ7CiAKIAlzb2NrID0gc29ja19mcm9tX2ZpbGUoc29ja19maWxlLCAmZXJyKTsKIAlpZiAoIXNvY2spCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9wdXQ7CiAKIAltc2cubXNnX2NvbnRyb2wgPSBOVUxMOwogCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CkBAIC0xNjEwLDggKzE2MDAsOSBAQAogCQlpZiAoZXJyMiA8IDApCiAJCQllcnIgPSBlcnIyOwogCX0KLW91dDoKK291dF9wdXQ6CiAJZnB1dF9saWdodChzb2NrX2ZpbGUsIGZwdXRfbmVlZGVkKTsKK291dDoKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuYwppbmRleCA0YzE2MTEyLi5jMWY4NzgxIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Yy5jCisrKyBiL25ldC9zdW5ycGMvc3ZjLmMKQEAgLTM4Niw3ICszODYsNyBAQAogCQlzdnNrID0gbGlzdF9lbnRyeShzZXJ2LT5zdl90ZW1wc29ja3MubmV4dCwKIAkJCQkgIHN0cnVjdCBzdmNfc29jaywKIAkJCQkgIHNrX2xpc3QpOwotCQlzdmNfZGVsZXRlX3NvY2tldChzdnNrKTsKKwkJc3ZjX2Nsb3NlX3NvY2tldChzdnNrKTsKIAl9CiAJaWYgKHNlcnYtPnN2X3NodXRkb3duKQogCQlzZXJ2LT5zdl9zaHV0ZG93bihzZXJ2KTsKQEAgLTM5NSw3ICszOTUsNyBAQAogCQlzdnNrID0gbGlzdF9lbnRyeShzZXJ2LT5zdl9wZXJtc29ja3MubmV4dCwKIAkJCQkgIHN0cnVjdCBzdmNfc29jaywKIAkJCQkgIHNrX2xpc3QpOwotCQlzdmNfZGVsZXRlX3NvY2tldChzdnNrKTsKKwkJc3ZjX2Nsb3NlX3NvY2tldChzdnNrKTsKIAl9CiAJCiAJY2FjaGVfY2xlYW5fZGVmZXJyZWQoc2Vydik7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y3NvY2suYyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCmluZGV4IGZmMWY4YmYuLmNmOTNjZDEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3Zjc29jay5jCisrKyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCkBAIC02Miw2ICs2MiwxMiBAQAogICoJCWFmdGVyIGEgY2xlYXIsIHRoZSBzb2NrZXQgbXVzdCBiZSByZWFkL2FjY2VwdGVkCiAgKgkJIGlmIHRoaXMgc3VjY2VlZHMsIGl0IG11c3QgYmUgc2V0IGFnYWluLgogICoJU0tfQ0xPU0UgY2FuIHNldCBhdCBhbnkgdGltZS4gSXQgaXMgbmV2ZXIgY2xlYXJlZC4KKyAqICAgICAgc2tfaW51c2UgY29udGFpbnMgYSBiaWFzIG9mICcxJyB1bnRpbCBTS19ERUFEIGlzIHNldC4KKyAqICAgICAgICAgICAgIHNvIHdoZW4gc2tfaW51c2UgaGl0cyB6ZXJvLCB3ZSBrbm93IHRoZSBzb2NrZXQgaXMgZGVhZAorICogICAgICAgICAgICAgYW5kIG5vLW9uZSBpcyB1c2luZyBpdC4KKyAqICAgICAgU0tfREVBRCBjYW4gb25seSBiZSBzZXQgd2hpbGUgU0tfQlVTWSBpcyBoZWxkIHdoaWNoIGVuc3VyZXMKKyAqICAgICAgICAgICAgIG5vIG90aGVyIHRocmVhZCB3aWxsIGJlIHVzaW5nIHRoZSBzb2NrZXQgb3Igd2lsbCB0cnkgdG8KKyAqCSAgICAgICBzZXQgU0tfREVBRC4KICAqCiAgKi8KIApAQCAtNzAsNiArNzYsNyBAQAogCiBzdGF0aWMgc3RydWN0IHN2Y19zb2NrICpzdmNfc2V0dXBfc29ja2V0KHN0cnVjdCBzdmNfc2VydiAqLCBzdHJ1Y3Qgc29ja2V0ICosCiAJCQkJCSBpbnQgKmVycnAsIGludCBwbWFwX3JlZyk7CitzdGF0aWMgdm9pZAkJc3ZjX2RlbGV0ZV9zb2NrZXQoc3RydWN0IHN2Y19zb2NrICpzdnNrKTsKIHN0YXRpYyB2b2lkCQlzdmNfdWRwX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKiwgaW50KTsKIHN0YXRpYyBpbnQJCXN2Y191ZHBfcmVjdmZyb20oc3RydWN0IHN2Y19ycXN0ICopOwogc3RhdGljIGludAkJc3ZjX3VkcF9zZW5kdG8oc3RydWN0IHN2Y19ycXN0ICopOwpAQCAtMzI5LDggKzMzNiw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIHN2Y19zb2NrX3B1dChzdHJ1Y3Qgc3ZjX3NvY2sgKnN2c2spCiB7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnN2c2stPnNrX2ludXNlKSAmJgotCQkJdGVzdF9iaXQoU0tfREVBRCwgJnN2c2stPnNrX2ZsYWdzKSkgeworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzdnNrLT5za19pbnVzZSkpIHsKKwkJQlVHX09OKCEgdGVzdF9iaXQoU0tfREVBRCwgJnN2c2stPnNrX2ZsYWdzKSk7CisKIAkJZHByaW50aygic3ZjOiByZWxlYXNpbmcgZGVhZCBzb2NrZXRcbiIpOwogCQlpZiAoc3Zzay0+c2tfc29jay0+ZmlsZSkKIAkJCXNvY2tmZF9wdXQoc3Zzay0+c2tfc29jayk7CkBAIC01MjAsNyArNTI4LDcgQEAKIAogCWlmICghc2VydikKIAkJcmV0dXJuIDA7Ci0Jc3Bpbl9sb2NrKCZzZXJ2LT5zdl9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNlcnYtPnN2X2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ZzaywgJnNlcnYtPnN2X3Blcm1zb2Nrcywgc2tfbGlzdCkgewogCQlpbnQgb25lbGVuID0gb25lX3NvY2tfbmFtZShidWYrbGVuLCBzdnNrKTsKIAkJaWYgKHRvY2xvc2UgJiYgc3RyY21wKHRvY2xvc2UsIGJ1ZitsZW4pID09IDApCkBAIC01MjgsMTIgKzUzNiwxMiBAQAogCQllbHNlCiAJCQlsZW4gKz0gb25lbGVuOwogCX0KLQlzcGluX3VubG9jaygmc2Vydi0+c3ZfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOwogCWlmIChjbG9zZXNrKQogCQkvKiBTaG91bGQgdW5yZWdpc3RlciB3aXRoIHBvcnRtYXAsIGJ1dCB5b3UgY2Fubm90CiAJCSAqIHVucmVnaXN0ZXIganVzdCBvbmUgcHJvdG9jb2wuLi4KIAkJICovCi0JCXN2Y19kZWxldGVfc29ja2V0KGNsb3Nlc2spOworCQlzdmNfY2xvc2Vfc29ja2V0KGNsb3Nlc2spOwogCWVsc2UgaWYgKHRvY2xvc2UpCiAJCXJldHVybiAtRU5PRU5UOwogCXJldHVybiBsZW47CkBAIC02ODMsNiArNjkxLDExIEBACiAJCXJldHVybiBzdmNfZGVmZXJyZWRfcmVjdihycXN0cCk7CiAJfQogCisJaWYgKHRlc3RfYml0KFNLX0NMT1NFLCAmc3Zzay0+c2tfZmxhZ3MpKSB7CisJCXN2Y19kZWxldGVfc29ja2V0KHN2c2spOworCQlyZXR1cm4gMDsKKwl9CisKIAljbGVhcl9iaXQoU0tfREFUQSwgJnN2c2stPnNrX2ZsYWdzKTsKIAl3aGlsZSAoKHNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHN2c2stPnNrX3NrLCAwLCAxLCAmZXJyKSkgPT0gTlVMTCkgewogCQlpZiAoZXJyID09IC1FQUdBSU4pIHsKQEAgLTExNzYsNyArMTE4OSw4IEBACiAJCSAgICAgICBycXN0cC0+cnFfc29jay0+c2tfc2VydmVyLT5zdl9uYW1lLAogCQkgICAgICAgKHNlbnQ8MCk/ImdvdCBlcnJvciI6InNlbnQgb25seSIsCiAJCSAgICAgICBzZW50LCB4YnVmcC0+bGVuKTsKLQkJc3ZjX2RlbGV0ZV9zb2NrZXQocnFzdHAtPnJxX3NvY2spOworCQlzZXRfYml0KFNLX0NMT1NFLCAmcnFzdHAtPnJxX3NvY2stPnNrX2ZsYWdzKTsKKwkJc3ZjX3NvY2tfZW5xdWV1ZShycXN0cC0+cnFfc29jayk7CiAJCXNlbnQgPSAtRUFHQUlOOwogCX0KIAlyZXR1cm4gc2VudDsKQEAgLTE0OTUsNyArMTUwOSw3IEBACiAJc3Zzay0+c2tfb2RhdGEgPSBpbmV0LT5za19kYXRhX3JlYWR5OwogCXN2c2stPnNrX293c3BhY2UgPSBpbmV0LT5za193cml0ZV9zcGFjZTsKIAlzdnNrLT5za19zZXJ2ZXIgPSBzZXJ2OwotCWF0b21pY19zZXQoJnN2c2stPnNrX2ludXNlLCAwKTsKKwlhdG9taWNfc2V0KCZzdnNrLT5za19pbnVzZSwgMSk7CiAJc3Zzay0+c2tfbGFzdHJlY3YgPSBnZXRfc2Vjb25kcygpOwogCXNwaW5fbG9ja19pbml0KCZzdnNrLT5za19kZWZlcl9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmc3Zzay0+c2tfZGVmZXJyZWQpOwpAQCAtMTYxOCw3ICsxNjMyLDcgQEAKIC8qCiAgKiBSZW1vdmUgYSBkZWFkIHNvY2tldAogICovCi12b2lkCitzdGF0aWMgdm9pZAogc3ZjX2RlbGV0ZV9zb2NrZXQoc3RydWN0IHN2Y19zb2NrICpzdnNrKQogewogCXN0cnVjdCBzdmNfc2Vydgkqc2VydjsKQEAgLTE2NDQsMTYgKzE2NTgsMjYgQEAKIAkgKiB3aGlsZSBzdGlsbCBhdHRhY2hlZCB0byBhIHF1ZXVlLCB0aGUgcXVldWUgaXRzZWxmCiAJICogaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkIChpbiBzdmNfZGVzdHJveSkuCiAJICovCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNLX0RFQUQsICZzdnNrLT5za19mbGFncykpCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNLX0RFQUQsICZzdnNrLT5za19mbGFncykpIHsKKwkJQlVHX09OKGF0b21pY19yZWFkKCZzdnNrLT5za19pbnVzZSk8Mik7CisJCWF0b21pY19kZWMoJnN2c2stPnNrX2ludXNlKTsKIAkJaWYgKHRlc3RfYml0KFNLX1RFTVAsICZzdnNrLT5za19mbGFncykpCiAJCQlzZXJ2LT5zdl90bXBjbnQtLTsKKwl9CiAKLQkvKiBUaGlzIGF0b21pY19pbmMgc2hvdWxkIGJlIG5lZWRlZCAtIHN2Y19kZWxldGVfc29ja2V0Ci0JICogc2hvdWxkIGhhdmUgdGhlIHNlbWFudGljIG9mIGRyb3BwaW5nIGEgcmVmZXJlbmNlLgotCSAqIEJ1dCBpdCBkb2Vzbid0IHlldC4uLi4KLQkgKi8KLQlhdG9taWNfaW5jKCZzdnNrLT5za19pbnVzZSk7CiAJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOworfQorCit2b2lkIHN2Y19jbG9zZV9zb2NrZXQoc3RydWN0IHN2Y19zb2NrICpzdnNrKQoreworCXNldF9iaXQoU0tfQ0xPU0UsICZzdnNrLT5za19mbGFncyk7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoU0tfQlVTWSwgJnN2c2stPnNrX2ZsYWdzKSkKKwkJLyogc29tZW9uZSBlbHNlIHdpbGwgaGF2ZSB0byBlZmZlY3QgdGhlIGNsb3NlICovCisJCXJldHVybjsKKworCWF0b21pY19pbmMoJnN2c2stPnNrX2ludXNlKTsKKwlzdmNfZGVsZXRlX3NvY2tldChzdnNrKTsKKwljbGVhcl9iaXQoU0tfQlVTWSwgJnN2c2stPnNrX2ZsYWdzKTsKIAlzdmNfc29ja19wdXQoc3Zzayk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jIGIvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKaW5kZXggNzY5Y2RkNi4uNGQ5MGExNyAxMDA2NDQKLS0tIGEvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKKysrIGIvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKQEAgLTg2LDggKzg2LDggQEAKIAogc3RhdGljIHN0cnVjdCB3YW5fZGV2aWNlICp3YW5yb3V0ZXJfZmluZF9kZXZpY2UoY2hhciAqbmFtZSk7CiBzdGF0aWMgaW50IHdhbnJvdXRlcl9kZWxldGVfaW50ZXJmYWNlKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIGNoYXIgKm5hbWUpOwotdm9pZCBsb2NrX2FkYXB0ZXJfaXJxKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7Ci12b2lkIHVubG9ja19hZGFwdGVyX2lycShzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOworc3RhdGljIHZvaWQgbG9ja19hZGFwdGVyX2lycShzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOworc3RhdGljIHZvaWQgdW5sb2NrX2FkYXB0ZXJfaXJxKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7CiAKIAogCkBAIC0xMDQsOCArMTA0LDggQEAKICAqCU9yZ2FuaXplIFVuaXF1ZSBJZGVudGlmaWVycyBmb3IgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgd2Fucm91dGVyX291aV9ldGhlcltdID0geyAweDAwLCAweDAwLCAweDAwIH07CiAjaWYgMAorc3RhdGljIHVuc2lnbmVkIGNoYXIgd2Fucm91dGVyX291aV9ldGhlcltdID0geyAweDAwLCAweDAwLCAweDAwIH07CiBzdGF0aWMgdW5zaWduZWQgY2hhciB3YW5yb3V0ZXJfb3VpXzgwMl8yW10gPSB7IDB4MDAsIDB4ODAsIDB4QzIgfTsKICNlbmRpZgogCkBAIC0yNDYsNiArMjQ2LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIDAKKwogLyoKICAqCUVuY2Fwc3VsYXRlIHBhY2tldC4KICAqCkBAIC0zNDEsNiArMzQzLDcgQEAKIAlyZXR1cm4gZXRoZXJ0eXBlOwogfQogCisjZW5kaWYgIC8qICAwICAqLwogCiAvKgogICoJV0FOIGRldmljZSBJT0NUTC4KQEAgLTc5OSwyMyArODAyLDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbG9ja19hZGFwdGVyX2lycShzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCitzdGF0aWMgdm9pZCBsb2NrX2FkYXB0ZXJfaXJxKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncykKIHsKICAgICAgICAJc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgKnNtcF9mbGFncyk7CiB9CiAKIAotdm9pZCB1bmxvY2tfYWRhcHRlcl9pcnEoc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKQorc3RhdGljIHZvaWQgdW5sb2NrX2FkYXB0ZXJfaXJxKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncykKIHsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssICpzbXBfZmxhZ3MpOwogfQogCiBFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX3dhbl9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3dhbl9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTCh3YW5yb3V0ZXJfZW5jYXBzdWxhdGUpOwotRVhQT1JUX1NZTUJPTCh3YW5yb3V0ZXJfdHlwZV90cmFucyk7Ci1FWFBPUlRfU1lNQk9MKGxvY2tfYWRhcHRlcl9pcnEpOwotRVhQT1JUX1NZTUJPTCh1bmxvY2tfYWRhcHRlcl9pcnEpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL25ldC94MjUvTWFrZWZpbGUgYi9uZXQveDI1L01ha2VmaWxlCmluZGV4IDU4N2E3MWEuLmEyYzM0YWIgMTAwNjQ0Ci0tLSBhL25ldC94MjUvTWFrZWZpbGUKKysrIGIvbmV0L3gyNS9NYWtlZmlsZQpAQCAtNiw1ICs2LDUgQEAKIAogeDI1LXkJCQk6PSBhZl94MjUubyB4MjVfZGV2Lm8geDI1X2ZhY2lsaXRpZXMubyB4MjVfaW4ubyBcCiAJCQkgICB4MjVfbGluay5vIHgyNV9vdXQubyB4MjVfcm91dGUubyB4MjVfc3Vici5vIFwKLQkJCSAgIHgyNV90aW1lci5vIHgyNV9wcm9jLm8KKwkJCSAgIHgyNV90aW1lci5vIHgyNV9wcm9jLm8geDI1X2ZvcndhcmQubwogeDI1LSQoQ09ORklHX1NZU0NUTCkJKz0gc3lzY3RsX25ldF94MjUubwpkaWZmIC0tZ2l0IGEvbmV0L3gyNS9hZl94MjUuYyBiL25ldC94MjUvYWZfeDI1LmMKaW5kZXggYjVjODBiMS4uYjM3ZDg5NCAxMDA2NDQKLS0tIGEvbmV0L3gyNS9hZl94MjUuYworKysgYi9uZXQveDI1L2FmX3gyNS5jCkBAIC02Myw2ICs2Myw3IEBACiBpbnQgc3lzY3RsX3gyNV9yZXNldF9yZXF1ZXN0X3RpbWVvdXQgICA9IFgyNV9ERUZBVUxUX1QyMjsKIGludCBzeXNjdGxfeDI1X2NsZWFyX3JlcXVlc3RfdGltZW91dCAgID0gWDI1X0RFRkFVTFRfVDIzOwogaW50IHN5c2N0bF94MjVfYWNrX2hvbGRiYWNrX3RpbWVvdXQgICAgPSBYMjVfREVGQVVMVF9UMjsKK2ludCBzeXNjdGxfeDI1X2ZvcndhcmQgICAgICAgICAgICAgICAgID0gMDsKIAogSExJU1RfSEVBRCh4MjVfbGlzdCk7CiBERUZJTkVfUldMT0NLKHgyNV9saXN0X2xvY2spOwpAQCAtODQ2LDcgKzg0Nyw3IEBACiAJc3RydWN0IHgyNV9hZGRyZXNzIHNvdXJjZV9hZGRyLCBkZXN0X2FkZHI7CiAJc3RydWN0IHgyNV9mYWNpbGl0aWVzIGZhY2lsaXRpZXM7CiAJc3RydWN0IHgyNV9kdGVfZmFjaWxpdGllcyBkdGVfZmFjaWxpdGllczsKLQlpbnQgbGVuLCByYzsKKwlpbnQgbGVuLCBhZGRyX2xlbiwgcmM7CiAKIAkvKgogCSAqCVJlbW92ZSB0aGUgTENJIGFuZCBmcmFtZSB0eXBlLgpAQCAtODU3LDcgKzg1OCw4IEBACiAJICoJRXh0cmFjdCB0aGUgWC4yNSBhZGRyZXNzZXMgYW5kIGNvbnZlcnQgdGhlbSB0byBBU0NJSSBzdHJpbmdzLAogCSAqCWFuZCByZW1vdmUgdGhlbS4KIAkgKi8KLQlza2JfcHVsbChza2IsIHgyNV9hZGRyX250b2Eoc2tiLT5kYXRhLCAmc291cmNlX2FkZHIsICZkZXN0X2FkZHIpKTsKKwlhZGRyX2xlbiA9IHgyNV9hZGRyX250b2Eoc2tiLT5kYXRhLCAmc291cmNlX2FkZHIsICZkZXN0X2FkZHIpOworCXNrYl9wdWxsKHNrYiwgYWRkcl9sZW4pOwogCiAJLyoKIAkgKglHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZmFjaWxpdGllcywgc2tpcCBwYXN0IHRoZW0gZm9yIHRoZSBtb21lbnQKQEAgLTg3MywxMSArODc1LDI4IEBACiAJc2sgPSB4MjVfZmluZF9saXN0ZW5lcigmc291cmNlX2FkZHIsc2tiKTsKIAlza2JfcHVzaChza2IsbGVuKTsKIAorCWlmIChzayAhPSBOVUxMICYmIHNrX2FjY2VwdHFfaXNfZnVsbChzaykpIHsKKwkJZ290byBvdXRfc29ja19wdXQ7CisJfQorCiAJLyoKLQkgKglXZSBjYW4ndCBhY2NlcHQgdGhlIENhbGwgUmVxdWVzdC4KKwkgKglXZSBkb250IGhhdmUgYW55IGxpc3RlbmVycyBmb3IgdGhpcyBpbmNvbWluZyBjYWxsLgorCSAqCVRyeSBmb3J3YXJkaW5nIGl0LgogCSAqLwotCWlmIChzayA9PSBOVUxMIHx8IHNrX2FjY2VwdHFfaXNfZnVsbChzaykpCi0JCWdvdG8gb3V0X2NsZWFyX3JlcXVlc3Q7CisJaWYgKHNrID09IE5VTEwpIHsKKwkJc2tiX3B1c2goc2tiLCBhZGRyX2xlbiArIFgyNV9TVERfTUlOX0xFTik7CisJCWlmIChzeXNjdGxfeDI1X2ZvcndhcmQgJiYKKwkJCQl4MjVfZm9yd2FyZF9jYWxsKCZkZXN0X2FkZHIsIG5iLCBza2IsIGxjaSkgPiAwKQorCQl7CisJCQkvKiBDYWxsIHdhcyBmb3J3YXJkZWQsIGRvbnQgcHJvY2VzcyBpdCBhbnkgbW9yZSAqLworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyYyA9IDE7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vIGxpc3RlbmVycywgY2FuJ3QgZm9yd2FyZCwgY2xlYXIgdGhlIGNhbGwgKi8KKwkJCWdvdG8gb3V0X2NsZWFyX3JlcXVlc3Q7CisJCX0KKwl9CiAKIAkvKgogCSAqCVRyeSB0byByZWFjaCBhIGNvbXByb21pc2Ugb24gdGhlIHJlcXVlc3RlZCBmYWNpbGl0aWVzLgpAQCAtMTU5OCw2ICsxNjE3LDkgQEAKIAkJCXgyNV9kaXNjb25uZWN0KHMsIEVORVRVTlJFQUNILCAwLCAwKTsKIAogCXdyaXRlX3VubG9ja19iaCgmeDI1X2xpc3RfbG9jayk7CisKKwkvKiBSZW1vdmUgYW55IHJlbGF0ZWQgZm9yd2FyZHMgKi8KKwl4MjVfY2xlYXJfZm9yd2FyZF9ieV9kZXYobmItPmRldik7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHgyNV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQveDI1L3N5c2N0bF9uZXRfeDI1LmMgYi9uZXQveDI1L3N5c2N0bF9uZXRfeDI1LmMKaW5kZXggYWFiZGE1OS4uMmIyZTdmZCAxMDA2NDQKLS0tIGEvbmV0L3gyNS9zeXNjdGxfbmV0X3gyNS5jCisrKyBiL25ldC94MjUvc3lzY3RsX25ldF94MjUuYwpAQCAtNzMsNiArNzMsMTQgQEAKIAkJLmV4dHJhMSA9CSZtaW5fdGltZXIsCiAJCS5leHRyYTIgPQkmbWF4X3RpbWVyLAogCX0sCisJeworCQkuY3RsX25hbWUgPQlORVRfWDI1X0ZPUldBUkQsCisJCS5wcm9jbmFtZSA9CSJ4MjVfZm9yd2FyZCIsCisJCS5kYXRhID0gCSZzeXNjdGxfeDI1X2ZvcndhcmQsCisJCS5tYXhsZW4gPSAJc2l6ZW9mKGludCksCisJCS5tb2RlID0gCTA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYywKKwl9LAogCXsgMCwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL25ldC94MjUveDI1X2Rldi5jIGIvbmV0L3gyNS94MjVfZGV2LmMKaW5kZXggMzI4ZDgwZi4uZjA5OWZkNiAxMDA2NDQKLS0tIGEvbmV0L3gyNS94MjVfZGV2LmMKKysrIGIvbmV0L3gyNS94MjVfZGV2LmMKQEAgLTY3LDkgKzY3LDE4IEBACiAJCXJldHVybiB4MjVfcnhfY2FsbF9yZXF1ZXN0KHNrYiwgbmIsIGxjaSk7CiAKIAkvKgotCSAqCUl0cyBub3QgYSBDYWxsIFJlcXVlc3QsIG5vciBpcyBpdCBhIGNvbnRyb2wgZnJhbWUuCi0JICogICAgICBMZXQgY2FsbGVyIHRocm93IGl0IGF3YXkuCisJICogCUl0cyBub3QgYSBDYWxsIFJlcXVlc3QsIG5vciBpcyBpdCBhIGNvbnRyb2wgZnJhbWUuCisJICoJQ2FuIHdlIGZvcndhcmQgaXQ/CiAJICovCisKKwlpZiAoeDI1X2ZvcndhcmRfZGF0YShsY2ksIG5iLCBza2IpKSB7CisJCWlmIChmcmFtZXR5cGUgPT0gWDI1X0NMRUFSX0NPTkZJUk1BVElPTikgeworCQkJeDI1X2NsZWFyX2ZvcndhcmRfYnlfbGNpKGxjaSk7CisJCX0KKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAxOworCX0KKwogLyoKIAl4MjVfdHJhbnNtaXRfY2xlYXJfcmVxdWVzdChuYiwgbGNpLCAweDBEKTsKICovCmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9mb3J3YXJkLmMgYi9uZXQveDI1L3gyNV9mb3J3YXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzOWUwYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC94MjUveDI1X2ZvcndhcmQuYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqCVRoaXMgbW9kdWxlOgorICoJCVRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglIaXN0b3J5CisgKgkwMy0wMS0yMDA3CUFkZGVkIGZvcndhcmRpbmcgZm9yIHguMjUJQW5kcmV3IEhlbmRyeQorICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC94MjUuaD4KKworc3RydWN0IGxpc3RfaGVhZCB4MjVfZm9yd2FyZF9saXN0ID0gTElTVF9IRUFEX0lOSVQoeDI1X2ZvcndhcmRfbGlzdCk7CitERUZJTkVfUldMT0NLKHgyNV9mb3J3YXJkX2xpc3RfbG9jayk7CisKK2ludCB4MjVfZm9yd2FyZF9jYWxsKHN0cnVjdCB4MjVfYWRkcmVzcyAqZGVzdF9hZGRyLCBzdHJ1Y3QgeDI1X25laWdoICpmcm9tLAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxjaSkKK3sKKwlzdHJ1Y3QgeDI1X3JvdXRlICpydDsKKwlzdHJ1Y3QgeDI1X25laWdoICpuZWlnaF9uZXcgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCB4MjVfZm9yd2FyZCAqeDI1X2Zyd2QsICpuZXdfZnJ3ZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tibjsKKwlzaG9ydCBzYW1lX2xjaSA9IDA7CisJaW50IHJjID0gMDsKKworCWlmICgocnQgPSB4MjVfZ2V0X3JvdXRlKGRlc3RfYWRkcikpICE9IE5VTEwpIHsKKworCQlpZiAoKG5laWdoX25ldyA9IHgyNV9nZXRfbmVpZ2gocnQtPmRldikpID09IE5VTEwpIHsKKwkJCS8qIFRoaXMgc2hvdWxkbnQgaGFwcGVuLCBpZiBpdCBvY2N1cnMgc29tZWhvdworCQkJICogZG8gc29tZXRoaW5nIHNlbnNpYmxlCisJCQkgKi8KKwkJCWdvdG8gb3V0X3B1dF9yb3V0ZTsKKwkJfQorCisJCS8qIEF2b2lkIGEgbG9vcC4gVGhpcyBpcyB0aGUgbm9ybWFsIGV4aXQgcGF0aCBmb3IgYQorCQkgKiBzeXN0ZW0gd2l0aCBvbmx5IG9uZSB4LjI1IGlmYWNlIGFuZCBkZWZhdWx0IHJvdXRlCisJCSAqLworCQlpZiAocnQtPmRldiA9PSBmcm9tLT5kZXYpIHsKKwkJCWdvdG8gb3V0X3B1dF9uYjsKKwkJfQorCisJCS8qIFJlbW90ZSBlbmQgc2VuZGluZyBhIGNhbGwgcmVxdWVzdCBvbiBhbiBhbHJlYWR5CisJCSAqIGVzdGFibGlzaGVkIExDST8gSXQgc2hvdWxkbnQgaGFwcGVuLCBqdXN0IGluIGNhc2UuLgorCQkgKi8KKwkJcmVhZF9sb2NrX2JoKCZ4MjVfZm9yd2FyZF9saXN0X2xvY2spOworCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmeDI1X2ZvcndhcmRfbGlzdCkgeworCQkJeDI1X2Zyd2QgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgeDI1X2ZvcndhcmQsIG5vZGUpOworCQkJaWYgKHgyNV9mcndkLT5sY2kgPT0gbGNpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiWC4yNTogY2FsbCByZXF1ZXN0IGZvciBsY2kgd2hpY2ggaXMgYWxyZWFkeSByZWdpc3RlcmVkISwgdHJhbnNtaXR0aW5nIGJ1dCBub3QgcmVnaXN0ZXJpbmcgbmV3IHBhaXJcbiIpOworCQkJCXNhbWVfbGNpID0gMTsKKwkJCX0KKwkJfQorCQlyZWFkX3VubG9ja19iaCgmeDI1X2ZvcndhcmRfbGlzdF9sb2NrKTsKKworCQkvKiBTYXZlIHRoZSBmb3J3YXJkaW5nIGRldGFpbHMgZm9yIGZ1dHVyZSB0cmFmZmljICovCisJCWlmICghc2FtZV9sY2kpeworCQkJaWYgKChuZXdfZnJ3ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB4MjVfZm9yd2FyZCksCisJCQkJCQkJR0ZQX0FUT01JQykpID09IE5VTEwpeworCQkJCXJjID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dF9wdXRfbmI7CisJCQl9CisJCQluZXdfZnJ3ZC0+bGNpID0gbGNpOworCQkJbmV3X2Zyd2QtPmRldjEgPSBydC0+ZGV2OworCQkJbmV3X2Zyd2QtPmRldjIgPSBmcm9tLT5kZXY7CisJCQl3cml0ZV9sb2NrX2JoKCZ4MjVfZm9yd2FyZF9saXN0X2xvY2spOworCQkJbGlzdF9hZGQoJm5ld19mcndkLT5ub2RlLCAmeDI1X2ZvcndhcmRfbGlzdCk7CisJCQl3cml0ZV91bmxvY2tfYmgoJngyNV9mb3J3YXJkX2xpc3RfbG9jayk7CisJCX0KKworCQkvKiBGb3J3YXJkIHRoZSBjYWxsIHJlcXVlc3QgKi8KKwkJaWYgKCAoc2tibiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKXsKKwkJCWdvdG8gb3V0X3B1dF9uYjsKKwkJfQorCQl4MjVfdHJhbnNtaXRfbGluayhza2JuLCBuZWlnaF9uZXcpOworCQlyYyA9IDE7CisJfQorCisKK291dF9wdXRfbmI6CisJeDI1X25laWdoX3B1dChuZWlnaF9uZXcpOworCitvdXRfcHV0X3JvdXRlOgorCXgyNV9yb3V0ZV9wdXQocnQpOworCXJldHVybiByYzsKK30KKworCitpbnQgeDI1X2ZvcndhcmRfZGF0YShpbnQgbGNpLCBzdHJ1Y3QgeDI1X25laWdoICpmcm9tLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7CisKKwlzdHJ1Y3QgeDI1X2ZvcndhcmQgKmZyd2Q7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBlZXIgPSBOVUxMOworCXN0cnVjdCB4MjVfbmVpZ2ggKm5iOworCXN0cnVjdCBza19idWZmICpza2JuOworCWludCByYyA9IDA7CisKKwlyZWFkX2xvY2tfYmgoJngyNV9mb3J3YXJkX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJngyNV9mb3J3YXJkX2xpc3QpIHsKKwkJZnJ3ZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCB4MjVfZm9yd2FyZCwgbm9kZSk7CisJCWlmIChmcndkLT5sY2kgPT0gbGNpKSB7CisJCQkvKiBUaGUgY2FsbCBpcyBlc3RhYmxpc2hlZCwgZWl0aGVyIHNpZGUgY2FuIHNlbmQgKi8KKwkJCWlmIChmcm9tLT5kZXYgPT0gZnJ3ZC0+ZGV2MSkgeworCQkJCXBlZXIgPSBmcndkLT5kZXYyOworCQkJfSBlbHNlIHsKKwkJCQlwZWVyID0gZnJ3ZC0+ZGV2MTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrX2JoKCZ4MjVfZm9yd2FyZF9saXN0X2xvY2spOworCisJaWYgKCAobmIgPSB4MjVfZ2V0X25laWdoKHBlZXIpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWlmICggKHNrYm4gPSBwc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCl7CisJCWdvdG8gb3V0OworCisJfQorCXgyNV90cmFuc21pdF9saW5rKHNrYm4sIG5iKTsKKworCXgyNV9uZWlnaF9wdXQobmIpOworCXJjID0gMTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgeDI1X2NsZWFyX2ZvcndhcmRfYnlfbGNpKHVuc2lnbmVkIGludCBsY2kpCit7CisJc3RydWN0IHgyNV9mb3J3YXJkICpmd2Q7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisKKwl3cml0ZV9sb2NrX2JoKCZ4MjVfZm9yd2FyZF9saXN0X2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZ4MjVfZm9yd2FyZF9saXN0KSB7CisJCWZ3ZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCB4MjVfZm9yd2FyZCwgbm9kZSk7CisJCWlmIChmd2QtPmxjaSA9PSBsY2kpIHsKKwkJCWxpc3RfZGVsKCZmd2QtPm5vZGUpOworCQkJa2ZyZWUoZndkKTsKKwkJfQorCX0KKwl3cml0ZV91bmxvY2tfYmgoJngyNV9mb3J3YXJkX2xpc3RfbG9jayk7Cit9CisKKwordm9pZCB4MjVfY2xlYXJfZm9yd2FyZF9ieV9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeDI1X2ZvcndhcmQgKmZ3ZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKnRtcDsKKworCXdyaXRlX2xvY2tfYmgoJngyNV9mb3J3YXJkX2xpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJngyNV9mb3J3YXJkX2xpc3QpIHsKKwkJZndkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHgyNV9mb3J3YXJkLCBub2RlKTsKKwkJaWYgKChmd2QtPmRldjEgPT0gZGV2KSB8fCAoZndkLT5kZXYyID09IGRldikpeworCQkJbGlzdF9kZWwoJmZ3ZC0+bm9kZSk7CisJCQlrZnJlZShmd2QpOworCQl9CisJfQorCXdyaXRlX3VubG9ja19iaCgmeDI1X2ZvcndhcmRfbGlzdF9sb2NrKTsKK30KZGlmZiAtLWdpdCBhL25ldC94MjUveDI1X3Byb2MuYyBiL25ldC94MjUveDI1X3Byb2MuYwppbmRleCBhMTE4MzdkLi5lMDQ3MGJkIDEwMDY0NAotLS0gYS9uZXQveDI1L3gyNV9wcm9jLmMKKysrIGIvbmV0L3gyNS94MjVfcHJvYy5jCkBAIC0xNjUsNiArMTY1LDc1IEBACiAJcmV0dXJuIDA7CiB9IAogCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgeDI1X2ZvcndhcmQgKngyNV9nZXRfZm9yd2FyZF9pZHgobG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgeDI1X2ZvcndhcmQgKmY7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmeDI1X2ZvcndhcmRfbGlzdCkgeworCQlmID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHgyNV9mb3J3YXJkLCBub2RlKTsKKwkJaWYgKCFwb3MtLSkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJZiA9IE5VTEw7Citmb3VuZDoKKwlyZXR1cm4gZjsKK30KKworc3RhdGljIHZvaWQgKngyNV9zZXFfZm9yd2FyZF9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJbG9mZl90IGwgPSAqcG9zOworCisJcmVhZF9sb2NrX2JoKCZ4MjVfZm9yd2FyZF9saXN0X2xvY2spOworCXJldHVybiBsID8geDI1X2dldF9mb3J3YXJkX2lkeCgtLWwpIDogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqeDI1X3NlcV9mb3J3YXJkX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB4MjVfZm9yd2FyZCAqZjsKKworCSsrKnBvczsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJZiA9IE5VTEw7CisJCWlmICghbGlzdF9lbXB0eSgmeDI1X2ZvcndhcmRfbGlzdCkpCisJCQlmID0gbGlzdF9lbnRyeSh4MjVfZm9yd2FyZF9saXN0Lm5leHQsCisJCQkJCXN0cnVjdCB4MjVfZm9yd2FyZCwgbm9kZSk7CisJCWdvdG8gb3V0OworCX0KKwlmID0gdjsKKwlpZiAoZi0+bm9kZS5uZXh0ICE9ICZ4MjVfZm9yd2FyZF9saXN0KQorCQlmID0gbGlzdF9lbnRyeShmLT5ub2RlLm5leHQsIHN0cnVjdCB4MjVfZm9yd2FyZCwgbm9kZSk7CisJZWxzZQorCQlmID0gTlVMTDsKK291dDoKKwlyZXR1cm4gZjsKKworfQorCitzdGF0aWMgdm9pZCB4MjVfc2VxX2ZvcndhcmRfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9ja19iaCgmeDI1X2ZvcndhcmRfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIGludCB4MjVfc2VxX2ZvcndhcmRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgeDI1X2ZvcndhcmQgKmY7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3ByaW50ZihzZXEsICJsY2kgZGV2MSAgICAgICBkZXYyXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZiA9IHY7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiVkICUtMTBzICUtMTBzXG4iLAorCQkJZi0+bGNpLCBmLT5kZXYxLT5uYW1lLCBmLT5kZXYyLT5uYW1lKTsKKworb3V0OgorCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHgyNV9zZXFfcm91dGVfb3BzID0gewogCS5zdGFydCAgPSB4MjVfc2VxX3JvdXRlX3N0YXJ0LAogCS5uZXh0ICAgPSB4MjVfc2VxX3JvdXRlX25leHQsCkBAIC0xNzksNiArMjQ4LDEzIEBACiAJLnNob3cgICA9IHgyNV9zZXFfc29ja2V0X3Nob3csCiB9OwogCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHgyNV9zZXFfZm9yd2FyZF9vcHMgPSB7CisJLnN0YXJ0ICA9IHgyNV9zZXFfZm9yd2FyZF9zdGFydCwKKwkubmV4dCAgID0geDI1X3NlcV9mb3J3YXJkX25leHQsCisJLnN0b3AgICA9IHgyNV9zZXFfZm9yd2FyZF9zdG9wLAorCS5zaG93ICAgPSB4MjVfc2VxX2ZvcndhcmRfc2hvdywKK307CisKIHN0YXRpYyBpbnQgeDI1X3NlcV9zb2NrZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJngyNV9zZXFfc29ja2V0X29wcyk7CkBAIC0xODksNiArMjY1LDExIEBACiAJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZ4MjVfc2VxX3JvdXRlX29wcyk7CiB9CiAKK3N0YXRpYyBpbnQgeDI1X3NlcV9mb3J3YXJkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZ4MjVfc2VxX2ZvcndhcmRfb3BzKTsKK30KKwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeDI1X3NlcV9zb2NrZXRfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCT0geDI1X3NlcV9zb2NrZXRfb3BlbiwKQEAgLTIwNSw2ICsyODYsMTQgQEAKIAkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAogfTsKIAorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeDI1X3NlcV9mb3J3YXJkX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHgyNV9zZXFfZm9yd2FyZF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp4MjVfcHJvY19kaXI7CiAKIGludCBfX2luaXQgeDI1X3Byb2NfaW5pdCh2b2lkKQpAQCAtMjI1LDkgKzMxNCwxNyBAQAogCWlmICghcCkKIAkJZ290byBvdXRfc29ja2V0OwogCXAtPnByb2NfZm9wcyA9ICZ4MjVfc2VxX3NvY2tldF9mb3BzOworCisJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJmb3J3YXJkIiwgU19JUlVHTywgeDI1X3Byb2NfZGlyKTsKKwlpZiAoIXApCisJCWdvdG8gb3V0X2ZvcndhcmQ7CisJcC0+cHJvY19mb3BzID0gJngyNV9zZXFfZm9yd2FyZF9mb3BzOwogCXJjID0gMDsKKwogb3V0OgogCXJldHVybiByYzsKK291dF9mb3J3YXJkOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJzb2NrZXQiLCB4MjVfcHJvY19kaXIpOwogb3V0X3NvY2tldDoKIAlyZW1vdmVfcHJvY19lbnRyeSgicm91dGUiLCB4MjVfcHJvY19kaXIpOwogb3V0X3JvdXRlOgpAQCAtMjM3LDYgKzMzNCw3IEBACiAKIHZvaWQgX19leGl0IHgyNV9wcm9jX2V4aXQodm9pZCkKIHsKKwlyZW1vdmVfcHJvY19lbnRyeSgiZm9yd2FyZCIsIHgyNV9wcm9jX2Rpcik7CiAJcmVtb3ZlX3Byb2NfZW50cnkoInJvdXRlIiwgeDI1X3Byb2NfZGlyKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgic29ja2V0IiwgeDI1X3Byb2NfZGlyKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgieDI1IiwgcHJvY19uZXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3gyNS94MjVfcm91dGUuYyBiL25ldC94MjUveDI1X3JvdXRlLmMKaW5kZXggMmEzZmU5OC4uODgzYTg0OCAxMDA2NDQKLS0tIGEvbmV0L3gyNS94MjVfcm91dGUuYworKysgYi9uZXQveDI1L3gyNV9yb3V0ZS5jCkBAIC0xMTksNiArMTE5LDkgQEAKIAkJCV9feDI1X3JlbW92ZV9yb3V0ZShydCk7CiAJfQogCXdyaXRlX3VubG9ja19iaCgmeDI1X3JvdXRlX2xpc3RfbG9jayk7CisKKwkvKiBSZW1vdmUgYW55IHJlbGF0ZWQgZm9yd2FyZGluZyAqLworCXgyNV9jbGVhcl9mb3J3YXJkX2J5X2RldihkZXYpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0vS2NvbmZpZyBiL25ldC94ZnJtL0tjb25maWcKaW5kZXggMGZhYWI2My4uNTc3YTRmODIgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL0tjb25maWcKKysrIGIvbmV0L3hmcm0vS2NvbmZpZwpAQCAtMjQsNiArMjQsMTcgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFhGUk1fTUlHUkFURQorCWJvb2wgIlRyYW5zZm9ybWF0aW9uIG1pZ3JhdGUgZGF0YWJhc2UgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBYRlJNICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIEEgZmVhdHVyZSB0byB1cGRhdGUgbG9jYXRvcihzKSBvZiBhIGdpdmVuIElQc2VjIHNlY3VyaXR5CisJICBhc3NvY2lhdGlvbiBkeW5hbWljYWxseS4gIFRoaXMgZmVhdHVyZSBpcyByZXF1aXJlZCwgZm9yCisJICBpbnN0YW5jZSwgaW4gYSBNb2JpbGUgSVB2NiBlbnZpcm9ubWVudCB3aXRoIElQc2VjIGNvbmZpZ3VyYXRpb24KKwkgIHdoZXJlIG1vYmlsZSBub2RlcyBjaGFuZ2UgdGhlaXIgYXR0YWNobWVudCBwb2ludCB0byB0aGUgSW50ZXJuZXQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBORVRfS0VZCiAJdHJpc3RhdGUgIlBGX0tFWSBzb2NrZXRzIgogCXNlbGVjdCBYRlJNCkBAIC0zNCw0ICs0NSwxOSBAQAogCiAJICBTYXkgWSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgogCitjb25maWcgTkVUX0tFWV9NSUdSQVRFCisJYm9vbCAiUEZfS0VZIE1JR1JBVEUgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfS0VZICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBYRlJNX01JR1JBVEUKKwktLS1oZWxwLS0tCisJICBBZGQgYSBQRl9LRVkgTUlHUkFURSBtZXNzYWdlIHRvIFBGX0tFWXYyIHNvY2tldCBmYW1pbHkuCisJICBUaGUgUEZfS0VZIE1JR1JBVEUgbWVzc2FnZSBpcyB1c2VkIHRvIGR5bmFtaWNhbGx5IHVwZGF0ZQorCSAgbG9jYXRvcihzKSBvZiBhIGdpdmVuIElQc2VjIHNlY3VyaXR5IGFzc29jaWF0aW9uLgorCSAgVGhpcyBmZWF0dXJlIGlzIHJlcXVpcmVkLCBmb3IgaW5zdGFuY2UsIGluIGEgTW9iaWxlIElQdjYKKwkgIGVudmlyb25tZW50IHdpdGggSVBzZWMgY29uZmlndXJhdGlvbiB3aGVyZSBtb2JpbGUgbm9kZXMKKwkgIGNoYW5nZSB0aGVpciBhdHRhY2htZW50IHBvaW50IHRvIHRoZSBJbnRlcm5ldC4gIERldGFpbAorCSAgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBpbnRlcm5ldC1kcmFmdAorCSAgPGRyYWZ0LXN1Z2ltb3RvLW1pcDYtcGZrZXktbWlncmF0ZT4uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fYWxnby5jIGIvbmV0L3hmcm0veGZybV9hbGdvLmMKaW5kZXggZjFjZjM0MC4uMjQ4Zjk0OCAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9hbGdvLmMKKysrIGIvbmV0L3hmcm0veGZybV9hbGdvLmMKQEAgLTI2Niw2ICsyNjYsMjMgQEAKICAgICAgICAgfQogfSwKIHsKKwkubmFtZSA9ICJjYmMoY2FtZWxsaWEpIiwKKworCS51aW5mbyA9IHsKKwkJLmVuY3IgPSB7CisJCQkuYmxvY2tiaXRzID0gMTI4LAorCQkJLmRlZmtleWJpdHMgPSAxMjgsCisJCX0KKwl9LAorCisJLmRlc2MgPSB7CisJCS5zYWRiX2FsZ19pZCA9IFNBREJfWF9FQUxHX0NBTUVMTElBQ0JDLAorCQkuc2FkYl9hbGdfaXZsZW4gPSA4LAorCQkuc2FkYl9hbGdfbWluYml0cyA9IDEyOCwKKwkJLnNhZGJfYWxnX21heGJpdHMgPSAyNTYKKwl9Cit9LAorewogICAgICAgICAubmFtZSA9ICJjYmModHdvZmlzaCkiLAogICAgICAgICAuY29tcGF0ID0gInR3b2Zpc2giLAogICAgICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fcG9saWN5LmMgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCmluZGV4IGI3ZTUzN2YuLmZhN2NlMDYgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKKysrIGIvbmV0L3hmcm0veGZybV9wb2xpY3kuYwpAQCAtMjIzNiwzICsyMjM2LDIzNCBAQAogCXhmcm1faW5wdXRfaW5pdCgpOwogfQogCisjaWZkZWYgQ09ORklHX1hGUk1fTUlHUkFURQorc3RhdGljIGludCB4ZnJtX21pZ3JhdGVfc2VsZWN0b3JfbWF0Y2goc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbF9jbXAsCisJCQkJICAgICAgIHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWxfdGd0KQoreworCWlmIChzZWxfY21wLT5wcm90byA9PSBJUFNFQ19VTFBST1RPX0FOWSkgeworCQlpZiAoc2VsX3RndC0+ZmFtaWx5ID09IHNlbF9jbXAtPmZhbWlseSAmJgorCQkgICAgeGZybV9hZGRyX2NtcCgmc2VsX3RndC0+ZGFkZHIsICZzZWxfY21wLT5kYWRkciwKKwkJCSAgICAgICAgICBzZWxfY21wLT5mYW1pbHkpID09IDAgJiYKKwkJICAgIHhmcm1fYWRkcl9jbXAoJnNlbF90Z3QtPnNhZGRyLCAmc2VsX2NtcC0+c2FkZHIsCisJCQkJICBzZWxfY21wLT5mYW1pbHkpID09IDAgJiYKKwkJICAgIHNlbF90Z3QtPnByZWZpeGxlbl9kID09IHNlbF9jbXAtPnByZWZpeGxlbl9kICYmCisJCSAgICBzZWxfdGd0LT5wcmVmaXhsZW5fcyA9PSBzZWxfY21wLT5wcmVmaXhsZW5fcykgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobWVtY21wKHNlbF90Z3QsIHNlbF9jbXAsIHNpemVvZigqc2VsX3RndCkpID09IDApIHsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5ICogeGZybV9taWdyYXRlX3BvbGljeV9maW5kKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsCisJCQkJCQkgICAgIHU4IGRpciwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwgKnJldCA9IE5VTEw7CisJc3RydWN0IGhsaXN0X25vZGUgKmVudHJ5OworCXN0cnVjdCBobGlzdF9oZWFkICpjaGFpbjsKKwl1MzIgcHJpb3JpdHkgPSB+MFU7CisKKwlyZWFkX2xvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOworCWNoYWluID0gcG9saWN5X2hhc2hfZGlyZWN0KCZzZWwtPmRhZGRyLCAmc2VsLT5zYWRkciwgc2VsLT5mYW1pbHksIGRpcik7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9sLCBlbnRyeSwgY2hhaW4sIGJ5ZHN0KSB7CisJCWlmICh4ZnJtX21pZ3JhdGVfc2VsZWN0b3JfbWF0Y2goc2VsLCAmcG9sLT5zZWxlY3RvcikgJiYKKwkJICAgIHBvbC0+dHlwZSA9PSB0eXBlKSB7CisJCQlyZXQgPSBwb2w7CisJCQlwcmlvcml0eSA9IHJldC0+cHJpb3JpdHk7CisJCQlicmVhazsKKwkJfQorCX0KKwljaGFpbiA9ICZ4ZnJtX3BvbGljeV9pbmV4YWN0W2Rpcl07CisJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9sLCBlbnRyeSwgY2hhaW4sIGJ5ZHN0KSB7CisJCWlmICh4ZnJtX21pZ3JhdGVfc2VsZWN0b3JfbWF0Y2goc2VsLCAmcG9sLT5zZWxlY3RvcikgJiYKKwkJICAgIHBvbC0+dHlwZSA9PSB0eXBlICYmCisJCSAgICBwb2wtPnByaW9yaXR5IDwgcHJpb3JpdHkpIHsKKwkJCXJldCA9IHBvbDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJldCkKKwkJeGZybV9wb2xfaG9sZChyZXQpOworCisJcmVhZF91bmxvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtaWdyYXRlX3RtcGxfbWF0Y2goc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgc3RydWN0IHhmcm1fdG1wbCAqdCkKK3sKKwlpbnQgbWF0Y2ggPSAwOworCisJaWYgKHQtPm1vZGUgPT0gbS0+bW9kZSAmJiB0LT5pZC5wcm90byA9PSBtLT5wcm90byAmJgorCSAgICAobS0+cmVxaWQgPT0gMCB8fCB0LT5yZXFpZCA9PSBtLT5yZXFpZCkpIHsKKwkJc3dpdGNoICh0LT5tb2RlKSB7CisJCWNhc2UgWEZSTV9NT0RFX1RVTk5FTDoKKwkJY2FzZSBYRlJNX01PREVfQkVFVDoKKwkJCWlmICh4ZnJtX2FkZHJfY21wKCZ0LT5pZC5kYWRkciwgJm0tPm9sZF9kYWRkciwKKwkJCQkJICBtLT5vbGRfZmFtaWx5KSA9PSAwICYmCisJCQkgICAgeGZybV9hZGRyX2NtcCgmdC0+c2FkZHIsICZtLT5vbGRfc2FkZHIsCisJCQkJCSAgbS0+b2xkX2ZhbWlseSkgPT0gMCkgeworCQkJCW1hdGNoID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFhGUk1fTU9ERV9UUkFOU1BPUlQ6CisJCQkvKiBpbiBjYXNlIG9mIHRyYW5zcG9ydCBtb2RlLCB0ZW1wbGF0ZSBkb2VzIG5vdCBzdG9yZQorCQkJICAgYW55IElQIGFkZHJlc3NlcywgaGVuY2Ugd2UganVzdCBjb21wYXJlIG1vZGUgYW5kCisJCQkgICBwcm90b2NvbCAqLworCQkJbWF0Y2ggPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gbWF0Y2g7Cit9CisKKy8qIHVwZGF0ZSBlbmRwb2ludCBhZGRyZXNzKGVzKSBvZiB0ZW1wbGF0ZShzKSAqLworc3RhdGljIGludCB4ZnJtX3BvbGljeV9taWdyYXRlKHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sLAorCQkJICAgICAgIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fbWlncmF0ZSkKK3sKKwlzdHJ1Y3QgeGZybV9taWdyYXRlICptcDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisJaW50IGksIGosIG4gPSAwOworCisJd3JpdGVfbG9ja19iaCgmcG9sLT5sb2NrKTsKKwlpZiAodW5saWtlbHkocG9sLT5kZWFkKSkgeworCQkvKiB0YXJnZXQgcG9saWN5IGhhcyBiZWVuIGRlbGV0ZWQgKi8KKwkJd3JpdGVfdW5sb2NrX2JoKCZwb2wtPmxvY2spOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9sLT54ZnJtX25yOyBpKyspIHsKKwkJZm9yIChqID0gMCwgbXAgPSBtOyBqIDwgbnVtX21pZ3JhdGU7IGorKywgbXArKykgeworCQkJaWYgKCFtaWdyYXRlX3RtcGxfbWF0Y2gobXAsICZwb2wtPnhmcm1fdmVjW2ldKSkKKwkJCQljb250aW51ZTsKKwkJCW4rKzsKKwkJCWlmIChwb2wtPnhmcm1fdmVjW2ldLm1vZGUgIT0gWEZSTV9NT0RFX1RVTk5FTCkKKwkJCQljb250aW51ZTsKKwkJCS8qIHVwZGF0ZSBlbmRwb2ludHMgKi8KKwkJCW1lbWNweSgmcG9sLT54ZnJtX3ZlY1tpXS5pZC5kYWRkciwgJm1wLT5uZXdfZGFkZHIsCisJCQkgICAgICAgc2l6ZW9mKHBvbC0+eGZybV92ZWNbaV0uaWQuZGFkZHIpKTsKKwkJCW1lbWNweSgmcG9sLT54ZnJtX3ZlY1tpXS5zYWRkciwgJm1wLT5uZXdfc2FkZHIsCisJCQkgICAgICAgc2l6ZW9mKHBvbC0+eGZybV92ZWNbaV0uc2FkZHIpKTsKKwkJCXBvbC0+eGZybV92ZWNbaV0uZW5jYXBfZmFtaWx5ID0gbXAtPm5ld19mYW1pbHk7CisJCQkvKiBmbHVzaCBidW5kbGVzICovCisJCQl3aGlsZSAoKGRzdCA9IHBvbC0+YnVuZGxlcykgIT0gTlVMTCkgeworCQkJCXBvbC0+YnVuZGxlcyA9IGRzdC0+bmV4dDsKKwkJCQlkc3RfZnJlZShkc3QpOworCQkJfQorCQl9CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZwb2wtPmxvY2spOworCisJaWYgKCFuKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZnJtX21pZ3JhdGVfY2hlY2soc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgaW50IG51bV9taWdyYXRlKQoreworCWludCBpLCBqOworCisJaWYgKG51bV9taWdyYXRlIDwgMSB8fCBudW1fbWlncmF0ZSA+IFhGUk1fTUFYX0RFUFRIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbWlncmF0ZTsgaSsrKSB7CisJCWlmICgoeGZybV9hZGRyX2NtcCgmbVtpXS5vbGRfZGFkZHIsICZtW2ldLm5ld19kYWRkciwKKwkJCQkgICBtW2ldLm9sZF9mYW1pbHkpID09IDApICYmCisJCSAgICAoeGZybV9hZGRyX2NtcCgmbVtpXS5vbGRfc2FkZHIsICZtW2ldLm5ld19zYWRkciwKKwkJCQkgICBtW2ldLm9sZF9mYW1pbHkpID09IDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh4ZnJtX2FkZHJfYW55KCZtW2ldLm5ld19kYWRkciwgbVtpXS5uZXdfZmFtaWx5KSB8fAorCQkgICAgeGZybV9hZGRyX2FueSgmbVtpXS5uZXdfc2FkZHIsIG1baV0ubmV3X2ZhbWlseSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBjaGVjayBpZiB0aGVyZSBpcyBhbnkgZHVwbGljYXRlZCBlbnRyeSAqLworCQlmb3IgKGogPSBpICsgMTsgaiA8IG51bV9taWdyYXRlOyBqKyspIHsKKwkJCWlmICghbWVtY21wKCZtW2ldLm9sZF9kYWRkciwgJm1bal0ub2xkX2RhZGRyLAorCQkJCSAgICBzaXplb2YobVtpXS5vbGRfZGFkZHIpKSAmJgorCQkJICAgICFtZW1jbXAoJm1baV0ub2xkX3NhZGRyLCAmbVtqXS5vbGRfc2FkZHIsCisJCQkJICAgIHNpemVvZihtW2ldLm9sZF9zYWRkcikpICYmCisJCQkgICAgbVtpXS5wcm90byA9PSBtW2pdLnByb3RvICYmCisJCQkgICAgbVtpXS5tb2RlID09IG1bal0ubW9kZSAmJgorCQkJICAgIG1baV0ucmVxaWQgPT0gbVtqXS5yZXFpZCAmJgorCQkJICAgIG1baV0ub2xkX2ZhbWlseSA9PSBtW2pdLm9sZF9mYW1pbHkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHhmcm1fbWlncmF0ZShzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCB1OCBkaXIsIHU4IHR5cGUsCisJCSBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX21pZ3JhdGUpCit7CisJaW50IGksIGVyciwgbnhfY3VyID0gMCwgbnhfbmV3ID0gMDsKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCA9IE5VTEw7CisJc3RydWN0IHhmcm1fc3RhdGUgKngsICp4YzsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeF9jdXJbWEZSTV9NQVhfREVQVEhdOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4X25ld1tYRlJNX01BWF9ERVBUSF07CisJc3RydWN0IHhmcm1fbWlncmF0ZSAqbXA7CisKKwlpZiAoKGVyciA9IHhmcm1fbWlncmF0ZV9jaGVjayhtLCBudW1fbWlncmF0ZSkpIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBTdGFnZSAxIC0gZmluZCBwb2xpY3kgKi8KKwlpZiAoKHBvbCA9IHhmcm1fbWlncmF0ZV9wb2xpY3lfZmluZChzZWwsIGRpciwgdHlwZSkpID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU3RhZ2UgMiAtIGZpbmQgYW5kIHVwZGF0ZSBzdGF0ZShzKSAqLworCWZvciAoaSA9IDAsIG1wID0gbTsgaSA8IG51bV9taWdyYXRlOyBpKyssIG1wKyspIHsKKwkJaWYgKCh4ID0geGZybV9taWdyYXRlX3N0YXRlX2ZpbmQobXApKSkgeworCQkJeF9jdXJbbnhfY3VyXSA9IHg7CisJCQlueF9jdXIrKzsKKwkJCWlmICgoeGMgPSB4ZnJtX3N0YXRlX21pZ3JhdGUoeCwgbXApKSkgeworCQkJCXhfbmV3W254X25ld10gPSB4YzsKKwkJCQlueF9uZXcrKzsKKwkJCX0gZWxzZSB7CisJCQkJZXJyID0gLUVOT0RBVEE7CisJCQkJZ290byByZXN0b3JlX3N0YXRlOworCQkJfQorCQl9CisJfQorCisJLyogU3RhZ2UgMyAtIHVwZGF0ZSBwb2xpY3kgKi8KKwlpZiAoKGVyciA9IHhmcm1fcG9saWN5X21pZ3JhdGUocG9sLCBtLCBudW1fbWlncmF0ZSkpIDwgMCkKKwkJZ290byByZXN0b3JlX3N0YXRlOworCisJLyogU3RhZ2UgNCAtIGRlbGV0ZSBvbGQgc3RhdGUocykgKi8KKwlpZiAobnhfY3VyKSB7CisJCXhmcm1fc3RhdGVzX3B1dCh4X2N1ciwgbnhfY3VyKTsKKwkJeGZybV9zdGF0ZXNfZGVsZXRlKHhfY3VyLCBueF9jdXIpOworCX0KKworCS8qIFN0YWdlIDUgLSBhbm5vdW5jZSAqLworCWttX21pZ3JhdGUoc2VsLCBkaXIsIHR5cGUsIG0sIG51bV9taWdyYXRlKTsKKworCXhmcm1fcG9sX3B1dChwb2wpOworCisJcmV0dXJuIDA7CitvdXQ6CisJcmV0dXJuIGVycjsKKworcmVzdG9yZV9zdGF0ZToKKwlpZiAocG9sKQorCQl4ZnJtX3BvbF9wdXQocG9sKTsKKwlpZiAobnhfY3VyKQorCQl4ZnJtX3N0YXRlc19wdXQoeF9jdXIsIG54X2N1cik7CisJaWYgKG54X25ldykKKwkJeGZybV9zdGF0ZXNfZGVsZXRlKHhfbmV3LCBueF9uZXcpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9taWdyYXRlKTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3N0YXRlLmMgYi9uZXQveGZybS94ZnJtX3N0YXRlLmMKaW5kZXggZmRiMDhkOS4uOTFiMDI2OCAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9zdGF0ZS5jCisrKyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwpAQCAtMTgzLDkgKzE4Myw2IEBACiAKIGludCBfX3hmcm1fc3RhdGVfZGVsZXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4KTsKIAotc3RhdGljIHN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqeGZybV9zdGF0ZV9nZXRfYWZpbmZvKHVuc2lnbmVkIHNob3J0IGZhbWlseSk7Ci1zdGF0aWMgdm9pZCB4ZnJtX3N0YXRlX3B1dF9hZmluZm8oc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvICphZmluZm8pOwotCiBpbnQga21fcXVlcnkoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCB4ZnJtX3RtcGwgKnQsIHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sKTsKIHZvaWQga21fc3RhdGVfZXhwaXJlZChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IGhhcmQsIHUzMiBwaWQpOwogCkBAIC04MzEsNiArODI4LDE2MCBAQAogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX2FkZCk7CiAKKyNpZmRlZiBDT05GSUdfWEZSTV9NSUdSQVRFCitzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybV9zdGF0ZV9jbG9uZShzdHJ1Y3QgeGZybV9zdGF0ZSAqb3JpZywgaW50ICplcnJwKQoreworCWludCBlcnIgPSAtRU5PTUVNOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4ID0geGZybV9zdGF0ZV9hbGxvYygpOworCWlmICgheCkKKwkJZ290byBlcnJvcjsKKworCW1lbWNweSgmeC0+aWQsICZvcmlnLT5pZCwgc2l6ZW9mKHgtPmlkKSk7CisJbWVtY3B5KCZ4LT5zZWwsICZvcmlnLT5zZWwsIHNpemVvZih4LT5zZWwpKTsKKwltZW1jcHkoJngtPmxmdCwgJm9yaWctPmxmdCwgc2l6ZW9mKHgtPmxmdCkpOworCXgtPnByb3BzLm1vZGUgPSBvcmlnLT5wcm9wcy5tb2RlOworCXgtPnByb3BzLnJlcGxheV93aW5kb3cgPSBvcmlnLT5wcm9wcy5yZXBsYXlfd2luZG93OworCXgtPnByb3BzLnJlcWlkID0gb3JpZy0+cHJvcHMucmVxaWQ7CisJeC0+cHJvcHMuZmFtaWx5ID0gb3JpZy0+cHJvcHMuZmFtaWx5OworCXgtPnByb3BzLnNhZGRyID0gb3JpZy0+cHJvcHMuc2FkZHI7CisKKwlpZiAob3JpZy0+YWFsZykgeworCQl4LT5hYWxnID0geGZybV9hbGdvX2Nsb25lKG9yaWctPmFhbGcpOworCQlpZiAoIXgtPmFhbGcpCisJCQlnb3RvIGVycm9yOworCX0KKwl4LT5wcm9wcy5hYWxnbyA9IG9yaWctPnByb3BzLmFhbGdvOworCisJaWYgKG9yaWctPmVhbGcpIHsKKwkJeC0+ZWFsZyA9IHhmcm1fYWxnb19jbG9uZShvcmlnLT5lYWxnKTsKKwkJaWYgKCF4LT5lYWxnKQorCQkJZ290byBlcnJvcjsKKwl9CisJeC0+cHJvcHMuZWFsZ28gPSBvcmlnLT5wcm9wcy5lYWxnbzsKKworCWlmIChvcmlnLT5jYWxnKSB7CisJCXgtPmNhbGcgPSB4ZnJtX2FsZ29fY2xvbmUob3JpZy0+Y2FsZyk7CisJCWlmICgheC0+Y2FsZykKKwkJCWdvdG8gZXJyb3I7CisJfQorCXgtPnByb3BzLmNhbGdvID0gb3JpZy0+cHJvcHMuY2FsZ287CisKKyAgICAgICAgaWYgKG9yaWctPmVuY2FwKSB7CisJCXgtPmVuY2FwID0ga21lbWR1cChvcmlnLT5lbmNhcCwgc2l6ZW9mKCp4LT5lbmNhcCksIEdGUF9LRVJORUwpOworCQlpZiAoIXgtPmVuY2FwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAob3JpZy0+Y29hZGRyKSB7CisJCXgtPmNvYWRkciA9IGttZW1kdXAob3JpZy0+Y29hZGRyLCBzaXplb2YoKngtPmNvYWRkciksCisJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXgtPmNvYWRkcikKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJZXJyID0geGZybV9pbml0X3N0YXRlKHgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwl4LT5wcm9wcy5mbGFncyA9IG9yaWctPnByb3BzLmZsYWdzOworCisJeC0+Y3VybGZ0LmFkZF90aW1lID0gb3JpZy0+Y3VybGZ0LmFkZF90aW1lOworCXgtPmttLnN0YXRlID0gb3JpZy0+a20uc3RhdGU7CisJeC0+a20uc2VxID0gb3JpZy0+a20uc2VxOworCisJcmV0dXJuIHg7CisKKyBlcnJvcjoKKwlpZiAoZXJycCkKKwkJKmVycnAgPSBlcnI7CisJaWYgKHgpIHsKKwkJa2ZyZWUoeC0+YWFsZyk7CisJCWtmcmVlKHgtPmVhbGcpOworCQlrZnJlZSh4LT5jYWxnKTsKKwkJa2ZyZWUoeC0+ZW5jYXApOworCQlrZnJlZSh4LT5jb2FkZHIpOworCX0KKwlrZnJlZSh4KTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9zdGF0ZV9jbG9uZSk7CisKKy8qIHhmcm1fc3RhdGVfbG9jayBpcyBoZWxkICovCitzdHJ1Y3QgeGZybV9zdGF0ZSAqIHhmcm1fbWlncmF0ZV9zdGF0ZV9maW5kKHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0pCit7CisJdW5zaWduZWQgaW50IGg7CisJc3RydWN0IHhmcm1fc3RhdGUgKng7CisJc3RydWN0IGhsaXN0X25vZGUgKmVudHJ5OworCisJaWYgKG0tPnJlcWlkKSB7CisJCWggPSB4ZnJtX2RzdF9oYXNoKCZtLT5vbGRfZGFkZHIsICZtLT5vbGRfc2FkZHIsCisJCQkJICBtLT5yZXFpZCwgbS0+b2xkX2ZhbWlseSk7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIGVudHJ5LCB4ZnJtX3N0YXRlX2J5ZHN0K2gsIGJ5ZHN0KSB7CisJCQlpZiAoeC0+cHJvcHMubW9kZSAhPSBtLT5tb2RlIHx8CisJCQkgICAgeC0+aWQucHJvdG8gIT0gbS0+cHJvdG8pCisJCQkJY29udGludWU7CisJCQlpZiAobS0+cmVxaWQgJiYgeC0+cHJvcHMucmVxaWQgIT0gbS0+cmVxaWQpCisJCQkJY29udGludWU7CisJCQlpZiAoeGZybV9hZGRyX2NtcCgmeC0+aWQuZGFkZHIsICZtLT5vbGRfZGFkZHIsCisJCQkJCSAgbS0+b2xkX2ZhbWlseSkgfHwKKwkJCSAgICB4ZnJtX2FkZHJfY21wKCZ4LT5wcm9wcy5zYWRkciwgJm0tPm9sZF9zYWRkciwKKwkJCQkJICBtLT5vbGRfZmFtaWx5KSkKKwkJCQljb250aW51ZTsKKwkJCXhmcm1fc3RhdGVfaG9sZCh4KTsKKwkJCXJldHVybiB4OworCQl9CisJfSBlbHNlIHsKKwkJaCA9IHhmcm1fc3JjX2hhc2goJm0tPm9sZF9kYWRkciwgJm0tPm9sZF9zYWRkciwKKwkJCQkgIG0tPm9sZF9mYW1pbHkpOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeSh4LCBlbnRyeSwgeGZybV9zdGF0ZV9ieXNyYytoLCBieXNyYykgeworCQkJaWYgKHgtPnByb3BzLm1vZGUgIT0gbS0+bW9kZSB8fAorCQkJICAgIHgtPmlkLnByb3RvICE9IG0tPnByb3RvKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHhmcm1fYWRkcl9jbXAoJngtPmlkLmRhZGRyLCAmbS0+b2xkX2RhZGRyLAorCQkJCQkgIG0tPm9sZF9mYW1pbHkpIHx8CisJCQkgICAgeGZybV9hZGRyX2NtcCgmeC0+cHJvcHMuc2FkZHIsICZtLT5vbGRfc2FkZHIsCisJCQkJCSAgbS0+b2xkX2ZhbWlseSkpCisJCQkJY29udGludWU7CisJCQl4ZnJtX3N0YXRlX2hvbGQoeCk7CisJCQlyZXR1cm4geDsKKwkJfQorCX0KKworICAgICAgICByZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9taWdyYXRlX3N0YXRlX2ZpbmQpOworCitzdHJ1Y3QgeGZybV9zdGF0ZSAqIHhmcm1fc3RhdGVfbWlncmF0ZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwKKwkJCQkgICAgICAgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSkKK3sKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeGM7CisJaW50IGVycjsKKworCXhjID0geGZybV9zdGF0ZV9jbG9uZSh4LCAmZXJyKTsKKwlpZiAoIXhjKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweSgmeGMtPmlkLmRhZGRyLCAmbS0+bmV3X2RhZGRyLCBzaXplb2YoeGMtPmlkLmRhZGRyKSk7CisJbWVtY3B5KCZ4Yy0+cHJvcHMuc2FkZHIsICZtLT5uZXdfc2FkZHIsIHNpemVvZih4Yy0+cHJvcHMuc2FkZHIpKTsKKworCS8qIGFkZCBzdGF0ZSAqLworCWlmICgheGZybV9hZGRyX2NtcCgmeC0+aWQuZGFkZHIsICZtLT5uZXdfZGFkZHIsIG0tPm5ld19mYW1pbHkpKSB7CisJCS8qIGEgY2FyZSBpcyBuZWVkZWQgd2hlbiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUKKwkJICAgc3RhdGUgaXMgdG8gYmUgdXBkYXRlZCBhcyBpdCBpcyBhIHBhcnQgb2YgdHJpcGxldCAqLworCQl4ZnJtX3N0YXRlX2luc2VydCh4Yyk7CisJfSBlbHNlIHsKKwkJaWYgKChlcnIgPSB4ZnJtX3N0YXRlX2FkZCh4YykpIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIHhjOworZXJyb3I6CisJa2ZyZWUoeGMpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX21pZ3JhdGUpOworI2VuZGlmCisKIGludCB4ZnJtX3N0YXRlX3VwZGF0ZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKIHsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDE7CkBAIC0xMzQ1LDYgKzE0OTYsMjYgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21fcG9saWN5X2V4cGlyZWQpOwogCitpbnQga21fbWlncmF0ZShzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCB1OCBkaXIsIHU4IHR5cGUsCisJICAgICAgIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fbWlncmF0ZSkKK3sKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwlpbnQgcmV0OworCXN0cnVjdCB4ZnJtX21nciAqa207CisKKwlyZWFkX2xvY2soJnhmcm1fa21fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShrbSwgJnhmcm1fa21fbGlzdCwgbGlzdCkgeworCQlpZiAoa20tPm1pZ3JhdGUpIHsKKwkJCXJldCA9IGttLT5taWdyYXRlKHNlbCwgZGlyLCB0eXBlLCBtLCBudW1fbWlncmF0ZSk7CisJCQlpZiAoIXJldCkKKwkJCQllcnIgPSByZXQ7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJnhmcm1fa21fbG9jayk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woa21fbWlncmF0ZSk7CisKIGludCBrbV9yZXBvcnQodTggcHJvdG8sIHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHhmcm1fYWRkcmVzc190ICphZGRyKQogewogCWludCBlcnIgPSAtRUlOVkFMOwpAQCAtMTQ1OCw3ICsxNjI5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woeGZybV9zdGF0ZV91bnJlZ2lzdGVyX2FmaW5mbyk7CiAKLXN0YXRpYyBzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKnhmcm1fc3RhdGVfZ2V0X2FmaW5mbyh1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCitzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKnhmcm1fc3RhdGVfZ2V0X2FmaW5mbyh1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCiB7CiAJc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvICphZmluZm87CiAJaWYgKHVubGlrZWx5KGZhbWlseSA+PSBOUFJPVE8pKQpAQCAtMTQ3MCwxMSArMTY0MSwxNCBAQAogCXJldHVybiBhZmluZm87CiB9CiAKLXN0YXRpYyB2b2lkIHhmcm1fc3RhdGVfcHV0X2FmaW5mbyhzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKmFmaW5mbykKK3ZvaWQgeGZybV9zdGF0ZV9wdXRfYWZpbmZvKHN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqYWZpbmZvKQogewogCXJlYWRfdW5sb2NrKCZ4ZnJtX3N0YXRlX2FmaW5mb19sb2NrKTsKIH0KIAorRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX2dldF9hZmluZm8pOworRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX3B1dF9hZmluZm8pOworCiAvKiBUZW1wb3JhcmlseSBsb2NhdGVkIGhlcmUgdW50aWwgbmV0L3hmcm0veGZybV90dW5uZWwuYyBpcyBjcmVhdGVkICovCiB2b2lkIHhmcm1fc3RhdGVfZGVsZXRlX3R1bm5lbChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKIHsKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fdXNlci5jIGIvbmV0L3hmcm0veGZybV91c2VyLmMKaW5kZXggODJmMzZkMy4uMDc5YTVkMyAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV91c2VyLmMKKysrIGIvbmV0L3hmcm0veGZybV91c2VyLmMKQEAgLTE2MzIsNiArMTYzMiwxNzYgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19YRlJNX01JR1JBVEUKK3N0YXRpYyBpbnQgdmVyaWZ5X3VzZXJfbWlncmF0ZShzdHJ1Y3QgcnRhdHRyICoqeGZybWEpCit7CisJc3RydWN0IHJ0YXR0ciAqcnQgPSB4ZnJtYVtYRlJNQV9NSUdSQVRFLTFdOworCXN0cnVjdCB4ZnJtX3VzZXJfbWlncmF0ZSAqdW07CisKKwlpZiAoIXJ0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgocnQtPnJ0YV9sZW4gLSBzaXplb2YoKnJ0KSkgPCBzaXplb2YoKnVtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3B5X2Zyb21fdXNlcl9taWdyYXRlKHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm1hLAorCQkJCSAgc3RydWN0IHJ0YXR0ciAqKnhmcm1hLCBpbnQgKm51bSkKK3sKKwlzdHJ1Y3QgcnRhdHRyICpydCA9IHhmcm1hW1hGUk1BX01JR1JBVEUtMV07CisJc3RydWN0IHhmcm1fdXNlcl9taWdyYXRlICp1bTsKKwlpbnQgaSwgbnVtX21pZ3JhdGU7CisKKwl1bSA9IFJUQV9EQVRBKHJ0KTsKKwludW1fbWlncmF0ZSA9IChydC0+cnRhX2xlbiAtIHNpemVvZigqcnQpKSAvIHNpemVvZigqdW0pOworCisJaWYgKG51bV9taWdyYXRlIDw9IDAgfHwgbnVtX21pZ3JhdGUgPiBYRlJNX01BWF9ERVBUSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX21pZ3JhdGU7IGkrKywgdW0rKywgbWErKykgeworCQltZW1jcHkoJm1hLT5vbGRfZGFkZHIsICZ1bS0+b2xkX2RhZGRyLCBzaXplb2YobWEtPm9sZF9kYWRkcikpOworCQltZW1jcHkoJm1hLT5vbGRfc2FkZHIsICZ1bS0+b2xkX3NhZGRyLCBzaXplb2YobWEtPm9sZF9zYWRkcikpOworCQltZW1jcHkoJm1hLT5uZXdfZGFkZHIsICZ1bS0+bmV3X2RhZGRyLCBzaXplb2YobWEtPm5ld19kYWRkcikpOworCQltZW1jcHkoJm1hLT5uZXdfc2FkZHIsICZ1bS0+bmV3X3NhZGRyLCBzaXplb2YobWEtPm5ld19zYWRkcikpOworCisJCW1hLT5wcm90byA9IHVtLT5wcm90bzsKKwkJbWEtPm1vZGUgPSB1bS0+bW9kZTsKKwkJbWEtPnJlcWlkID0gdW0tPnJlcWlkOworCisJCW1hLT5vbGRfZmFtaWx5ID0gdW0tPm9sZF9mYW1pbHk7CisJCW1hLT5uZXdfZmFtaWx5ID0gdW0tPm5ld19mYW1pbHk7CisJfQorCisJKm51bSA9IGk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9kb19taWdyYXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLAorCQkJICAgc3RydWN0IHJ0YXR0ciAqKnhmcm1hKQoreworCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaWQgKnBpID0gTkxNU0dfREFUQShubGgpOworCXN0cnVjdCB4ZnJtX21pZ3JhdGUgbVtYRlJNX01BWF9ERVBUSF07CisJdTggdHlwZTsKKwlpbnQgZXJyOworCWludCBuID0gMDsKKworCWVyciA9IHZlcmlmeV91c2VyX21pZ3JhdGUoKHN0cnVjdCBydGF0dHIgKiopeGZybWEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBjb3B5X2Zyb21fdXNlcl9wb2xpY3lfdHlwZSgmdHlwZSwgKHN0cnVjdCBydGF0dHIgKiopeGZybWEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBjb3B5X2Zyb21fdXNlcl9taWdyYXRlKChzdHJ1Y3QgeGZybV9taWdyYXRlICopbSwKKwkJCQkgICAgIChzdHJ1Y3QgcnRhdHRyICoqKXhmcm1hLCAmbik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmICghbikKKwkJcmV0dXJuIDA7CisKKwl4ZnJtX21pZ3JhdGUoJnBpLT5zZWwsIHBpLT5kaXIsIHR5cGUsIG0sIG4pOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCB4ZnJtX2RvX21pZ3JhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsCisJCQkgICBzdHJ1Y3QgcnRhdHRyICoqeGZybWEpCit7CisJcmV0dXJuIC1FTk9QUk9UT09QVDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1hGUk1fTUlHUkFURQorc3RhdGljIGludCBjb3B5X3RvX3VzZXJfbWlncmF0ZShzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB4ZnJtX3VzZXJfbWlncmF0ZSB1bTsKKworCW1lbXNldCgmdW0sIDAsIHNpemVvZih1bSkpOworCXVtLnByb3RvID0gbS0+cHJvdG87CisJdW0ubW9kZSA9IG0tPm1vZGU7CisJdW0ucmVxaWQgPSBtLT5yZXFpZDsKKwl1bS5vbGRfZmFtaWx5ID0gbS0+b2xkX2ZhbWlseTsKKwltZW1jcHkoJnVtLm9sZF9kYWRkciwgJm0tPm9sZF9kYWRkciwgc2l6ZW9mKHVtLm9sZF9kYWRkcikpOworCW1lbWNweSgmdW0ub2xkX3NhZGRyLCAmbS0+b2xkX3NhZGRyLCBzaXplb2YodW0ub2xkX3NhZGRyKSk7CisJdW0ubmV3X2ZhbWlseSA9IG0tPm5ld19mYW1pbHk7CisJbWVtY3B5KCZ1bS5uZXdfZGFkZHIsICZtLT5uZXdfZGFkZHIsIHNpemVvZih1bS5uZXdfZGFkZHIpKTsKKwltZW1jcHkoJnVtLm5ld19zYWRkciwgJm0tPm5ld19zYWRkciwgc2l6ZW9mKHVtLm5ld19zYWRkcikpOworCisJUlRBX1BVVChza2IsIFhGUk1BX01JR1JBVEUsIHNpemVvZih1bSksICZ1bSk7CisJcmV0dXJuIDA7CisKK3J0YXR0cl9mYWlsdXJlOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBidWlsZF9taWdyYXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sCisJCQkgaW50IG51bV9taWdyYXRlLCBzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLAorCQkJIHU4IGRpciwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgeGZybV9taWdyYXRlICptcDsKKwlzdHJ1Y3QgeGZybV91c2VycG9saWN5X2lkICpwb2xfaWQ7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlpbnQgaTsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIFhGUk1fTVNHX01JR1JBVEUsIHNpemVvZigqcG9sX2lkKSk7CisJcG9sX2lkID0gTkxNU0dfREFUQShubGgpOworCW5saC0+bmxtc2dfZmxhZ3MgPSAwOworCisJLyogY29weSBkYXRhIGZyb20gc2VsZWN0b3IsIGRpciwgYW5kIHR5cGUgdG8gdGhlIHBvbF9pZCAqLworCW1lbXNldChwb2xfaWQsIDAsIHNpemVvZigqcG9sX2lkKSk7CisJbWVtY3B5KCZwb2xfaWQtPnNlbCwgc2VsLCBzaXplb2YocG9sX2lkLT5zZWwpKTsKKwlwb2xfaWQtPmRpciA9IGRpcjsKKworCWlmIChjb3B5X3RvX3VzZXJfcG9saWN5X3R5cGUodHlwZSwgc2tiKSA8IDApCisJCWdvdG8gbmxtc2dfZmFpbHVyZTsKKworCWZvciAoaSA9IDAsIG1wID0gbSA7IGkgPCBudW1fbWlncmF0ZTsgaSsrLCBtcCsrKSB7CisJCWlmIChjb3B5X3RvX3VzZXJfbWlncmF0ZShtcCwgc2tiKSA8IDApCisJCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CisJfQorCisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCXJldHVybiBza2ItPmxlbjsKK25sbXNnX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9zZW5kX21pZ3JhdGUoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLAorCQkJICAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX21pZ3JhdGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzaXplX3QgbGVuOworCisJbGVuID0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VyX21pZ3JhdGUpICogbnVtX21pZ3JhdGUpOworCWxlbiArPSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pZCkpOworI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKKwlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUpKTsKKyNlbmRpZgorCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBidWlsZCBtaWdyYXRlICovCisJaWYgKGJ1aWxkX21pZ3JhdGUoc2tiLCBtLCBudW1fbWlncmF0ZSwgc2VsLCBkaXIsIHR5cGUpIDwgMCkKKwkJQlVHKCk7CisKKwlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gWEZSTU5MR1JQX01JR1JBVEU7CisJcmV0dXJuIG5ldGxpbmtfYnJvYWRjYXN0KHhmcm1fbmwsIHNrYiwgMCwgWEZSTU5MR1JQX01JR1JBVEUsCisJCQkJIEdGUF9BVE9NSUMpOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgeGZybV9zZW5kX21pZ3JhdGUoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLAorCQkJICAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX21pZ3JhdGUpCit7CisJcmV0dXJuIC1FTk9QUk9UT09QVDsKK30KKyNlbmRpZgogCiAjZGVmaW5lIFhNU0dTSVpFKHR5cGUpIE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHR5cGUpKQogCkBAIC0xNjUzLDYgKzE4MjMsNyBAQAogCVtYRlJNX01TR19ORVdBRSAgICAgICAtIFhGUk1fTVNHX0JBU0VdID0gWE1TR1NJWkUoeGZybV9hZXZlbnRfaWQpLAogCVtYRlJNX01TR19HRVRBRSAgICAgICAtIFhGUk1fTVNHX0JBU0VdID0gWE1TR1NJWkUoeGZybV9hZXZlbnRfaWQpLAogCVtYRlJNX01TR19SRVBPUlQgICAgICAtIFhGUk1fTVNHX0JBU0VdID0gWE1TR1NJWkUoeGZybV91c2VyX3JlcG9ydCksCisJW1hGUk1fTVNHX01JR1JBVEUgICAgIC0gWEZSTV9NU0dfQkFTRV0gPSBYTVNHU0laRSh4ZnJtX3VzZXJwb2xpY3lfaWQpLAogfTsKIAogI3VuZGVmIFhNU0dTSVpFCkBAIC0xNjc5LDYgKzE4NTAsNyBAQAogCVtYRlJNX01TR19GTFVTSFBPTElDWSAtIFhGUk1fTVNHX0JBU0VdID0geyAuZG9pdCA9IHhmcm1fZmx1c2hfcG9saWN5ICB9LAogCVtYRlJNX01TR19ORVdBRSAgICAgICAtIFhGUk1fTVNHX0JBU0VdID0geyAuZG9pdCA9IHhmcm1fbmV3X2FlICB9LAogCVtYRlJNX01TR19HRVRBRSAgICAgICAtIFhGUk1fTVNHX0JBU0VdID0geyAuZG9pdCA9IHhmcm1fZ2V0X2FlICB9LAorCVtYRlJNX01TR19NSUdSQVRFICAgICAtIFhGUk1fTVNHX0JBU0VdID0geyAuZG9pdCA9IHhmcm1fZG9fbWlncmF0ZSAgICB9LAogfTsKIAogc3RhdGljIGludCB4ZnJtX3VzZXJfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgaW50ICplcnJwKQpAQCAtMjI4NSw2ICsyNDU3LDcgQEAKIAkuY29tcGlsZV9wb2xpY3kJPSB4ZnJtX2NvbXBpbGVfcG9saWN5LAogCS5ub3RpZnlfcG9saWN5CT0geGZybV9zZW5kX3BvbGljeV9ub3RpZnksCiAJLnJlcG9ydAkJPSB4ZnJtX3NlbmRfcmVwb3J0LAorCS5taWdyYXRlCT0geGZybV9zZW5kX21pZ3JhdGUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB4ZnJtX3VzZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvS2NvbmZpZyBiL3NvdW5kL0tjb25maWcKaW5kZXggOWQ3NzMwMC4uOTc1MzJiYiAxMDA2NDQKLS0tIGEvc291bmQvS2NvbmZpZworKysgYi9zb3VuZC9LY29uZmlnCkBAIC03Niw2ICs3Niw4IEBACiAKIHNvdXJjZSAic291bmQvcGFyaXNjL0tjb25maWciCiAKK3NvdXJjZSAic291bmQvc29jL0tjb25maWciCisKIGVuZG1lbnUKIAogbWVudSAiT3BlbiBTb3VuZCBTeXN0ZW0iCmRpZmYgLS1naXQgYS9zb3VuZC9NYWtlZmlsZSBiL3NvdW5kL01ha2VmaWxlCmluZGV4IDlhZWU1NGMuLmI3YzdmYjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL01ha2VmaWxlCisrKyBiL3NvdW5kL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogb2JqLSQoQ09ORklHX1NPVU5EX1BSSU1FKSArPSBzb3VuZF9maXJtd2FyZS5vCiBvYmotJChDT05GSUdfU09VTkRfUFJJTUUpICs9IG9zcy8KIG9iai0kKENPTkZJR19ETUFTT1VORCkgKz0gb3NzLwotb2JqLSQoQ09ORklHX1NORCkgKz0gY29yZS8gaTJjLyBkcml2ZXJzLyBpc2EvIHBjaS8gcHBjLyBhcm0vIHN5bnRoLyB1c2IvIHNwYXJjLyBwYXJpc2MvIHBjbWNpYS8gbWlwcy8KK29iai0kKENPTkZJR19TTkQpICs9IGNvcmUvIGkyYy8gZHJpdmVycy8gaXNhLyBwY2kvIHBwYy8gYXJtLyBzeW50aC8gdXNiLyBzcGFyYy8gcGFyaXNjLyBwY21jaWEvIG1pcHMvIHNvYy8KIG9iai0kKENPTkZJR19TTkRfQU9BKSArPSBhb2EvCiAKICMgVGhpcyBvbmUgbXVzdCBiZSBjb21waWxhYmxlIGV2ZW4gaWYgc291bmQgaXMgY29uZmlndXJlZCBvdXQKZGlmZiAtLWdpdCBhL3NvdW5kL2FjOTdfYnVzLmMgYi9zb3VuZC9hYzk3X2J1cy5jCmluZGV4IDY2ZGUyYzIuLjdmYTM3ZTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FjOTdfYnVzLmMKKysrIGIvc291bmQvYWM5N19idXMuYwpAQCAtMjYsNiArMjYsNyBAQAogCXJldHVybiAxOwogfQogCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IGFjOTdfYnVzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJaW50IHJldCA9IDA7CkBAIC00NSwxMiArNDYsMTUgQEAKIAogCXJldHVybiByZXQ7CiB9CisjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIHN0cnVjdCBidXNfdHlwZSBhYzk3X2J1c190eXBlID0gewogCS5uYW1lCQk9ICJhYzk3IiwKIAkubWF0Y2gJCT0gYWM5N19idXNfbWF0Y2gsCisjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQJPSBhYzk3X2J1c19zdXNwZW5kLAogCS5yZXN1bWUJCT0gYWM5N19idXNfcmVzdW1lLAorI2VuZGlmIC8qIENPTkZJR19QTSAqLwogfTsKIAogc3RhdGljIGludCBfX2luaXQgYWM5N19idXNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2FvYS5oIGIvc291bmQvYW9hL2FvYS5oCmluZGV4IDM3OGVmMWUuLjU0MWI5MDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9hb2EuaAorKysgYi9zb3VuZC9hb2EvYW9hLmgKQEAgLTk5LDcgKzk5LDcgQEAKICAqIHRoYXQgYXJlIG5vdCBhc3NpZ25lZCB5ZXQgYXJlIHBhc3NlZCB0byB0aGUgZmFicmljCiAgKiBhZ2FpbiBmb3IgcmVjb25zaWRlcmF0aW9uLiAqLwogZXh0ZXJuIGludAotYW9hX2ZhYnJpY19yZWdpc3RlcihzdHJ1Y3QgYW9hX2ZhYnJpYyAqZmFicmljKTsKK2FvYV9mYWJyaWNfcmVnaXN0ZXIoc3RydWN0IGFvYV9mYWJyaWMgKmZhYnJpYywgc3RydWN0IGRldmljZSAqZGV2KTsKIAogLyogaXQgaXMgdml0YWwgdG8gY2FsbCB0aGlzIHdoZW4gdGhlIGZhYnJpYyBleGl0cyEKICAqIFdoZW4gY2FsbGluZywgdGhlIHJlbW92ZV9jb2RlYyB3aWxsIGJlIGNhbGxlZApkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLW9ueXguYyBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy1vbnl4LmMKaW5kZXggMGI3NjUwNy4uYjAwZmM0OCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLW9ueXguYworKysgYi9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtb255eC5jCkBAIC04MjUsNyArODI1LDE2IEBACiAJaW50IGVyciA9IC1FTlhJTzsKIAogCW11dGV4X2xvY2soJm9ueXgtPm11dGV4KTsKLQkvKiB0YWtlIGNvZGVjIG91dCBvZiBzdXNwZW5kICovCisKKwkvKiByZXNldCBjb2RlYyAqLworCW9ueXgtPmNvZGVjLmdwaW8tPm1ldGhvZHMtPnNldF9od19yZXNldChvbnl4LT5jb2RlYy5ncGlvLCAwKTsKKwltc2xlZXAoMSk7CisJb255eC0+Y29kZWMuZ3Bpby0+bWV0aG9kcy0+c2V0X2h3X3Jlc2V0KG9ueXgtPmNvZGVjLmdwaW8sIDEpOworCW1zbGVlcCgxKTsKKwlvbnl4LT5jb2RlYy5ncGlvLT5tZXRob2RzLT5zZXRfaHdfcmVzZXQob255eC0+Y29kZWMuZ3BpbywgMCk7CisJbXNsZWVwKDEpOworCisJLyogdGFrZSBjb2RlYyBvdXQgb2Ygc3VzcGVuZCAoaWYgaXQgc3RpbGwgaXMgYWZ0ZXIgcmVzZXQpICovCiAJaWYgKG9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19DT05UUk9MLCAmdikpCiAJCWdvdG8gb3V0X3VubG9jazsKIAlvbnl4X3dyaXRlX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0NPTlRST0wsIHYgJiB+KE9OWVhfQURQU1YgfCBPTllYX0RBUFNWKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWFsc2EuYyBiL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtYWxzYS5jCmluZGV4IGI0MmZkZWEuLjE3ZmU2ODkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtYWxzYS5jCisrKyBiL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtYWxzYS5jCkBAIC0xNCw3ICsxNCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW9hX2NhcmQgKmFvYV9jYXJkOwogCi1pbnQgYW9hX2Fsc2FfaW5pdChjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2QpCitpbnQgYW9hX2Fsc2FfaW5pdChjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmFsc2FfY2FyZDsKIAlpbnQgZXJyOwpAQCAtMjgsNiArMjgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlhb2FfY2FyZCA9IGFsc2FfY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWFvYV9jYXJkLT5hbHNhX2NhcmQgPSBhbHNhX2NhcmQ7CisJYWxzYV9jYXJkLT5kZXYgPSBkZXY7CiAJc3RybGNweShhbHNhX2NhcmQtPmRyaXZlciwgIkFwcGxlT25iZEF1ZGlvIiwgc2l6ZW9mKGFsc2FfY2FyZC0+ZHJpdmVyKSk7CiAJc3RybGNweShhbHNhX2NhcmQtPnNob3J0bmFtZSwgbmFtZSwgc2l6ZW9mKGFsc2FfY2FyZC0+c2hvcnRuYW1lKSk7CiAJc3RybGNweShhbHNhX2NhcmQtPmxvbmduYW1lLCBuYW1lLCBzaXplb2YoYWxzYV9jYXJkLT5sb25nbmFtZSkpOwpAQCAtNTksNyArNjAsNyBAQAogfQogCiBpbnQgYW9hX3NuZF9kZXZpY2VfbmV3KHNuZF9kZXZpY2VfdHlwZV90IHR5cGUsCi0gICAgICAgIHZvaWQgKiBkZXZpY2VfZGF0YSwgc3RydWN0IHNuZF9kZXZpY2Vfb3BzICogb3BzKQorCQkgICAgICAgdm9pZCAqIGRldmljZV9kYXRhLCBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgKiBvcHMpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gYW9hX2dldF9jYXJkKCk7CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtYWxzYS5oIGIvc291bmQvYW9hL2NvcmUvc25kLWFvYS1hbHNhLmgKaW5kZXggNjYwZDJmMS4uOTY2OWU0NCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvcmUvc25kLWFvYS1hbHNhLmgKKysrIGIvc291bmQvYW9hL2NvcmUvc25kLWFvYS1hbHNhLmgKQEAgLTEwLDcgKzEwLDcgQEAKICNkZWZpbmUgX19TTkRfQU9BX0FMU0FfSAogI2luY2x1ZGUgIi4uL2FvYS5oIgogCi1leHRlcm4gaW50IGFvYV9hbHNhX2luaXQoY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kKTsKK2V4dGVybiBpbnQgYW9hX2Fsc2FfaW5pdChjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBkZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBhb2FfYWxzYV9jbGVhbnVwKHZvaWQpOwogCiAjZW5kaWYgLyogX19TTkRfQU9BX0FMU0FfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvcmUvc25kLWFvYS1jb3JlLmMgYi9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWNvcmUuYwppbmRleCBlY2QyZDgyLi4xOWZkYWU0IDEwMDY0NAotLS0gYS9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWNvcmUuYworKysgYi9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWNvcmUuYwpAQCAtODIsNyArODIsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYW9hX2NvZGVjX3VucmVnaXN0ZXIpOwogCi1pbnQgYW9hX2ZhYnJpY19yZWdpc3RlcihzdHJ1Y3QgYW9hX2ZhYnJpYyAqbmV3X2ZhYnJpYykKK2ludCBhb2FfZmFicmljX3JlZ2lzdGVyKHN0cnVjdCBhb2FfZmFicmljICpuZXdfZmFicmljLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGFvYV9jb2RlYyAqYzsKIAlpbnQgZXJyOwpAQCAtOTgsNyArOTgsNyBAQAogCWlmICghbmV3X2ZhYnJpYykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllcnIgPSBhb2FfYWxzYV9pbml0KG5ld19mYWJyaWMtPm5hbWUsIG5ld19mYWJyaWMtPm93bmVyKTsKKwllcnIgPSBhb2FfYWxzYV9pbml0KG5ld19mYWJyaWMtPm5hbWUsIG5ld19mYWJyaWMtPm93bmVyLCBkZXYpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9mYWJyaWNzL3NuZC1hb2EtZmFicmljLWxheW91dC5jIGIvc291bmQvYW9hL2ZhYnJpY3Mvc25kLWFvYS1mYWJyaWMtbGF5b3V0LmMKaW5kZXggMTcyZWI5NS4uMWI5NGJhNiAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2ZhYnJpY3Mvc25kLWFvYS1mYWJyaWMtbGF5b3V0LmMKKysrIGIvc291bmQvYW9hL2ZhYnJpY3Mvc25kLWFvYS1mYWJyaWMtbGF5b3V0LmMKQEAgLTEwMTQsNyArMTAxNCw3IEBACiAKIAlsZGV2LT5ncGlvLm1ldGhvZHMtPmluaXQoJmxkZXYtPmdwaW8pOwogCi0JZXJyID0gYW9hX2ZhYnJpY19yZWdpc3RlcigmbGF5b3V0X2ZhYnJpYyk7CisJZXJyID0gYW9hX2ZhYnJpY19yZWdpc3RlcigmbGF5b3V0X2ZhYnJpYywgJnNkZXYtPm9mZGV2LmRldik7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVBTFJFQURZKSB7CiAJCXByaW50ayhLRVJOX0lORk8gInNuZC1hb2EtZmFicmljLWxheW91dDogY2FuJ3QgdXNlLCIKIAkJCQkgIiBhbm90aGVyIGZhYnJpYyBpcyBhY3RpdmUhXG4iKTsKQEAgLTEwMzQsOSArMTAzNCw5IEBACiAJbGlzdF9kZWwoJmxkZXYtPmxpc3QpOwogCWxheW91dHNfbGlzdF9pdGVtcy0tOwogIG91dG5vZGV2OgotIAlpZiAoc291bmQpIG9mX25vZGVfcHV0KHNvdW5kKTsKKyAJb2Zfbm9kZV9wdXQoc291bmQpOwogIAlsYXlvdXRfZGV2aWNlID0gTlVMTDsKLSAJaWYgKGxkZXYpIGtmcmVlKGxkZXYpOworIAlrZnJlZShsZGV2KTsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIApAQCAtMTA3Nyw4ICsxMDc3LDYgQEAKIHsKIAlzdHJ1Y3QgbGF5b3V0X2RldiAqbGRldiA9IHNkZXYtPm9mZGV2LmRldi5kcml2ZXJfZGF0YTsKIAotCXByaW50aygiYW9hX2ZhYnJpY19sYXlvdXRfc3VzcGVuZCgpXG4iKTsKLQogCWlmIChsZGV2LT5ncGlvLm1ldGhvZHMgJiYgbGRldi0+Z3Bpby5tZXRob2RzLT5hbGxfYW1wc19vZmYpCiAJCWxkZXYtPmdwaW8ubWV0aG9kcy0+YWxsX2FtcHNfb2ZmKCZsZGV2LT5ncGlvKTsKIApAQCAtMTA4OSw4ICsxMDg3LDYgQEAKIHsKIAlzdHJ1Y3QgbGF5b3V0X2RldiAqbGRldiA9IHNkZXYtPm9mZGV2LmRldi5kcml2ZXJfZGF0YTsKIAotCXByaW50aygiYW9hX2ZhYnJpY19sYXlvdXRfcmVzdW1lKClcbiIpOwotCiAJaWYgKGxkZXYtPmdwaW8ubWV0aG9kcyAmJiBsZGV2LT5ncGlvLm1ldGhvZHMtPmFsbF9hbXBzX29mZikKIAkJbGRldi0+Z3Bpby5tZXRob2RzLT5hbGxfYW1wc19yZXN0b3JlKCZsZGV2LT5ncGlvKTsKIApAQCAtMTEwNyw2ICsxMTAzLDkgQEAKIAkuc3VzcGVuZCA9IGFvYV9mYWJyaWNfbGF5b3V0X3N1c3BlbmQsCiAJLnJlc3VtZSA9IGFvYV9mYWJyaWNfbGF5b3V0X3Jlc3VtZSwKICNlbmRpZgorCS5kcml2ZXIgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0KIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFvYV9mYWJyaWNfbGF5b3V0X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLWNvcmUuYyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLWNvcmUuYwppbmRleCBlNTkzYTEzLi5lMzZmNmFhIDEwMDY0NAotLS0gYS9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1jb3JlLmMKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMtY29yZS5jCkBAIC00MSw4ICs0MSw4IEBACiAJCQkJICAgICAgIHN0cnVjdCBkYmRtYV9jb21tYW5kX21lbSAqciwKIAkJCQkgICAgICAgaW50IG51bWNtZHMpCiB7Ci0JLyogb25lIG1vcmUgZm9yIHJvdW5kaW5nICovCi0Jci0+c2l6ZSA9IChudW1jbWRzKzEpICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpOworCS8qIG9uZSBtb3JlIGZvciByb3VuZGluZywgb25lIGZvciBicmFuY2ggYmFjaywgb25lIGZvciBzdG9wIGNvbW1hbmQgKi8KKwlyLT5zaXplID0gKG51bWNtZHMgKyAzKSAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKTsKIAkvKiBXZSB1c2UgdGhlIFBDSSBBUElzIGZvciBub3cgdW50aWwgdGhlIGdlbmVyaWMgb25lIGdldHMgZml4ZWQKIAkgKiBlbm91Z2ggb3IgdW50aWwgd2UgZ2V0IHNvbWUgbWFjaW8tc3BlY2lmaWMgdmVyc2lvbnMKIAkgKi8KQEAgLTM3NywxMSArMzc3LDggQEAKIAkJaWYgKGkyc2Rldi0+c291bmQucGNtKSB7CiAJCQkvKiBTdXNwZW5kIFBDTSBzdHJlYW1zICovCiAJCQlzbmRfcGNtX3N1c3BlbmRfYWxsKGkyc2Rldi0+c291bmQucGNtKTsKLQkJCS8qIFByb2JhYmx5IHVzZWxlc3MgYXMgd2UgaGFuZGxlCi0JCQkgKiBwb3dlciB0cmFuc2l0aW9ucyBvdXJzZWx2ZXMgKi8KLQkJCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoaTJzZGV2LT5zb3VuZC5wY20tPmNhcmQsCi0JCQkJCSAgICAgICBTTkRSVl9DVExfUE9XRVJfRDNob3QpOwogCQl9CisKIAkJLyogTm90aWZ5IGNvZGVjcyAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNpaSwgJmkyc2Rldi0+c291bmQuY29kZWNfbGlzdCwgbGlzdCkgewogCQkJZXJyID0gMDsKQEAgLTM5MCw3ICszODcsMTEgQEAKIAkJCWlmIChlcnIpCiAJCQkJcmV0ID0gZXJyOwogCQl9CisKKwkJLyogd2FpdCB1bnRpbCBzdHJlYW1zIGFyZSBzdG9wcGVkICovCisJCWkyc2J1c193YWl0X2Zvcl9zdG9wX2JvdGgoaTJzZGV2KTsKIAl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MDIsNiArNDAzLDkgQEAKIAlpbnQgZXJyLCByZXQgPSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpMnNkZXYsICZjb250cm9sLT5saXN0LCBpdGVtKSB7CisJCS8qIHJlc2V0IGkycyBidXMgZm9ybWF0IGV0Yy4gKi8KKwkJaTJzYnVzX3BjbV9wcmVwYXJlX2JvdGgoaTJzZGV2KTsKKwogCQkvKiBOb3RpZnkgY29kZWNzIHNvIHRoZXkgY2FuIHJlLWluaXRpYWxpemUgKi8KIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaWksICZpMnNkZXYtPnNvdW5kLmNvZGVjX2xpc3QsIGxpc3QpIHsKIAkJCWVyciA9IDA7CkBAIC00MTAsMTIgKzQxNCw2IEBACiAJCQlpZiAoZXJyKQogCQkJCXJldCA9IGVycjsKIAkJfQotCQkvKiBOb3RpZnkgQWxzYSAqLwotCQlpZiAoaTJzZGV2LT5zb3VuZC5wY20pIHsKLQkJCS8qIFNhbWUgY29tbWVudCBhcyBhYm92ZSwgcHJvYmFibHkgdXNlbGVzcyAqLwotCQkJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShpMnNkZXYtPnNvdW5kLnBjbS0+Y2FyZCwKLQkJCQkJICAgICAgIFNORFJWX0NUTF9QT1dFUl9EMCk7Ci0JCX0KIAl9CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMtcGNtLmMgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1wY20uYwppbmRleCA1ZWZmMzBiLi5jNmI0MmY5IDEwMDY0NAotLS0gYS9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1wY20uYworKysgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1wY20uYwpAQCAtMTI1LDcgKzEyNSw4IEBACiAJfQogCS8qIGJ1cyBkZXBlbmRlbnQgc3R1ZmYgKi8KIAlody0+aW5mbyA9IFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJICAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUU7CisJCSAgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwgU05EUlZfUENNX0lORk9fUkVTVU1FIHwKKwkJICAgU05EUlZfUENNX0lORk9fSk9JTlRfRFVQTEVYOwogCiAJQ0hFQ0tfUkFURSg1NTEyKTsKIAlDSEVDS19SQVRFKDgwMDApOwpAQCAtMjQ1LDE4ICsyNDYsNzggQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgdm9pZCBpMnNidXNfd2FpdF9mb3Jfc3RvcChzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LAorCQkJCSBzdHJ1Y3QgcGNtX2luZm8gKnBpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKKwlsb25nIHRpbWVvdXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTJzZGV2LT5sb3dfbG9jaywgZmxhZ3MpOworCWlmIChwaS0+ZGJkbWFfcmluZy5zdG9wcGluZykgeworCQlpbml0X2NvbXBsZXRpb24oJmRvbmUpOworCQlwaS0+c3RvcF9jb21wbGV0aW9uID0gJmRvbmU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyc2Rldi0+bG93X2xvY2ssIGZsYWdzKTsKKwkJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZG9uZSwgSFopOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaTJzZGV2LT5sb3dfbG9jaywgZmxhZ3MpOworCQlwaS0+c3RvcF9jb21wbGV0aW9uID0gTlVMTDsKKwkJaWYgKHRpbWVvdXQgPT0gMCkgeworCQkJLyogdGltZW91dCBleHBpcmVkLCBzdG9wIGRiZG1hIGZvcmNlZnVsbHkgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiaTJzYnVzX3dhaXRfZm9yX3N0b3A6IHRpbWVkIG91dFxuIik7CisJCQkvKiBtYWtlIHN1cmUgUlVOLCBQQVVTRSBhbmQgUzAgYml0cyBhcmUgY2xlYXJlZCAqLworCQkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwgKFJVTiB8IFBBVVNFIHwgMSkgPDwgMTYpOworCQkJcGktPmRiZG1hX3Jpbmcuc3RvcHBpbmcgPSAwOworCQkJdGltZW91dCA9IDEwOworCQkJd2hpbGUgKGluX2xlMzIoJnBpLT5kYmRtYS0+c3RhdHVzKSAmIEFDVElWRSkgeworCQkJCWlmICgtLXRpbWVvdXQgPD0gMCkKKwkJCQkJYnJlYWs7CisJCQkJdWRlbGF5KDEpOworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyc2Rldi0+bG93X2xvY2ssIGZsYWdzKTsKK30KKworI2lmZGVmIENPTkZJR19QTQordm9pZCBpMnNidXNfd2FpdF9mb3Jfc3RvcF9ib3RoKHN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYpCit7CisJc3RydWN0IHBjbV9pbmZvICpwaTsKKworCWdldF9wY21faW5mbyhpMnNkZXYsIDAsICZwaSwgTlVMTCk7CisJaTJzYnVzX3dhaXRfZm9yX3N0b3AoaTJzZGV2LCBwaSk7CisJZ2V0X3BjbV9pbmZvKGkyc2RldiwgMSwgJnBpLCBOVUxMKTsKKwlpMnNidXNfd2FpdF9mb3Jfc3RvcChpMnNkZXYsIHBpKTsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IGkyc2J1c19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCiB7CiAJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7CiB9CiAKLXN0YXRpYyBpbnQgaTJzYnVzX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCitzdGF0aWMgaW5saW5lIGludCBpMnNidXNfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGluKQogeworCXN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHBjbV9pbmZvICpwaTsKKworCWdldF9wY21faW5mbyhpMnNkZXYsIGluLCAmcGksIE5VTEwpOworCWlmIChwaS0+ZGJkbWFfcmluZy5zdG9wcGluZykKKwkJaTJzYnVzX3dhaXRfZm9yX3N0b3AoaTJzZGV2LCBwaSk7CiAJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGkyc2J1c19wbGF5YmFja19od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiBpMnNidXNfaHdfZnJlZShzdWJzdHJlYW0sIDApOworfQorCitzdGF0aWMgaW50IGkyc2J1c19yZWNvcmRfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gaTJzYnVzX2h3X2ZyZWUoc3Vic3RyZWFtLCAxKTsKK30KKwogc3RhdGljIGludCBpMnNidXNfcGNtX3ByZXBhcmUoc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldiwgaW50IGluKQogewogCS8qIHdoZWUuIEhhcmQgd29yayBub3cuIFRoZSB1c2VyIGhhcyBzZWxlY3RlZCBhIGJpdHJhdGUKQEAgLTI2NCw3ICszMjUsNyBAQAogCSAqIEkyUyBjb250cm9sbGVyIGFwcHJvcHJpYXRlbHkuICovCiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKIAlzdHJ1Y3QgZGJkbWFfY21kICpjb21tYW5kOwotCWludCBpLCBwZXJpb2RzaXplOworCWludCBpLCBwZXJpb2RzaXplLCBucGVyaW9kczsKIAlkbWFfYWRkcl90IG9mZnNldDsKIAlzdHJ1Y3QgYnVzX2luZm8gYmk7CiAJc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpOwpAQCAtMjc0LDYgKzMzNSw3IEBACiAJc3RydWN0IHBjbV9pbmZvICpwaSwgKm90aGVyOwogCWludCBjbnQ7CiAJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IGNtZCwgc3RvcGFkZHI7CiAKIAltdXRleF9sb2NrKCZpMnNkZXYtPmxvY2spOwogCkBAIC0yODMsNiArMzQ1LDEzIEBACiAJCXJlc3VsdCA9IC1FQlVTWTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KKwlpZiAocGktPmRiZG1hX3Jpbmcuc3RvcHBpbmcpCisJCWkyc2J1c193YWl0X2Zvcl9zdG9wKGkyc2RldiwgcGkpOworCisJaWYgKCFwaS0+c3Vic3RyZWFtIHx8ICFwaS0+c3Vic3RyZWFtLT5ydW50aW1lKSB7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CiAKIAlydW50aW1lID0gcGktPnN1YnN0cmVhbS0+cnVudGltZTsKIAlwaS0+YWN0aXZlID0gMTsKQEAgLTI5NywyNCArMzY2LDQzIEBACiAJaTJzZGV2LT5yYXRlID0gcnVudGltZS0+cmF0ZTsKIAogCXBlcmlvZHNpemUgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMocGktPnN1YnN0cmVhbSk7CisJbnBlcmlvZHMgPSBwaS0+c3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2RzOwogCXBpLT5jdXJyZW50X3BlcmlvZCA9IDA7CiAKIAkvKiBnZW5lcmF0ZSBkYmRtYSBjb21tYW5kIHJpbmcgZmlyc3QgKi8KIAljb21tYW5kID0gcGktPmRiZG1hX3JpbmcuY21kczsKKwltZW1zZXQoY29tbWFuZCwgMCwgKG5wZXJpb2RzICsgMikgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCkpOworCisJLyogY29tbWFuZHMgdG8gRE1BIHRvL2Zyb20gdGhlIHJpbmcgKi8KKwkvKgorCSAqIEZvciBpbnB1dCwgd2UgbmVlZCB0byBkbyBhIGdyYWNlZnVsIHN0b3A7IGlmIHdlIGFib3J0CisJICogdGhlIERNQSwgd2UgZW5kIHVwIHdpdGggbGVmdG92ZXIgYnl0ZXMgdGhhdCBjb3JydXB0CisJICogdGhlIG5leHQgcmVjb3JkaW5nLiAgVG8gZG8gdGhpcyB3ZSBzZXQgdGhlIFMwIHN0YXR1cworCSAqIGJpdCBhbmQgd2FpdCBmb3IgdGhlIERNQSBjb250cm9sbGVyIHRvIHN0b3AuICBFYWNoCisJICogY29tbWFuZCBoYXMgYSBicmFuY2ggY29uZGl0aW9uIHRvCisJICogbWFrZSBpdCBicmFuY2ggdG8gYSBzdG9wIGNvbW1hbmQgaWYgUzAgaXMgc2V0LgorCSAqIE9uIGlucHV0IHdlIGFsc28gbmVlZCB0byB3YWl0IGZvciB0aGUgUzcgYml0IHRvIGJlCisJICogc2V0IGJlZm9yZSB0dXJuaW5nIG9mZiB0aGUgRE1BIGNvbnRyb2xsZXIuCisJICogSW4gZmFjdCB3ZSBkbyB0aGUgZ3JhY2VmdWwgc3RvcCBmb3Igb3V0cHV0IGFzIHdlbGwuCisJICovCiAJb2Zmc2V0ID0gcnVudGltZS0+ZG1hX2FkZHI7Ci0JZm9yIChpID0gMDsgaSA8IHBpLT5zdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZHM7Ci0JICAgICBpKyssIGNvbW1hbmQrKywgb2Zmc2V0ICs9IHBlcmlvZHNpemUpIHsKLQkJbWVtc2V0KGNvbW1hbmQsIDAsIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSk7Ci0JCWNvbW1hbmQtPmNvbW1hbmQgPQotCQkgICAgY3B1X3RvX2xlMTYoKGluID8gSU5QVVRfTU9SRSA6IE9VVFBVVF9NT1JFKSB8IElOVFJfQUxXQVlTKTsKKwljbWQgPSAoaW4/IElOUFVUX01PUkU6IE9VVFBVVF9NT1JFKSB8IEJSX0lGU0VUIHwgSU5UUl9BTFdBWVM7CisJc3RvcGFkZHIgPSBwaS0+ZGJkbWFfcmluZy5idXNfY21kX3N0YXJ0ICsKKwkJKG5wZXJpb2RzICsgMSkgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCk7CisJZm9yIChpID0gMDsgaSA8IG5wZXJpb2RzOyBpKyssIGNvbW1hbmQrKywgb2Zmc2V0ICs9IHBlcmlvZHNpemUpIHsKKwkJY29tbWFuZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZCk7CisJCWNvbW1hbmQtPmNtZF9kZXAgPSBjcHVfdG9fbGUzMihzdG9wYWRkcik7CiAJCWNvbW1hbmQtPnBoeV9hZGRyID0gY3B1X3RvX2xlMzIob2Zmc2V0KTsKIAkJY29tbWFuZC0+cmVxX2NvdW50ID0gY3B1X3RvX2xlMTYocGVyaW9kc2l6ZSk7Ci0JCWNvbW1hbmQtPnhmZXJfc3RhdHVzID0gY3B1X3RvX2xlMTYoMCk7CiAJfQotCS8qIGxhc3Qgb25lIGJyYW5jaGVzIGJhY2sgdG8gZmlyc3QgKi8KLQljb21tYW5kLS07Ci0JY29tbWFuZC0+Y29tbWFuZCB8PSBjcHVfdG9fbGUxNihCUl9BTFdBWVMpOworCisJLyogYnJhbmNoIGJhY2sgdG8gYmVnaW5uaW5nIG9mIHJpbmcgKi8KKwljb21tYW5kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoREJETUFfTk9QIHwgQlJfQUxXQVlTKTsKIAljb21tYW5kLT5jbWRfZGVwID0gY3B1X3RvX2xlMzIocGktPmRiZG1hX3JpbmcuYnVzX2NtZF9zdGFydCk7CisJY29tbWFuZCsrOworCisJLyogc2V0IHN0b3AgY29tbWFuZCAqLworCWNvbW1hbmQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihEQkRNQV9TVE9QKTsKIAogCS8qIG9rLCBsZXQncyBzZXQgdGhlIHNlcmlhbCBmb3JtYXQgYW5kIHN0dWZmICovCiAJc3dpdGNoIChydW50aW1lLT5mb3JtYXQpIHsKQEAgLTQzNSwxNiArNTIzLDE4IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHN0cnVjdCBkYmRtYV9jbWQgU1RPUF9DTUQgPSB7Ci0JLmNvbW1hbmQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KERCRE1BX1NUT1ApLAotfTsKKyNpZmRlZiBDT05GSUdfUE0KK3ZvaWQgaTJzYnVzX3BjbV9wcmVwYXJlX2JvdGgoc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldikKK3sKKwlpMnNidXNfcGNtX3ByZXBhcmUoaTJzZGV2LCAwKTsKKwlpMnNidXNfcGNtX3ByZXBhcmUoaTJzZGV2LCAxKTsKK30KKyNlbmRpZgogCiBzdGF0aWMgaW50IGkyc2J1c19wY21fdHJpZ2dlcihzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LCBpbnQgaW4sIGludCBjbWQpCiB7CiAJc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpOwogCXN0cnVjdCBwY21faW5mbyAqcGk7Ci0JaW50IHRpbWVvdXQ7Ci0Jc3RydWN0IGRiZG1hX2NtZCB0bXA7CiAJaW50IHJlc3VsdCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNDY0LDkyICs1NTQsNTAgQEAKIAkJCQljaWktPmNvZGVjLT5zdGFydChjaWksIHBpLT5zdWJzdHJlYW0pOwogCQlwaS0+ZGJkbWFfcmluZy5ydW5uaW5nID0gMTsKIAotCQkvKiByZXNldCBkbWEgZW5naW5lICovCi0JCW91dF9sZTMyKCZwaS0+ZGJkbWEtPmNvbnRyb2wsCi0JCQkgMCB8IChSVU4gfCBQQVVTRSB8IEZMVVNIIHwgV0FLRSkgPDwgMTYpOwotCQl0aW1lb3V0ID0gMTAwOwotCQl3aGlsZSAoaW5fbGUzMigmcGktPmRiZG1hLT5zdGF0dXMpICYgUlVOICYmIHRpbWVvdXQtLSkKLQkJCXVkZWxheSgxKTsKLQkJaWYgKHRpbWVvdXQgPD0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImkyc2J1czogZXJyb3Igd2FpdGluZyBmb3IgZG1hIHJlc2V0XG4iKTsKLQkJCXJlc3VsdCA9IC1FTlhJTzsKLQkJCWdvdG8gb3V0X3VubG9jazsKKwkJaWYgKHBpLT5kYmRtYV9yaW5nLnN0b3BwaW5nKSB7CisJCQkvKiBDbGVhciB0aGUgUzAgYml0LCB0aGVuIHNlZSBpZiB3ZSBzdG9wcGVkIHlldCAqLworCQkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwgMSA8PCAxNik7CisJCQlpZiAoaW5fbGUzMigmcGktPmRiZG1hLT5zdGF0dXMpICYgQUNUSVZFKSB7CisJCQkJLyogcG9zc2libGUgcmFjZSBoZXJlPyAqLworCQkJCXVkZWxheSgxMCk7CisJCQkJaWYgKGluX2xlMzIoJnBpLT5kYmRtYS0+c3RhdHVzKSAmIEFDVElWRSkgeworCQkJCQlwaS0+ZGJkbWFfcmluZy5zdG9wcGluZyA9IDA7CisJCQkJCWdvdG8gb3V0X3VubG9jazsgLyoga2VlcCBydW5uaW5nICovCisJCQkJfQorCQkJfQogCQl9CiAKKwkJLyogbWFrZSBzdXJlIFJVTiwgUEFVU0UgYW5kIFMwIGJpdHMgYXJlIGNsZWFyZWQgKi8KKwkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwgKFJVTiB8IFBBVVNFIHwgMSkgPDwgMTYpOworCisJCS8qIHNldCBicmFuY2ggY29uZGl0aW9uIHNlbGVjdCByZWdpc3RlciAqLworCQlvdXRfbGUzMigmcGktPmRiZG1hLT5icl9zZWwsICgxIDw8IDE2KSB8IDEpOworCiAJCS8qIHdyaXRlIGRtYSBjb21tYW5kIGJ1ZmZlciBhZGRyZXNzIHRvIHRoZSBkYmRtYSBjaGlwICovCiAJCW91dF9sZTMyKCZwaS0+ZGJkbWEtPmNtZHB0ciwgcGktPmRiZG1hX3JpbmcuYnVzX2NtZF9zdGFydCk7Ci0JCS8qIHBvc3QgUENJIHdyaXRlICovCi0JCW1iKCk7Ci0JCSh2b2lkKWluX2xlMzIoJnBpLT5kYmRtYS0+c3RhdHVzKTsKIAotCQkvKiBjaGFuZ2UgZmlyc3QgY29tbWFuZCB0byBTVE9QICovCi0JCXRtcCA9ICpwaS0+ZGJkbWFfcmluZy5jbWRzOwotCQkqcGktPmRiZG1hX3JpbmcuY21kcyA9IFNUT1BfQ01EOwotCi0JCS8qIHNldCBydW5uaW5nIHN0YXRlLCByZW1lbWJlciB0aGF0IHRoZSBmaXJzdCBjb21tYW5kIGlzIFNUT1AgKi8KLQkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwgUlVOIHwgKFJVTiA8PCAxNikpOwotCQl0aW1lb3V0ID0gMTAwOwotCQkvKiB3YWl0IGZvciBTVE9QIHRvIGJlIGV4ZWN1dGVkICovCi0JCXdoaWxlIChpbl9sZTMyKCZwaS0+ZGJkbWEtPnN0YXR1cykgJiBBQ1RJVkUgJiYgdGltZW91dC0tKQotCQkJdWRlbGF5KDEpOwotCQlpZiAodGltZW91dCA8PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImkyc2J1czogZXJyb3Igd2FpdGluZyBmb3IgZG1hIHN0b3BcbiIpOwotCQkJcmVzdWx0ID0gLUVOWElPOwotCQkJZ290byBvdXRfdW5sb2NrOwotCQl9Ci0JCS8qIGFnYWluLCB3cml0ZSBkbWEgY29tbWFuZCBidWZmZXIgYWRkcmVzcyB0byB0aGUgZGJkbWEgY2hpcCwKLQkJICogdGhpcyB0aW1lIG9mIHRoZSBmaXJzdCByZWFsIGNvbW1hbmQgKi8KLQkJKnBpLT5kYmRtYV9yaW5nLmNtZHMgPSB0bXA7Ci0JCW91dF9sZTMyKCZwaS0+ZGJkbWEtPmNtZHB0ciwgcGktPmRiZG1hX3JpbmcuYnVzX2NtZF9zdGFydCk7Ci0JCS8qIHBvc3Qgd3JpdGUgKi8KLQkJbWIoKTsKLQkJKHZvaWQpaW5fbGUzMigmcGktPmRiZG1hLT5zdGF0dXMpOwotCi0JCS8qIHJlc2V0IGRtYSBlbmdpbmUgYWdhaW4gKi8KLQkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwKLQkJCSAwIHwgKFJVTiB8IFBBVVNFIHwgRkxVU0ggfCBXQUtFKSA8PCAxNik7Ci0JCXRpbWVvdXQgPSAxMDA7Ci0JCXdoaWxlIChpbl9sZTMyKCZwaS0+ZGJkbWEtPnN0YXR1cykgJiBSVU4gJiYgdGltZW91dC0tKQotCQkJdWRlbGF5KDEpOwotCQlpZiAodGltZW91dCA8PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiaTJzYnVzOiBlcnJvciB3YWl0aW5nIGZvciBkbWEgcmVzZXRcbiIpOwotCQkJcmVzdWx0ID0gLUVOWElPOwotCQkJZ290byBvdXRfdW5sb2NrOwotCQl9Ci0KLQkJLyogd2FrZSB1cCB0aGUgY2hpcCB3aXRoIHRoZSBuZXh0IGRlc2NyaXB0b3IgKi8KLQkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwKLQkJCSAoUlVOIHwgV0FLRSkgfCAoKFJVTiB8IFdBS0UpIDw8IDE2KSk7Ci0JCS8qIGdldCB0aGUgZnJhbWUgY291bnQgICovCisJCS8qIGluaXRpYWxpemUgdGhlIGZyYW1lIGNvdW50IGFuZCBjdXJyZW50IHBlcmlvZCAqLworCQlwaS0+Y3VycmVudF9wZXJpb2QgPSAwOwogCQlwaS0+ZnJhbWVfY291bnQgPSBpbl9sZTMyKCZpMnNkZXYtPmludGZyZWdzLT5mcmFtZV9jb3VudCk7CiAKKwkJLyogc2V0IHRoZSBETUEgY29udHJvbGxlciBydW5uaW5nICovCisJCW91dF9sZTMyKCZwaS0+ZGJkbWEtPmNvbnRyb2wsIChSVU4gPDwgMTYpIHwgUlVOKTsKKwogCQkvKiBvZmYgeW91IGdvISAqLwogCQlicmVhazsKKwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CiAJCWlmICghcGktPmRiZG1hX3JpbmcucnVubmluZykgewogCQkJcmVzdWx0ID0gLUVBTFJFQURZOwogCQkJZ290byBvdXRfdW5sb2NrOwogCQl9Ci0KLQkJLyogdHVybiBvZmYgYWxsIHJlbGV2YW50IGJpdHMgKi8KLQkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwKLQkJCSAoUlVOIHwgV0FLRSB8IEZMVVNIIHwgUEFVU0UpIDw8IDE2KTsKLQkJewotCQkJLyogRklYTUU6IG1vdmUgdG8gb3duIGZ1bmN0aW9uICovCi0JCQlpbnQgdGltZW91dCA9IDUwMDA7Ci0JCQl3aGlsZSAoKGluX2xlMzIoJnBpLT5kYmRtYS0+c3RhdHVzKSAmIFJVTikKLQkJCSAgICAgICAmJiAtLXRpbWVvdXQgPiAwKQotCQkJCXVkZWxheSgxKTsKLQkJCWlmICghdGltZW91dCkKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgImkyc2J1czogdGltZWQgb3V0IHR1cm5pbmcgIgotCQkJCSAgICAgICAib2ZmIGRiZG1hIGVuZ2luZSFcbiIpOwotCQl9Ci0KIAkJcGktPmRiZG1hX3JpbmcucnVubmluZyA9IDA7CisKKwkJLyogU2V0IHRoZSBTMCBiaXQgdG8gbWFrZSB0aGUgRE1BIGJyYW5jaCB0byB0aGUgc3RvcCBjbWQgKi8KKwkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwgKDEgPDwgMTYpIHwgMSk7CisJCXBpLT5kYmRtYV9yaW5nLnN0b3BwaW5nID0gMTsKKwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNpaSwgJmkyc2Rldi0+c291bmQuY29kZWNfbGlzdCwgbGlzdCkKIAkJCWlmIChjaWktPmNvZGVjLT5zdG9wKQogCQkJCWNpaS0+Y29kZWMtPnN0b3AoY2lpLCBwaS0+c3Vic3RyZWFtKTsKQEAgLTU3NCw3MCArNjIyLDgyIEBACiAJZmMgPSBpbl9sZTMyKCZpMnNkZXYtPmludGZyZWdzLT5mcmFtZV9jb3VudCk7CiAJZmMgPSBmYyAtIHBpLT5mcmFtZV9jb3VudDsKIAotCXJldHVybiAoYnl0ZXNfdG9fZnJhbWVzKHBpLT5zdWJzdHJlYW0tPnJ1bnRpbWUsCi0JCQlwaS0+Y3VycmVudF9wZXJpb2QgKgotCQkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHBpLT5zdWJzdHJlYW0pKQotCQkrIGZjKSAlIHBpLT5zdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCWlmIChmYyA+PSBwaS0+c3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJZmMgJT0gcGktPnN1YnN0cmVhbS0+cnVudGltZS0+YnVmZmVyX3NpemU7CisJcmV0dXJuIGZjOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LCBpbnQgaW4pCiB7CiAJc3RydWN0IHBjbV9pbmZvICpwaTsKLQl1MzIgZmM7Ci0JdTMyIGRlbHRhOworCXUzMiBmYywgbmZyYW1lczsKKwl1MzIgc3RhdHVzOworCWludCB0aW1lb3V0LCBpOworCWludCBkbWFfc3RvcHBlZCA9IDA7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKIAogCXNwaW5fbG9jaygmaTJzZGV2LT5sb3dfbG9jayk7CiAJZ2V0X3BjbV9pbmZvKGkyc2RldiwgaW4sICZwaSwgTlVMTCk7Ci0KLQlpZiAoIXBpLT5kYmRtYV9yaW5nLnJ1bm5pbmcpIHsKLQkJLyogdGhlcmUgd2FzIHN0aWxsIGFuIGludGVycnVwdCBwZW5kaW5nCi0JCSAqIHdoaWxlIHdlIHN0b3BwZWQuIG9yIG1heWJlIGFub3RoZXIKLQkJICogcHJvY2Vzc29yIChub3QgdGhlIG9uZSB0aGF0IHdhcyBzdG9wcGluZwotCQkgKiB0aGUgRE1BIGVuZ2luZSkgd2FzIHNwaW5uaW5nIGFib3ZlCi0JCSAqIHdhaXRpbmcgZm9yIHRoZSBsb2NrLiAqLworCWlmICghcGktPmRiZG1hX3JpbmcucnVubmluZyAmJiAhcGktPmRiZG1hX3Jpbmcuc3RvcHBpbmcpCiAJCWdvdG8gb3V0X3VubG9jazsKLQl9CiAKLQlmYyA9IGluX2xlMzIoJmkyc2Rldi0+aW50ZnJlZ3MtPmZyYW1lX2NvdW50KTsKLQkvKiBhIGNvdW50ZXIgb3ZlcmZsb3cgZG9lcyBub3QgY2hhbmdlIHRoZSBjYWxjdWxhdGlvbi4gKi8KLQlkZWx0YSA9IGZjIC0gcGktPmZyYW1lX2NvdW50OworCWkgPSBwaS0+Y3VycmVudF9wZXJpb2Q7CisJcnVudGltZSA9IHBpLT5zdWJzdHJlYW0tPnJ1bnRpbWU7CisJd2hpbGUgKHBpLT5kYmRtYV9yaW5nLmNtZHNbaV0ueGZlcl9zdGF0dXMpIHsKKwkJaWYgKGxlMTZfdG9fY3B1KHBpLT5kYmRtYV9yaW5nLmNtZHNbaV0ueGZlcl9zdGF0dXMpICYgQlQpCisJCQkvKgorCQkJICogQlQgaXMgdGhlIGJyYW5jaCB0YWtlbiBiaXQuICBJZiBpdCB0b29rIGEgYnJhbmNoCisJCQkgKiBpdCBpcyBiZWNhdXNlIHdlIHNldCB0aGUgUzAgYml0IHRvIG1ha2UgaXQKKwkJCSAqIGJyYW5jaCB0byB0aGUgc3RvcCBjb21tYW5kLgorCQkJICovCisJCQlkbWFfc3RvcHBlZCA9IDE7CisJCXBpLT5kYmRtYV9yaW5nLmNtZHNbaV0ueGZlcl9zdGF0dXMgPSAwOwogCi0JLyogdXBkYXRlIGN1cnJlbnRfcGVyaW9kICovCi0Jd2hpbGUgKGRlbHRhID49IHBpLT5zdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZF9zaXplKSB7Ci0JCXBpLT5jdXJyZW50X3BlcmlvZCsrOwotCQlkZWx0YSA9IGRlbHRhIC0gcGktPnN1YnN0cmVhbS0+cnVudGltZS0+cGVyaW9kX3NpemU7Ci0JfQotCi0JaWYgKHVubGlrZWx5KGRlbHRhKSkgewotCQkvKiBTb21lIGludGVycnVwdCBjYW1lIGxhdGUsIHNvIGNoZWNrIHRoZSBkYmRtYS4KLQkJICogVGhpcyBzcGVjaWFsIGNhc2UgZXhpc3RzIHRvIHN5bmNyb25pemUgdGhlIGZyYW1lX2NvdW50IHdpdGgKLQkJICogdGhlIGRiZG1hIHRyYW5zZmVyLCBidXQgaXMgaGl0IGV2ZXJ5IG9uY2UgaW4gYSB3aGlsZS4gKi8KLQkJaW50IHBlcmlvZDsKLQotCQlwZXJpb2QgPSAoaW5fbGUzMigmcGktPmRiZG1hLT5jbWRwdHIpCi0JCSAgICAgICAgLSBwaS0+ZGJkbWFfcmluZy5idXNfY21kX3N0YXJ0KQotCQkJCS8gc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpOwotCQlwaS0+Y3VycmVudF9wZXJpb2QgPSBwaS0+Y3VycmVudF9wZXJpb2QKLQkJCQkJJSBwaS0+c3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2RzOwotCi0JCXdoaWxlIChwaS0+Y3VycmVudF9wZXJpb2QgIT0gcGVyaW9kKSB7Ci0JCQlwaS0+Y3VycmVudF9wZXJpb2QrKzsKLQkJCXBpLT5jdXJyZW50X3BlcmlvZCAlPSBwaS0+c3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2RzOwotCQkJLyogU2V0IGRlbHRhIHRvIHplcm8sIGFzIHRoZSBmcmFtZV9jb3VudCB2YWx1ZSBpcyB0b28KLQkJCSAqIGhpZ2ggKG90aGVyd2lzZSB0aGUgY29kZSBwYXRoIHdpbGwgbm90IGJlIGV4ZWN1dGVkKS4KLQkJCSAqIFRoaXMgY29ycmVjdHMgdGhlIGZhY3QgdGhhdCB0aGUgZnJhbWVfY291bnQgaXMgdG9vCi0JCQkgKiBsb3cgYXQgdGhlIGJlZ2lubmluZyBkdWUgdG8gYnVmZmVyaW5nLiAqLwotCQkJZGVsdGEgPSAwOworCQlpZiAoKytpID49IHJ1bnRpbWUtPnBlcmlvZHMpIHsKKwkJCWkgPSAwOworCQkJcGktPmZyYW1lX2NvdW50ICs9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwogCQl9CisJCXBpLT5jdXJyZW50X3BlcmlvZCA9IGk7CisKKwkJLyoKKwkJICogQ2hlY2sgdGhlIGZyYW1lIGNvdW50LiAgVGhlIERNQSB0ZW5kcyB0byBnZXQgYSBiaXQKKwkJICogYWhlYWQgb2YgdGhlIGZyYW1lIGNvdW50ZXIsIHdoaWNoIGNvbmZ1c2VzIHRoZSBjb3JlLgorCQkgKi8KKwkJZmMgPSBpbl9sZTMyKCZpMnNkZXYtPmludGZyZWdzLT5mcmFtZV9jb3VudCk7CisJCW5mcmFtZXMgPSBpICogcnVudGltZS0+cGVyaW9kX3NpemU7CisJCWlmIChmYyA8IHBpLT5mcmFtZV9jb3VudCArIG5mcmFtZXMpCisJCQlwaS0+ZnJhbWVfY291bnQgPSBmYyAtIG5mcmFtZXM7CiAJfQogCi0JcGktPmZyYW1lX2NvdW50ID0gZmMgLSBkZWx0YTsKLQlwaS0+Y3VycmVudF9wZXJpb2QgJT0gcGktPnN1YnN0cmVhbS0+cnVudGltZS0+cGVyaW9kczsKKwlpZiAoZG1hX3N0b3BwZWQpIHsKKwkJdGltZW91dCA9IDEwMDA7CisJCWZvciAoOzspIHsKKwkJCXN0YXR1cyA9IGluX2xlMzIoJnBpLT5kYmRtYS0+c3RhdHVzKTsKKwkJCWlmICghKHN0YXR1cyAmIEFDVElWRSkgJiYgKCFpbiB8fCAoc3RhdHVzICYgMHg4MCkpKQorCQkJCWJyZWFrOworCQkJaWYgKC0tdGltZW91dCA8PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJpMnNidXM6IHRpbWVkIG91dCAiCisJCQkJICAgICAgICJ3YWl0aW5nIGZvciBETUEgdG8gc3RvcCFcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJdWRlbGF5KDEpOworCQl9CiAKKwkJLyogVHVybiBvZmYgRE1BIGNvbnRyb2xsZXIsIGNsZWFyIFMwIGJpdCAqLworCQlvdXRfbGUzMigmcGktPmRiZG1hLT5jb250cm9sLCAoUlVOIHwgUEFVU0UgfCAxKSA8PCAxNik7CisKKwkJcGktPmRiZG1hX3Jpbmcuc3RvcHBpbmcgPSAwOworCQlpZiAocGktPnN0b3BfY29tcGxldGlvbikKKwkJCWNvbXBsZXRlKHBpLT5zdG9wX2NvbXBsZXRpb24pOworCX0KKworCWlmICghcGktPmRiZG1hX3JpbmcucnVubmluZykKKwkJZ290byBvdXRfdW5sb2NrOwogCXNwaW5fdW5sb2NrKCZpMnNkZXYtPmxvd19sb2NrKTsKIAkvKiBtYXkgY2FsbCBfdHJpZ2dlciBhZ2FpbiwgaGVuY2UgbmVlZHMgdG8gYmUgdW5sb2NrZWQgKi8KIAlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBpLT5zdWJzdHJlYW0pOwogCXJldHVybjsKKwogIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJmkyc2Rldi0+bG93X2xvY2spOwogfQpAQCAtNzE4LDcgKzc3OCw3IEBACiAJLmNsb3NlID0JaTJzYnVzX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAogCS5od19wYXJhbXMgPQlpMnNidXNfaHdfcGFyYW1zLAotCS5od19mcmVlID0JaTJzYnVzX2h3X2ZyZWUsCisJLmh3X2ZyZWUgPQlpMnNidXNfcGxheWJhY2tfaHdfZnJlZSwKIAkucHJlcGFyZSA9CWkyc2J1c19wbGF5YmFja19wcmVwYXJlLAogCS50cmlnZ2VyID0JaTJzYnVzX3BsYXliYWNrX3RyaWdnZXIsCiAJLnBvaW50ZXIgPQlpMnNidXNfcGxheWJhY2tfcG9pbnRlciwKQEAgLTc4OCw3ICs4NDgsNyBAQAogCS5jbG9zZSA9CWkyc2J1c19yZWNvcmRfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCiAJLmh3X3BhcmFtcyA9CWkyc2J1c19od19wYXJhbXMsCi0JLmh3X2ZyZWUgPQlpMnNidXNfaHdfZnJlZSwKKwkuaHdfZnJlZSA9CWkyc2J1c19yZWNvcmRfaHdfZnJlZSwKIAkucHJlcGFyZSA9CWkyc2J1c19yZWNvcmRfcHJlcGFyZSwKIAkudHJpZ2dlciA9CWkyc2J1c19yZWNvcmRfdHJpZ2dlciwKIAkucG9pbnRlciA9CWkyc2J1c19yZWNvcmRfcG9pbnRlciwKQEAgLTgxMiw3ICs4NzIsNiBAQAogCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogfQogCi0vKiBGSVhNRTogdGhpcyBmdW5jdGlvbiBuZWVkcyBhbiBlcnJvciBoYW5kbGluZyBzdHJhdGVneSB3aXRoIGxhYmVscyAqLwogaW50CiBpMnNidXNfYXR0YWNoX2NvZGVjKHN0cnVjdCBzb3VuZGJ1c19kZXYgKmRldiwgc3RydWN0IHNuZF9jYXJkICpjYXJkLAogCQkgICAgc3RydWN0IGNvZGVjX2luZm8gKmNpLCB2b2lkICpkYXRhKQpAQCAtODgwLDQxICs5MzksMzEgQEAKIAlpZiAoIWNpaS0+c2RldikgewogCQlwcmludGsoS0VSTl9ERUJVRwogCQkgICAgICAgImkyc2J1czogZmFpbGVkIHRvIGdldCBzb3VuZGJ1cyBkZXYgcmVmZXJlbmNlXG4iKTsKLQkJa2ZyZWUoY2lpKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2ZyZWVfY2lpOwogCX0KIAogCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJpMnNidXM6IGZhaWxlZCB0byBnZXQgbW9kdWxlIHJlZmVyZW5jZSFcbiIpOwotCQlzb3VuZGJ1c19kZXZfcHV0KGRldik7Ci0JCWtmcmVlKGNpaSk7Ci0JCXJldHVybiAtRUJVU1k7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXRfcHV0X3NkZXY7CiAJfQogCiAJaWYgKCF0cnlfbW9kdWxlX2dldChjaS0+b3duZXIpKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHCiAJCSAgICAgICAiaTJzYnVzOiBmYWlsZWQgdG8gZ2V0IG1vZHVsZSByZWZlcmVuY2UgdG8gY29kZWMgb3duZXIhXG4iKTsKLQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JCXNvdW5kYnVzX2Rldl9wdXQoZGV2KTsKLQkJa2ZyZWUoY2lpKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dF9wdXRfdGhpc19tb2R1bGU7CiAJfQogCiAJaWYgKCFkZXYtPnBjbSkgewotCQllcnIgPSBzbmRfcGNtX25ldyhjYXJkLAotCQkJCSAgZGV2LT5wY21uYW1lLAotCQkJCSAgZGV2LT5wY21pZCwKLQkJCQkgIDAsCi0JCQkJICAwLAorCQllcnIgPSBzbmRfcGNtX25ldyhjYXJkLCBkZXYtPnBjbW5hbWUsIGRldi0+cGNtaWQsIDAsIDAsCiAJCQkJICAmZGV2LT5wY20pOwogCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiaTJzYnVzOiBmYWlsZWQgdG8gY3JlYXRlIHBjbVxuIik7Ci0JCQlrZnJlZShjaWkpOwotCQkJbW9kdWxlX3B1dChjaS0+b3duZXIpOwotCQkJc291bmRidXNfZGV2X3B1dChkZXYpOwotCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JCQlyZXR1cm4gZXJyOworCQkJZ290byBvdXRfcHV0X2NpX21vZHVsZTsKIAkJfQorCQlkZXYtPnBjbS0+ZGV2ID0gJmRldi0+b2ZkZXYuZGV2OwogCX0KIAogCS8qIEFMU0EgeWV0IGFnYWluIHN1Y2tzLgpAQCAtOTI2LDIwICs5NzUsMTIgQEAKIAkJCS8qIGVoPyAqLwogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIkNhbid0IGF0dGFjaCBzYW1lIGJ1cyB0byBkaWZmZXJlbnQgY2FyZHMhXG4iKTsKLQkJCW1vZHVsZV9wdXQoY2ktPm93bmVyKTsKLQkJCWtmcmVlKGNpaSk7Ci0JCQlzb3VuZGJ1c19kZXZfcHV0KGRldik7Ci0JCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X3B1dF9jaV9tb2R1bGU7CiAJCX0KLQkJaWYgKChlcnIgPQotCQkgICAgIHNuZF9wY21fbmV3X3N0cmVhbShkZXYtPnBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgMSkpKSB7Ci0JCQltb2R1bGVfcHV0KGNpLT5vd25lcik7Ci0JCQlrZnJlZShjaWkpOwotCQkJc291bmRidXNfZGV2X3B1dChkZXYpOwotCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWVyciA9IHNuZF9wY21fbmV3X3N0cmVhbShkZXYtPnBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgMSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9wdXRfY2lfbW9kdWxlOwogCQlzbmRfcGNtX3NldF9vcHMoZGV2LT5wY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCiAJCQkJJmkyc2J1c19wbGF5YmFja19vcHMpOwogCQlpMnNkZXYtPm91dC5jcmVhdGVkID0gMTsKQEAgLTk0OSwyMCArOTkwLDExIEBACiAJCWlmIChkZXYtPnBjbS0+Y2FyZCAhPSBjYXJkKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiQ2FuJ3QgYXR0YWNoIHNhbWUgYnVzIHRvIGRpZmZlcmVudCBjYXJkcyFcbiIpOwotCQkJbW9kdWxlX3B1dChjaS0+b3duZXIpOwotCQkJa2ZyZWUoY2lpKTsKLQkJCXNvdW5kYnVzX2Rldl9wdXQoZGV2KTsKLQkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlnb3RvIG91dF9wdXRfY2lfbW9kdWxlOwogCQl9Ci0JCWlmICgoZXJyID0KLQkJICAgICBzbmRfcGNtX25ld19zdHJlYW0oZGV2LT5wY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgMSkpKSB7Ci0JCQltb2R1bGVfcHV0KGNpLT5vd25lcik7Ci0JCQlrZnJlZShjaWkpOwotCQkJc291bmRidXNfZGV2X3B1dChkZXYpOwotCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWVyciA9IHNuZF9wY21fbmV3X3N0cmVhbShkZXYtPnBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X3B1dF9jaV9tb2R1bGU7CiAJCXNuZF9wY21fc2V0X29wcyhkZXYtPnBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLAogCQkJCSZpMnNidXNfcmVjb3JkX29wcyk7CiAJCWkyc2Rldi0+aW4uY3JlYXRlZCA9IDE7CkBAIC05NzcsMTEgKzEwMDksNyBAQAogCWVyciA9IHNuZF9kZXZpY2VfcmVnaXN0ZXIoY2FyZCwgZGV2LT5wY20pOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpMnNidXM6IGVycm9yIHJlZ2lzdGVyaW5nIG5ldyBwY21cbiIpOwotCQltb2R1bGVfcHV0KGNpLT5vd25lcik7Ci0JCWtmcmVlKGNpaSk7Ci0JCXNvdW5kYnVzX2Rldl9wdXQoZGV2KTsKLQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0X3B1dF9jaV9tb2R1bGU7CiAJfQogCS8qIG5vIGVycm9ycyBhbnkgbW9yZSwgc28gbGV0J3MgYWRkIHRoaXMgdG8gb3VyIGxpc3QgKi8KIAlsaXN0X2FkZCgmY2lpLT5saXN0LCAmZGV2LT5jb2RlY19saXN0KTsKQEAgLTk5Niw2ICsxMDI0LDE1IEBACiAJCTY0ICogMTAyNCwgNjQgKiAxMDI0KTsKIAogCXJldHVybiAwOworIG91dF9wdXRfY2lfbW9kdWxlOgorCW1vZHVsZV9wdXQoY2ktPm93bmVyKTsKKyBvdXRfcHV0X3RoaXNfbW9kdWxlOgorCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworIG91dF9wdXRfc2RldjoKKwlzb3VuZGJ1c19kZXZfcHV0KGRldik7Cisgb3V0X2ZyZWVfY2lpOgorCWtmcmVlKGNpaSk7CisJcmV0dXJuIGVycjsKIH0KIAogdm9pZCBpMnNidXNfZGV0YWNoX2NvZGVjKHN0cnVjdCBzb3VuZGJ1c19kZXYgKmRldiwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLmggYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy5oCmluZGV4IGVjMjBlZTYuLmZmMjk2NTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLmgKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMuaApAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KIApAQCAtMzQsNiArMzUsNyBAQAogCXZvaWQgKnNwYWNlOwogCWludCBzaXplOwogCXUzMiBydW5uaW5nOjE7CisJdTMyIHN0b3BwaW5nOjE7CiB9OwogCiBzdHJ1Y3QgcGNtX2luZm8gewpAQCAtNDUsNiArNDcsNyBAQAogCXUzMiBmcmFtZV9jb3VudDsKIAlzdHJ1Y3QgZGJkbWFfY29tbWFuZF9tZW0gZGJkbWFfcmluZzsKIAl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkYmRtYTsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqc3RvcF9jb21wbGV0aW9uOwogfTsKIAogZW51bSB7CkBAIC0xMDEsNiArMTA0LDkgQEAKIGV4dGVybiBpcnFyZXR1cm5fdAogaTJzYnVzX3J4X2ludHIoaW50IGlycSwgdm9pZCAqZGV2aWQpOwogCitleHRlcm4gdm9pZCBpMnNidXNfd2FpdF9mb3Jfc3RvcF9ib3RoKHN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYpOworZXh0ZXJuIHZvaWQgaTJzYnVzX3BjbV9wcmVwYXJlX2JvdGgoc3RydWN0IGkyc2J1c19kZXYgKmkyc2Rldik7CisKIC8qIGNvbnRyb2wgc3BlY2lmaWMgZnVuY3Rpb25zICovCiBleHRlcm4gaW50IGkyc2J1c19jb250cm9sX2luaXQoc3RydWN0IG1hY2lvX2RldiogZGV2LAogCQkJICAgICAgIHN0cnVjdCBpMnNidXNfY29udHJvbCAqKmMpOwpkaWZmIC0tZ2l0IGEvc291bmQvYXJtL2FhY2kuaCBiL3NvdW5kL2FybS9hYWNpLmgKaW5kZXggMDYyOTUxOS4uOTE3NWZmOSAxMDA2NDQKLS0tIGEvc291bmQvYXJtL2FhY2kuaAorKysgYi9zb3VuZC9hcm0vYWFjaS5oCkBAIC0yMjgsNyArMjI4LDcgQEAKIAogCS8qIEFDJzk3ICovCiAJc3RydWN0IG11dGV4CQlhYzk3X3NlbTsKLQlhYzk3X2J1c190CQkqYWM5N19idXM7CisJc3RydWN0IHNuZF9hYzk3X2J1cwkqYWM5N19idXM7CiAKIAl1MzIJCQltYWluY3I7CiAJc3BpbmxvY2tfdAkJbG9jazsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvY29udHJvbC5jIGIvc291bmQvY29yZS9jb250cm9sLmMKaW5kZXggMGM3YmNkNi4uNDJiY2YyNyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9jb250cm9sLmMKKysrIGIvc291bmQvY29yZS9jb250cm9sLmMKQEAgLTEwOCw3ICsxMDgsNiBAQAogc3RhdGljIGludCBzbmRfY3RsX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX2N0bF9maWxlICpjdGw7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqY29udHJvbDsKQEAgLTEyMiwxMiArMTIxLDEwIEBACiAJbGlzdF9kZWwoJmN0bC0+bGlzdCk7CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmN0bF9maWxlc19yd2xvY2ssIGZsYWdzKTsKIAlkb3duX3dyaXRlKCZjYXJkLT5jb250cm9sc19yd3NlbSk7Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmY2FyZC0+Y29udHJvbHMpIHsKLQkJY29udHJvbCA9IHNuZF9rY29udHJvbChsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbnRyb2wsICZjYXJkLT5jb250cm9scywgbGlzdCkKIAkJZm9yIChpZHggPSAwOyBpZHggPCBjb250cm9sLT5jb3VudDsgaWR4KyspCiAJCQlpZiAoY29udHJvbC0+dmRbaWR4XS5vd25lciA9PSBjdGwpCiAJCQkJY29udHJvbC0+dmRbaWR4XS5vd25lciA9IE5VTEw7Ci0JfQogCXVwX3dyaXRlKCZjYXJkLT5jb250cm9sc19yd3NlbSk7CiAJc25kX2N0bF9lbXB0eV9yZWFkX3F1ZXVlKGN0bCk7CiAJa2ZyZWUoY3RsKTsKQEAgLTE0MCw3ICsxMzcsNiBAQAogCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pZCAqaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpmbGlzdDsKIAlzdHJ1Y3Qgc25kX2N0bF9maWxlICpjdGw7CiAJc3RydWN0IHNuZF9rY3RsX2V2ZW50ICpldjsKIAkKQEAgLTE0OSwxNCArMTQ1LDExIEBACiAjaWYgZGVmaW5lZChDT05GSUdfU05EX01JWEVSX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX01JWEVSX09TU19NT0RVTEUpCiAJY2FyZC0+bWl4ZXJfb3NzX2NoYW5nZV9jb3VudCsrOwogI2VuZGlmCi0JbGlzdF9mb3JfZWFjaChmbGlzdCwgJmNhcmQtPmN0bF9maWxlcykgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICplbGlzdDsKLQkJY3RsID0gc25kX2N0bF9maWxlKGZsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0bCwgJmNhcmQtPmN0bF9maWxlcywgbGlzdCkgewogCQlpZiAoIWN0bC0+c3Vic2NyaWJlZCkKIAkJCWNvbnRpbnVlOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3RsLT5yZWFkX2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9mb3JfZWFjaChlbGlzdCwgJmN0bC0+ZXZlbnRzKSB7Ci0JCQlldiA9IHNuZF9rY3RsX2V2ZW50KGVsaXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShldiwgJmN0bC0+ZXZlbnRzLCBsaXN0KSB7CiAJCQlpZiAoZXYtPmlkLm51bWlkID09IGlkLT5udW1pZCkgewogCQkJCWV2LT5tYXNrIHw9IG1hc2s7CiAJCQkJZ290byBfZm91bmQ7CkBAIC0xOTAsNyArMTgzLDggQEAKICAqCiAgKiBSZXR1cm5zIHRoZSBwb2ludGVyIG9mIHRoZSBuZXcgaW5zdGFuY2UsIG9yIE5VTEwgb24gZmFpbHVyZS4KICAqLwotc3RydWN0IHNuZF9rY29udHJvbCAqc25kX2N0bF9uZXcoc3RydWN0IHNuZF9rY29udHJvbCAqY29udHJvbCwgdW5zaWduZWQgaW50IGFjY2VzcykKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sICpzbmRfY3RsX25ldyhzdHJ1Y3Qgc25kX2tjb250cm9sICpjb250cm9sLAorCQkJCQl1bnNpZ25lZCBpbnQgYWNjZXNzKQogewogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CiAJdW5zaWduZWQgaW50IGlkeDsKQEAgLTIwOCw4ICsyMDIsNiBAQAogCXJldHVybiBrY3RsOwogfQogCi1FWFBPUlRfU1lNQk9MKHNuZF9jdGxfbmV3KTsKLQogLyoqCiAgKiBzbmRfY3RsX25ldzEgLSBjcmVhdGUgYSBjb250cm9sIGluc3RhbmNlIGZyb20gdGhlIHRlbXBsYXRlCiAgKiBAbmNvbnRyb2w6IHRoZSBpbml0aWFsaXphdGlvbiByZWNvcmQKQEAgLTI3NywxMSArMjY5LDkgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2N0bF9ob2xlX2NoZWNrKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IGNvdW50KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKIAotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmNvbnRyb2xzKSB7Ci0JCWtjdGwgPSBzbmRfa2NvbnRyb2wobGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShrY3RsLCAmY2FyZC0+Y29udHJvbHMsIGxpc3QpIHsKIAkJaWYgKChrY3RsLT5pZC5udW1pZCA8PSBjYXJkLT5sYXN0X251bWlkICYmCiAJCSAgICAga2N0bC0+aWQubnVtaWQgKyBrY3RsLT5jb3VudCA+IGNhcmQtPmxhc3RfbnVtaWQpIHx8CiAJCSAgICAoa2N0bC0+aWQubnVtaWQgPD0gY2FyZC0+bGFzdF9udW1pZCArIGNvdW50IC0gMSAmJgpAQCAtNDk4LDEyICs0ODgsMTAgQEAKICAqLwogc3RydWN0IHNuZF9rY29udHJvbCAqc25kX2N0bF9maW5kX251bWlkKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IG51bWlkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKIAogCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMICYmIG51bWlkICE9IDAsIHJldHVybiBOVUxMKTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5jb250cm9scykgewotCQlrY3RsID0gc25kX2tjb250cm9sKGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoa2N0bCwgJmNhcmQtPmNvbnRyb2xzLCBsaXN0KSB7CiAJCWlmIChrY3RsLT5pZC5udW1pZCA8PSBudW1pZCAmJiBrY3RsLT5pZC5udW1pZCArIGtjdGwtPmNvdW50ID4gbnVtaWQpCiAJCQlyZXR1cm4ga2N0bDsKIAl9CkBAIC01MjcsMTQgKzUxNSwxMiBAQAogc3RydWN0IHNuZF9rY29udHJvbCAqc25kX2N0bF9maW5kX2lkKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKIAkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faWQgKmlkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKIAogCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMICYmIGlkICE9IE5VTEwsIHJldHVybiBOVUxMKTsKIAlpZiAoaWQtPm51bWlkICE9IDApCiAJCXJldHVybiBzbmRfY3RsX2ZpbmRfbnVtaWQoY2FyZCwgaWQtPm51bWlkKTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5jb250cm9scykgewotCQlrY3RsID0gc25kX2tjb250cm9sKGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoa2N0bCwgJmNhcmQtPmNvbnRyb2xzLCBsaXN0KSB7CiAJCWlmIChrY3RsLT5pZC5pZmFjZSAhPSBpZC0+aWZhY2UpCiAJCQljb250aW51ZTsKIAkJaWYgKGtjdGwtPmlkLmRldmljZSAhPSBpZC0+ZGV2aWNlKQpAQCAtMTE4Miw3ICsxMTY4LDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX2N0bF9maWxlICpjdGw7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9rY3RsX2lvY3RsICpwOwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBfX3VzZXIgKmlwID0gYXJncDsKQEAgLTEyMzIsOCArMTIxNyw3IEBACiAjZW5kaWYKIAl9CiAJZG93bl9yZWFkKCZzbmRfaW9jdGxfcndzZW0pOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJnNuZF9jb250cm9sX2lvY3RscykgewotCQlwID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc25kX2tjdGxfaW9jdGwsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnNuZF9jb250cm9sX2lvY3RscywgbGlzdCkgewogCQllcnIgPSBwLT5maW9jdGwoY2FyZCwgY3RsLCBjbWQsIGFyZyk7CiAJCWlmIChlcnIgIT0gLUVOT0lPQ1RMQ01EKSB7CiAJCQl1cF9yZWFkKCZzbmRfaW9jdGxfcndzZW0pOwpAQCAtMTM1NywxMyArMTM0MSwxMSBAQAogc3RhdGljIGludCBfc25kX2N0bF91bnJlZ2lzdGVyX2lvY3RsKHNuZF9rY3RsX2lvY3RsX2Z1bmNfdCBmY24sCiAJCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0cykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXN0cnVjdCBzbmRfa2N0bF9pb2N0bCAqcDsKIAogCXNuZF9hc3NlcnQoZmNuICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKIAlkb3duX3dyaXRlKCZzbmRfaW9jdGxfcndzZW0pOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgbGlzdHMpIHsKLQkJcCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHNuZF9rY3RsX2lvY3RsLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGxpc3RzLCBsaXN0KSB7CiAJCWlmIChwLT5maW9jdGwgPT0gZmNuKSB7CiAJCQlsaXN0X2RlbCgmcC0+bGlzdCk7CiAJCQl1cF93cml0ZSgmc25kX2lvY3RsX3J3c2VtKTsKQEAgLTE0NTMsNyArMTQzNSw2IEBACiBzdGF0aWMgaW50IHNuZF9jdGxfZGV2X2Rpc2Nvbm5lY3Qoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZpY2UtPmRldmljZV9kYXRhOwotCXN0cnVjdCBsaXN0X2hlYWQgKmZsaXN0OwogCXN0cnVjdCBzbmRfY3RsX2ZpbGUgKmN0bDsKIAlpbnQgZXJyLCBjYXJkbnVtOwogCkBAIC0xNDYyLDggKzE0NDMsNyBAQAogCXNuZF9hc3NlcnQoY2FyZG51bSA+PSAwICYmIGNhcmRudW0gPCBTTkRSVl9DQVJEUywgcmV0dXJuIC1FTlhJTyk7CiAKIAlkb3duX3JlYWQoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKLQlsaXN0X2Zvcl9lYWNoKGZsaXN0LCAmY2FyZC0+Y3RsX2ZpbGVzKSB7Ci0JCWN0bCA9IHNuZF9jdGxfZmlsZShmbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdGwsICZjYXJkLT5jdGxfZmlsZXMsIGxpc3QpIHsKIAkJd2FrZV91cCgmY3RsLT5jaGFuZ2Vfc2xlZXApOwogCQlraWxsX2Zhc3luYygmY3RsLT5mYXN5bmMsIFNJR0lPLCBQT0xMX0VSUik7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jIGIvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jCmluZGV4IGFiNDg5NjIuLjkzMTFjYTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvY29udHJvbF9jb21wYXQuYworKysgYi9zb3VuZC9jb3JlL2NvbnRyb2xfY29tcGF0LmMKQEAgLTM5Miw3ICszOTIsNyBAQAogc3RhdGljIGlubGluZSBsb25nIHNuZF9jdGxfaW9jdGxfY29tcGF0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3Qgc25kX2N0bF9maWxlICpjdGw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3Qgc25kX2tjdGxfaW9jdGwgKnA7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSBjb21wYXRfcHRyKGFyZyk7CiAJaW50IGVycjsKIApAQCAtNDI3LDggKzQyNyw3IEBACiAJfQogCiAJZG93bl9yZWFkKCZzbmRfaW9jdGxfcndzZW0pOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJnNuZF9jb250cm9sX2NvbXBhdF9pb2N0bHMpIHsKLQkJc3RydWN0IHNuZF9rY3RsX2lvY3RsICpwID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc25kX2tjdGxfaW9jdGwsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnNuZF9jb250cm9sX2NvbXBhdF9pb2N0bHMsIGxpc3QpIHsKIAkJaWYgKHAtPmZpb2N0bCkgewogCQkJZXJyID0gcC0+ZmlvY3RsKGN0bC0+Y2FyZCwgY3RsLCBjbWQsIGFyZyk7CiAJCQlpZiAoZXJyICE9IC1FTk9JT0NUTENNRCkgewpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9kZXZpY2UuYyBiL3NvdW5kL2NvcmUvZGV2aWNlLmMKaW5kZXggY2NiMjU4MS4uNTg1OGIwMiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9kZXZpY2UuYworKysgYi9zb3VuZC9jb3JlL2RldmljZS5jCkBAIC03OSwxMyArNzksMTEgQEAKICAqLwogaW50IHNuZF9kZXZpY2VfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHZvaWQgKmRldmljZV9kYXRhKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKIAkKIAlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CiAJc25kX2Fzc2VydChkZXZpY2VfZGF0YSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7CiAJCWlmIChkZXYtPmRldmljZV9kYXRhICE9IGRldmljZV9kYXRhKQogCQkJY29udGludWU7CiAJCS8qIHVubGluayAqLwpAQCAtMTI0LDEzICsxMjIsMTEgQEAKICAqLwogaW50IHNuZF9kZXZpY2VfZGlzY29ubmVjdChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHZvaWQgKmRldmljZV9kYXRhKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKIAogCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKIAlzbmRfYXNzZXJ0KGRldmljZV9kYXRhICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmRldmljZXMpIHsKLQkJZGV2ID0gc25kX2RldmljZShsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmNhcmQtPmRldmljZXMsIGxpc3QpIHsKIAkJaWYgKGRldi0+ZGV2aWNlX2RhdGEgIT0gZGV2aWNlX2RhdGEpCiAJCQljb250aW51ZTsKIAkJaWYgKGRldi0+c3RhdGUgPT0gU05EUlZfREVWX1JFR0lTVEVSRUQgJiYKQEAgLTE2MSwxNCArMTU3LDEyIEBACiAgKi8KIGludCBzbmRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OwogCWludCBlcnI7CiAKIAlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CiAJc25kX2Fzc2VydChkZXZpY2VfZGF0YSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7CiAJCWlmIChkZXYtPmRldmljZV9kYXRhICE9IGRldmljZV9kYXRhKQogCQkJY29udGludWU7CiAJCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9CVUlMRCAmJiBkZXYtPm9wcy0+ZGV2X3JlZ2lzdGVyKSB7CkBAIC0xOTIsMTMgKzE4NiwxMSBAQAogICovCiBpbnQgc25kX2RldmljZV9yZWdpc3Rlcl9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKIAlpbnQgZXJyOwogCQogCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7CiAJCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9CVUlMRCAmJiBkZXYtPm9wcy0+ZGV2X3JlZ2lzdGVyKSB7CiAJCQlpZiAoKGVyciA9IGRldi0+b3BzLT5kZXZfcmVnaXN0ZXIoZGV2KSkgPCAwKQogCQkJCXJldHVybiBlcnI7CkBAIC0yMTUsMTIgKzIwNywxMCBAQAogaW50IHNuZF9kZXZpY2VfZGlzY29ubmVjdF9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewogCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAlpbnQgZXJyID0gMDsKIAogCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7CiAJCWlmIChzbmRfZGV2aWNlX2Rpc2Nvbm5lY3QoY2FyZCwgZGV2LT5kZXZpY2VfZGF0YSkgPCAwKQogCQkJZXJyID0gLUVOWElPOwogCX0KQEAgLTIzNCw3ICsyMjQsNiBAQAogaW50IHNuZF9kZXZpY2VfZnJlZV9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzbmRfZGV2aWNlX2NtZF90IGNtZCkKIHsKIAlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBpbnQgcmFuZ2VfbG93LCByYW5nZV9oaWdoOwogCkBAIC0yNDIsOCArMjMxLDcgQEAKIAlyYW5nZV9sb3cgPSBjbWQgKiBTTkRSVl9ERVZfVFlQRV9SQU5HRV9TSVpFOwogCXJhbmdlX2hpZ2ggPSByYW5nZV9sb3cgKyBTTkRSVl9ERVZfVFlQRV9SQU5HRV9TSVpFIC0gMTsKICAgICAgIF9fYWdhaW46Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmY2FyZC0+ZGV2aWNlcykgewotCQlkZXYgPSBzbmRfZGV2aWNlKGxpc3QpOwkJCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7CiAJCWlmIChkZXYtPnR5cGUgPj0gcmFuZ2VfbG93ICYmIGRldi0+dHlwZSA8PSByYW5nZV9oaWdoKSB7CiAJCQlpZiAoKGVyciA9IHNuZF9kZXZpY2VfZnJlZShjYXJkLCBkZXYtPmRldmljZV9kYXRhKSkgPCAwKQogCQkJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2h3ZGVwLmMgYi9zb3VuZC9jb3JlL2h3ZGVwLmMKaW5kZXggNDZiNDc2OC4uMzljMDNmMyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9od2RlcC5jCisrKyBiL3NvdW5kL2NvcmUvaHdkZXAuYwpAQCAtNDcsMTQgKzQ3LDExIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2h3ZGVwICpzbmRfaHdkZXBfc2VhcmNoKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldmljZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmc25kX2h3ZGVwX2RldmljZXMpIHsKLQkJaHdkZXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfaHdkZXAsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaHdkZXAsICZzbmRfaHdkZXBfZGV2aWNlcywgbGlzdCkKIAkJaWYgKGh3ZGVwLT5jYXJkID09IGNhcmQgJiYgaHdkZXAtPmRldmljZSA9PSBkZXZpY2UpCiAJCQlyZXR1cm4gaHdkZXA7Ci0JfQogCXJldHVybiBOVUxMOwogfQogCkBAIC0xNTksMTUgKzE1NiwxNiBAQAogCWludCBlcnIgPSAtRU5YSU87CiAJc3RydWN0IHNuZF9od2RlcCAqaHcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IG1vZHVsZSAqbW9kID0gaHctPmNhcmQtPm1vZHVsZTsKKwogCW11dGV4X2xvY2soJmh3LT5vcGVuX211dGV4KTsKLQlpZiAoaHctPm9wcy5yZWxlYXNlKSB7CisJaWYgKGh3LT5vcHMucmVsZWFzZSkKIAkJZXJyID0gaHctPm9wcy5yZWxlYXNlKGh3LCBmaWxlKTsKLQkJd2FrZV91cCgmaHctPm9wZW5fd2FpdCk7Ci0JfQogCWlmIChody0+dXNlZCA+IDApCiAJCWh3LT51c2VkLS07Ci0Jc25kX2NhcmRfZmlsZV9yZW1vdmUoaHctPmNhcmQsIGZpbGUpOwogCW11dGV4X3VubG9jaygmaHctPm9wZW5fbXV0ZXgpOworCXdha2VfdXAoJmh3LT5vcGVuX3dhaXQpOworCisJc25kX2NhcmRfZmlsZV9yZW1vdmUoaHctPmNhcmQsIGZpbGUpOwogCW1vZHVsZV9wdXQobW9kKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNDY4LDE1ICs0NjYsMTIgQEAKIHN0YXRpYyB2b2lkIHNuZF9od2RlcF9wcm9jX3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKIAkJCQlzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcDsKIAogCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoKHAsICZzbmRfaHdkZXBfZGV2aWNlcykgewotCQlod2RlcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF9od2RlcCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShod2RlcCwgJnNuZF9od2RlcF9kZXZpY2VzLCBsaXN0KQogCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDJpLSUwMmk6ICVzXG4iLAogCQkJICAgIGh3ZGVwLT5jYXJkLT5udW1iZXIsIGh3ZGVwLT5kZXZpY2UsIGh3ZGVwLT5uYW1lKTsKLQl9CiAJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaW5pdC5jIGIvc291bmQvY29yZS9pbml0LmMKaW5kZXggYTRjYzZiMS4uZGI2MTAzNyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbml0LmMKKysrIGIvc291bmQvY29yZS9pbml0LmMKQEAgLTExNCwyMiArMTE0LDI4IEBACiAJaWYgKGlkeCA8IDApIHsKIAkJaW50IGlkeDI7CiAJCWZvciAoaWR4MiA9IDA7IGlkeDIgPCBTTkRSVl9DQVJEUzsgaWR4MisrKQorCQkJLyogaWR4ID09IC0xID09IDB4ZmZmZiBtZWFuczogdGFrZSBhbnkgZnJlZSBzbG90ICovCiAJCQlpZiAofnNuZF9jYXJkc19sb2NrICYgaWR4ICYgMTw8aWR4MikgewogCQkJCWlkeCA9IGlkeDI7CiAJCQkJaWYgKGlkeCA+PSBzbmRfZWNhcmRzX2xpbWl0KQogCQkJCQlzbmRfZWNhcmRzX2xpbWl0ID0gaWR4ICsgMTsKIAkJCQlicmVhazsKIAkJCX0KLQl9IGVsc2UgaWYgKGlkeCA8IHNuZF9lY2FyZHNfbGltaXQpIHsKLQkJaWYgKHNuZF9jYXJkc19sb2NrICYgKDEgPDwgaWR4KSkKLQkJCWVyciA9IC1FTk9ERVY7CS8qIGludmFsaWQgKi8KLQl9IGVsc2UgaWYgKGlkeCA8IFNORFJWX0NBUkRTKQotCQlzbmRfZWNhcmRzX2xpbWl0ID0gaWR4ICsgMTsgLyogaW5jcmVhc2UgdGhlIGxpbWl0ICovCi0JZWxzZQotCQllcnIgPSAtRU5PREVWOworCX0gZWxzZSB7CisJCSBpZiAoaWR4IDwgc25kX2VjYXJkc19saW1pdCkgeworCQkJaWYgKHNuZF9jYXJkc19sb2NrICYgKDEgPDwgaWR4KSkKKwkJCQllcnIgPSAtRUJVU1k7CS8qIGludmFsaWQgKi8KKwkJfSBlbHNlIHsKKwkJCWlmIChpZHggPCBTTkRSVl9DQVJEUykKKwkJCQlzbmRfZWNhcmRzX2xpbWl0ID0gaWR4ICsgMTsgLyogaW5jcmVhc2UgdGhlIGxpbWl0ICovCisJCQllbHNlCisJCQkJZXJyID0gLUVOT0RFVjsKKwkJfQorCX0KIAlpZiAoaWR4IDwgMCB8fCBlcnIgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmc25kX2NhcmRfbXV0ZXgpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZmluZCB0aGUgc2xvdCBmb3IgaW5kZXggJWQgKHJhbmdlIDAtJWkpXG4iLCBpZHgsIHNuZF9lY2FyZHNfbGltaXQgLSAxKTsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGZpbmQgdGhlIHNsb3QgZm9yIGluZGV4ICVkIChyYW5nZSAwLSVpKSwgZXJyb3I6ICVkXG4iLAorCQkJIGlkeCwgc25kX2VjYXJkc19saW1pdCAtIDEsIGVycik7CiAJCWdvdG8gX19lcnJvcjsKIAl9CiAJc25kX2NhcmRzX2xvY2sgfD0gMSA8PCBpZHg7CQkvKiBsb2NrIGl0ICovCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL21lbWFsbG9jLmMgYi9zb3VuZC9jb3JlL21lbWFsbG9jLmMKaW5kZXggYmMwYmQwOS4uZjA1NzQzMCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9tZW1hbGxvYy5jCisrKyBiL3NvdW5kL2NvcmUvbWVtYWxsb2MuYwpAQCAtNDA2LDE5ICs0MDYsMTcgQEAKICAqLwogc2l6ZV90IHNuZF9kbWFfZ2V0X3Jlc2VydmVkX2J1ZihzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYWIsIHVuc2lnbmVkIGludCBpZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCXN0cnVjdCBzbmRfbWVtX2xpc3QgKm1lbTsKIAogCXNuZF9hc3NlcnQoZG1hYiwgcmV0dXJuIDApOwogCiAJbXV0ZXhfbG9jaygmbGlzdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmbWVtX2xpc3RfaGVhZCkgewotCQltZW0gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfbWVtX2xpc3QsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobWVtLCAmbWVtX2xpc3RfaGVhZCwgbGlzdCkgewogCQlpZiAobWVtLT5pZCA9PSBpZCAmJgogCQkgICAgKG1lbS0+YnVmZmVyLmRldi5kZXYgPT0gTlVMTCB8fCBkbWFiLT5kZXYuZGV2ID09IE5VTEwgfHwKIAkJICAgICAhIG1lbWNtcCgmbWVtLT5idWZmZXIuZGV2LCAmZG1hYi0+ZGV2LCBzaXplb2YoZG1hYi0+ZGV2KSkpKSB7CiAJCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkbWFiLT5kZXYuZGV2OwotCQkJbGlzdF9kZWwocCk7CisJCQlsaXN0X2RlbCgmbWVtLT5saXN0KTsKIAkJCSpkbWFiID0gbWVtLT5idWZmZXI7CiAJCQlpZiAoZG1hYi0+ZGV2LmRldiA9PSBOVUxMKQogCQkJCWRtYWItPmRldi5kZXYgPSBkZXY7CkBAIC00ODgsNyArNDg2LDYgQEAKIHsKIAlpbnQgbGVuID0gMDsKIAlsb25nIHBhZ2VzID0gc25kX2FsbG9jYXRlZF9wYWdlcyA+PiAoUEFHRV9TSElGVC0xMik7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX21lbV9saXN0ICptZW07CiAJaW50IGRldm5vOwogCXN0YXRpYyBjaGFyICp0eXBlc1tdID0geyAiVU5LTk9XTiIsICJDT05UIiwgIkRFViIsICJERVYtU0ciLCAiU0JVUyIgfTsKQEAgLTQ5OCw4ICs0OTUsNyBAQAogCQkJInBhZ2VzICA6ICVsaSBieXRlcyAoJWxpIHBhZ2VzIHBlciAlbGlrQilcbiIsCiAJCQlwYWdlcyAqIFBBR0VfU0laRSwgcGFnZXMsIFBBR0VfU0laRSAvIDEwMjQpOwogCWRldm5vID0gMDsKLQlsaXN0X2Zvcl9lYWNoKHAsICZtZW1fbGlzdF9oZWFkKSB7Ci0JCW1lbSA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF9tZW1fbGlzdCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtZW0sICZtZW1fbGlzdF9oZWFkLCBsaXN0KSB7CiAJCWRldm5vKys7CiAJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKIAkJCQkiYnVmZmVyICVkIDogSUQgJTA4eCA6IHR5cGUgJXNcbiIsCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL21pc2MuYyBiL3NvdW5kL2NvcmUvbWlzYy5jCmluZGV4IDAzZmM3MTEuLjZkYjg2YTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvbWlzYy5jCisrKyBiL3NvdW5kL2NvcmUvbWlzYy5jCkBAIC03OCwzICs3OCwzMSBAQAogCiBFWFBPUlRfU1lNQk9MKHNuZF92ZXJib3NlX3ByaW50ZCk7CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKy8qKgorICogc25kX3BjaV9xdWlya19sb29rdXAgLSBsb29rIHVwIGEgUENJIFNTSUQgcXVpcmsgbGlzdAorICogQHBjaTogcGNpX2RldiBoYW5kbGUKKyAqIEBsaXN0OiBxdWlyayBsaXN0LCB0ZXJtaW5hdGVkIGJ5IGEgbnVsbCBlbnRyeQorICoKKyAqIExvb2sgdGhyb3VnaCB0aGUgZ2l2ZW4gcXVpcmsgbGlzdCBhbmQgZmluZHMgYSBtYXRjaGluZyBlbnRyeQorICogd2l0aCB0aGUgc2FtZSBQQ0kgU1NJRC4gIFdoZW4gc3ViZGV2aWNlIGlzIDAsIGFsbCBzdWJkZXZpY2UKKyAqIHZhbHVlcyBtYXkgbWF0Y2guCisgKgorICogUmV0dXJucyB0aGUgbWF0Y2hlZCBlbnRyeSBwb2ludGVyLCBvciBOVUxMIGlmIG5vdGhpbmcgbWF0Y2hlZC4KKyAqLworY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKgorc25kX3BjaV9xdWlya19sb29rdXAoc3RydWN0IHBjaV9kZXYgKnBjaSwgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKmxpc3QpCit7CisJY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKnE7CisKKwlmb3IgKHEgPSBsaXN0OyBxLT5zdWJ2ZW5kb3I7IHErKykKKwkJaWYgKHEtPnN1YnZlbmRvciA9PSBwY2ktPnN1YnN5c3RlbV92ZW5kb3IgJiYKKwkJICAgICghcS0+c3ViZGV2aWNlIHx8IHEtPnN1YmRldmljZSA9PSBwY2ktPnN1YnN5c3RlbV9kZXZpY2UpKQorCQkJcmV0dXJuIHE7CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0woc25kX3BjaV9xdWlya19sb29rdXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbS5jIGIvc291bmQvY29yZS9wY20uYwppbmRleCA4ZTAxODk4Li4yNzQzNDE0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtLmMKQEAgLTQ1LDExICs0NSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjbSAqc25kX3BjbV9zZWFyY2goc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2aWNlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAotCWxpc3RfZm9yX2VhY2gocCwgJnNuZF9wY21fZGV2aWNlcykgewotCQlwY20gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfcGNtLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjbSwgJnNuZF9wY21fZGV2aWNlcywgbGlzdCkgewogCQlpZiAocGNtLT5jYXJkID09IGNhcmQgJiYgcGNtLT5kZXZpY2UgPT0gZGV2aWNlKQogCQkJcmV0dXJuIHBjbTsKIAl9CkBAIC03ODIsNyArNzgwLDYgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOwogCXN0cnVjdCBzbmRfY3RsX2ZpbGUgKmtjdGw7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJaW50IHByZWZlcl9zdWJkZXZpY2UgPSAtMTsKIAlzaXplX3Qgc2l6ZTsKIApAQCAtNzk1LDggKzc5Miw3IEBACiAKIAljYXJkID0gcGNtLT5jYXJkOwogCWRvd25fcmVhZCgmY2FyZC0+Y29udHJvbHNfcndzZW0pOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmN0bF9maWxlcykgewotCQlrY3RsID0gc25kX2N0bF9maWxlKGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoa2N0bCwgJmNhcmQtPmN0bF9maWxlcywgbGlzdCkgewogCQlpZiAoa2N0bC0+cGlkID09IGN1cnJlbnQtPnBpZCkgewogCQkJcHJlZmVyX3N1YmRldmljZSA9IGtjdGwtPnByZWZlcl9wY21fc3ViZGV2aWNlOwogCQkJaWYgKHByZWZlcl9zdWJkZXZpY2UgIT0gLTEpCkBAIC05NDEsOSArOTM3LDEwIEBACiB7CiAJaW50IGNpZHgsIGVycjsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBzbmRfcGNtX25vdGlmeSAqbm90aWZ5OwogCWNoYXIgc3RyWzE2XTsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKIAlzbmRfYXNzZXJ0KHBjbSAhPSBOVUxMICYmIGRldmljZSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKIAltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CkBAIC05NjYsMTEgKzk2MywxOCBAQAogCQkJZGV2dHlwZSA9IFNORFJWX0RFVklDRV9UWVBFX1BDTV9DQVBUVVJFOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKChlcnIgPSBzbmRfcmVnaXN0ZXJfZGV2aWNlKGRldnR5cGUsIHBjbS0+Y2FyZCwKLQkJCQkJICAgICAgIHBjbS0+ZGV2aWNlLAotCQkJCQkgICAgICAgJnNuZF9wY21fZl9vcHNbY2lkeF0sCi0JCQkJCSAgICAgICBwY20sIHN0cikpIDwgMCkKLQkJeworCQkvKiBkZXZpY2UgcG9pbnRlciB0byB1c2UsIHBjbS0+ZGV2IHRha2VzIHByZWNlZGVuY2UgaWYKKwkJICogaXQgaXMgYXNzaWduZWQsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gY2FyZCdzIGRldmljZQorCQkgKiBpZiBwb3NzaWJsZSAqLworCQlkZXYgPSBwY20tPmRldjsKKwkJaWYgKCFkZXYpCisJCQlkZXYgPSBzbmRfY2FyZF9nZXRfZGV2aWNlX2xpbmsocGNtLT5jYXJkKTsKKwkJLyogcmVnaXN0ZXIgcGNtICovCisJCWVyciA9IHNuZF9yZWdpc3Rlcl9kZXZpY2VfZm9yX2RldihkZXZ0eXBlLCBwY20tPmNhcmQsCisJCQkJCQkgIHBjbS0+ZGV2aWNlLAorCQkJCQkJICAmc25kX3BjbV9mX29wc1tjaWR4XSwKKwkJCQkJCSAgcGNtLCBzdHIsIGRldik7CisJCWlmIChlcnIgPCAwKSB7CiAJCQlsaXN0X2RlbCgmcGNtLT5saXN0KTsKIAkJCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCQkJcmV0dXJuIGVycjsKQEAgLTk4MCwxMSArOTg0LDEwIEBACiAJCWZvciAoc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW2NpZHhdLnN1YnN0cmVhbTsgc3Vic3RyZWFtOyBzdWJzdHJlYW0gPSBzdWJzdHJlYW0tPm5leHQpCiAJCQlzbmRfcGNtX3RpbWVyX2luaXQoc3Vic3RyZWFtKTsKIAl9Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmc25kX3BjbV9ub3RpZnlfbGlzdCkgewotCQlzdHJ1Y3Qgc25kX3BjbV9ub3RpZnkgKm5vdGlmeTsKLQkJbm90aWZ5ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc25kX3BjbV9ub3RpZnksIGxpc3QpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShub3RpZnksICZzbmRfcGNtX25vdGlmeV9saXN0LCBsaXN0KQogCQlub3RpZnktPm5fcmVnaXN0ZXIocGNtKTsKLQl9CisKIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMjcsNyArMTAzMCw3IEBACiAKIGludCBzbmRfcGNtX25vdGlmeShzdHJ1Y3Qgc25kX3BjbV9ub3RpZnkgKm5vdGlmeSwgaW50IG5mcmVlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKIAogCXNuZF9hc3NlcnQobm90aWZ5ICE9IE5VTEwgJiYKIAkJICAgbm90aWZ5LT5uX3JlZ2lzdGVyICE9IE5VTEwgJiYKQEAgLTEwMzYsMTMgKzEwMzksMTIgQEAKIAltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJaWYgKG5mcmVlKSB7CiAJCWxpc3RfZGVsKCZub3RpZnktPmxpc3QpOwotCQlsaXN0X2Zvcl9lYWNoKHAsICZzbmRfcGNtX2RldmljZXMpCi0JCQlub3RpZnktPm5fdW5yZWdpc3RlcihsaXN0X2VudHJ5KHAsCi0JCQkJCQkJc3RydWN0IHNuZF9wY20sIGxpc3QpKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwY20sICZzbmRfcGNtX2RldmljZXMsIGxpc3QpCisJCQlub3RpZnktPm5fdW5yZWdpc3RlcihwY20pOwogCX0gZWxzZSB7CiAJCWxpc3RfYWRkX3RhaWwoJm5vdGlmeS0+bGlzdCwgJnNuZF9wY21fbm90aWZ5X2xpc3QpOwotCQlsaXN0X2Zvcl9lYWNoKHAsICZzbmRfcGNtX2RldmljZXMpCi0JCQlub3RpZnktPm5fcmVnaXN0ZXIobGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3BjbSwgbGlzdCkpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjbSwgJnNuZF9wY21fZGV2aWNlcywgbGlzdCkKKwkJCW5vdGlmeS0+bl9yZWdpc3RlcihwY20pOwogCX0KIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlyZXR1cm4gMDsKQEAgLTEwNTgsMTIgKzEwNjAsMTAgQEAKIHN0YXRpYyB2b2lkIHNuZF9wY21fcHJvY19yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCiAJCQkgICAgICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2gocCwgJnNuZF9wY21fZGV2aWNlcykgewotCQlwY20gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfcGNtLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjbSwgJnNuZF9wY21fZGV2aWNlcywgbGlzdCkgewogCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDJpLSUwMmk6ICVzIDogJXMiLAogCQkJICAgIHBjbS0+Y2FyZC0+bnVtYmVyLCBwY20tPmRldmljZSwgcGNtLT5pZCwgcGNtLT5uYW1lKTsKIAkJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW0pCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9saWIuYyBiL3NvdW5kL2NvcmUvcGNtX2xpYi5jCmluZGV4IGIzMzY3OTcuLjlmZWZjYWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX2xpYi5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX2xpYi5jCkBAIC03ODEsNiArNzgxLDExIEBACiB7CiAgICAgICAgIHVuc2lnbmVkIGludCBrOwogCWludCBjaGFuZ2VkID0gMDsKKworCWlmICghY291bnQpIHsKKwkJaS0+ZW1wdHkgPSAxOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAgICAgICAgIGZvciAoayA9IDA7IGsgPCBjb3VudDsgaysrKSB7CiAJCWlmIChtYXNrICYmICEobWFzayAmICgxIDw8IGspKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbWVtb3J5LmMgYi9zb3VuZC9jb3JlL3BjbV9tZW1vcnkuYwppbmRleCBiZTAzMGNiLi45NWIxYjJmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9tZW1vcnkuYworKysgYi9zb3VuZC9jb3JlL3BjbV9tZW1vcnkuYwpAQCAtMTAxLDYgKzEwMSw4IEBACiB7CiAJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZG1hX2ZyZWUoc3Vic3RyZWFtKTsKICNpZmRlZiBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTCisJc25kX2luZm9fZnJlZV9lbnRyeShzdWJzdHJlYW0tPnByb2NfcHJlYWxsb2NfbWF4X2VudHJ5KTsKKwlzdWJzdHJlYW0tPnByb2NfcHJlYWxsb2NfbWF4X2VudHJ5ID0gTlVMTDsKIAlzbmRfaW5mb19mcmVlX2VudHJ5KHN1YnN0cmVhbS0+cHJvY19wcmVhbGxvY19lbnRyeSk7CiAJc3Vic3RyZWFtLT5wcm9jX3ByZWFsbG9jX2VudHJ5ID0gTlVMTDsKICNlbmRpZgpAQCAtMTQyLDYgKzE0NCwxOCBAQAogfQogCiAvKgorICogcmVhZCBjYWxsYmFjayBmb3IgcHJlYWxsb2NfbWF4IHByb2MgZmlsZQorICoKKyAqIHByaW50cyB0aGUgbWF4aW11bSBhbGxvd2VkIHNpemUgaW4ga0IuCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX21heF9wcm9jX3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKKwkJCQkJCSAgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIlbHVcbiIsICh1bnNpZ25lZCBsb25nKSBzdWJzdHJlYW0tPmRtYV9tYXggLyAxMDI0KTsKK30KKworLyoKICAqIHdyaXRlIGNhbGxiYWNrIGZvciBwcmVhbGxvYyBwcm9jIGZpbGUKICAqCiAgKiBhY2NlcHRzIHRoZSBwcmVhbGxvY2F0aW9uIHNpemUgaW4ga0IuCkBAIC0yMDMsNiArMjE3LDE1IEBACiAJCX0KIAl9CiAJc3Vic3RyZWFtLT5wcm9jX3ByZWFsbG9jX2VudHJ5ID0gZW50cnk7CisJaWYgKChlbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KHN1YnN0cmVhbS0+cGNtLT5jYXJkLCAicHJlYWxsb2NfbWF4Iiwgc3Vic3RyZWFtLT5wcm9jX3Jvb3QpKSAhPSBOVUxMKSB7CisJCWVudHJ5LT5jLnRleHQucmVhZCA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX21heF9wcm9jX3JlYWQ7CisJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBzdWJzdHJlYW07CisJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CisJCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKKwkJCWVudHJ5ID0gTlVMTDsKKwkJfQorCX0KKwlzdWJzdHJlYW0tPnByb2NfcHJlYWxsb2NfbWF4X2VudHJ5ID0gZW50cnk7CiB9CiAKICNlbHNlIC8qICFDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTICovCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3Jhd21pZGkuYyBiL3NvdW5kL2NvcmUvcmF3bWlkaS5jCmluZGV4IDBmMDU1YmYuLjdlNmNlZWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcmF3bWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvcmF3bWlkaS5jCkBAIC02MSwxNCArNjEsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfcmF3bWlkaSAqc25kX3Jhd21pZGlfc2VhcmNoKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldmljZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCXN0cnVjdCBzbmRfcmF3bWlkaSAqcmF3bWlkaTsKIAotCWxpc3RfZm9yX2VhY2gocCwgJnNuZF9yYXdtaWRpX2RldmljZXMpIHsKLQkJcmF3bWlkaSA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF9yYXdtaWRpLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJhd21pZGksICZzbmRfcmF3bWlkaV9kZXZpY2VzLCBsaXN0KQogCQlpZiAocmF3bWlkaS0+Y2FyZCA9PSBjYXJkICYmIHJhd21pZGktPmRldmljZSA9PSBkZXZpY2UpCiAJCQlyZXR1cm4gcmF3bWlkaTsKLQl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTM4OSw3ICszODYsNiBAQAogCXN0cnVjdCBzbmRfcmF3bWlkaSAqcm1pZGk7CiAJc3RydWN0IHNuZF9yYXdtaWRpX2ZpbGUgKnJhd21pZGlfZmlsZTsKIAl3YWl0X3F1ZXVlX3Qgd2FpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXN0cnVjdCBzbmRfY3RsX2ZpbGUgKmtjdGw7CiAKIAlpZiAobWFqID09IHNuZF9tYWpvcikgewpAQCAtNDI2LDggKzQyMiw3IEBACiAJd2hpbGUgKDEpIHsKIAkJc3ViZGV2aWNlID0gLTE7CiAJCWRvd25fcmVhZCgmY2FyZC0+Y29udHJvbHNfcndzZW0pOwotCQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5jdGxfZmlsZXMpIHsKLQkJCWtjdGwgPSBzbmRfY3RsX2ZpbGUobGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoa2N0bCwgJmNhcmQtPmN0bF9maWxlcywgbGlzdCkgewogCQkJaWYgKGtjdGwtPnBpZCA9PSBjdXJyZW50LT5waWQpIHsKIAkJCQlzdWJkZXZpY2UgPSBrY3RsLT5wcmVmZXJfcmF3bWlkaV9zdWJkZXZpY2U7CiAJCQkJaWYgKHN1YmRldmljZSAhPSAtMSkKQEAgLTU3NSw3ICs1NzAsNiBAQAogCXN0cnVjdCBzbmRfcmF3bWlkaSAqcm1pZGk7CiAJc3RydWN0IHNuZF9yYXdtaWRpX3N0ciAqcHN0cjsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW07Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAogCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlybWlkaSA9IHNuZF9yYXdtaWRpX3NlYXJjaChjYXJkLCBpbmZvLT5kZXZpY2UpOwpAQCAtNTg5LDggKzU4Myw3IEBACiAJCXJldHVybiAtRU5PRU5UOwogCWlmIChpbmZvLT5zdWJkZXZpY2UgPj0gcHN0ci0+c3Vic3RyZWFtX2NvdW50KQogCQlyZXR1cm4gLUVOWElPOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJnBzdHItPnN1YnN0cmVhbXMpIHsKLQkJc3Vic3RyZWFtID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnN0cmVhbSwgJnBzdHItPnN1YnN0cmVhbXMsIGxpc3QpIHsKIAkJaWYgKCh1bnNpZ25lZCBpbnQpc3Vic3RyZWFtLT5udW1iZXIgPT0gaW5mby0+c3ViZGV2aWNlKQogCQkJcmV0dXJuIHNuZF9yYXdtaWRpX2luZm8oc3Vic3RyZWFtLCBpbmZvKTsKIAl9CkBAIC0xMzEzLDE0ICsxMzA2LDE0IEBACiAJc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaTsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJc3RydWN0IHNuZF9yYXdtaWRpX3J1bnRpbWUgKnJ1bnRpbWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAogCXJtaWRpID0gZW50cnktPnByaXZhdGVfZGF0YTsKIAlzbmRfaXByaW50ZihidWZmZXIsICIlc1xuXG4iLCBybWlkaS0+bmFtZSk7CiAJbXV0ZXhfbG9jaygmcm1pZGktPm9wZW5fbXV0ZXgpOwogCWlmIChybWlkaS0+aW5mb19mbGFncyAmIFNORFJWX1JBV01JRElfSU5GT19PVVRQVVQpIHsKLQkJbGlzdF9mb3JfZWFjaChsaXN0LCAmcm1pZGktPnN0cmVhbXNbU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVUXS5zdWJzdHJlYW1zKSB7Ci0JCQlzdWJzdHJlYW0gPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0sIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnN0cmVhbSwKKwkJCQkgICAgJnJtaWRpLT5zdHJlYW1zW1NORFJWX1JBV01JRElfU1RSRUFNX09VVFBVVF0uc3Vic3RyZWFtcywKKwkJCQkgICAgbGlzdCkgewogCQkJc25kX2lwcmludGYoYnVmZmVyLAogCQkJCSAgICAiT3V0cHV0ICVkXG4iCiAJCQkJICAgICIgIFR4IGJ5dGVzICAgICA6ICVsdVxuIiwKQEAgLTEzMzksOCArMTMzMiw5IEBACiAJCX0KIAl9CiAJaWYgKHJtaWRpLT5pbmZvX2ZsYWdzICYgU05EUlZfUkFXTUlESV9JTkZPX0lOUFVUKSB7Ci0JCWxpc3RfZm9yX2VhY2gobGlzdCwgJnJtaWRpLT5zdHJlYW1zW1NORFJWX1JBV01JRElfU1RSRUFNX0lOUFVUXS5zdWJzdHJlYW1zKSB7Ci0JCQlzdWJzdHJlYW0gPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0sIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnN0cmVhbSwKKwkJCQkgICAgJnJtaWRpLT5zdHJlYW1zW1NORFJWX1JBV01JRElfU1RSRUFNX0lOUFVUXS5zdWJzdHJlYW1zLAorCQkJCSAgICBsaXN0KSB7CiAJCQlzbmRfaXByaW50ZihidWZmZXIsCiAJCQkJICAgICJJbnB1dCAlZFxuIgogCQkJCSAgICAiICBSeCBieXRlcyAgICAgOiAlbHVcbiIsCkBAIC0xNjI1LDEzICsxNjE5LDEwIEBACiB2b2lkIHNuZF9yYXdtaWRpX3NldF9vcHMoc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaSwgaW50IHN0cmVhbSwKIAkJCSBzdHJ1Y3Qgc25kX3Jhd21pZGlfb3BzICpvcHMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJCi0JbGlzdF9mb3JfZWFjaChsaXN0LCAmcm1pZGktPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW1zKSB7Ci0JCXN1YnN0cmVhbSA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzdHJlYW0sICZybWlkaS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbXMsIGxpc3QpCiAJCXN1YnN0cmVhbS0+b3BzID0gb3BzOwotCX0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYwppbmRleCA1MzJhNjYwLi5iYjlkZDlmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCkBAIC02NTksNyArNjU5LDYgQEAKIAlpbnQgZXJyID0gMCwgbnVtX2V2ID0gMDsKIAlzdHJ1Y3Qgc25kX3NlcV9ldmVudCBldmVudF9zYXZlZDsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqc3JjX3BvcnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNfaW5mbyAqZ3JwOwogCiAJc3JjX3BvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihjbGllbnQsIGV2ZW50LT5zb3VyY2UucG9ydCk7CkBAIC02NzQsOCArNjczLDcgQEAKIAkJcmVhZF9sb2NrKCZncnAtPmxpc3RfbG9jayk7CiAJZWxzZQogCQlkb3duX3JlYWQoJmdycC0+bGlzdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmZ3JwLT5saXN0X2hlYWQpIHsKLQkJc3VicyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF9zZXFfc3Vic2NyaWJlcnMsIHNyY19saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnMsICZncnAtPmxpc3RfaGVhZCwgc3JjX2xpc3QpIHsKIAkJZXZlbnQtPmRlc3QgPSBzdWJzLT5pbmZvLmRlc3Q7CiAJCWlmIChzdWJzLT5pbmZvLmZsYWdzICYgU05EUlZfU0VRX1BPUlRfU1VCU19USU1FU1RBTVApCiAJCQkvKiBjb252ZXJ0IHRpbWUgYWNjb3JkaW5nIHRvIGZsYWcgd2l0aCBzdWJzY3JpcHRpb24gKi8KQEAgLTcwOSwxNSArNzA3LDE0IEBACiB7CiAJaW50IG51bV9ldiA9IDAsIGVyciA9IDA7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpkZXN0X2NsaWVudDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwb3J0OwogCiAJZGVzdF9jbGllbnQgPSBnZXRfZXZlbnRfZGVzdF9jbGllbnQoZXZlbnQsIFNORFJWX1NFUV9GSUxURVJfQlJPQURDQVNUKTsKIAlpZiAoZGVzdF9jbGllbnQgPT0gTlVMTCkKIAkJcmV0dXJuIDA7IC8qIG5vIG1hdGNoaW5nIGRlc3RpbmF0aW9uICovCiAKIAlyZWFkX2xvY2soJmRlc3RfY2xpZW50LT5wb3J0c19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKHAsICZkZXN0X2NsaWVudC0+cG9ydHNfbGlzdF9oZWFkKSB7Ci0JCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwb3J0ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmZGVzdF9jbGllbnQtPnBvcnRzX2xpc3RfaGVhZCwgbGlzdCkgewogCQlldmVudC0+ZGVzdC5wb3J0ID0gcG9ydC0+YWRkci5wb3J0OwogCQkvKiBwYXNzIE5VTEwgYXMgc291cmNlIGNsaWVudCB0byBhdm9pZCBlcnJvciBib3VuY2UgKi8KIAkJZXJyID0gc25kX3NlcV9kZWxpdmVyX3NpbmdsZV9ldmVudChOVUxMLCBldmVudCwKQEAgLTI0NzMsMTEgKzI0NzAsMTAgQEAKIHN0YXRpYyB2b2lkIHNuZF9zZXFfaW5mb19kdW1wX3BvcnRzKHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlciwKIAkJCQkgICAgc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqcDsKIAogCW11dGV4X2xvY2soJmNsaWVudC0+cG9ydHNfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2gobCwgJmNsaWVudC0+cG9ydHNfbGlzdF9oZWFkKSB7Ci0JCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xpZW50LT5wb3J0c19saXN0X2hlYWQsIGxpc3QpIHsKIAkJc25kX2lwcmludGYoYnVmZmVyLCAiICBQb3J0ICUzZCA6IFwiJXNcIiAoJWMlYyVjJWMpXG4iLAogCQkJICAgIHAtPmFkZHIucG9ydCwgcC0+bmFtZSwKIAkJCSAgICBGTEFHX1BFUk1fUkQocC0+Y2FwYWJpbGl0eSksCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMKaW5kZXggYjc5ZDAxMS4uMzc4NTJjZCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYwpAQCAtMTA2LDExICsxMDYsMTAgQEAKIHN0YXRpYyB2b2lkIHNuZF9zZXFfZGV2aWNlX2luZm8oc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKIAkJCQlzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3Qgb3BzX2xpc3QgKm9wczsKIAogCW11dGV4X2xvY2soJm9wc19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChoZWFkLCAmb3BzbGlzdCkgewotCQlzdHJ1Y3Qgb3BzX2xpc3QgKm9wcyA9IGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IG9wc19saXN0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJm9wc2xpc3QsIGxpc3QpIHsKIAkJc25kX2lwcmludGYoYnVmZmVyLCAic25kLSVzJXMlcyVzLCVkXG4iLAogCQkJCW9wcy0+aWQsCiAJCQkJb3BzLT5kcml2ZXIgJiBEUklWRVJfTE9BREVEID8gIixsb2FkZWQiIDogKG9wcy0+ZHJpdmVyID09IERSSVZFUl9FTVBUWSA/ICIsZW1wdHkiIDogIiIpLApAQCAtMTQzLDcgKzE0Miw3IEBACiB2b2lkIHNuZF9zZXFfZGV2aWNlX2xvYWRfZHJpdmVycyh2b2lkKQogewogI2lmZGVmIENPTkZJR19LTU9ECi0Jc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3Qgb3BzX2xpc3QgKm9wczsKIAogCS8qIENhbGxpbmcgcmVxdWVzdF9tb2R1bGUgZHVyaW5nIG1vZHVsZV9pbml0KCkKIAkgKiBtYXkgY2F1c2UgYmxvY2tpbmcuCkBAIC0xNTUsOCArMTU0LDcgQEAKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmb3BzX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoKGhlYWQsICZvcHNsaXN0KSB7Ci0JCXN0cnVjdCBvcHNfbGlzdCAqb3BzID0gbGlzdF9lbnRyeShoZWFkLCBzdHJ1Y3Qgb3BzX2xpc3QsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkob3BzLCAmb3BzbGlzdCwgbGlzdCkgewogCQlpZiAoISAob3BzLT5kcml2ZXIgJiBEUklWRVJfTE9BREVEKSAmJgogCQkgICAgISAob3BzLT5kcml2ZXIgJiBEUklWRVJfUkVRVUVTVEVEKSkgewogCQkJb3BzLT51c2VkKys7CkBAIC0zMTQsOCArMzEyLDggQEAKIGludCBzbmRfc2VxX2RldmljZV9yZWdpc3Rlcl9kcml2ZXIoY2hhciAqaWQsIHN0cnVjdCBzbmRfc2VxX2Rldl9vcHMgKmVudHJ5LAogCQkJCSAgIGludCBhcmdzaXplKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IG9wc19saXN0ICpvcHM7CisJc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXY7CiAKIAlpZiAoaWQgPT0gTlVMTCB8fCBlbnRyeSA9PSBOVUxMIHx8CiAJICAgIGVudHJ5LT5pbml0X2RldmljZSA9PSBOVUxMIHx8IGVudHJ5LT5mcmVlX2RldmljZSA9PSBOVUxMKQpAQCAtMzQxLDggKzMzOSw3IEBACiAJb3BzLT5hcmdzaXplID0gYXJnc2l6ZTsKIAogCS8qIGluaXRpYWxpemUgZXhpc3RpbmcgZGV2aWNlcyBpZiBuZWNlc3NhcnkgKi8KLQlsaXN0X2Zvcl9lYWNoKGhlYWQsICZvcHMtPmRldl9saXN0KSB7Ci0JCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2ID0gbGlzdF9lbnRyeShoZWFkLCBzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmb3BzLT5kZXZfbGlzdCwgbGlzdCkgewogCQlpbml0X2RldmljZShkZXYsIG9wcyk7CiAJfQogCW11dGV4X3VubG9jaygmb3BzLT5yZWdfbXV0ZXgpOwpAQCAtMzk0LDggKzM5MSw4IEBACiAgKi8KIGludCBzbmRfc2VxX2RldmljZV91bnJlZ2lzdGVyX2RyaXZlcihjaGFyICppZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOwogCXN0cnVjdCBvcHNfbGlzdCAqb3BzOworCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2OwogCiAJb3BzID0gZmluZF9kcml2ZXIoaWQsIDApOwogCWlmIChvcHMgPT0gTlVMTCkKQEAgLTQxMSw4ICs0MDgsNyBAQAogCS8qIGNsb3NlIGFuZCByZWxlYXNlIGFsbCBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRyaXZlciAqLwogCW11dGV4X2xvY2soJm9wcy0+cmVnX211dGV4KTsKIAlvcHMtPmRyaXZlciB8PSBEUklWRVJfTE9DS0VEOyAvKiBkbyBub3QgcmVtb3ZlIHRoaXMgZHJpdmVyIHJlY3Vyc2l2ZWx5ICovCi0JbGlzdF9mb3JfZWFjaChoZWFkLCAmb3BzLT5kZXZfbGlzdCkgewotCQlzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldiA9IGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IHNuZF9zZXFfZGV2aWNlLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJm9wcy0+ZGV2X2xpc3QsIGxpc3QpIHsKIAkJZnJlZV9kZXZpY2UoZGV2LCBvcHMpOwogCX0KIApAQCAtNTEyLDExICs1MDgsMTAgQEAKICAqLwogc3RhdGljIHN0cnVjdCBvcHNfbGlzdCAqIGZpbmRfZHJpdmVyKGNoYXIgKmlkLCBpbnQgY3JlYXRlX2lmX2VtcHR5KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IG9wc19saXN0ICpvcHM7CiAKIAltdXRleF9sb2NrKCZvcHNfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2goaGVhZCwgJm9wc2xpc3QpIHsKLQkJc3RydWN0IG9wc19saXN0ICpvcHMgPSBsaXN0X2VudHJ5KGhlYWQsIHN0cnVjdCBvcHNfbGlzdCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZvcHNsaXN0LCBsaXN0KSB7CiAJCWlmIChzdHJjbXAob3BzLT5pZCwgaWQpID09IDApIHsKIAkJCW9wcy0+dXNlZCsrOwogCQkJbXV0ZXhfdW5sb2NrKCZvcHNfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX3BvcnRzLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYwppbmRleCA4YzY0YjU4Li5lZWZkMWNmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYwpAQCAtNTksMTQgKzU5LDEyIEBACiBzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqc25kX3NlcV9wb3J0X3VzZV9wdHIoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCiAJCQkJCQkgaW50IG51bSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwb3J0OwogCiAJaWYgKGNsaWVudCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlyZWFkX2xvY2soJmNsaWVudC0+cG9ydHNfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmY2xpZW50LT5wb3J0c19saXN0X2hlYWQpIHsKLQkJcG9ydCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmNsaWVudC0+cG9ydHNfbGlzdF9oZWFkLCBsaXN0KSB7CiAJCWlmIChwb3J0LT5hZGRyLnBvcnQgPT0gbnVtKSB7CiAJCQlpZiAocG9ydC0+Y2xvc2luZykKIAkJCQlicmVhazsgLyogZGVsZXRpbmcgbm93ICovCkBAIC04NSwxNCArODMsMTIgQEAKIAkJCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gKnBpbmZvKQogewogCWludCBudW07Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqcG9ydCwgKmZvdW5kOwogCiAJbnVtID0gcGluZm8tPmFkZHIucG9ydDsKIAlmb3VuZCA9IE5VTEw7CiAJcmVhZF9sb2NrKCZjbGllbnQtPnBvcnRzX2xvY2spOwotCWxpc3RfZm9yX2VhY2gocCwgJmNsaWVudC0+cG9ydHNfbGlzdF9oZWFkKSB7Ci0JCXBvcnQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZjbGllbnQtPnBvcnRzX2xpc3RfaGVhZCwgbGlzdCkgewogCQlpZiAocG9ydC0+YWRkci5wb3J0IDwgbnVtKQogCQkJY29udGludWU7CiAJCWlmIChwb3J0LT5hZGRyLnBvcnQgPT0gbnVtKSB7CkBAIC0xMzEsOCArMTI3LDcgQEAKIAkJCQkJCWludCBwb3J0KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKm5ld19wb3J0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKm5ld19wb3J0LCAqcDsKIAlpbnQgbnVtID0gLTE7CiAJCiAJLyogc2FuaXR5IGNoZWNrICovCkBAIC0xNjEsMTUgKzE1NiwxNCBAQAogCW51bSA9IHBvcnQgPj0gMCA/IHBvcnQgOiAwOwogCW11dGV4X2xvY2soJmNsaWVudC0+cG9ydHNfbXV0ZXgpOwogCXdyaXRlX2xvY2tfaXJxc2F2ZSgmY2xpZW50LT5wb3J0c19sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaChsLCAmY2xpZW50LT5wb3J0c19saXN0X2hlYWQpIHsKLQkJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnAgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbGllbnQtPnBvcnRzX2xpc3RfaGVhZCwgbGlzdCkgewogCQlpZiAocC0+YWRkci5wb3J0ID4gbnVtKQogCQkJYnJlYWs7CiAJCWlmIChwb3J0IDwgMCkgLyogYXV0by1wcm9iZSBtb2RlICovCiAJCQludW0gPSBwLT5hZGRyLnBvcnQgKyAxOwogCX0KIAkvKiBpbnNlcnQgdGhlIG5ldyBwb3J0ICovCi0JbGlzdF9hZGRfdGFpbCgmbmV3X3BvcnQtPmxpc3QsIGwpOworCWxpc3RfYWRkX3RhaWwoJm5ld19wb3J0LT5saXN0LCAmcC0+bGlzdCk7CiAJY2xpZW50LT5udW1fcG9ydHMrKzsKIAluZXdfcG9ydC0+YWRkci5wb3J0ID0gbnVtOwkvKiBzdG9yZSB0aGUgcG9ydCBudW1iZXIgaW4gdGhlIHBvcnQgKi8KIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmY2xpZW50LT5wb3J0c19sb2NrLCBmbGFncyk7CkBAIC0yNTEsOSArMjQ1LDkgQEAKIAkJCQlsaXN0X2RlbCgmc3Vicy0+ZGVzdF9saXN0KTsKIAkJCWVsc2UKIAkJCQlsaXN0X2RlbCgmc3Vicy0+c3JjX2xpc3QpOworCQkJdXBfd3JpdGUoJmFncnAtPmxpc3RfbXV0ZXgpOwogCQkJdW5zdWJzY3JpYmVfcG9ydChjLCBhcG9ydCwgYWdycCwgJnN1YnMtPmluZm8sIDEpOwogCQkJa2ZyZWUoc3Vicyk7Ci0JCQl1cF93cml0ZSgmYWdycC0+bGlzdF9tdXRleCk7CiAJCQlzbmRfc2VxX3BvcnRfdW5sb2NrKGFwb3J0KTsKIAkJCXNuZF9zZXFfY2xpZW50X3VubG9jayhjKTsKIAkJfQpAQCAtMjg3LDE2ICsyODEsMTQgQEAKIGludCBzbmRfc2VxX2RlbGV0ZV9wb3J0KHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCBpbnQgcG9ydCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBsaXN0X2hlYWQgKmw7Ci0Jc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKmZvdW5kID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqZm91bmQgPSBOVUxMLCAqcDsKIAogCW11dGV4X2xvY2soJmNsaWVudC0+cG9ydHNfbXV0ZXgpOwogCXdyaXRlX2xvY2tfaXJxc2F2ZSgmY2xpZW50LT5wb3J0c19sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaChsLCAmY2xpZW50LT5wb3J0c19saXN0X2hlYWQpIHsKLQkJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnAgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbGllbnQtPnBvcnRzX2xpc3RfaGVhZCwgbGlzdCkgewogCQlpZiAocC0+YWRkci5wb3J0ID09IHBvcnQpIHsKIAkJCS8qIG9rIGZvdW5kLiAgZGVsZXRlIGZyb20gdGhlIGxpc3QgYXQgZmlyc3QgKi8KLQkJCWxpc3RfZGVsKGwpOworCQkJbGlzdF9kZWwoJnAtPmxpc3QpOwogCQkJY2xpZW50LT5udW1fcG9ydHMtLTsKIAkJCWZvdW5kID0gcDsKIAkJCWJyZWFrOwpAQCAtMzE0LDcgKzMwNiw4IEBACiBpbnQgc25kX3NlcV9kZWxldGVfYWxsX3BvcnRzKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCBkZWxldGVkX2xpc3QsICpwLCAqbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlbGV0ZWRfbGlzdDsKKwlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqcG9ydCwgKnRtcDsKIAkKIAkvKiBtb3ZlIHRoZSBwb3J0IGxpc3QgdG8gZGVsZXRlZF9saXN0LCBhbmQKIAkgKiBjbGVhciB0aGUgcG9ydCBsaXN0IGluIHRoZSBjbGllbnQgZGF0YS4KQEAgLTMzMSw5ICszMjQsOCBAQAogCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPnBvcnRzX2xvY2ssIGZsYWdzKTsKIAogCS8qIHJlbW92ZSBlYWNoIHBvcnQgaW4gZGVsZXRlZF9saXN0ICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZkZWxldGVkX2xpc3QpIHsKLQkJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnBvcnQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0LCBsaXN0KTsKLQkJbGlzdF9kZWwocCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcnQsIHRtcCwgJmRlbGV0ZWRfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmcG9ydC0+bGlzdCk7CiAJCXNuZF9zZXFfc3lzdGVtX2NsaWVudF9ldl9wb3J0X2V4aXQocG9ydC0+YWRkci5jbGllbnQsIHBvcnQtPmFkZHIucG9ydCk7CiAJCXBvcnRfZGVsZXRlKGNsaWVudCwgcG9ydCk7CiAJfQpAQCAtNTAwLDggKzQ5Miw3IEBACiB7CiAJc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzX2luZm8gKnNyYyA9ICZzcmNfcG9ydC0+Y19zcmM7CiAJc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzX2luZm8gKmRlc3QgPSAmZGVzdF9wb3J0LT5jX2Rlc3Q7Ci0Jc3RydWN0IHNuZF9zZXFfc3Vic2NyaWJlcnMgKnN1YnM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycyAqc3VicywgKnM7CiAJaW50IGVyciwgc3JjX2NhbGxlZCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXhjbHVzaXZlOwpAQCAtNTI1LDEzICs1MTYsMTEgQEAKIAkJaWYgKHNyYy0+ZXhjbHVzaXZlIHx8IGRlc3QtPmV4Y2x1c2l2ZSkKIAkJCWdvdG8gX19lcnJvcjsKIAkJLyogY2hlY2sgd2hldGhlciBhbHJlYWR5IGV4aXN0cyAqLwotCQlsaXN0X2Zvcl9lYWNoKHAsICZzcmMtPmxpc3RfaGVhZCkgewotCQkJc3RydWN0IHNuZF9zZXFfc3Vic2NyaWJlcnMgKnMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX3N1YnNjcmliZXJzLCBzcmNfbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocywgJnNyYy0+bGlzdF9oZWFkLCBzcmNfbGlzdCkgewogCQkJaWYgKG1hdGNoX3N1YnNfaW5mbyhpbmZvLCAmcy0+aW5mbykpCiAJCQkJZ290byBfX2Vycm9yOwogCQl9Ci0JCWxpc3RfZm9yX2VhY2gocCwgJmRlc3QtPmxpc3RfaGVhZCkgewotCQkJc3RydWN0IHNuZF9zZXFfc3Vic2NyaWJlcnMgKnMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX3N1YnNjcmliZXJzLCBkZXN0X2xpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZkZXN0LT5saXN0X2hlYWQsIGRlc3RfbGlzdCkgewogCQkJaWYgKG1hdGNoX3N1YnNfaW5mbyhpbmZvLCAmcy0+aW5mbykpCiAJCQkJZ290byBfX2Vycm9yOwogCQl9CkBAIC01ODIsNyArNTcxLDYgQEAKIAlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNfaW5mbyAqc3JjID0gJnNyY19wb3J0LT5jX3NyYzsKIAlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNfaW5mbyAqZGVzdCA9ICZkZXN0X3BvcnQtPmNfZGVzdDsKIAlzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycyAqc3ViczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCWludCBlcnIgPSAtRU5PRU5UOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTU5MCw4ICs1NzgsNyBAQAogCWRvd25fd3JpdGVfbmVzdGVkKCZkZXN0LT5saXN0X211dGV4LCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAKIAkvKiBsb29rIGZvciB0aGUgY29ubmVjdGlvbiAqLwotCWxpc3RfZm9yX2VhY2gocCwgJnNyYy0+bGlzdF9oZWFkKSB7Ci0JCXN1YnMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX3N1YnNjcmliZXJzLCBzcmNfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzLCAmc3JjLT5saXN0X2hlYWQsIHNyY19saXN0KSB7CiAJCWlmIChtYXRjaF9zdWJzX2luZm8oaW5mbywgJnN1YnMtPmluZm8pKSB7CiAJCQl3cml0ZV9sb2NrX2lycXNhdmUoJnNyYy0+bGlzdF9sb2NrLCBmbGFncyk7CiAJCQkvLyB3cml0ZV9sb2NrKCZkZXN0LT5saXN0X2xvY2spOyAgLy8gbm8gbG9jayB5ZXQKQEAgLTYyMCwxMiArNjA3LDEwIEBACiBzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycyAqc25kX3NlcV9wb3J0X2dldF9zdWJzY3JpcHRpb24oc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzX2luZm8gKnNyY19ncnAsCiAJCQkJCQkJICBzdHJ1Y3Qgc25kX3NlcV9hZGRyICpkZXN0X2FkZHIpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycyAqcywgKmZvdW5kID0gTlVMTDsKIAogCWRvd25fcmVhZCgmc3JjX2dycC0+bGlzdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmc3JjX2dycC0+bGlzdF9oZWFkKSB7Ci0JCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX3N1YnNjcmliZXJzLCBzcmNfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmc3JjX2dycC0+bGlzdF9oZWFkLCBzcmNfbGlzdCkgewogCQlpZiAoYWRkcl9tYXRjaChkZXN0X2FkZHIsICZzLT5pbmZvLmRlc3QpKSB7CiAJCQlmb3VuZCA9IHM7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV92aXJtaWRpLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jCmluZGV4IDBjZmEwNmMuLjk3MmY5MzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV92aXJtaWRpLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX3Zpcm1pZGkuYwpAQCAtODEsMTMgKzgxLDExIEBACiAJCQkJCSBzdHJ1Y3Qgc25kX3NlcV9ldmVudCAqZXYpCiB7CiAJc3RydWN0IHNuZF92aXJtaWRpICp2bWlkaTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXVuc2lnbmVkIGNoYXIgbXNnWzRdOwogCWludCBsZW47CiAKIAlyZWFkX2xvY2soJnJkZXYtPmZpbGVsaXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJnJkZXYtPmZpbGVsaXN0KSB7Ci0JCXZtaWRpID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc25kX3Zpcm1pZGksIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodm1pZGksICZyZGV2LT5maWxlbGlzdCwgbGlzdCkgewogCQlpZiAoIXZtaWRpLT50cmlnZ2VyKQogCQkJY29udGludWU7CiAJCWlmIChldi0+dHlwZSA9PSBTTkRSVl9TRVFfRVZFTlRfU1lTRVgpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc291bmQuYyBiL3NvdW5kL2NvcmUvc291bmQuYwppbmRleCA4MmE2MWM2Li40MDg0ZGUwIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NvdW5kLmMKKysrIGIvc291bmQvY29yZS9zb3VuZC5jCkBAIC0yMTksMjYgKzIxOSwyNyBAQAogI2VuZGlmCiAKIC8qKgotICogc25kX3JlZ2lzdGVyX2RldmljZSAtIFJlZ2lzdGVyIHRoZSBBTFNBIGRldmljZSBmaWxlIGZvciB0aGUgY2FyZAorICogc25kX3JlZ2lzdGVyX2RldmljZV9mb3JfZGV2IC0gUmVnaXN0ZXIgdGhlIEFMU0EgZGV2aWNlIGZpbGUgZm9yIHRoZSBjYXJkCiAgKiBAdHlwZTogdGhlIGRldmljZSB0eXBlLCBTTkRSVl9ERVZJQ0VfVFlQRV9YWFgKICAqIEBjYXJkOiB0aGUgY2FyZCBpbnN0YW5jZQogICogQGRldjogdGhlIGRldmljZSBpbmRleAogICogQGZfb3BzOiB0aGUgZmlsZSBvcGVyYXRpb25zCiAgKiBAcHJpdmF0ZV9kYXRhOiB1c2VyIHBvaW50ZXIgZm9yIGZfb3BzLT5vcGVuKCkKICAqIEBuYW1lOiB0aGUgZGV2aWNlIGZpbGUgbmFtZQorICogQGRldmljZTogdGhlICZzdHJ1Y3QgZGV2aWNlIHRvIGxpbmsgdGhpcyBuZXcgZGV2aWNlIHRvCiAgKgogICogUmVnaXN0ZXJzIGFuIEFMU0EgZGV2aWNlIGZpbGUgZm9yIHRoZSBnaXZlbiBjYXJkLgogICogVGhlIG9wZXJhdG9ycyBoYXZlIHRvIGJlIHNldCBpbiByZWcgcGFyYW1ldGVyLgogICoKLSAqIFJldHJ1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKiBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KLWludCBzbmRfcmVnaXN0ZXJfZGV2aWNlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCi0JCQljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmX29wcywgdm9pZCAqcHJpdmF0ZV9kYXRhLAotCQkJY29uc3QgY2hhciAqbmFtZSkKK2ludCBzbmRfcmVnaXN0ZXJfZGV2aWNlX2Zvcl9kZXYoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmX29wcywKKwkJCQl2b2lkICpwcml2YXRlX2RhdGEsCisJCQkJY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCWludCBtaW5vcjsKIAlzdHJ1Y3Qgc25kX21pbm9yICpwcmVnOwotCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9IHNuZF9jYXJkX2dldF9kZXZpY2VfbGluayhjYXJkKTsKIAogCXNuZF9hc3NlcnQobmFtZSwgcmV0dXJuIC1FSU5WQUwpOwogCXByZWcgPSBrbWFsbG9jKHNpemVvZiAqcHJlZywgR0ZQX0tFUk5FTCk7CkBAIC0yNzIsNyArMjczLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUX1NZTUJPTChzbmRfcmVnaXN0ZXJfZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0woc25kX3JlZ2lzdGVyX2RldmljZV9mb3JfZGV2KTsKIAogLyogZmluZCB0aGUgbWF0Y2hpbmcgbWlub3IgcmVjb3JkCiAgKiByZXR1cm4gdGhlIGluZGV4IG9mIHNuZF9taW5vciwgb3IgLTEgaWYgbm90IGZvdW5kCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3RpbWVyLmMgYi9zb3VuZC9jb3JlL3RpbWVyLmMKaW5kZXggMTBhNzlhZS4uM2UwNjM4MyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS90aW1lci5jCisrKyBiL3NvdW5kL2NvcmUvdGltZXIuYwpAQCAtMzUsOSArMzUsNiBAQAogI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jaWZkZWYgQ09ORklHX0tFUk5FTEQKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxkLmg+Ci0jZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NORF9IUEVUKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfSFBFVF9NT0RVTEUpCiAjZGVmaW5lIERFRkFVTFRfVElNRVJfTElNSVQgMwpAQCAtMTMwLDExICsxMjcsOCBAQAogc3RhdGljIHN0cnVjdCBzbmRfdGltZXIgKnNuZF90aW1lcl9maW5kKHN0cnVjdCBzbmRfdGltZXJfaWQgKnRpZCkKIHsKIAlzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lciA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAotCWxpc3RfZm9yX2VhY2gocCwgJnNuZF90aW1lcl9saXN0KSB7Ci0JCXRpbWVyID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3RpbWVyLCBkZXZpY2VfbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpbWVyLCAmc25kX3RpbWVyX2xpc3QsIGRldmljZV9saXN0KSB7CiAJCWlmICh0aW1lci0+dG1yX2NsYXNzICE9IHRpZC0+ZGV2X2NsYXNzKQogCQkJY29udGludWU7CiAJCWlmICgodGltZXItPnRtcl9jbGFzcyA9PSBTTkRSVl9USU1FUl9DTEFTU19DQVJEIHx8CkBAIC0xODQsMTMgKzE3OCwxMCBAQAogewogCXN0cnVjdCBzbmRfdGltZXIgKnRpbWVyOwogCXN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UgKm1hc3RlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcTsKIAogCS8qIEZJWE1FOiBpdCdzIHJlYWxseSBkdW1iIHRvIGxvb2sgdXAgYWxsIGVudHJpZXMuLiAqLwotCWxpc3RfZm9yX2VhY2gocCwgJnNuZF90aW1lcl9saXN0KSB7Ci0JCXRpbWVyID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3RpbWVyLCBkZXZpY2VfbGlzdCk7Ci0JCWxpc3RfZm9yX2VhY2gocSwgJnRpbWVyLT5vcGVuX2xpc3RfaGVhZCkgewotCQkJbWFzdGVyID0gbGlzdF9lbnRyeShxLCBzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlLCBvcGVuX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXIsICZzbmRfdGltZXJfbGlzdCwgZGV2aWNlX2xpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXN0ZXIsICZ0aW1lci0+b3Blbl9saXN0X2hlYWQsIG9wZW5fbGlzdCkgewogCQkJaWYgKHNsYXZlLT5zbGF2ZV9jbGFzcyA9PSBtYXN0ZXItPnNsYXZlX2NsYXNzICYmCiAJCQkgICAgc2xhdmUtPnNsYXZlX2lkID09IG1hc3Rlci0+c2xhdmVfaWQpIHsKIAkJCQlsaXN0X2RlbCgmc2xhdmUtPm9wZW5fbGlzdCk7CkBAIC0yMTQsMTYgKzIwNSwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBzbmRfdGltZXJfY2hlY2tfbWFzdGVyKHN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UgKm1hc3RlcikKIHsKLQlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICpzbGF2ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKwlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICpzbGF2ZSwgKnRtcDsKIAogCS8qIGNoZWNrIGFsbCBwZW5kaW5nIHNsYXZlcyAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmc25kX3RpbWVyX3NsYXZlX2xpc3QpIHsKLQkJc2xhdmUgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UsIG9wZW5fbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNsYXZlLCB0bXAsICZzbmRfdGltZXJfc2xhdmVfbGlzdCwgb3Blbl9saXN0KSB7CiAJCWlmIChzbGF2ZS0+c2xhdmVfY2xhc3MgPT0gbWFzdGVyLT5zbGF2ZV9jbGFzcyAmJgogCQkgICAgc2xhdmUtPnNsYXZlX2lkID09IG1hc3Rlci0+c2xhdmVfaWQpIHsKLQkJCWxpc3RfZGVsKHApOwotCQkJbGlzdF9hZGRfdGFpbChwLCAmbWFzdGVyLT5zbGF2ZV9saXN0X2hlYWQpOworCQkJbGlzdF9tb3ZlX3RhaWwoJnNsYXZlLT5vcGVuX2xpc3QsICZtYXN0ZXItPnNsYXZlX2xpc3RfaGVhZCk7CiAJCQlzcGluX2xvY2tfaXJxKCZzbGF2ZV9hY3RpdmVfbG9jayk7CiAJCQlzbGF2ZS0+bWFzdGVyID0gbWFzdGVyOwogCQkJc2xhdmUtPnRpbWVyID0gbWFzdGVyLT50aW1lcjsKQEAgLTMxNyw4ICszMDUsNyBAQAogaW50IHNuZF90aW1lcl9jbG9zZShzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICp0aW1lcmkpCiB7CiAJc3RydWN0IHNuZF90aW1lciAqdGltZXIgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwotCXN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UgKnNsYXZlOworCXN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UgKnNsYXZlLCAqdG1wOwogCiAJc25kX2Fzc2VydCh0aW1lcmkgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CiAKQEAgLTM1MywxMiArMzQwLDExIEBACiAJCSAgICB0aW1lci0+aHcuY2xvc2UpCiAJCQl0aW1lci0+aHcuY2xvc2UodGltZXIpOwogCQkvKiByZW1vdmUgc2xhdmUgbGlua3MgKi8KLQkJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZ0aW1lcmktPnNsYXZlX2xpc3RfaGVhZCkgewotCQkJc2xhdmUgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UsIG9wZW5fbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbGF2ZSwgdG1wLCAmdGltZXJpLT5zbGF2ZV9saXN0X2hlYWQsCisJCQkJCSBvcGVuX2xpc3QpIHsKIAkJCXNwaW5fbG9ja19pcnEoJnNsYXZlX2FjdGl2ZV9sb2NrKTsKIAkJCV9zbmRfdGltZXJfc3RvcChzbGF2ZSwgMSwgU05EUlZfVElNRVJfRVZFTlRfUkVTT0xVVElPTik7Ci0JCQlsaXN0X2RlbChwKTsKLQkJCWxpc3RfYWRkX3RhaWwocCwgJnNuZF90aW1lcl9zbGF2ZV9saXN0KTsKKwkJCWxpc3RfbW92ZV90YWlsKCZzbGF2ZS0+b3Blbl9saXN0LCAmc25kX3RpbWVyX3NsYXZlX2xpc3QpOwogCQkJc2xhdmUtPm1hc3RlciA9IE5VTEw7CiAJCQlzbGF2ZS0+dGltZXIgPSBOVUxMOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZzbGF2ZV9hY3RpdmVfbG9jayk7CkBAIC0zOTQsNyArMzgwLDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgcmVzb2x1dGlvbiA9IDA7CiAJc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSAqdHM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbjsKIAlzdHJ1Y3QgdGltZXNwZWMgdHN0YW1wOwogCiAJZ2V0bnN0aW1lb2ZkYXkoJnRzdGFtcCk7CkBAIC00MTMsMTEgKzM5OCw5IEBACiAJaWYgKHRpbWVyLT5ody5mbGFncyAmIFNORFJWX1RJTUVSX0hXX1NMQVZFKQogCQlyZXR1cm47CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVyLT5sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaChuLCAmdGktPnNsYXZlX2FjdGl2ZV9oZWFkKSB7Ci0JCXRzID0gbGlzdF9lbnRyeShuLCBzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlLCBhY3RpdmVfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cywgJnRpLT5zbGF2ZV9hY3RpdmVfaGVhZCwgYWN0aXZlX2xpc3QpCiAJCWlmICh0cy0+Y2NhbGxiYWNrKQogCQkJdHMtPmNjYWxsYmFjayh0aSwgZXZlbnQgKyAxMDAsICZ0c3RhbXAsIHJlc29sdXRpb24pOwotCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lci0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC01OTMsMTAgKzU3Niw4IEBACiB7CiAJc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSAqdGk7CiAJdW5zaWduZWQgbG9uZyB0aWNrcyA9IH4wVUw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAotCWxpc3RfZm9yX2VhY2gocCwgJnRpbWVyLT5hY3RpdmVfbGlzdF9oZWFkKSB7Ci0JCXRpID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlLCBhY3RpdmVfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aSwgJnRpbWVyLT5hY3RpdmVfbGlzdF9oZWFkLCBhY3RpdmVfbGlzdCkgewogCQlpZiAodGktPmZsYWdzICYgU05EUlZfVElNRVJfSUZMR19TVEFSVCkgewogCQkJdGktPmZsYWdzICY9IH5TTkRSVl9USU1FUl9JRkxHX1NUQVJUOwogCQkJdGktPmZsYWdzIHw9IFNORFJWX1RJTUVSX0lGTEdfUlVOTklORzsKQEAgLTY2MSw5ICs2NDIsOSBAQAogICovCiB2b2lkIHNuZF90aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHNuZF90aW1lciAqIHRpbWVyLCB1bnNpZ25lZCBsb25nIHRpY2tzX2xlZnQpCiB7Ci0Jc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSAqdGksICp0czsKKwlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICp0aSwgKnRzLCAqdG1wOwogCXVuc2lnbmVkIGxvbmcgcmVzb2x1dGlvbiwgdGlja3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcCwgKnEsICpuLCAqYWNrX2xpc3RfaGVhZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqYWNrX2xpc3RfaGVhZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB1c2VfdGFza2xldCA9IDA7CiAKQEAgLTY3OSwxMiArNjYwLDEyIEBACiAJCXJlc29sdXRpb24gPSB0aW1lci0+aHcucmVzb2x1dGlvbjsKIAogCS8qIGxvb3AgZm9yIGFsbCBhY3RpdmUgaW5zdGFuY2VzCi0JICogSGVyZSB3ZSBjYW5ub3QgdXNlIGxpc3RfZm9yX2VhY2ggYmVjYXVzZSB0aGUgYWN0aXZlX2xpc3Qgb2YgYQorCSAqIEhlcmUgd2UgY2Fubm90IHVzZSBsaXN0X2Zvcl9lYWNoX2VudHJ5IGJlY2F1c2UgdGhlIGFjdGl2ZV9saXN0IG9mIGEKIAkgKiBwcm9jZXNzZWQgaW5zdGFuY2UgaXMgcmVsaW5rZWQgdG8gZG9uZV9saXN0X2hlYWQgYmVmb3JlIHRoZSBjYWxsYmFjawogCSAqIGlzIGNhbGxlZC4KIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJnRpbWVyLT5hY3RpdmVfbGlzdF9oZWFkKSB7Ci0JCXRpID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlLCBhY3RpdmVfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRpLCB0bXAsICZ0aW1lci0+YWN0aXZlX2xpc3RfaGVhZCwKKwkJCQkgYWN0aXZlX2xpc3QpIHsKIAkJaWYgKCEodGktPmZsYWdzICYgU05EUlZfVElNRVJfSUZMR19SVU5OSU5HKSkKIAkJCWNvbnRpbnVlOwogCQl0aS0+cHRpY2tzICs9IHRpY2tzX2xlZnQ7CkBAIC03MDAsNyArNjgxLDcgQEAKIAkJfSBlbHNlIHsKIAkJCXRpLT5mbGFncyAmPSB+U05EUlZfVElNRVJfSUZMR19SVU5OSU5HOwogCQkJaWYgKC0tdGltZXItPnJ1bm5pbmcpCi0JCQkJbGlzdF9kZWwocCk7CisJCQkJbGlzdF9kZWwoJnRpLT5hY3RpdmVfbGlzdCk7CiAJCX0KIAkJaWYgKCh0aW1lci0+aHcuZmxhZ3MgJiBTTkRSVl9USU1FUl9IV19UQVNLTEVUKSB8fAogCQkgICAgKHRpLT5mbGFncyAmIFNORFJWX1RJTUVSX0lGTEdfRkFTVCkpCkBAIC03MDksOCArNjkwLDcgQEAKIAkJCWFja19saXN0X2hlYWQgPSAmdGltZXItPnNhY2tfbGlzdF9oZWFkOwogCQlpZiAobGlzdF9lbXB0eSgmdGktPmFja19saXN0KSkKIAkJCWxpc3RfYWRkX3RhaWwoJnRpLT5hY2tfbGlzdCwgYWNrX2xpc3RfaGVhZCk7Ci0JCWxpc3RfZm9yX2VhY2gocSwgJnRpLT5zbGF2ZV9hY3RpdmVfaGVhZCkgewotCQkJdHMgPSBsaXN0X2VudHJ5KHEsIHN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UsIGFjdGl2ZV9saXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cywgJnRpLT5zbGF2ZV9hY3RpdmVfaGVhZCwgYWN0aXZlX2xpc3QpIHsKIAkJCXRzLT5wdGlja3MgPSB0aS0+cHRpY2tzOwogCQkJdHMtPnJlc29sdXRpb24gPSByZXNvbHV0aW9uOwogCQkJaWYgKGxpc3RfZW1wdHkoJnRzLT5hY2tfbGlzdCkpCkBAIC04NDQsNyArODI0LDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lciA9IGRldi0+ZGV2aWNlX2RhdGE7CiAJc3RydWN0IHNuZF90aW1lciAqdGltZXIxOwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKIAlzbmRfYXNzZXJ0KHRpbWVyICE9IE5VTEwgJiYgdGltZXItPmh3LnN0YXJ0ICE9IE5VTEwgJiYKIAkJICAgdGltZXItPmh3LnN0b3AgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CkBAIC04NTMsOCArODMyLDcgQEAKIAkgICAgCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2gocCwgJnNuZF90aW1lcl9saXN0KSB7Ci0JCXRpbWVyMSA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF90aW1lciwgZGV2aWNlX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXIxLCAmc25kX3RpbWVyX2xpc3QsIGRldmljZV9saXN0KSB7CiAJCWlmICh0aW1lcjEtPnRtcl9jbGFzcyA+IHRpbWVyLT50bXJfY2xhc3MpCiAJCQlicmVhazsKIAkJaWYgKHRpbWVyMS0+dG1yX2NsYXNzIDwgdGltZXItPnRtcl9jbGFzcykKQEAgLTg3Nyw3ICs4NTUsNyBAQAogCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0JbGlzdF9hZGRfdGFpbCgmdGltZXItPmRldmljZV9saXN0LCBwKTsKKwlsaXN0X2FkZF90YWlsKCZ0aW1lci0+ZGV2aWNlX2xpc3QsICZ0aW1lcjEtPmRldmljZV9saXN0KTsKIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTg5Niw3ICs4NzQsNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyByZXNvbHV0aW9uID0gMDsKIAlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICp0aSwgKnRzOwotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwogCiAJaWYgKCEgKHRpbWVyLT5ody5mbGFncyAmIFNORFJWX1RJTUVSX0hXX1NMQVZFKSkKIAkJcmV0dXJuOwpAQCAtOTExLDE1ICs4ODgsMTIgQEAKIAkJZWxzZQogCQkJcmVzb2x1dGlvbiA9IHRpbWVyLT5ody5yZXNvbHV0aW9uOwogCX0KLQlsaXN0X2Zvcl9lYWNoKHAsICZ0aW1lci0+YWN0aXZlX2xpc3RfaGVhZCkgewotCQl0aSA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSwgYWN0aXZlX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGksICZ0aW1lci0+YWN0aXZlX2xpc3RfaGVhZCwgYWN0aXZlX2xpc3QpIHsKIAkJaWYgKHRpLT5jY2FsbGJhY2spCiAJCQl0aS0+Y2NhbGxiYWNrKHRpLCBldmVudCwgdHN0YW1wLCByZXNvbHV0aW9uKTsKLQkJbGlzdF9mb3JfZWFjaChuLCAmdGktPnNsYXZlX2FjdGl2ZV9oZWFkKSB7Ci0JCQl0cyA9IGxpc3RfZW50cnkobiwgc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSwgYWN0aXZlX2xpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRzLCAmdGktPnNsYXZlX2FjdGl2ZV9oZWFkLCBhY3RpdmVfbGlzdCkKIAkJCWlmICh0cy0+Y2NhbGxiYWNrKQogCQkJCXRzLT5jY2FsbGJhY2sodHMsIGV2ZW50LCB0c3RhbXAsIHJlc29sdXRpb24pOwotCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVyLT5sb2NrLCBmbGFncyk7CiB9CkBAIC0xMDU3LDExICsxMDMxLDkgQEAKIHsKIAlzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lcjsKIAlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICp0aTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcTsKIAogCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoKHAsICZzbmRfdGltZXJfbGlzdCkgewotCQl0aW1lciA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF90aW1lciwgZGV2aWNlX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXIsICZzbmRfdGltZXJfbGlzdCwgZGV2aWNlX2xpc3QpIHsKIAkJc3dpdGNoICh0aW1lci0+dG1yX2NsYXNzKSB7CiAJCWNhc2UgU05EUlZfVElNRVJfQ0xBU1NfR0xPQkFMOgogCQkJc25kX2lwcmludGYoYnVmZmVyLCAiRyVpOiAiLCB0aW1lci0+dG1yX2RldmljZSk7CkBAIC0xMDg4LDE0ICsxMDYwLDEyIEBACiAJCWlmICh0aW1lci0+aHcuZmxhZ3MgJiBTTkRSVl9USU1FUl9IV19TTEFWRSkKIAkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBTTEFWRSIpOwogCQlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOwotCQlsaXN0X2Zvcl9lYWNoKHEsICZ0aW1lci0+b3Blbl9saXN0X2hlYWQpIHsKLQkJCXRpID0gbGlzdF9lbnRyeShxLCBzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlLCBvcGVuX2xpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpLCAmdGltZXItPm9wZW5fbGlzdF9oZWFkLCBvcGVuX2xpc3QpCiAJCQlzbmRfaXByaW50ZihidWZmZXIsICIgIENsaWVudCAlcyA6ICVzXG4iLAogCQkJCSAgICB0aS0+b3duZXIgPyB0aS0+b3duZXIgOiAidW5rbm93biIsCiAJCQkJICAgIHRpLT5mbGFncyAmIChTTkRSVl9USU1FUl9JRkxHX1NUQVJUIHwKIAkJCQkJCSBTTkRSVl9USU1FUl9JRkxHX1JVTk5JTkcpCiAJCQkJICAgID8gInJ1bm5pbmciIDogInN0b3BwZWQiKTsKLQkJfQogCX0KIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvS2NvbmZpZyBiL3NvdW5kL2RyaXZlcnMvS2NvbmZpZwppbmRleCA0MGViZDJmLi44MzUyOWIwIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL0tjb25maWcKKysrIGIvc291bmQvZHJpdmVycy9LY29uZmlnCkBAIC0xMDksNCArMTA5LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzbmQtbXB1NDAxLgogCitjb25maWcgU05EX1BPUlRNQU4yWDQKKwl0cmlzdGF0ZSAiUG9ydG1hbiAyeDQgZHJpdmVyIgorCWRlcGVuZHMgb24gU05EICYmIFBBUlBPUlQKKwlzZWxlY3QgU05EX1JBV01JREkKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgTWlkaW1hbiBQb3J0bWFuIDJ4NCBwYXJhbGxlbAorCSAgcG9ydCBNSURJIGRldmljZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc25kLXBvcnRtYW4yeDQuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvTWFrZWZpbGUgYi9zb3VuZC9kcml2ZXJzL01ha2VmaWxlCmluZGV4IGM5YmFkNmQuLjA0MTEyNjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvc291bmQvZHJpdmVycy9NYWtlZmlsZQpAQCAtNiw2ICs2LDcgQEAKIHNuZC1kdW1teS1vYmpzIDo9IGR1bW15Lm8KIHNuZC1tdHBhdi1vYmpzIDo9IG10cGF2Lm8KIHNuZC1tdHM2NC1vYmpzIDo9IG10czY0Lm8KK3NuZC1wb3J0bWFuMng0LW9ianMgOj0gcG9ydG1hbjJ4NC5vCiBzbmQtc2VyaWFsLXUxNjU1MC1vYmpzIDo9IHNlcmlhbC11MTY1NTAubwogc25kLXZpcm1pZGktb2JqcyA6PSB2aXJtaWRpLm8KIApAQCAtMTUsNSArMTYsNiBAQAogb2JqLSQoQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwKSArPSBzbmQtc2VyaWFsLXUxNjU1MC5vCiBvYmotJChDT05GSUdfU05EX01UUEFWKSArPSBzbmQtbXRwYXYubwogb2JqLSQoQ09ORklHX1NORF9NVFM2NCkgKz0gc25kLW10czY0Lm8KK29iai0kKENPTkZJR19TTkRfUE9SVE1BTjJYNCkgKz0gc25kLXBvcnRtYW4yeDQubwogCiBvYmotJChDT05GSUdfU05EKSArPSBvcGwzLyBvcGw0LyBtcHU0MDEvIHZ4LwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9kdW1teS5jIGIvc291bmQvZHJpdmVycy9kdW1teS5jCmluZGV4IDQyMDAxZWYuLjgzMzliYWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvZHVtbXkuYworKysgYi9zb3VuZC9kcml2ZXJzL2R1bW15LmMKQEAgLTUwMSw3ICs1MDEsNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9kdW1teSwgLTQ1MDAsIDMwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9kdW1teSwgLTQ1MDAsIDMwLCAwKTsKIAogI2RlZmluZSBEVU1NWV9DQVBTUkMoeG5hbWUsIHhpbmRleCwgYWRkcikgXAogeyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3BvcnRtYW4yeDQuYyBiL3NvdW5kL2RyaXZlcnMvcG9ydG1hbjJ4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDg3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9kcml2ZXJzL3BvcnRtYW4yeDQuYwpAQCAtMCwwICsxLDg3NiBAQAorLyoKKyAqICAgRHJpdmVyIGZvciBNaWRpbWFuIFBvcnRtYW4yeDQgcGFyYWxsZWwgcG9ydCBtaWRpIGludGVyZmFjZQorICoKKyAqICAgQ29weXJpZ2h0IChjKSBieSBMZXZlbnQgR3VlbmRvZ2R1IDxsZXZvbkBmZWF0dXJlLWl0LmNvbT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogQ2hhbmdlTG9nCisgKiBKYW4gMjQgMjAwNyBNYXR0aGlhcyBLb2VuaWcgPG1rb2VuaWdAc3VzZS5kZT4KKyAqICAgICAgLSBjbGVhbnVwIGFuZCByZXdyaXRlCisgKiBTZXAgMzAgMjAwNCBUb2JpYXMgR2VocmlnIDx0b2JpYXNAZ2VocmlnLnRrPgorICogICAgICAtIHNvdXJjZSBjb2RlIGNsZWFudXAKKyAqIFNlcCAwMyAyMDA0IFRvYmlhcyBHZWhyaWcgPHRvYmlhc0BnZWhyaWcudGs+CisgKiAgICAgIC0gZml4ZWQgY29tcGlsYXRpb24gcHJvYmxlbSB3aXRoIGFsc2EgMS4wLjZhIChyZW1vdmVkIE1PRFVMRV9DTEFTU0VTLAorICogICAgICAgIE1PRFVMRV9QQVJNX1NZTlRBWCBhbmQgY2hhbmdlZCBNT0RVTEVfREVWSUNFUyB0bworICogICAgICAgIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKQorICogTWFyIDI0IDIwMDQgVG9iaWFzIEdlaHJpZyA8dG9iaWFzQGdlaHJpZy50az4KKyAqICAgICAgLSBhZGRlZCAyLjYga2VybmVsIHN1cHBvcnQKKyAqIE1hciAxOCAyMDA0IFRvYmlhcyBHZWhyaWcgPHRvYmlhc0BnZWhyaWcudGs+CisgKiAgICAgIC0gYWRkZWQgcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlciB0byB0aGUgc3RhcnR1cCByb3V0aW5lIGlmIHRoZSBkcml2ZXIgZmFpbHMgdG8gZGV0ZWN0IGEgcG9ydG1hbgorICogICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIGFsbCA0IG91dHB1dCBwb3J0cyBpbiBwb3J0bWFuX3B1dG1pZGkKKyAqIE1hciAxNyAyMDA0IFRvYmlhcyBHZWhyaWcgPHRvYmlhc0BnZWhyaWcudGs+CisgKiAgICAgIC0gYWRkZWQgY2hlY2tzIGZvciBvcGVuZWQgaW5wdXQgZGV2aWNlIGluIGludGVycnVwdCBoYW5kbGVyCisgKiBGZWIgMjAgMjAwNCBUb2JpYXMgR2VocmlnIDx0b2JpYXNAZ2VocmlnLnRrPgorICogICAgICAtIHBvcnRlZCBmcm9tIGFsc2EgMC41IHRvIDEuMAorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Jhd21pZGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisKKyNkZWZpbmUgQ0FSRF9OQU1FICJQb3J0bWFuIDJ4NCIKKyNkZWZpbmUgRFJJVkVSX05BTUUgInBvcnRtYW4iCisjZGVmaW5lIFBMQVRGT1JNX0RSSVZFUiAic25kX3BvcnRtYW4yeDQiCisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdICA9IFNORFJWX0RFRkFVTFRfSURYOworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSAgID0gU05EUlZfREVGQVVMVF9TVFI7CitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW1NORFJWX0NBUkRTXTsgCitzdGF0aWMgaW50IGRldmljZV9jb3VudDsKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciAiIENBUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgIiBDQVJEX05BTUUgIiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlICIgQ0FSRF9OQU1FICIgc291bmRjYXJkLiIpOworCitNT0RVTEVfQVVUSE9SKCJMZXZlbnQgR3VlbmRvZ2R1LCBUb2JpYXMgR2VocmlnLCBNYXR0aGlhcyBLb2VuaWciKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWlkaW1hbiBQb3J0bWFuMng0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tNaWRpbWFuLFBvcnRtYW4yeDR9fSIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGlwIHNwZWNpZmljCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQT1JUTUFOX05VTV9JTlBVVF9QT1JUUyAyCisjZGVmaW5lIFBPUlRNQU5fTlVNX09VVFBVVF9QT1JUUyA0CisKK3N0cnVjdCBwb3J0bWFuIHsKKwlzcGlubG9ja190IHJlZ19sb2NrOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpOworCXN0cnVjdCBwYXJkZXZpY2UgKnBhcmRldjsKKwlpbnQgcGFyZGV2X2NsYWltZWQ7CisKKwlpbnQgb3Blbl9jb3VudDsKKwlpbnQgbW9kZVtQT1JUTUFOX05VTV9JTlBVVF9QT1JUU107CisJc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqbWlkaV9pbnB1dFtQT1JUTUFOX05VTV9JTlBVVF9QT1JUU107Cit9OworCitzdGF0aWMgaW50IHBvcnRtYW5fZnJlZShzdHJ1Y3QgcG9ydG1hbiAqcG0pCit7CisJa2ZyZWUocG0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwb3J0bWFuX2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIAorCQkJCSAgICBzdHJ1Y3QgcGFyZGV2aWNlICpwYXJkZXYsIAorCQkJCSAgICBzdHJ1Y3QgcG9ydG1hbiAqKnJjaGlwKQoreworCXN0cnVjdCBwb3J0bWFuICpwbTsKKworCSpyY2hpcCA9IE5VTEw7CisKKwlwbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwb3J0bWFuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBtID09IE5VTEwpIAorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEluaXQgY2hpcCBzcGVjaWZpYyBkYXRhICovCisJc3Bpbl9sb2NrX2luaXQoJnBtLT5yZWdfbG9jayk7CisJcG0tPmNhcmQgPSBjYXJkOworCXBtLT5wYXJkZXYgPSBwYXJkZXY7CisKKwkqcmNoaXAgPSBwbTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIVyByZWxhdGVkIGNvbnN0YW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU3RhbmRhcmQgUEMgcGFyYWxsZWwgcG9ydCBzdGF0dXMgcmVnaXN0ZXIgZXF1YXRlcy4gKi8KKyNkZWZpbmUJUFBfU1RBVF9CU1kgICAJMHg4MAkvKiBCdXN5IHN0YXR1cy4gIEludmVydGVkLiAqLworI2RlZmluZQlQUF9TVEFUX0FDSyAgIAkweDQwCS8qIEFja25vd2xlZGdlLiAgTm9uLUludmVydGVkLiAqLworI2RlZmluZQlQUF9TVEFUX1BPVVQgIAkweDIwCS8qIFBhcGVyIE91dC4gICAgTm9uLUludmVydGVkLiAqLworI2RlZmluZQlQUF9TVEFUX1NFTCAgIAkweDEwCS8qIFNlbGVjdC4gICAgICAgTm9uLUludmVydGVkLiAqLworI2RlZmluZQlQUF9TVEFUX0VSUiAgIAkweDA4CS8qIEVycm9yLiAgICAgICAgTm9uLUludmVydGVkLiAqLworCisvKiBTdGFuZGFyZCBQQyBwYXJhbGxlbCBwb3J0IGNvbW1hbmQgcmVnaXN0ZXIgZXF1YXRlcy4gKi8KKyNkZWZpbmUJUFBfQ01EX0lFTiAgCTB4MTAJLyogSVJRIEVuYWJsZS4gICBOb24tSW52ZXJ0ZWQuICovCisjZGVmaW5lCVBQX0NNRF9TRUxJIAkweDA4CS8qIFNlbGVjdCBJbnB1dC4gSW52ZXJ0ZWQuICovCisjZGVmaW5lCVBQX0NNRF9JTklUIAkweDA0CS8qIEluaXQgUHJpbnRlci4gTm9uLUludmVydGVkLiAqLworI2RlZmluZQlQUF9DTURfRkVFRCAJMHgwMgkvKiBBdXRvIEZlZWQuICAgIEludmVydGVkLiAqLworI2RlZmluZQlQUF9DTURfU1RCICAgICAgMHgwMQkvKiBTdHJvYmUuICAgICAgIEludmVydGVkLiAqLworCisvKiBQYXJhbGxlbCBQb3J0IENvbW1hbmQgUmVnaXN0ZXIgYXMgaW1wbGVtZW50ZWQgYnkgUENQMng0LiAqLworI2RlZmluZQlJTlRfRU4JIAlQUF9DTURfSUVOCS8qIEludGVycnVwdCBlbmFibGUuICovCisjZGVmaW5lCVNUUk9CRQkgICAgICAgIFBQX0NNRF9TVEIJLyogQ29tbWFuZCBzdHJvYmUuICovCisKKy8qIFRoZSBwYXJhbGxlbCBwb3J0IGNvbW1hbmQgcmVnaXN0ZXIgZmllbGQgKGIxLi5iMykgc2VsZWN0cyB0aGUgCisgKiB2YXJpb3VzICJyZWdpc3RlcnMiIHdpdGhpbiB0aGUgUEMvUCAyeDQuICBUaGVzZSBhcmUgdGhlIGludGVybmFsCisgKiBhZGRyZXNzIG9mIHRoZXNlICJyZWdpc3RlcnMiIHRoYXQgbXVzdCBiZSB3cml0dGVuIHRvIHRoZSBwYXJhbGxlbAorICogcG9ydCBjb21tYW5kIHJlZ2lzdGVyLgorICovCisjZGVmaW5lCVJYREFUQTAJCSgwIDw8IDEpCS8qIFBDUCBSeERhdGEgY2hhbm5lbCAwLiAqLworI2RlZmluZQlSWERBVEExCQkoMSA8PCAxKQkvKiBQQ1AgUnhEYXRhIGNoYW5uZWwgMS4gKi8KKyNkZWZpbmUJR0VOX0NUTAkJKDIgPDwgMSkJLyogUENQIEdlbmVyYWwgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUJU1lOQ19DVEwgCSgzIDw8IDEpCS8qIFBDUCBTeW5jIENvbnRyb2wgUmVnaXN0ZXIuICovCisjZGVmaW5lCVRYREFUQTAJCSg0IDw8IDEpCS8qIFBDUCBUeERhdGEgY2hhbm5lbCAwLiAqLworI2RlZmluZQlUWERBVEExCQkoNSA8PCAxKQkvKiBQQ1AgVHhEYXRhIGNoYW5uZWwgMS4gKi8KKyNkZWZpbmUJVFhEQVRBMgkJKDYgPDwgMSkJLyogUENQIFR4RGF0YSBjaGFubmVsIDIuICovCisjZGVmaW5lCVRYREFUQTMJCSg3IDw8IDEpCS8qIFBDUCBUeERhdGEgY2hhbm5lbCAzLiAqLworCisvKiBQYXJhbGxlbCBQb3J0IFN0YXR1cyBSZWdpc3RlciBhcyBpbXBsZW1lbnRlZCBieSBQQ1AyeDQuICovCisjZGVmaW5lCUVTVEIJCVBQX1NUQVRfUE9VVAkvKiBFY2hvZWQgc3Ryb2JlLiAqLworI2RlZmluZQlJTlRfUkVRICAgICAgICAgUFBfU1RBVF9BQ0sJLyogSW5wdXQgZGF0YSBpbnQgcmVxdWVzdC4gKi8KKyNkZWZpbmUJQlVTWSAgICAgICAgICAgIFBQX1NUQVRfRVJSCS8qIEludGVyZmFjZSBCdXN5LiAqLworCisvKiBQYXJhbGxlbCBQb3J0IFN0YXR1cyBSZWdpc3RlciBCVVNZIGFuZCBTRUxFQ1QgbGluZXMgYXJlIG11bHRpcGxleGVkCisgKiBiZXR3ZWVuIHNldmVyYWwgZnVuY3Rpb25zLiAgRGVwZW5kaW5nIG9uIHdoaWNoIDJ4NCAicmVnaXN0ZXIiIGlzCisgKiBjdXJyZW50bHkgc2VsZWN0ZWQgKGIxLi5iMyksIHRoZSBCVVNZIGFuZCBTRUxFQ1QgbGluZXMgYXJlCisgKiBhc3NpZ25lZCBhcyBmb2xsb3dzOgorICoKKyAqICAgU0VMRUNUIExJTkU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzIEEyIEExCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLQorICovCisjZGVmaW5lCVJYQVZBSUwJCVBQX1NUQVRfU0VMCS8qIFJ4IEF2YWlsYWJsZSwgY2hhbm5lbCAwLiAgIDAgMCAwICovCisvLyAgUlhBVkFJTDEgICAgUFBfU1RBVF9TRUwgICAgICAgICAgICAgLyogUnggQXZhaWxhYmxlLCBjaGFubmVsIDEuICAgMCAwIDEgKi8KKyNkZWZpbmUJU1lOQ19TVEFUCVBQX1NUQVRfU0VMCS8qIFJlc2VydmVkIC0gU3luYyBTdGF0dXMuICAgIDAgMSAwICovCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgMCAxIDEgKi8KKyNkZWZpbmUJVFhFTVBUWQkJUFBfU1RBVF9TRUwJLyogVHggRW1wdHksIGNoYW5uZWwgMC4gICAgICAgMSAwIDAgKi8KKy8vICAgICAgVFhFTVBUWTEgICAgICAgIFBQX1NUQVRfU0VMICAgICAvKiBUeCBFbXB0eSwgY2hhbm5lbCAxLiAgICAgICAxIDAgMSAqLworLy8gIFRYRU1QVFkyICAgIFBQX1NUQVRfU0VMICAgICAgICAgICAgIC8qIFR4IEVtcHR5LCBjaGFubmVsIDIuICAgICAgIDEgMSAwICovCisvLyAgVFhFTVBUWTMgICAgUFBfU1RBVF9TRUwgICAgICAgICAgICAgLyogVHggRW1wdHksIGNoYW5uZWwgMy4gICAgICAgMSAxIDEgKi8KKworLyogICBCVVNZIExJTkU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTMgQTIgQTEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tCisgKi8KKyNkZWZpbmUJUlhEQVRBCQlQUF9TVEFUX0JTWQkvKiBSeCBJbnB1dCBEYXRhLCBjaGFubmVsIDAuICAwIDAgMCAqLworLy8gICAgICBSWERBVEExICAgICAgICAgUFBfU1RBVF9CU1kgICAgIC8qIFJ4IElucHV0IERhdGEsIGNoYW5uZWwgMS4gIDAgMCAxICovCisjZGVmaW5lCVNZTkNfREFUQSAgICAgICBQUF9TVEFUX0JTWQkvKiBSZXNlcnZlZCAtIFN5bmMgRGF0YS4gICAgICAwIDEgMCAqLworCQkJCQkvKiBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAwIDEgMSAqLworI2RlZmluZQlEQVRBX0VDSE8gICAgICAgUFBfU1RBVF9CU1kJLyogUGFyYWxsZWwgUG9ydCBEYXRhIEVjaG8uICAgMSAwIDAgKi8KKyNkZWZpbmUJQTBfRUNITyAgICAgICAgIFBQX1NUQVRfQlNZCS8qIEFkZHJlc3MgMCBFY2hvLiAgICAgICAgICAgIDEgMCAxICovCisjZGVmaW5lCUExX0VDSE8gICAgICAgICBQUF9TVEFUX0JTWQkvKiBBZGRyZXNzIDEgRWNoby4gICAgICAgICAgICAxIDEgMCAqLworI2RlZmluZQlBMl9FQ0hPICAgICAgICAgUFBfU1RBVF9CU1kJLyogQWRkcmVzcyAyIEVjaG8uICAgICAgICAgICAgMSAxIDEgKi8KKworI2RlZmluZSBQT1JUTUFOMlg0X01PREVfSU5QVVRfVFJJR0dFUkVECSAweDAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhhcmR3YXJlIHNwZWNpZmljIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwb3J0bWFuX3dyaXRlX2NvbW1hbmQoc3RydWN0IHBvcnRtYW4gKnBtLCB1OCB2YWx1ZSkKK3sKKwlwYXJwb3J0X3dyaXRlX2NvbnRyb2wocG0tPnBhcmRldi0+cG9ydCwgdmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHU4IHBvcnRtYW5fcmVhZF9jb21tYW5kKHN0cnVjdCBwb3J0bWFuICpwbSkKK3sKKwlyZXR1cm4gcGFycG9ydF9yZWFkX2NvbnRyb2wocG0tPnBhcmRldi0+cG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggcG9ydG1hbl9yZWFkX3N0YXR1cyhzdHJ1Y3QgcG9ydG1hbiAqcG0pCit7CisJcmV0dXJuIHBhcnBvcnRfcmVhZF9zdGF0dXMocG0tPnBhcmRldi0+cG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggcG9ydG1hbl9yZWFkX2RhdGEoc3RydWN0IHBvcnRtYW4gKnBtKQoreworCXJldHVybiBwYXJwb3J0X3JlYWRfZGF0YShwbS0+cGFyZGV2LT5wb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBvcnRtYW5fd3JpdGVfZGF0YShzdHJ1Y3QgcG9ydG1hbiAqcG0sIHU4IHZhbHVlKQoreworCXBhcnBvcnRfd3JpdGVfZGF0YShwbS0+cGFyZGV2LT5wb3J0LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRtYW5fd3JpdGVfbWlkaShzdHJ1Y3QgcG9ydG1hbiAqcG0sIAorCQkJICAgICAgIGludCBwb3J0LCB1OCBtaWRpZGF0YSkKK3sKKwlpbnQgY29tbWFuZCA9ICgocG9ydCArIDQpIDw8IDEpOworCisJLyogR2V0IGVudGVyaW5nIGRhdGEgYnl0ZSBhbmQgcG9ydCBudW1iZXIgaW4gQkwgYW5kIEJIIHJlc3BlY3RpdmVseS4KKwkgKiBTZXQgdXAgVHggQ2hhbm5lbCBhZGRyZXNzIGZpZWxkIGZvciB1c2Ugd2l0aCBQUCBDbWQgUmVnaXN0ZXIuCisJICogU3RvcmUgYWRkcmVzcyBmaWVsZCBpbiBCSCByZWdpc3Rlci4KKwkgKiBJbnB1dHM6ICAgICAgQUggPSBPdXRwdXQgcG9ydCBudW1iZXIgKDAuLjMpLgorCSAqICAgICAgICAgICAgICBBTCA9IERhdGEgYnl0ZS4KKwkgKiAgICBjb21tYW5kID0gVFhEQVRBMCB8IElOVF9FTjsKKwkgKiBBbGlnbiBwb3J0IG51bSB3aXRoIGFkZHJlc3MgZmllbGQgKGIxLi4uYjMpLAorCSAqIHNldCBhZGRyZXNzIGZvciBUWERhdGF4LCBTdHJvYmU9MAorCSAqLworCWNvbW1hbmQgfD0gSU5UX0VOOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHNvIHRoYXQgdGhlIHByb2Nlc3MgaXMgbm90IGludGVycnVwdGVkLCB0aGVuIAorCSAqIHdyaXRlIHRoZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBUeCBjaGFubmVsIHRvIHRoZSAKKwkgKiBQUCBDb21tYW5kIFJlZy4gIERvIG5vdCBzZXQgdGhlIFN0cm9iZSBzaWduYWwgeWV0LgorCSAqLworCisJZG8geworCQlwb3J0bWFuX3dyaXRlX2NvbW1hbmQocG0sIGNvbW1hbmQpOworCisJCS8qIFdoaWxlIHRoZSBhZGRyZXNzIGxpbmVzIHNldHRsZSwgd3JpdGUgcGFyYWxsZWwgb3V0cHV0IGRhdGEgdG8gCisJCSAqIFBQIERhdGEgUmVnLiAgVGhpcyBoYXMgbm8gZWZmZWN0IHVudGlsIFN0cm9iZSBzaWduYWwgaXMgYXNzZXJ0ZWQuCisJCSAqLworCisJCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgbWlkaWRhdGEpOworCQkKKwkJLyogSWYgUENQIGNoYW5uZWwncyBUeEVtcHR5IGlzIHNldCAoVHhFbXB0eSBpcyByZWFkIHRocm91Z2ggdGhlIFBQCisJCSAqIFN0YXR1cyBSZWdpc3RlciksIHRoZW4gZ28gd3JpdGUgZGF0YS4gIEVsc2UgZ28gYmFjayBhbmQgd2FpdC4KKwkJICovCisJfSB3aGlsZSAoKHBvcnRtYW5fcmVhZF9zdGF0dXMocG0pICYgVFhFTVBUWSkgIT0gVFhFTVBUWSk7CisKKwkvKiBUeEVtcHR5IGlzIHNldC4gIE1haW50YWluIFBDL1AgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgYXNzZXJ0CisJICogU3Ryb2JlIHRocm91Z2ggdGhlIFBQIENvbW1hbmQgUmVnLiAgVGhpcyB3aWxsIFN0cm9iZSBkYXRhIGludG8KKwkgKiB0aGUgUEMvUCB0cmFuc21pdHRlciBhbmQgc2V0IHRoZSBQQy9QIEJVU1kgc2lnbmFsLgorCSAqLworCisJcG9ydG1hbl93cml0ZV9jb21tYW5kKHBtLCBjb21tYW5kIHwgU1RST0JFKTsKKworCS8qIFdhaXQgZm9yIHN0cm9iZSBsaW5lIHRvIHNldHRsZSBhbmQgZWNobyBiYWNrIHRocm91Z2ggaGFyZHdhcmUuCisJICogT25jZSBpdCBoYXMgZWNob2VkIGJhY2ssIGFzc3VtZSB0aGF0IHRoZSBhZGRyZXNzIGFuZCBkYXRhIGxpbmVzCisJICogaGF2ZSBzZXR0bGVkIQorCSAqLworCisJd2hpbGUgKChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSAmIEVTVEIpID09IDApCisJCWNwdV9yZWxheCgpOworCisJLyogUmVsZWFzZSBzdHJvYmUgYW5kIGltbWVkaWF0ZWx5IHJlLWFsbG93IGludGVycnVwdHMuICovCisJcG9ydG1hbl93cml0ZV9jb21tYW5kKHBtLCBjb21tYW5kKTsKKworCXdoaWxlICgocG9ydG1hbl9yZWFkX3N0YXR1cyhwbSkgJiBFU1RCKSA9PSBFU1RCKQorCQljcHVfcmVsYXgoKTsKKworCS8qIFBDL1AgQlVTWSBpcyBub3cgc2V0LiAgV2UgbXVzdCB3YWl0IHVudGlsIEJVU1kgcmVzZXRzIGl0c2VsZi4KKwkgKiBXZSdsbCByZWVuYWJsZSBpbnRzIHdoaWxlIHdlJ3JlIHdhaXRpbmcuCisJICovCisKKwl3aGlsZSAoKHBvcnRtYW5fcmVhZF9zdGF0dXMocG0pICYgQlVTWSkgPT0gQlVTWSkKKwkJY3B1X3JlbGF4KCk7CisKKwkvKiBEYXRhIHNlbnQuICovCit9CisKKworLyoKKyAqICBSZWFkIE1JREkgYnl0ZSBmcm9tIHBvcnQKKyAqICBBdHRlbXB0IHRvIHJlYWQgaW5wdXQgYnl0ZSBmcm9tIHNwZWNpZmllZCBoYXJkd2FyZSBpbnB1dCBwb3J0ICgwLi4pLgorICogIFJldHVybiAtMSBpZiBubyBkYXRhCisgKi8KK3N0YXRpYyBpbnQgcG9ydG1hbl9yZWFkX21pZGkoc3RydWN0IHBvcnRtYW4gKnBtLCBpbnQgcG9ydCkKK3sKKwl1bnNpZ25lZCBjaGFyIG1pZGlfZGF0YSA9IDA7CisJdW5zaWduZWQgY2hhciBjbWRvdXQ7CS8qIFNhdmVkIGFkZHJlc3MrSUUgYml0LiAqLworCisJLyogTWFrZSBzdXJlIGNsb2NraW5nIGVkZ2UgaXMgZG93biBiZWZvcmUgc3RhcnRpbmcuLi4gKi8KKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDApOwkvKiBNYWtlIHN1cmUgZWRnZSBpcyBkb3duLiAqLworCisJLyogU2V0IGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gUENQLiAqLworCWNtZG91dCA9IChwb3J0IDw8IDEpIHwgSU5UX0VOOwkvKiBBZGRyZXNzICsgSUUgKyBObyBTdHJvYmUuICovCisJcG9ydG1hbl93cml0ZV9jb21tYW5kKHBtLCBjbWRvdXQpOworCisJd2hpbGUgKChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSAmIEVTVEIpID09IEVTVEIpCisJCWNwdV9yZWxheCgpOwkvKiBXYWl0IGZvciBzdHJvYmUgZWNoby4gKi8KKworCS8qIEFmdGVyIHRoZSBhZGRyZXNzIGxpbmVzIHNldHRsZSwgY2hlY2sgbXVsdGlwbGV4ZWQgUnhBdmFpbCBzaWduYWwuCisJICogSWYgZGF0YSBpcyBhdmFpbGFibGUsIHJlYWQgaXQuCisJICovCisJaWYgKChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSAmIFJYQVZBSUwpID09IDApCisJCXJldHVybiAtMTsJLyogTm8gZGF0YS4gKi8KKworCS8qIFNldCB0aGUgU3Ryb2JlIHNpZ25hbCB0byBlbmFibGUgdGhlIFJ4IGNsb2NraW5nIGNpcmN1aXRyeS4gKi8KKwlwb3J0bWFuX3dyaXRlX2NvbW1hbmQocG0sIGNtZG91dCB8IFNUUk9CRSk7CS8qIFdyaXRlIGFkZHJlc3MrSUUrU3Ryb2JlLiAqLworCisJd2hpbGUgKChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSAmIEVTVEIpID09IDApCisJCWNwdV9yZWxheCgpOyAvKiBXYWl0IGZvciBzdHJvYmUgZWNoby4gKi8KKworCS8qIFRoZSBmaXJzdCBkYXRhIGJpdCAobXNiKSBpcyBhbHJlYWR5IHNpdHRpbmcgb24gdGhlIGlucHV0IGxpbmUuICovCisJbWlkaV9kYXRhID0gKHBvcnRtYW5fcmVhZF9zdGF0dXMocG0pICYgMTI4KTsKKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDEpOwkvKiBDYXVzZSByaXNpbmcgZWRnZSwgd2hpY2ggc2hpZnRzIGRhdGEuICovCisKKwkvKiBEYXRhIGJpdCA2LiAqLworCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgMCk7CS8qIENhdXNlIGZhbGxpbmcgZWRnZSB3aGlsZSBkYXRhIHNldHRsZXMuICovCisJbWlkaV9kYXRhIHw9IChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSA+PiAxKSAmIDY0OworCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgMSk7CS8qIENhdXNlIHJpc2luZyBlZGdlLCB3aGljaCBzaGlmdHMgZGF0YS4gKi8KKworCS8qIERhdGEgYml0IDUuICovCisJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAwKTsJLyogQ2F1c2UgZmFsbGluZyBlZGdlIHdoaWxlIGRhdGEgc2V0dGxlcy4gKi8KKwltaWRpX2RhdGEgfD0gKHBvcnRtYW5fcmVhZF9zdGF0dXMocG0pID4+IDIpICYgMzI7CisJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAxKTsJLyogQ2F1c2UgcmlzaW5nIGVkZ2UsIHdoaWNoIHNoaWZ0cyBkYXRhLiAqLworCisJLyogRGF0YSBiaXQgNC4gKi8KKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDApOwkvKiBDYXVzZSBmYWxsaW5nIGVkZ2Ugd2hpbGUgZGF0YSBzZXR0bGVzLiAqLworCW1pZGlfZGF0YSB8PSAocG9ydG1hbl9yZWFkX3N0YXR1cyhwbSkgPj4gMykgJiAxNjsKKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDEpOwkvKiBDYXVzZSByaXNpbmcgZWRnZSwgd2hpY2ggc2hpZnRzIGRhdGEuICovCisKKwkvKiBEYXRhIGJpdCAzLiAqLworCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgMCk7CS8qIENhdXNlIGZhbGxpbmcgZWRnZSB3aGlsZSBkYXRhIHNldHRsZXMuICovCisJbWlkaV9kYXRhIHw9IChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSA+PiA0KSAmIDg7CisJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAxKTsJLyogQ2F1c2UgcmlzaW5nIGVkZ2UsIHdoaWNoIHNoaWZ0cyBkYXRhLiAqLworCisJLyogRGF0YSBiaXQgMi4gKi8KKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDApOwkvKiBDYXVzZSBmYWxsaW5nIGVkZ2Ugd2hpbGUgZGF0YSBzZXR0bGVzLiAqLworCW1pZGlfZGF0YSB8PSAocG9ydG1hbl9yZWFkX3N0YXR1cyhwbSkgPj4gNSkgJiA0OworCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgMSk7CS8qIENhdXNlIHJpc2luZyBlZGdlLCB3aGljaCBzaGlmdHMgZGF0YS4gKi8KKworCS8qIERhdGEgYml0IDEuICovCisJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAwKTsJLyogQ2F1c2UgZmFsbGluZyBlZGdlIHdoaWxlIGRhdGEgc2V0dGxlcy4gKi8KKwltaWRpX2RhdGEgfD0gKHBvcnRtYW5fcmVhZF9zdGF0dXMocG0pID4+IDYpICYgMjsKKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDEpOwkvKiBDYXVzZSByaXNpbmcgZWRnZSwgd2hpY2ggc2hpZnRzIGRhdGEuICovCisKKwkvKiBEYXRhIGJpdCAwLiAqLworCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgMCk7CS8qIENhdXNlIGZhbGxpbmcgZWRnZSB3aGlsZSBkYXRhIHNldHRsZXMuICovCisJbWlkaV9kYXRhIHw9IChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSA+PiA3KSAmIDE7CisJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAxKTsJLyogQ2F1c2UgcmlzaW5nIGVkZ2UsIHdoaWNoIHNoaWZ0cyBkYXRhLiAqLworCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgMCk7CS8qIFJldHVybiBkYXRhIGNsb2NrIGxvdy4gKi8KKworCisJLyogRGUtYXNzZXJ0IFN0cm9iZSBhbmQgcmV0dXJuIGRhdGEuICovCisJcG9ydG1hbl93cml0ZV9jb21tYW5kKHBtLCBjbWRvdXQpOwkvKiBPdXRwdXQgc2F2ZWQgYWRkcmVzcytJRS4gKi8KKworCS8qIFdhaXQgZm9yIHN0cm9iZSBlY2hvLiAqLworCXdoaWxlICgocG9ydG1hbl9yZWFkX3N0YXR1cyhwbSkgJiBFU1RCKSA9PSBFU1RCKQorCQljcHVfcmVsYXgoKTsKKworCXJldHVybiAobWlkaV9kYXRhICYgMjU1KTsJLyogU2hpZnQgYmFjayBhbmQgcmV0dXJuIHZhbHVlLiAqLworfQorCisvKgorICogIENoZWNrcyBpZiBhbnkgaW5wdXQgZGF0YSBvbiB0aGUgZ2l2ZW4gY2hhbm5lbCBpcyBhdmFpbGFibGUKKyAqICBDaGVja3MgUnhBdmFpbCAKKyAqLworc3RhdGljIGludCBwb3J0bWFuX2RhdGFfYXZhaWwoc3RydWN0IHBvcnRtYW4gKnBtLCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQgY29tbWFuZCA9IElOVF9FTjsKKwlzd2l0Y2ggKGNoYW5uZWwpIHsKKwljYXNlIDA6CisJCWNvbW1hbmQgfD0gUlhEQVRBMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQljb21tYW5kIHw9IFJYREFUQTE7CisJCWJyZWFrOworCX0KKwkvKiBXcml0ZSBoYXJkd2FyZSAoYXNzdW1tZSBTVFJPQkU9MCkgKi8KKwlwb3J0bWFuX3dyaXRlX2NvbW1hbmQocG0sIGNvbW1hbmQpOworCS8qIENoZWNrIG11bHRpcGxleGVkIFJ4QXZhaWwgc2lnbmFsICovCisJaWYgKChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSAmIFJYQVZBSUwpID09IFJYQVZBSUwpCisJCXJldHVybiAxOwkvKiBEYXRhIGF2YWlsYWJsZSAqLworCisJLyogTm8gRGF0YSBhdmFpbGFibGUgKi8KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogIEZsdXNoZXMgYW55IGlucHV0CisgKi8KK3N0YXRpYyB2b2lkIHBvcnRtYW5fZmx1c2hfaW5wdXQoc3RydWN0IHBvcnRtYW4gKnBtLCB1bnNpZ25lZCBjaGFyIHBvcnQpCit7CisJLyogTG9jYWwgdmFyaWFibGUgZm9yIGNvdW50aW5nIHRoaW5ncyAqLworCXVuc2lnbmVkIGludCBpID0gMDsKKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmQgPSAwOworCisJc3dpdGNoIChwb3J0KSB7CisJY2FzZSAwOgorCQljb21tYW5kID0gUlhEQVRBMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQljb21tYW5kID0gUlhEQVRBMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICJwb3J0bWFuX2ZsdXNoX2lucHV0KCkgV29uJ3QgZmx1c2ggcG9ydCAlaVxuIiwKKwkJCSAgIHBvcnQpOworCQlyZXR1cm47CisJfQorCisJLyogU2V0IGFkZHJlc3MgZm9yIHNwZWNpZmllZCBjaGFubmVsIGluIHBvcnQgYW5kIGFsbG93IHRvIHNldHRsZS4gKi8KKwlwb3J0bWFuX3dyaXRlX2NvbW1hbmQocG0sIGNvbW1hbmQpOworCisJLyogQXNzZXJ0IHRoZSBTdHJvYmUgYW5kIHdhaXQgZm9yIGVjaG8gYmFjay4gKi8KKwlwb3J0bWFuX3dyaXRlX2NvbW1hbmQocG0sIGNvbW1hbmQgfCBTVFJPQkUpOworCisJLyogV2FpdCBmb3IgRVNUQiAqLworCXdoaWxlICgocG9ydG1hbl9yZWFkX3N0YXR1cyhwbSkgJiBFU1RCKSA9PSAwKQorCQljcHVfcmVsYXgoKTsKKworCS8qIE91dHB1dCBjbG9jayBjeWNsZXMgdG8gdGhlIFJ4IGNpcmN1aXRyeS4gKi8KKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDApOworCisJLyogRmx1c2ggMjUwIGJpdHMuLi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjUwOyBpKyspIHsKKwkJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAxKTsKKwkJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAwKTsKKwl9CisKKwkvKiBEZWFzc2VydCB0aGUgU3Ryb2JlIHNpZ25hbCBvZiB0aGUgcG9ydCBhbmQgd2FpdCBmb3IgaXQgdG8gc2V0dGxlLiAqLworCXBvcnRtYW5fd3JpdGVfY29tbWFuZChwbSwgY29tbWFuZCB8IElOVF9FTik7CisKKwkvKiBXYWl0IGZvciBzZXR0bGluZyAqLworCXdoaWxlICgocG9ydG1hbl9yZWFkX3N0YXR1cyhwbSkgJiBFU1RCKSA9PSBFU1RCKQorCQljcHVfcmVsYXgoKTsKK30KKworc3RhdGljIGludCBwb3J0bWFuX3Byb2JlKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCS8qIEluaXRpYWxpemUgdGhlIHBhcmFsbGVsIHBvcnQgZGF0YSByZWdpc3Rlci4gIFdpbGwgc2V0IFJ4IGNsb2NrcworCSAqIGxvdyBpbiBjYXNlIHdlIGhhcHBlbiB0byBiZSBhZGRyZXNzaW5nIHRoZSBSeCBwb3J0cyBhdCB0aGlzIHRpbWUuCisJICovCisJLyogMSAqLworCXBhcnBvcnRfd3JpdGVfZGF0YShwLCAwKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHBhcmFsbGVsIHBvcnQgY29tbWFuZCByZWdpc3RlciwgdGh1cyBpbml0aWFsaXppbmcKKwkgKiBoYXJkd2FyZSBoYW5kc2hha2UgbGluZXMgdG8gbWlkaSBib3g6CisJICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJvYmUgPSAwCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0IEVuYWJsZSA9IDAgICAgICAgICAgICAKKwkgKi8KKwkvKiAyICovCisJcGFycG9ydF93cml0ZV9jb250cm9sKHAsIDApOworCisJLyogQ2hlY2sgaWYgUG9ydG1hbiBQQy9QIDJ4NCBpcyBvdXQgdGhlcmUuICovCisJLyogMyAqLworCXBhcnBvcnRfd3JpdGVfY29udHJvbChwLCBSWERBVEEwKTsJLyogV3JpdGUgU3Ryb2JlPTAgdG8gY29tbWFuZCByZWcuICovCisKKwkvKiBDaGVjayBmb3IgRVNUQiB0byBiZSBjbGVhciAqLworCS8qIDQgKi8KKwlpZiAoKHBhcnBvcnRfcmVhZF9zdGF0dXMocCkgJiBFU1RCKSA9PSBFU1RCKQorCQlyZXR1cm4gMTsJLyogQ09ERSAxIC0gU3Ryb2JlIEZhaWx1cmUuICovCisKKwkvKiBTZXQgZm9yIFJYREFUQTAgd2hlcmUgbm8gZGFtYWdlIHdpbGwgYmUgZG9uZS4gKi8KKwkvKiA1ICovCisJcGFycG9ydF93cml0ZV9jb250cm9sKHAsIFJYREFUQTAgKyBTVFJPQkUpOwkvKiBXcml0ZSBTdHJvYmU9MSB0byBjb21tYW5kIHJlZy4gKi8KKworCS8qIDYgKi8KKwlpZiAoKHBhcnBvcnRfcmVhZF9zdGF0dXMocCkgJiBFU1RCKSAhPSBFU1RCKQorCQlyZXR1cm4gMTsJLyogQ09ERSAxIC0gU3Ryb2JlIEZhaWx1cmUuICovCisKKwkvKiA3ICovCisJcGFycG9ydF93cml0ZV9jb250cm9sKHAsIDApOwkvKiBSZXNldCBTdHJvYmU9MC4gKi8KKworCS8qIENoZWNrIGlmIFR4IGNpcmN1aXRyeSBpcyBmdW5jdGlvbmluZyBwcm9wZXJseS4gIElmIGluaXRpYWxpemVkIAorCSAqIHVuaXQgVHhFbXB0eSBpcyBmYWxzZSwgc2VuZCBvdXQgY2hhciBhbmQgc2VlIGlmIGlmIGdvZXMgdHJ1ZS4KKwkgKi8KKwkvKiA4ICovCisJcGFycG9ydF93cml0ZV9jb250cm9sKHAsIFRYREFUQTApOwkvKiBUeCBjaGFubmVsIDAsIHN0cm9iZSBvZmYuICovCisKKwkvKiBJZiBQQ1AgY2hhbm5lbCdzIFR4RW1wdHkgaXMgc2V0IChUeEVtcHR5IGlzIHJlYWQgdGhyb3VnaCB0aGUgUFAKKwkgKiBTdGF0dXMgUmVnaXN0ZXIpLCB0aGVuIGdvIHdyaXRlIGRhdGEuICBFbHNlIGdvIGJhY2sgYW5kIHdhaXQuCisJICovCisJLyogOSAqLworCWlmICgocGFycG9ydF9yZWFkX3N0YXR1cyhwKSAmIFRYRU1QVFkpID09IDApCisJCXJldHVybiAyOworCisJLyogUmV0dXJuIE9LIHN0YXR1cy4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb3J0bWFuX2RldmljZV9pbml0KHN0cnVjdCBwb3J0bWFuICpwbSkKK3sKKwlwb3J0bWFuX2ZsdXNoX2lucHV0KHBtLCAwKTsKKwlwb3J0bWFuX2ZsdXNoX2lucHV0KHBtLCAxKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYXdtaWRpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzbmRfcG9ydG1hbl9taWRpX29wZW4oc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9wb3J0bWFuX21pZGlfY2xvc2Uoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfcG9ydG1hbl9taWRpX2lucHV0X3RyaWdnZXIoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQkgICBpbnQgdXApCit7CisJc3RydWN0IHBvcnRtYW4gKnBtID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG0tPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKHVwKQorCQlwbS0+bW9kZVtzdWJzdHJlYW0tPm51bWJlcl0gfD0gUE9SVE1BTjJYNF9NT0RFX0lOUFVUX1RSSUdHRVJFRDsKKwllbHNlCisJCXBtLT5tb2RlW3N1YnN0cmVhbS0+bnVtYmVyXSAmPSB+UE9SVE1BTjJYNF9NT0RFX0lOUFVUX1RSSUdHRVJFRDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbS0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc25kX3BvcnRtYW5fbWlkaV9vdXRwdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCSAgICBpbnQgdXApCit7CisJc3RydWN0IHBvcnRtYW4gKnBtID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBieXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBtLT5yZWdfbG9jaywgZmxhZ3MpOworCWlmICh1cCkgeworCQl3aGlsZSAoKHNuZF9yYXdtaWRpX3RyYW5zbWl0KHN1YnN0cmVhbSwgJmJ5dGUsIDEpID09IDEpKQorCQkJcG9ydG1hbl93cml0ZV9taWRpKHBtLCBzdWJzdHJlYW0tPm51bWJlciwgYnl0ZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtLT5yZWdfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9yYXdtaWRpX29wcyBzbmRfcG9ydG1hbl9taWRpX291dHB1dCA9IHsKKwkub3BlbiA9CQlzbmRfcG9ydG1hbl9taWRpX29wZW4sCisJLmNsb3NlID0Jc25kX3BvcnRtYW5fbWlkaV9jbG9zZSwKKwkudHJpZ2dlciA9CXNuZF9wb3J0bWFuX21pZGlfb3V0cHV0X3RyaWdnZXIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9yYXdtaWRpX29wcyBzbmRfcG9ydG1hbl9taWRpX2lucHV0ID0geworCS5vcGVuID0JCXNuZF9wb3J0bWFuX21pZGlfb3BlbiwKKwkuY2xvc2UgPQlzbmRfcG9ydG1hbl9taWRpX2Nsb3NlLAorCS50cmlnZ2VyID0Jc25kX3BvcnRtYW5fbWlkaV9pbnB1dF90cmlnZ2VyLAorfTsKKworLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSByYXdtaWRpIGNvbXBvbmVudCAqLworc3RhdGljIGludCBfX2RldmluaXQgc25kX3BvcnRtYW5fcmF3bWlkaV9jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBwb3J0bWFuICpwbSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpOworCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlpbnQgZXJyOworCQorCWVyciA9IHNuZF9yYXdtaWRpX25ldyhjYXJkLCBDQVJEX05BTUUsIDAsIAorCQkJICAgICAgUE9SVE1BTl9OVU1fT1VUUFVUX1BPUlRTLCAKKwkJCSAgICAgIFBPUlRNQU5fTlVNX0lOUFVUX1BPUlRTLCAKKwkJCSAgICAgICZybWlkaSk7CisJaWYgKGVyciA8IDApIAorCQlyZXR1cm4gZXJyOworCisJcm1pZGktPnByaXZhdGVfZGF0YSA9IHBtOworCXN0cmNweShybWlkaS0+bmFtZSwgQ0FSRF9OQU1FKTsKKwlybWlkaS0+aW5mb19mbGFncyA9IFNORFJWX1JBV01JRElfSU5GT19PVVRQVVQgfAorCQkgICAgICAgICAgICBTTkRSVl9SQVdNSURJX0lORk9fSU5QVVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNORFJWX1JBV01JRElfSU5GT19EVVBMRVg7CisKKwlwbS0+cm1pZGkgPSBybWlkaTsKKworCS8qIHJlZ2lzdGVyIHJhd21pZGkgb3BzICovCisJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVULCAKKwkJCSAgICAmc25kX3BvcnRtYW5fbWlkaV9vdXRwdXQpOworCXNuZF9yYXdtaWRpX3NldF9vcHMocm1pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX0lOUFVULCAKKwkJCSAgICAmc25kX3BvcnRtYW5fbWlkaV9pbnB1dCk7CisKKwkvKiBuYW1lIHN1YnN0cmVhbXMgKi8KKwkvKiBvdXRwdXQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnN0cmVhbSwKKwkJCSAgICAmcm1pZGktPnN0cmVhbXNbU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVUXS5zdWJzdHJlYW1zLAorCQkJICAgIGxpc3QpIHsKKwkJc3ByaW50ZihzdWJzdHJlYW0tPm5hbWUsCisJCQkiUG9ydG1hbjJ4NCAlZCIsIHN1YnN0cmVhbS0+bnVtYmVyKzEpOworCX0KKwkvKiBpbnB1dCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic3RyZWFtLAorCQkJICAgICZybWlkaS0+c3RyZWFtc1tTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVF0uc3Vic3RyZWFtcywKKwkJCSAgICBsaXN0KSB7CisJCXBtLT5taWRpX2lucHV0W3N1YnN0cmVhbS0+bnVtYmVyXSA9IHN1YnN0cmVhbTsKKwkJc3ByaW50ZihzdWJzdHJlYW0tPm5hbWUsCisJCQkiUG9ydG1hbjJ4NCAlZCIsIHN1YnN0cmVhbS0+bnVtYmVyKzEpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHBhcnBvcnQgc3R1ZmYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzbmRfcG9ydG1hbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqdXNlcmRhdGEpCit7CisJdW5zaWduZWQgY2hhciBtaWRpdmFsdWUgPSAwOworCXN0cnVjdCBwb3J0bWFuICpwbSA9ICgoc3RydWN0IHNuZF9jYXJkKil1c2VyZGF0YSktPnByaXZhdGVfZGF0YTsKKworCXNwaW5fbG9jaygmcG0tPnJlZ19sb2NrKTsKKworCS8qIFdoaWxlIGFueSBpbnB1dCBkYXRhIGlzIHdhaXRpbmcgKi8KKwl3aGlsZSAoKHBvcnRtYW5fcmVhZF9zdGF0dXMocG0pICYgSU5UX1JFUSkgPT0gSU5UX1JFUSkgeworCQkvKiBJZiBkYXRhIGF2YWlsYWJsZSBvbiBjaGFubmVsIDAsIAorCQkgICByZWFkIGl0IGFuZCBzdHVmZiBpdCBpbnRvIHRoZSBxdWV1ZS4gKi8KKwkJaWYgKHBvcnRtYW5fZGF0YV9hdmFpbChwbSwgMCkpIHsKKwkJCS8qIFJlYWQgTWlkaSAqLworCQkJbWlkaXZhbHVlID0gcG9ydG1hbl9yZWFkX21pZGkocG0sIDApOworCQkJLyogcHV0IG1pZGkgaW50byBxdWV1ZS4uLiAqLworCQkJaWYgKHBtLT5tb2RlWzBdICYgUE9SVE1BTjJYNF9NT0RFX0lOUFVUX1RSSUdHRVJFRCkKKwkJCQlzbmRfcmF3bWlkaV9yZWNlaXZlKHBtLT5taWRpX2lucHV0WzBdLAorCQkJCQkJICAgICZtaWRpdmFsdWUsIDEpOworCisJCX0KKwkJLyogSWYgZGF0YSBhdmFpbGFibGUgb24gY2hhbm5lbCAxLCAKKwkJICAgcmVhZCBpdCBhbmQgc3R1ZmYgaXQgaW50byB0aGUgcXVldWUuICovCisJCWlmIChwb3J0bWFuX2RhdGFfYXZhaWwocG0sIDEpKSB7CisJCQkvKiBSZWFkIE1pZGkgKi8KKwkJCW1pZGl2YWx1ZSA9IHBvcnRtYW5fcmVhZF9taWRpKHBtLCAxKTsKKwkJCS8qIHB1dCBtaWRpIGludG8gcXVldWUuLi4gKi8KKwkJCWlmIChwbS0+bW9kZVsxXSAmIFBPUlRNQU4yWDRfTU9ERV9JTlBVVF9UUklHR0VSRUQpCisJCQkJc25kX3Jhd21pZGlfcmVjZWl2ZShwbS0+bWlkaV9pbnB1dFsxXSwKKwkJCQkJCSAgICAmbWlkaXZhbHVlLCAxKTsKKwkJfQorCisJfQorCisJc3Bpbl91bmxvY2soJnBtLT5yZWdfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9wb3J0bWFuX3Byb2JlX3BvcnQoc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IHBhcmRldmljZSAqcGFyZGV2OworCWludCByZXM7CisKKwlwYXJkZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwLCBEUklWRVJfTkFNRSwKKwkJCQkJIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCSAwLCBOVUxMKTsKKwlpZiAoIXBhcmRldikKKwkJcmV0dXJuIC1FSU87CisJCisJaWYgKHBhcnBvcnRfY2xhaW0ocGFyZGV2KSkgeworCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBhcmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJlcyA9IHBvcnRtYW5fcHJvYmUocCk7CisKKwlwYXJwb3J0X3JlbGVhc2UocGFyZGV2KTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBhcmRldik7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX3BvcnRtYW5fYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZTsKKworCWRldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhQTEFURk9STV9EUklWRVIsIGRldmljZV9jb3VudCk7CisJaWYgKCFkZXZpY2UpIAorCQlyZXR1cm47CisKKwkvKiBUZW1wb3JhcnkgYXNzaWdubWVudCB0byBmb3J3YXJkIHRoZSBwYXJwb3J0ICovCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2aWNlLCBwKTsKKworCWlmIChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoZGV2aWNlKSA8IDApIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChkZXZpY2UpOworCQlyZXR1cm47CisJfQorCisJLyogU2luY2Ugd2UgZG9udCBnZXQgdGhlIHJldHVybiB2YWx1ZSBvZiBwcm9iZQorCSAqIFdlIG5lZWQgdG8gY2hlY2sgaWYgZGV2aWNlIHByb2Jpbmcgc3VjY2VlZGVkIG9yIG5vdCAqLworCWlmICghcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkZXZpY2UpOworCQlyZXR1cm47CisJfQorCisJLyogcmVnaXN0ZXIgZGV2aWNlIGluIGdsb2JhbCB0YWJsZSAqLworCXBsYXRmb3JtX2RldmljZXNbZGV2aWNlX2NvdW50XSA9IGRldmljZTsKKwlkZXZpY2VfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQgc25kX3BvcnRtYW5fZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIHBvcnRtYW5fcGFycG9ydF9kcml2ZXIgPSB7CisJLm5hbWUgICA9ICJwb3J0bWFuMng0IiwKKwkuYXR0YWNoID0gc25kX3BvcnRtYW5fYXR0YWNoLAorCS5kZXRhY2ggPSBzbmRfcG9ydG1hbl9kZXRhY2gKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHBsYXRmb3JtIHN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc25kX3BvcnRtYW5fY2FyZF9wcml2YXRlX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBwb3J0bWFuICpwbSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGFyZGV2aWNlICpwYXJkZXYgPSBwbS0+cGFyZGV2OworCisJaWYgKHBhcmRldikgeworCQlpZiAocG0tPnBhcmRldl9jbGFpbWVkKQorCQkJcGFycG9ydF9yZWxlYXNlKHBhcmRldik7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocGFyZGV2KTsKKwl9CisKKwlwb3J0bWFuX2ZyZWUocG0pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfcG9ydG1hbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwYXJkZXZpY2UgKnBhcmRldjsKKwlzdHJ1Y3QgcGFycG9ydCAqcDsKKwlpbnQgZGV2ID0gcGRldi0+aWQ7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gTlVMTDsKKwlzdHJ1Y3QgcG9ydG1hbiAqcG0gPSBOVUxMOworCWludCBlcnI7CisKKwlwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWVuYWJsZVtkZXZdKSAKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAoKGVyciA9IHNuZF9wb3J0bWFuX3Byb2JlX3BvcnQocCkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDApOworCWlmIChjYXJkID09IE5VTEwpIHsKKwkJc25kX3ByaW50ZCgiQ2Fubm90IGNyZWF0ZSBjYXJkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXN0cmNweShjYXJkLT5kcml2ZXIsIERSSVZFUl9OQU1FKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCBDQVJEX05BTUUpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICAiJXMgYXQgMHglbHgsIGlycSAlaSIsIAorCQljYXJkLT5zaG9ydG5hbWUsIHAtPmJhc2UsIHAtPmlycSk7CisKKwlwYXJkZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwLCAgICAgICAgICAgICAgICAgICAgIC8qIHBvcnQgKi8KKwkJCQkJIERSSVZFUl9OQU1FLCAgICAgICAgICAgLyogbmFtZSAqLworCQkJCQkgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBwcmVlbXB0ICovCisJCQkJCSBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHdha2V1cCAqLworCQkJCQkgc25kX3BvcnRtYW5faW50ZXJydXB0LCAvKiBJU1IgKi8KKwkJCQkJIFBBUlBPUlRfREVWX0VYQ0wsICAgICAgLyogZmxhZ3MgKi8KKwkJCQkJICh2b2lkICopY2FyZCk7ICAgICAgICAgLyogcHJpdmF0ZSAqLworCWlmIChwYXJkZXYgPT0gTlVMTCkgeworCQlzbmRfcHJpbnRkKCJDYW5ub3QgcmVnaXN0ZXIgcGFyZGV2aWNlXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBfX2VycjsKKwl9CisKKwlpZiAoKGVyciA9IHBvcnRtYW5fY3JlYXRlKGNhcmQsIHBhcmRldiwgJnBtKSkgPCAwKSB7CisJCXNuZF9wcmludGQoIkNhbm5vdCBjcmVhdGUgbWFpbiBjb21wb25lbnRcbiIpOworCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBhcmRldik7CisJCWdvdG8gX19lcnI7CisJfQorCWNhcmQtPnByaXZhdGVfZGF0YSA9IHBtOworCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9wb3J0bWFuX2NhcmRfcHJpdmF0ZV9mcmVlOworCQorCWlmICgoZXJyID0gc25kX3BvcnRtYW5fcmF3bWlkaV9jcmVhdGUoY2FyZCkpIDwgMCkgeworCQlzbmRfcHJpbnRkKCJDcmVhdGluZyBSYXdtaWRpIGNvbXBvbmVudCBmYWlsZWRcbiIpOworCQlnb3RvIF9fZXJyOworCX0KKworCS8qIGNsYWltIHBhcnBvcnQgKi8KKwlpZiAocGFycG9ydF9jbGFpbShwYXJkZXYpKSB7CisJCXNuZF9wcmludGQoIkNhbm5vdCBjbGFpbSBwYXJwb3J0IDB4JWx4XG4iLCBwYXJkZXYtPnBvcnQtPmJhc2UpOworCQllcnIgPSAtRUlPOworCQlnb3RvIF9fZXJyOworCX0KKwlwbS0+cGFyZGV2X2NsYWltZWQgPSAxOworCisJLyogaW5pdCBkZXZpY2UgKi8KKwlpZiAoKGVyciA9IHBvcnRtYW5fZGV2aWNlX2luaXQocG0pKSA8IDApCisJCWdvdG8gX19lcnI7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKworCS8qIEF0IHRoaXMgcG9pbnQgY2FyZCB3aWxsIGJlIHVzYWJsZSAqLworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfcHJpbnRkKCJDYW5ub3QgcmVnaXN0ZXIgY2FyZFxuIik7CisJCWdvdG8gX19lcnI7CisJfQorCisJc25kX3ByaW50ayhLRVJOX0lORk8gIlBvcnRtYW4gMng0IG9uIDB4JWx4XG4iLCBwLT5iYXNlKTsKKwlyZXR1cm4gMDsKKworX19lcnI6CisJc25kX2NhcmRfZnJlZShjYXJkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNuZF9wb3J0bWFuX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGNhcmQpCisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmRfcG9ydG1hbl9kcml2ZXIgPSB7CisJLnByb2JlICA9IHNuZF9wb3J0bWFuX3Byb2JlLAorCS5yZW1vdmUgPSBzbmRfcG9ydG1hbl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBQTEFURk9STV9EUklWRVIKKwl9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtb2R1bGUgaW5pdCBzdHVmZgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHNuZF9wb3J0bWFuX3VucmVnaXN0ZXJfYWxsKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU05EUlZfQ0FSRFM7ICsraSkgeworCQlpZiAocGxhdGZvcm1fZGV2aWNlc1tpXSkgeworCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGxhdGZvcm1fZGV2aWNlc1tpXSk7CisJCQlwbGF0Zm9ybV9kZXZpY2VzW2ldID0gTlVMTDsKKwkJfQorCX0JCQorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfcG9ydG1hbl9kcml2ZXIpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnBvcnRtYW5fcGFycG9ydF9kcml2ZXIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbmRfcG9ydG1hbl9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc25kX3BvcnRtYW5fZHJpdmVyKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZwb3J0bWFuX3BhcnBvcnRfZHJpdmVyKSAhPSAwKSB7CisJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfcG9ydG1hbl9kcml2ZXIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoZGV2aWNlX2NvdW50ID09IDApIHsKKwkJc25kX3BvcnRtYW5fdW5yZWdpc3Rlcl9hbGwoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbmRfcG9ydG1hbl9tb2R1bGVfZXhpdCh2b2lkKQoreworCXNuZF9wb3J0bWFuX3VucmVnaXN0ZXJfYWxsKCk7Cit9CisKK21vZHVsZV9pbml0KHNuZF9wb3J0bWFuX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHNuZF9wb3J0bWFuX21vZHVsZV9leGl0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvc2VyaWFsLXUxNjU1MC5jIGIvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMKaW5kZXggNzQwMjhiMi4uM2E4NmE1OCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMKKysrIGIvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMKQEAgLTExNywxMyArMTE3LDEzIEBACiAjZGVmaW5lIFNFUklBTF9NT0RFX0lOUFVUX1RSSUdHRVJFRAkoMSA8PCAyKQogI2RlZmluZSBTRVJJQUxfTU9ERV9PVVRQVVRfVFJJR0dFUkVECSgxIDw8IDMpCiAKLXR5cGVkZWYgc3RydWN0IF9zbmRfdWFydDE2NTUwIHsKK3N0cnVjdCBzbmRfdWFydDE2NTUwIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaTsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICptaWRpX291dHB1dFtTTkRSVl9TRVJJQUxfTUFYX09VVFNdOwogCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKm1pZGlfaW5wdXRbU05EUlZfU0VSSUFMX01BWF9JTlNdOwogCi0JaW50IGZpbGVtb2RlOwkJLy9vcGVuIHN0YXR1cyBvZiBmaWxlCisJaW50IGZpbGVtb2RlOwkJLyogb3BlbiBzdGF0dXMgb2YgZmlsZSAqLwogCiAJc3BpbmxvY2tfdCBvcGVuX2xvY2s7CiAKQEAgLTE0MCwzOSArMTQwLDM5IEBACiAJdW5zaWduZWQgY2hhciBvbGRfZGl2aXNvcl9tc2I7CiAJdW5zaWduZWQgY2hhciBvbGRfbGluZV9jdHJsX3JlZzsKIAotCS8vIHBhcmFtZXRlciBmb3IgdXNpbmcgb2Ygd3JpdGUgbG9vcAotCXNob3J0IGludCBmaWZvX2xpbWl0OwkvL3VzZWQgaW4gdWFydDE2NTUwCi0gICAgICAgIHNob3J0IGludCBmaWZvX2NvdW50OwkvL3VzZWQgaW4gdWFydDE2NTUwCisJLyogcGFyYW1ldGVyIGZvciB1c2luZyBvZiB3cml0ZSBsb29wICovCisJc2hvcnQgaW50IGZpZm9fbGltaXQ7CS8qIHVzZWQgaW4gdWFydDE2NTUwICovCisgICAgICAgIHNob3J0IGludCBmaWZvX2NvdW50OwkvKiB1c2VkIGluIHVhcnQxNjU1MCAqLwogCi0JLy8gdHlwZSBvZiBhZGFwdG9yCisJLyogdHlwZSBvZiBhZGFwdG9yICovCiAJaW50IGFkYXB0b3I7CiAKLQkvLyBpbnB1dHMKKwkvKiBpbnB1dHMgKi8KIAlpbnQgcHJldl9pbjsKIAl1bnNpZ25lZCBjaGFyIHJzdGF0dXM7CiAKLQkvLyBvdXRwdXRzCisJLyogb3V0cHV0cyAqLwogCWludCBwcmV2X291dDsKIAl1bnNpZ25lZCBjaGFyIHByZXZfc3RhdHVzW1NORFJWX1NFUklBTF9NQVhfT1VUU107CiAKLQkvLyB3cml0ZSBidWZmZXIgYW5kIGl0cyB3cml0aW5nL3JlYWRpbmcgcG9zaXRpb24KKwkvKiB3cml0ZSBidWZmZXIgYW5kIGl0cyB3cml0aW5nL3JlYWRpbmcgcG9zaXRpb24gKi8KIAl1bnNpZ25lZCBjaGFyIHR4X2J1ZmZbVFhfQlVGRl9TSVpFXTsKIAlpbnQgYnVmZl9pbl9jb3VudDsKICAgICAgICAgaW50IGJ1ZmZfaW47CiAgICAgICAgIGludCBidWZmX291dDsKICAgICAgICAgaW50IGRyb3Bfb25fZnVsbDsKIAotCS8vIHdhaXQgdGltZXIKKwkvKiB3YWl0IHRpbWVyICovCiAJdW5zaWduZWQgaW50IHRpbWVyX3J1bm5pbmc6MTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBidWZmZXJfdGltZXI7CiAKLX0gc25kX3VhcnQxNjU1MF90OworfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbU05EUlZfQ0FSRFNdOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgc25kX3VhcnQxNjU1MF9hZGRfdGltZXIoc25kX3VhcnQxNjU1MF90ICp1YXJ0KQorc3RhdGljIGlubGluZSB2b2lkIHNuZF91YXJ0MTY1NTBfYWRkX3RpbWVyKHN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0KQogewotCWlmICghIHVhcnQtPnRpbWVyX3J1bm5pbmcpIHsKKwlpZiAoIXVhcnQtPnRpbWVyX3J1bm5pbmcpIHsKIAkJLyogdGltZXIgMzg2MDBicHMgKiAxMGJpdCAqIDE2Ynl0ZSAqLwogCQl1YXJ0LT5idWZmZXJfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSForMjU1KS8yNTY7CiAJCXVhcnQtPnRpbWVyX3J1bm5pbmcgPSAxOwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc25kX3VhcnQxNjU1MF9kZWxfdGltZXIoc25kX3VhcnQxNjU1MF90ICp1YXJ0KQorc3RhdGljIGlubGluZSB2b2lkIHNuZF91YXJ0MTY1NTBfZGVsX3RpbWVyKHN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0KQogewogCWlmICh1YXJ0LT50aW1lcl9ydW5uaW5nKSB7CiAJCWRlbF90aW1lcigmdWFydC0+YnVmZmVyX3RpbWVyKTsKQEAgLTE4OSwxMCArMTg5LDEwIEBACiB9CiAKIC8qIFRoaXMgbWFjcm8gaXMgb25seSB1c2VkIGluIHNuZF91YXJ0MTY1NTBfaW9fbG9vcCAqLwotc3RhdGljIGlubGluZSB2b2lkIHNuZF91YXJ0MTY1NTBfYnVmZmVyX291dHB1dChzbmRfdWFydDE2NTUwX3QgKnVhcnQpCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX3VhcnQxNjU1MF9idWZmZXJfb3V0cHV0KHN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0KQogewogCXVuc2lnbmVkIHNob3J0IGJ1ZmZfb3V0ID0gdWFydC0+YnVmZl9vdXQ7Ci0JaWYoIHVhcnQtPmJ1ZmZfaW5fY291bnQgPiAwICkgeworCWlmICh1YXJ0LT5idWZmX2luX2NvdW50ID4gMCkgewogCQlvdXRiKHVhcnQtPnR4X2J1ZmZbYnVmZl9vdXRdLCB1YXJ0LT5iYXNlICsgVUFSVF9UWCk7CiAJCXVhcnQtPmZpZm9fY291bnQrKzsKIAkJYnVmZl9vdXQrKzsKQEAgLTIwNiw3ICsyMDYsNyBAQAogICogV2UgZG9uJ3Qgd2FudCB0byBpbnRlcnJ1cHQgdGhpcywgCiAgKiBhcyB3ZSdyZSBhbHJlYWR5IGhhbmRsaW5nIGFuIGludGVycnVwdCAKICAqLwotc3RhdGljIHZvaWQgc25kX3VhcnQxNjU1MF9pb19sb29wKHNuZF91YXJ0MTY1NTBfdCAqIHVhcnQpCitzdGF0aWMgdm9pZCBzbmRfdWFydDE2NTUwX2lvX2xvb3Aoc3RydWN0IHNuZF91YXJ0MTY1NTAgKiB1YXJ0KQogewogCXVuc2lnbmVkIGNoYXIgYywgc3RhdHVzOwogCWludCBzdWJzdHJlYW07CkBAIC0yMjAsOSArMjIwLDggQEAKIAkJYyA9IGluYih1YXJ0LT5iYXNlICsgVUFSVF9SWCk7CiAKIAkJLyoga2VlcCB0cmFjayBvZiBsYXN0IHN0YXR1cyBieXRlICovCi0JCWlmIChjICYgMHg4MCkgeworCQlpZiAoYyAmIDB4ODApCiAJCQl1YXJ0LT5yc3RhdHVzID0gYzsKLQkJfQogCiAJCS8qIGhhbmRsZSBzdHJlYW0gc3dpdGNoICovCiAJCWlmICh1YXJ0LT5hZGFwdG9yID09IFNORFJWX1NFUklBTF9HRU5FUklDKSB7CkBAIC0yMzAsMTQgKzIyOSwxNiBAQAogCQkJCWlmIChjIDw9IFNORFJWX1NFUklBTF9NQVhfSU5TICYmIGMgPiAwKQogCQkJCQlzdWJzdHJlYW0gPSBjIC0gMTsKIAkJCQlpZiAoYyAhPSAweGY1KQotCQkJCQl1YXJ0LT5yc3RhdHVzID0gMDsgLyogcHJldmVudCBmdXR1cmUgYnl0ZXMgZnJvbSBiZWluZyBpbnRlcnByZXRlZCBhcyBzdHJlYW1zICovCi0JCQl9Ci0JCQllbHNlIGlmICgodWFydC0+ZmlsZW1vZGUgJiBTRVJJQUxfTU9ERV9JTlBVVF9PUEVOKSAmJiAodWFydC0+bWlkaV9pbnB1dFtzdWJzdHJlYW1dICE9IE5VTEwpKSB7Ci0JCQkJc25kX3Jhd21pZGlfcmVjZWl2ZSh1YXJ0LT5taWRpX2lucHV0W3N1YnN0cmVhbV0sICZjLCAxKTsKLQkJCX0KLQkJfSBlbHNlIGlmICgodWFydC0+ZmlsZW1vZGUgJiBTRVJJQUxfTU9ERV9JTlBVVF9PUEVOKSAmJiAodWFydC0+bWlkaV9pbnB1dFtzdWJzdHJlYW1dICE9IE5VTEwpKSB7CisJCQkJCS8qIHByZXZlbnQgZnV0dXJlIGJ5dGVzIGZyb20gYmVpbmcKKwkJCQkJICAgaW50ZXJwcmV0ZWQgYXMgc3RyZWFtcyAqLworCQkJCQl1YXJ0LT5yc3RhdHVzID0gMDsKKwkJCX0gZWxzZSBpZiAoKHVhcnQtPmZpbGVtb2RlICYgU0VSSUFMX01PREVfSU5QVVRfT1BFTikKKwkJCQkgICAmJiB1YXJ0LT5taWRpX2lucHV0W3N1YnN0cmVhbV0pCisJCQkJc25kX3Jhd21pZGlfcmVjZWl2ZSh1YXJ0LT5taWRpX2lucHV0W3N1YnN0cmVhbV0sCisJCQkJCQkgICAgJmMsIDEpOworCQl9IGVsc2UgaWYgKCh1YXJ0LT5maWxlbW9kZSAmIFNFUklBTF9NT0RFX0lOUFVUX09QRU4pICYmCisJCQkgICB1YXJ0LT5taWRpX2lucHV0W3N1YnN0cmVhbV0pCiAJCQlzbmRfcmF3bWlkaV9yZWNlaXZlKHVhcnQtPm1pZGlfaW5wdXRbc3Vic3RyZWFtXSwgJmMsIDEpOwotCQl9CiAKIAkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX09FKQogCQkJc25kX3ByaW50aygiJXM6IE92ZXJydW4gb24gZGV2aWNlIGF0IDB4JWx4XG4iLApAQCAtMjUwLDIxICsyNTEsMjAgQEAKIAkvKiBubyBuZWVkIG9mIGNoZWNrIFNFUklBTF9NT0RFX09VVFBVVF9PUEVOIGJlY2F1c2UgaWYgbm90LAogCSAgIGJ1ZmZlciBpcyBuZXZlciBmaWxsZWQuICovCiAJLyogQ2hlY2sgd3JpdGUgc3RhdHVzICovCi0JaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpIHsKKwlpZiAoc3RhdHVzICYgVUFSVF9MU1JfVEhSRSkKIAkJdWFydC0+Zmlmb19jb3VudCA9IDA7Ci0JfQogCWlmICh1YXJ0LT5hZGFwdG9yID09IFNORFJWX1NFUklBTF9NUzEyNFdfU0EKIAkgICB8fCB1YXJ0LT5hZGFwdG9yID09IFNORFJWX1NFUklBTF9HRU5FUklDKSB7CiAJCS8qIENhbid0IHVzZSBGSUZPLCBtdXN0IHNlbmQgb25seSB3aGVuIENUUyBpcyB0cnVlICovCiAJCXN0YXR1cyA9IGluYih1YXJ0LT5iYXNlICsgVUFSVF9NU1IpOwotCQl3aGlsZSggKHVhcnQtPmZpZm9fY291bnQgPT0gMCkgJiYgKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgJiYKLQkJICAgICAgKHVhcnQtPmJ1ZmZfaW5fY291bnQgPiAwKSApIHsKKwkJd2hpbGUgKHVhcnQtPmZpZm9fY291bnQgPT0gMCAmJiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSAmJgorCQkgICAgICAgdWFydC0+YnVmZl9pbl9jb3VudCA+IDApIHsKIAkJICAgICAgIHNuZF91YXJ0MTY1NTBfYnVmZmVyX291dHB1dCh1YXJ0KTsKLQkJICAgICAgIHN0YXR1cyA9IGluYiggdWFydC0+YmFzZSArIFVBUlRfTVNSICk7CisJCSAgICAgICBzdGF0dXMgPSBpbmIodWFydC0+YmFzZSArIFVBUlRfTVNSKTsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIFdyaXRlIGxvb3AgKi8KLQkJd2hpbGUgKHVhcnQtPmZpZm9fY291bnQgPCB1YXJ0LT5maWZvX2xpbWl0CS8qIENhbiB3ZSB3cml0ZSA/ICovCisJCXdoaWxlICh1YXJ0LT5maWZvX2NvdW50IDwgdWFydC0+Zmlmb19saW1pdCAvKiBDYW4gd2Ugd3JpdGUgPyAqLwogCQkgICAgICAgJiYgdWFydC0+YnVmZl9pbl9jb3VudCA+IDApCS8qIERvIHdlIHdhbnQgdG8/ICovCiAJCQlzbmRfdWFydDE2NTUwX2J1ZmZlcl9vdXRwdXQodWFydCk7CiAJfQpAQCAtMjk0LDE1ICsyOTQsMTYgQEAKICAqLwogc3RhdGljIGlycXJldHVybl90IHNuZF91YXJ0MTY1NTBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzbmRfdWFydDE2NTUwX3QgKnVhcnQ7CisJc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQ7CiAKLQl1YXJ0ID0gKHNuZF91YXJ0MTY1NTBfdCAqKSBkZXZfaWQ7CisJdWFydCA9IGRldl9pZDsKIAlzcGluX2xvY2soJnVhcnQtPm9wZW5fbG9jayk7CiAJaWYgKHVhcnQtPmZpbGVtb2RlID09IFNFUklBTF9NT0RFX05PVF9PUEVORUQpIHsKIAkJc3Bpbl91bmxvY2soJnVhcnQtPm9wZW5fbG9jayk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9Ci0JaW5iKHVhcnQtPmJhc2UgKyBVQVJUX0lJUik7CQkvKiBpbmRpY2F0ZSB0byB0aGUgVUFSVCB0aGF0IHRoZSBpbnRlcnJ1cHQgaGFzIGJlZW4gc2VydmljZWQgKi8KKwkvKiBpbmRpY2F0ZSB0byB0aGUgVUFSVCB0aGF0IHRoZSBpbnRlcnJ1cHQgaGFzIGJlZW4gc2VydmljZWQgKi8KKwlpbmIodWFydC0+YmFzZSArIFVBUlRfSUlSKTsKIAlzbmRfdWFydDE2NTUwX2lvX2xvb3AodWFydCk7CiAJc3Bpbl91bmxvY2soJnVhcnQtPm9wZW5fbG9jayk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMzEyLDkgKzMxMyw5IEBACiBzdGF0aWMgdm9pZCBzbmRfdWFydDE2NTUwX2J1ZmZlcl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzbmRfdWFydDE2NTUwX3QgKnVhcnQ7CisJc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQ7CiAKLQl1YXJ0ID0gKHNuZF91YXJ0MTY1NTBfdCAqKWRhdGE7CisJdWFydCA9IChzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqKWRhdGE7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVhcnQtPm9wZW5fbG9jaywgZmxhZ3MpOwogCXNuZF91YXJ0MTY1NTBfZGVsX3RpbWVyKHVhcnQpOwogCXNuZF91YXJ0MTY1NTBfaW9fbG9vcCh1YXJ0KTsKQEAgLTMyNiw3ICszMjcsNyBAQAogICogIHJldHVybiAwIGlmIGZvdW5kCiAgKiAgcmV0dXJuIG5lZ2F0aXZlIGVycm9yIGlmIG5vdCBmb3VuZAogICovCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfdWFydDE2NTUwX2RldGVjdChzbmRfdWFydDE2NTUwX3QgKnVhcnQpCitzdGF0aWMgaW50IF9faW5pdCBzbmRfdWFydDE2NTUwX2RldGVjdChzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqdWFydCkKIHsKIAl1bnNpZ25lZCBsb25nIGlvX2Jhc2UgPSB1YXJ0LT5iYXNlOwogCWludCBvazsKQEAgLTM0Myw3ICszNDQsOCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCW9rID0gMTsJCQkvKiB1YXJ0IGRldGVjdGVkIHVubGVzcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBzaG91bGQgZmFpbCAqLworCS8qIHVhcnQgZGV0ZWN0ZWQgdW5sZXNzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIHNob3VsZCBmYWlsICovCisJb2sgPSAxOwogCS8qIDggZGF0YS1iaXRzLCAxIHN0b3AtYml0LCBwYXJpdHkgb2ZmLCBETEFCID0gMCAqLwogCW91dGIoVUFSVF9MQ1JfV0xFTjgsIGlvX2Jhc2UgKyBVQVJUX0xDUik7IC8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAqLwogCWMgPSBpbmIoaW9fYmFzZSArIFVBUlRfSUVSKTsKQEAgLTM2OCw3ICszNzAsNyBAQAogCXJldHVybiBvazsKIH0KIAotc3RhdGljIHZvaWQgc25kX3VhcnQxNjU1MF9kb19vcGVuKHNuZF91YXJ0MTY1NTBfdCAqIHVhcnQpCitzdGF0aWMgdm9pZCBzbmRfdWFydDE2NTUwX2RvX29wZW4oc3RydWN0IHNuZF91YXJ0MTY1NTAgKiB1YXJ0KQogewogCWNoYXIgYnl0ZTsKIApAQCAtNDYwLDcgKzQ2Miw3IEBACiAJaW5iKHVhcnQtPmJhc2UgKyBVQVJUX1JYKTsJLyogQ2xlYXIgYW55IHByZS1leGlzdGluZyByZWNlaXZlIGludGVycnVwdCAqLwogfQogCi1zdGF0aWMgdm9pZCBzbmRfdWFydDE2NTUwX2RvX2Nsb3NlKHNuZF91YXJ0MTY1NTBfdCAqIHVhcnQpCitzdGF0aWMgdm9pZCBzbmRfdWFydDE2NTUwX2RvX2Nsb3NlKHN0cnVjdCBzbmRfdWFydDE2NTUwICogdWFydCkKIHsKIAlpZiAodWFydC0+aXJxIDwgMCkKIAkJc25kX3VhcnQxNjU1MF9kZWxfdGltZXIodWFydCk7CkBAIC01MTQsNyArNTE2LDcgQEAKIHN0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9pbnB1dF9vcGVuKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNuZF91YXJ0MTY1NTBfdCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1YXJ0LT5vcGVuX2xvY2ssIGZsYWdzKTsKIAlpZiAodWFydC0+ZmlsZW1vZGUgPT0gU0VSSUFMX01PREVfTk9UX09QRU5FRCkKQEAgLTUyOCw3ICs1MzAsNyBAQAogc3RhdGljIGludCBzbmRfdWFydDE2NTUwX2lucHV0X2Nsb3NlKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNuZF91YXJ0MTY1NTBfdCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1YXJ0LT5vcGVuX2xvY2ssIGZsYWdzKTsKIAl1YXJ0LT5maWxlbW9kZSAmPSB+U0VSSUFMX01PREVfSU5QVVRfT1BFTjsKQEAgLTUzOSwyNCArNTQxLDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNuZF91YXJ0MTY1NTBfaW5wdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCB1cCkKK3N0YXRpYyB2b2lkIHNuZF91YXJ0MTY1NTBfaW5wdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCWludCB1cCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNuZF91YXJ0MTY1NTBfdCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1YXJ0LT5vcGVuX2xvY2ssIGZsYWdzKTsKLQlpZiAodXApIHsKKwlpZiAodXApCiAJCXVhcnQtPmZpbGVtb2RlIHw9IFNFUklBTF9NT0RFX0lOUFVUX1RSSUdHRVJFRDsKLQl9IGVsc2UgeworCWVsc2UKIAkJdWFydC0+ZmlsZW1vZGUgJj0gflNFUklBTF9NT0RFX0lOUFVUX1RSSUdHRVJFRDsKLQl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWFydC0+b3Blbl9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9vdXRwdXRfb3BlbihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzbmRfdWFydDE2NTUwX3QgKnVhcnQgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdWFydC0+b3Blbl9sb2NrLCBmbGFncyk7CiAJaWYgKHVhcnQtPmZpbGVtb2RlID09IFNFUklBTF9NT0RFX05PVF9PUEVORUQpCkBAIC01NzAsNyArNTcyLDcgQEAKIHN0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9vdXRwdXRfY2xvc2Uoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc25kX3VhcnQxNjU1MF90ICp1YXJ0ID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0ID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVhcnQtPm9wZW5fbG9jaywgZmxhZ3MpOwogCXVhcnQtPmZpbGVtb2RlICY9IH5TRVJJQUxfTU9ERV9PVVRQVVRfT1BFTjsKQEAgLTU4MSwxOCArNTgzLDIwIEBACiAJcmV0dXJuIDA7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBzbmRfdWFydDE2NTUwX2J1ZmZlcl9jYW5fd3JpdGUoIHNuZF91YXJ0MTY1NTBfdCAqdWFydCwgaW50IE51bSApCitzdGF0aWMgaW5saW5lIGludCBzbmRfdWFydDE2NTUwX2J1ZmZlcl9jYW5fd3JpdGUoc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQsCisJCQkJCQkgaW50IE51bSkKIHsKLQlpZiggdWFydC0+YnVmZl9pbl9jb3VudCArIE51bSA8IFRYX0JVRkZfU0laRSApCisJaWYgKHVhcnQtPmJ1ZmZfaW5fY291bnQgKyBOdW0gPCBUWF9CVUZGX1NJWkUpCiAJCXJldHVybiAxOwogCWVsc2UKIAkJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNuZF91YXJ0MTY1NTBfd3JpdGVfYnVmZmVyKHNuZF91YXJ0MTY1NTBfdCAqdWFydCwgdW5zaWduZWQgY2hhciBieXRlKQorc3RhdGljIGlubGluZSBpbnQgc25kX3VhcnQxNjU1MF93cml0ZV9idWZmZXIoc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQsCisJCQkJCSAgICAgdW5zaWduZWQgY2hhciBieXRlKQogewogCXVuc2lnbmVkIHNob3J0IGJ1ZmZfaW4gPSB1YXJ0LT5idWZmX2luOwotCWlmKCB1YXJ0LT5idWZmX2luX2NvdW50IDwgVFhfQlVGRl9TSVpFICkgeworCWlmICh1YXJ0LT5idWZmX2luX2NvdW50IDwgVFhfQlVGRl9TSVpFKSB7CiAJCXVhcnQtPnR4X2J1ZmZbYnVmZl9pbl0gPSBieXRlOwogCQlidWZmX2luKys7CiAJCWJ1ZmZfaW4gJj0gVFhfQlVGRl9NQVNLOwpAQCAtNjA1LDEyICs2MDksMTQgQEAKIAkJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9vdXRwdXRfYnl0ZShzbmRfdWFydDE2NTUwX3QgKnVhcnQsIHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpCitzdGF0aWMgaW50IHNuZF91YXJ0MTY1NTBfb3V0cHV0X2J5dGUoc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQsCisJCQkJICAgICBzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJICAgICB1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSkKIHsKLQlpZiAodWFydC0+YnVmZl9pbl9jb3VudCA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBlbXB0eT8gKi8KKwlpZiAodWFydC0+YnVmZl9pbl9jb3VudCA9PSAwICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgZW1wdHk/ICovCiAJICAgICYmICgodWFydC0+YWRhcHRvciAhPSBTTkRSVl9TRVJJQUxfTVMxMjRXX1NBICYmCiAJICAgIHVhcnQtPmFkYXB0b3IgIT0gU05EUlZfU0VSSUFMX0dFTkVSSUMpIHx8Ci0JCSh1YXJ0LT5maWZvX2NvdW50ID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRklGTyBlbXB0eT8gKi8KKwkJKHVhcnQtPmZpZm9fY291bnQgPT0gMCAgICAgICAgICAgICAgICAgIC8qIEZJRk8gZW1wdHk/ICovCiAJCSAmJiAoaW5iKHVhcnQtPmJhc2UgKyBVQVJUX01TUikgJiBVQVJUX01TUl9DVFMpKSkpIHsgLyogQ1RTPyAqLwogCiAJICAgICAgICAvKiBUeCBCdWZmZXIgRW1wdHkgLSB0cnkgdG8gd3JpdGUgaW1tZWRpYXRlbHkgKi8KQEAgLTYyMywxMiArNjI5LDEzIEBACiAJCQkgICAgICAgIHVhcnQtPmZpZm9fY291bnQrKzsKIAkJCQlvdXRiKG1pZGlfYnl0ZSwgdWFydC0+YmFzZSArIFVBUlRfVFgpOwogCQkJfSBlbHNlIHsKLQkJCSAgICAgICAgLyogQ2Fubm90IHdyaXRlIChidWZmZXIgZW1wdHkpIC0gcHV0IGNoYXIgaW4gYnVmZmVyICovCisJCQkgICAgICAgIC8qIENhbm5vdCB3cml0ZSAoYnVmZmVyIGVtcHR5KSAtCisJCQkJICogcHV0IGNoYXIgaW4gYnVmZmVyICovCiAJCQkJc25kX3VhcnQxNjU1MF93cml0ZV9idWZmZXIodWFydCwgbWlkaV9ieXRlKTsKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCWlmKCAhc25kX3VhcnQxNjU1MF93cml0ZV9idWZmZXIodWFydCwgbWlkaV9ieXRlKSApIHsKKwkJaWYgKCFzbmRfdWFydDE2NTUwX3dyaXRlX2J1ZmZlcih1YXJ0LCBtaWRpX2J5dGUpKSB7CiAJCQlzbmRfcHJpbnRrKCIlczogQnVmZmVyIG92ZXJydW4gb24gZGV2aWNlIGF0IDB4JWx4XG4iLAogCQkJCSAgIHVhcnQtPnJtaWRpLT5uYW1lLCB1YXJ0LT5iYXNlKTsKIAkJCXJldHVybiAwOwpAQCAtNjQyLDkgKzY0OSw5IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSwgYWRkcl9ieXRlOwotCXNuZF91YXJ0MTY1NTBfdCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKIAljaGFyIGZpcnN0OwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3R0aW1lPTA7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdHRpbWUgPSAwOwogCQogCS8qIEludGVydXB0cyBhcmUgZGlzYWJsZWQgZHVyaW5nIHRoZSB1cGRhdGluZyBvZiB0aGUgdHhfYnVmZiwKIAkgKiBzaW5jZSBpdCBpcyAnYmFkJyB0byBoYXZlIHR3byBwcm9jZXNzZXMgdXBkYXRpbmcgdGhlIHNhbWUKQEAgLTY1Myw3ICs2NjAsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVhcnQtPm9wZW5fbG9jaywgZmxhZ3MpOwogCi0JaWYgKHVhcnQtPmlycSA8IDApCS8vcG9sbGluZworCWlmICh1YXJ0LT5pcnEgPCAwKQkvKiBwb2xsaW5nICovCiAJCXNuZF91YXJ0MTY1NTBfaW9fbG9vcCh1YXJ0KTsKIAogCWlmICh1YXJ0LT5hZGFwdG9yID09IFNORFJWX1NFUklBTF9NUzEyNFdfTUIpIHsKQEAgLTY3MSw3ICs2NzgsOCBAQAogCQkJLyogc2VsZWN0IGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm91ciBwb3J0cyAqLwogCQkJYWRkcl9ieXRlID0gKHN1YnN0cmVhbS0+bnVtYmVyIDw8IDQpIHwgMHgwODsKIAkJCS8qIC4uLmV4Y2VwdCBub25lICovCi0JCQlpZiAoYWRkcl9ieXRlID09IDB4MDgpIGFkZHJfYnl0ZSA9IDB4Zjg7CisJCQlpZiAoYWRkcl9ieXRlID09IDB4MDgpCisJCQkJYWRkcl9ieXRlID0gMHhmODsKICNlbmRpZgogCQkJc25kX3VhcnQxNjU1MF9vdXRwdXRfYnl0ZSh1YXJ0LCBzdWJzdHJlYW0sIGFkZHJfYnl0ZSk7CiAJCQkvKiBzZW5kIG1pZGkgYnl0ZSAqLwpAQCAtNjc5LDMxICs2ODcsNDIgQEAKIAkJfQogCX0gZWxzZSB7CiAJCWZpcnN0ID0gMDsKLQkJd2hpbGUoIDEgPT0gc25kX3Jhd21pZGlfdHJhbnNtaXRfcGVlayhzdWJzdHJlYW0sICZtaWRpX2J5dGUsIDEpICkgewotCQkJLyogQWxzbyBzZW5kIEY1IGFmdGVyIDMgc2Vjb25kcyB3aXRoIG5vIGRhdGEgdG8gaGFuZGxlIGRldmljZSBkaXNjb25uZWN0ICovCi0JCQlpZiAoZmlyc3QgPT0gMCAmJiAodWFydC0+YWRhcHRvciA9PSBTTkRSVl9TRVJJQUxfU09VTkRDQU5WQVMgfHwKLQkJCQl1YXJ0LT5hZGFwdG9yID09IFNORFJWX1NFUklBTF9HRU5FUklDKSAmJgotCQkJICAgKHVhcnQtPnByZXZfb3V0ICE9IHN1YnN0cmVhbS0+bnVtYmVyIHx8IGppZmZpZXMtbGFzdHRpbWUgPiAzKkhaKSkgeworCQl3aGlsZSAoc25kX3Jhd21pZGlfdHJhbnNtaXRfcGVlayhzdWJzdHJlYW0sICZtaWRpX2J5dGUsIDEpID09IDEpIHsKKwkJCS8qIEFsc28gc2VuZCBGNSBhZnRlciAzIHNlY29uZHMgd2l0aCBubyBkYXRhCisJCQkgKiB0byBoYW5kbGUgZGV2aWNlIGRpc2Nvbm5lY3QgKi8KKwkJCWlmIChmaXJzdCA9PSAwICYmCisJCQkgICAgKHVhcnQtPmFkYXB0b3IgPT0gU05EUlZfU0VSSUFMX1NPVU5EQ0FOVkFTIHx8CisJCQkgICAgIHVhcnQtPmFkYXB0b3IgPT0gU05EUlZfU0VSSUFMX0dFTkVSSUMpICYmCisJCQkgICAgKHVhcnQtPnByZXZfb3V0ICE9IHN1YnN0cmVhbS0+bnVtYmVyIHx8CisJCQkgICAgIGppZmZpZXMtbGFzdHRpbWUgPiAzKkhaKSkgewogCi0JCQkJaWYoIHNuZF91YXJ0MTY1NTBfYnVmZmVyX2Nhbl93cml0ZSggdWFydCwgMyApICkgeworCQkJCWlmIChzbmRfdWFydDE2NTUwX2J1ZmZlcl9jYW5fd3JpdGUodWFydCwgMykpIHsKIAkJCQkJLyogUm9sYW5kIFNvdW5kY2FudmFzIHBhcnQgc2VsZWN0aW9uICovCi0JCQkJCS8qIElmIHRoaXMgc3Vic3RyZWFtIG9mIHRoZSBkYXRhIGlzIGRpZmZlcmVudCBwcmV2aW91cwotCQkJCQkgICBzdWJzdHJlYW0gaW4gdGhpcyB1YXJ0LCBzZW5kIHRoZSBjaGFuZ2UgcGFydCBldmVudCAqLworCQkJCQkvKiBJZiB0aGlzIHN1YnN0cmVhbSBvZiB0aGUgZGF0YSBpcworCQkJCQkgKiBkaWZmZXJlbnQgcHJldmlvdXMgc3Vic3RyZWFtCisJCQkJCSAqIGluIHRoaXMgdWFydCwgc2VuZCB0aGUgY2hhbmdlIHBhcnQKKwkJCQkJICogZXZlbnQKKwkJCQkJICovCiAJCQkJCXVhcnQtPnByZXZfb3V0ID0gc3Vic3RyZWFtLT5udW1iZXI7CiAJCQkJCS8qIGNoYW5nZSBwYXJ0ICovCi0JCQkJCXNuZF91YXJ0MTY1NTBfb3V0cHV0X2J5dGUodWFydCwgc3Vic3RyZWFtLCAweGY1KTsKKwkJCQkJc25kX3VhcnQxNjU1MF9vdXRwdXRfYnl0ZSh1YXJ0LCBzdWJzdHJlYW0sCisJCQkJCQkJCSAgMHhmNSk7CiAJCQkJCS8qIGRhdGEgKi8KLQkJCQkJc25kX3VhcnQxNjU1MF9vdXRwdXRfYnl0ZSh1YXJ0LCBzdWJzdHJlYW0sIHVhcnQtPnByZXZfb3V0ICsgMSk7Ci0JCQkJCS8qIElmIG1pZGlfYnl0ZSBpcyBhIGRhdGEgYnl0ZSwgc2VuZCB0aGUgcHJldmlvdXMgc3RhdHVzIGJ5dGUgKi8KLQkJCQkJaWYgKChtaWRpX2J5dGUgPCAweDgwKSAmJiAodWFydC0+YWRhcHRvciA9PSBTTkRSVl9TRVJJQUxfU09VTkRDQU5WQVMpKQorCQkJCQlzbmRfdWFydDE2NTUwX291dHB1dF9ieXRlKHVhcnQsIHN1YnN0cmVhbSwKKwkJCQkJCQkJICB1YXJ0LT5wcmV2X291dCArIDEpOworCQkJCQkvKiBJZiBtaWRpX2J5dGUgaXMgYSBkYXRhIGJ5dGUsCisJCQkJCSAqIHNlbmQgdGhlIHByZXZpb3VzIHN0YXR1cyBieXRlICovCisJCQkJCWlmIChtaWRpX2J5dGUgPCAweDgwICYmCisJCQkJCSAgICB1YXJ0LT5hZGFwdG9yID09IFNORFJWX1NFUklBTF9TT1VORENBTlZBUykKIAkJCQkJCXNuZF91YXJ0MTY1NTBfb3V0cHV0X2J5dGUodWFydCwgc3Vic3RyZWFtLCB1YXJ0LT5wcmV2X3N0YXR1c1t1YXJ0LT5wcmV2X291dF0pOwotCQkJCX0gZWxzZSBpZiggIXVhcnQtPmRyb3Bfb25fZnVsbCApCisJCQkJfSBlbHNlIGlmICghdWFydC0+ZHJvcF9vbl9mdWxsKQogCQkJCQlicmVhazsKIAogCQkJfQogCiAJCQkvKiBzZW5kIG1pZGkgYnl0ZSAqLwotCQkJaWYoICFzbmRfdWFydDE2NTUwX291dHB1dF9ieXRlKHVhcnQsIHN1YnN0cmVhbSwgbWlkaV9ieXRlKSAmJiAhdWFydC0+ZHJvcF9vbl9mdWxsICkKKwkJCWlmICghc25kX3VhcnQxNjU1MF9vdXRwdXRfYnl0ZSh1YXJ0LCBzdWJzdHJlYW0sIG1pZGlfYnl0ZSkgJiYKKwkJCSAgICAhdWFydC0+ZHJvcF9vbl9mdWxsICkKIAkJCQlicmVhazsKIAogCQkJaWYgKG1pZGlfYnl0ZSA+PSAweDgwICYmIG1pZGlfYnl0ZSA8IDB4ZjApCkBAIC03MTcsMTcgKzczNiwxNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVhcnQtPm9wZW5fbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBzbmRfdWFydDE2NTUwX291dHB1dF90cmlnZ2VyKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IHVwKQorc3RhdGljIHZvaWQgc25kX3VhcnQxNjU1MF9vdXRwdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCSBpbnQgdXApCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzbmRfdWFydDE2NTUwX3QgKnVhcnQgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdWFydC0+b3Blbl9sb2NrLCBmbGFncyk7Ci0JaWYgKHVwKSB7CisJaWYgKHVwKQogCQl1YXJ0LT5maWxlbW9kZSB8PSBTRVJJQUxfTU9ERV9PVVRQVVRfVFJJR0dFUkVEOwotCX0gZWxzZSB7CisJZWxzZQogCQl1YXJ0LT5maWxlbW9kZSAmPSB+U0VSSUFMX01PREVfT1VUUFVUX1RSSUdHRVJFRDsKLQl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWFydC0+b3Blbl9sb2NrLCBmbGFncyk7CiAJaWYgKHVwKQogCQlzbmRfdWFydDE2NTUwX291dHB1dF93cml0ZShzdWJzdHJlYW0pOwpAQCAtNzQ3LDEwICs3NjYsMTAgQEAKIAkudHJpZ2dlciA9CXNuZF91YXJ0MTY1NTBfaW5wdXRfdHJpZ2dlciwKIH07CiAKLXN0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9mcmVlKHNuZF91YXJ0MTY1NTBfdCAqdWFydCkKK3N0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9mcmVlKHN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0KQogewogCWlmICh1YXJ0LT5pcnEgPj0gMCkKLQkJZnJlZV9pcnEodWFydC0+aXJxLCAodm9pZCAqKXVhcnQpOworCQlmcmVlX2lycSh1YXJ0LT5pcnEsIHVhcnQpOwogCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UodWFydC0+cmVzX2Jhc2UpOwogCWtmcmVlKHVhcnQpOwogCXJldHVybiAwOwpAQCAtNzU4LDcgKzc3Nyw3IEBACiAKIHN0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9kZXZfZnJlZShzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQogewotCXNuZF91YXJ0MTY1NTBfdCAqdWFydCA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQgPSBkZXZpY2UtPmRldmljZV9kYXRhOwogCXJldHVybiBzbmRfdWFydDE2NTUwX2ZyZWUodWFydCk7CiB9CiAKQEAgLTc2OSwxMiArNzg4LDEyIEBACiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBiYXNlLAogCQkJCSAgICAgICBpbnQgYWRhcHRvciwKIAkJCQkgICAgICAgaW50IGRyb3BvbmZ1bGwsCi0JCQkJICAgICAgIHNuZF91YXJ0MTY1NTBfdCAqKnJ1YXJ0KQorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqKnJ1YXJ0KQogewogCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgb3BzID0gewogCQkuZGV2X2ZyZWUgPQlzbmRfdWFydDE2NTUwX2Rldl9mcmVlLAogCX07Ci0Jc25kX3VhcnQxNjU1MF90ICp1YXJ0OworCXN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0OwogCWludCBlcnI7CiAKIApAQCAtNzk1LDcgKzgxNCw3IEBACiAKIAlpZiAoaXJxID49IDAgJiYgaXJxICE9IFNORFJWX0FVVE9fSVJRKSB7CiAJCWlmIChyZXF1ZXN0X2lycShpcnEsIHNuZF91YXJ0MTY1NTBfaW50ZXJydXB0LAotCQkJCUlSUUZfRElTQUJMRUQsICJTZXJpYWwgTUlESSIsICh2b2lkICopIHVhcnQpKSB7CisJCQkJSVJRRl9ESVNBQkxFRCwgIlNlcmlhbCBNSURJIiwgdWFydCkpIHsKIAkJCXNuZF9wcmludGsoImlycSAlZCBidXN5LiBVc2luZyBQb2xsaW5nLlxuIiwgaXJxKTsKIAkJfSBlbHNlIHsKIAkJCXVhcnQtPmlycSA9IGlycTsKQEAgLTg0MywyMyArODYyLDI4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzbmRfdWFydDE2NTUwX3N1YnN0cmVhbXMoc3RydWN0IHNuZF9yYXdtaWRpX3N0ciAqc3RyZWFtKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwogCi0JbGlzdF9mb3JfZWFjaChsaXN0LCAmc3RyZWFtLT5zdWJzdHJlYW1zKSB7Ci0JCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzdHJlYW0sICZzdHJlYW0tPnN1YnN0cmVhbXMsIGxpc3QpIHsKIAkJc3ByaW50ZihzdWJzdHJlYW0tPm5hbWUsICJTZXJpYWwgTUlESSAlZCIsIHN1YnN0cmVhbS0+bnVtYmVyICsgMSk7CiAJfQogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfdWFydDE2NTUwX3JtaWRpKHNuZF91YXJ0MTY1NTBfdCAqdWFydCwgaW50IGRldmljZSwgaW50IG91dHMsIGludCBpbnMsIHN0cnVjdCBzbmRfcmF3bWlkaSAqKnJtaWRpKQorc3RhdGljIGludCBfX2luaXQgc25kX3VhcnQxNjU1MF9ybWlkaShzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqdWFydCwgaW50IGRldmljZSwKKwkJCQkgICAgICBpbnQgb3V0cywgaW50IGlucywKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3Jhd21pZGkgKipybWlkaSkKIHsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJyYXdtaWRpOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IHNuZF9yYXdtaWRpX25ldyh1YXJ0LT5jYXJkLCAiVUFSVCBTZXJpYWwgTUlESSIsIGRldmljZSwgb3V0cywgaW5zLCAmcnJhd21pZGkpKSA8IDApCisJZXJyID0gc25kX3Jhd21pZGlfbmV3KHVhcnQtPmNhcmQsICJVQVJUIFNlcmlhbCBNSURJIiwgZGV2aWNlLAorCQkJICAgICAgb3V0cywgaW5zLCAmcnJhd21pZGkpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCXNuZF9yYXdtaWRpX3NldF9vcHMocnJhd21pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX0lOUFVULCAmc25kX3VhcnQxNjU1MF9pbnB1dCk7Ci0Jc25kX3Jhd21pZGlfc2V0X29wcyhycmF3bWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVULCAmc25kX3VhcnQxNjU1MF9vdXRwdXQpOworCXNuZF9yYXdtaWRpX3NldF9vcHMocnJhd21pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX0lOUFVULAorCQkJICAgICZzbmRfdWFydDE2NTUwX2lucHV0KTsKKwlzbmRfcmF3bWlkaV9zZXRfb3BzKHJyYXdtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9PVVRQVVQsCisJCQkgICAgJnNuZF91YXJ0MTY1NTBfb3V0cHV0KTsKIAlzdHJjcHkocnJhd21pZGktPm5hbWUsICJTZXJpYWwgTUlESSIpOwogCXNuZF91YXJ0MTY1NTBfc3Vic3RyZWFtcygmcnJhd21pZGktPnN0cmVhbXNbU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVUXSk7CiAJc25kX3VhcnQxNjU1MF9zdWJzdHJlYW1zKCZycmF3bWlkaS0+c3RyZWFtc1tTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVF0pOwpAQCAtODc1LDcgKzg5OSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBzbmRfc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0cikKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7Ci0Jc25kX3VhcnQxNjU1MF90ICp1YXJ0OworCXN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0OwogCWludCBlcnI7CiAJaW50IGRldiA9IGRldnB0ci0+aWQ7CiAKQEAgLTkyOSw3ICs5NTMsOCBAQAogCQkJCQkmdWFydCkpIDwgMCkKIAkJZ290byBfZXJyOwogCi0JaWYgKChlcnIgPSBzbmRfdWFydDE2NTUwX3JtaWRpKHVhcnQsIDAsIG91dHNbZGV2XSwgaW5zW2Rldl0sICZ1YXJ0LT5ybWlkaSkpIDwgMCkKKwllcnIgPSBzbmRfdWFydDE2NTUwX3JtaWRpKHVhcnQsIDAsIG91dHNbZGV2XSwgaW5zW2Rldl0sICZ1YXJ0LT5ybWlkaSk7CisJaWYgKGVyciA8IDApCiAJCWdvdG8gX2VycjsKIAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCwgaXJxICVkIHNwZWVkICVkIGRpdiAlZCBvdXRzICVkIGlucyAlZCBhZGFwdG9yICVzIGRyb3BvbmZ1bGwgJWQiLApkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy92eC92eF9taXhlci5jIGIvc291bmQvZHJpdmVycy92eC92eF9taXhlci5jCmluZGV4IDE2MTNlZDguLmY2MzE1MmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvdngvdnhfbWl4ZXIuYworKysgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X21peGVyLmMKQEAgLTcxNiw3ICs3MTYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYXVkaW9fZ2FpbiwgLTEwOTc1LCAyNSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYXVkaW9fZ2FpbiwgLTEwOTc1LCAyNSwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2eF9jb250cm9sX2F1ZGlvX2dhaW4gPSB7CiAJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvTWFrZWZpbGUgYi9zb3VuZC9pMmMvTWFrZWZpbGUKaW5kZXggODE2YTJlNy4uNDU5MDJkNCAxMDA2NDQKLS0tIGEvc291bmQvaTJjL01ha2VmaWxlCisrKyBiL3NvdW5kL2kyYy9NYWtlZmlsZQpAQCAtMTYsMyArMTYsNCBAQAogIyBUb3BsZXZlbCBNb2R1bGUgRGVwZW5kZW5jeQogb2JqLSQoQ09ORklHX1NORF9JTlRFUldBVkVfU1RCKSArPSBzbmQtdGVhNjMzMHQubyBzbmQtaTJjLm8KIG9iai0kKENPTkZJR19TTkRfSUNFMTcxMikgKz0gc25kLWNzODQyNy5vIHNuZC1pMmMubworb2JqLSQoQ09ORklHX1NORF9JQ0UxNzI0KSArPSBzbmQtaTJjLm8KZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9NYWtlZmlsZSBiL3NvdW5kL2kyYy9vdGhlci9NYWtlZmlsZQppbmRleCAyZmUwMjNlZi4uNzdhOGE3YyAxMDA2NDQKLS0tIGEvc291bmQvaTJjL290aGVyL01ha2VmaWxlCisrKyBiL3NvdW5kL2kyYy9vdGhlci9NYWtlZmlsZQpAQCAtNiwxMSArNiwxMSBAQAogc25kLWFrNDExNC1vYmpzIDo9IGFrNDExNC5vCiBzbmQtYWs0MTE3LW9ianMgOj0gYWs0MTE3Lm8KIHNuZC1hazR4eHgtYWRkYS1vYmpzIDo9IGFrNHh4eC1hZGRhLm8KK3NuZC1wdDIyNTgtb2JqcyA6PSBwdDIyNTgubwogc25kLXRlYTU3NXgtdHVuZXItb2JqcyA6PSB0ZWE1NzV4LXR1bmVyLm8KIAogIyBNb2R1bGUgRGVwZW5kZW5jeQogb2JqLSQoQ09ORklHX1NORF9QREFVRElPQ0YpICs9IHNuZC1hazQxMTcubwogb2JqLSQoQ09ORklHX1NORF9JQ0UxNzEyKSArPSBzbmQtYWs0eHh4LWFkZGEubwotb2JqLSQoQ09ORklHX1NORF9JQ0UxNzI0KSArPSBzbmQtYWs0eHh4LWFkZGEubwotb2JqLSQoQ09ORklHX1NORF9JQ0UxNzI0KSArPSBzbmQtYWs0MTE0Lm8KK29iai0kKENPTkZJR19TTkRfSUNFMTcyNCkgKz0gc25kLWFrNDExNC5vIHNuZC1hazR4eHgtYWRkYS5vIHNuZC1wdDIyNTgubwogb2JqLSQoQ09ORklHX1NORF9GTTgwMV9URUE1NzVYKSArPSBzbmQtdGVhNTc1eC10dW5lci5vCmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMKaW5kZXggZDJmMmM1MC4uYWRiZmQ1OCAxMDA2NDQKLS0tIGEvc291bmQvaTJjL290aGVyL2FrNDExNC5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYwpAQCAtNDIsOCArNDIsOCBAQAogCWFrNDExNC0+d3JpdGUoYWs0MTE0LT5wcml2YXRlX2RhdGEsIHJlZywgdmFsKTsKIAlpZiAocmVnIDw9IEFLNDExNF9SRUdfSU5UMV9NQVNLKQogCQlhazQxMTQtPnJlZ21hcFtyZWddID0gdmFsOwotCWVsc2UgaWYgKHJlZyA+PSBBSzQxMTRfUkVHX1JYQ1NCMCAmJiByZWcgPD0gQUs0MTE0X1JFR19UWENTQjQpCi0JCWFrNDExNC0+dHhjc2JbcmVnLUFLNDExNF9SRUdfUlhDU0IwXSA9IHZhbDsKKwllbHNlIGlmIChyZWcgPj0gQUs0MTE0X1JFR19UWENTQjAgJiYgcmVnIDw9IEFLNDExNF9SRUdfVFhDU0I0KQorCQlhazQxMTQtPnR4Y3NiW3JlZy1BSzQxMTRfUkVHX1RYQ1NCMF0gPSB2YWw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWdfcmVhZChzdHJ1Y3QgYWs0MTE0ICphazQxMTQsIHVuc2lnbmVkIGNoYXIgcmVnKQpAQCAtNjYsMTAgKzY2LDggQEAKIHsKIAljaGlwLT5pbml0ID0gMTsJLyogZG9uJ3Qgc2NoZWR1bGUgbmV3IHdvcmsgKi8KIAltYigpOwotCWlmIChjaGlwLT53b3JrcXVldWUgIT0gTlVMTCkgewotCQlmbHVzaF93b3JrcXVldWUoY2hpcC0+d29ya3F1ZXVlKTsKLQkJZGVzdHJveV93b3JrcXVldWUoY2hpcC0+d29ya3F1ZXVlKTsKLQl9CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2hpcC0+d29yayk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAlrZnJlZShjaGlwKTsKIH0KIApAQCAtODIsNyArODAsNyBAQAogCiBpbnQgc25kX2FrNDExNF9jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLAogCQkgICAgICBhazQxMTRfcmVhZF90ICpyZWFkLCBhazQxMTRfd3JpdGVfdCAqd3JpdGUsCi0JCSAgICAgIHVuc2lnbmVkIGNoYXIgcGdtWzddLCB1bnNpZ25lZCBjaGFyIHR4Y3NiWzVdLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIHBnbVs3XSwgY29uc3QgdW5zaWduZWQgY2hhciB0eGNzYls1XSwKIAkJICAgICAgdm9pZCAqcHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgYWs0MTE0ICoqcl9hazQxMTQpCiB7CiAJc3RydWN0IGFrNDExNCAqY2hpcDsKQEAgLTEwMCwxOCArOTgsMTMgQEAKIAljaGlwLT5yZWFkID0gcmVhZDsKIAljaGlwLT53cml0ZSA9IHdyaXRlOwogCWNoaXAtPnByaXZhdGVfZGF0YSA9IHByaXZhdGVfZGF0YTsKKwlJTklUX0RFTEFZRURfV09SSygmY2hpcC0+d29yaywgYWs0MTE0X3N0YXRzKTsKIAogCWZvciAocmVnID0gMDsgcmVnIDwgNzsgcmVnKyspCiAJCWNoaXAtPnJlZ21hcFtyZWddID0gcGdtW3JlZ107CiAJZm9yIChyZWcgPSAwOyByZWcgPCA1OyByZWcrKykKIAkJY2hpcC0+dHhjc2JbcmVnXSA9IHR4Y3NiW3JlZ107CiAKLQljaGlwLT53b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJzbmQtYWs0MTE0Iik7Ci0JaWYgKGNoaXAtPndvcmtxdWV1ZSA9PSBOVUxMKSB7Ci0JCWtmcmVlKGNoaXApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAlzbmRfYWs0MTE0X3JlaW5pdChjaGlwKTsKIAogCWNoaXAtPnJjczAgPSByZWdfcmVhZChjaGlwLCBBSzQxMTRfUkVHX1JDUzApICYgfihBSzQxMTRfUUlOVCB8IEFLNDExNF9DSU5UKTsKQEAgLTEzNCw3ICsxMjcsOCBAQAogCWlmIChyZWcgPD0gQUs0MTE0X1JFR19JTlQxX01BU0spCiAJCXJlZ193cml0ZShjaGlwLCByZWcsIChjaGlwLT5yZWdtYXBbcmVnXSAmIH5tYXNrKSB8IHZhbCk7CiAJZWxzZSBpZiAocmVnID49IEFLNDExNF9SRUdfVFhDU0IwICYmIHJlZyA8PSBBSzQxMTRfUkVHX1RYQ1NCNCkKLQkJcmVnX3dyaXRlKGNoaXAsIHJlZywgKGNoaXAtPnR4Y3NiW3JlZ10gJiB+bWFzaykgfCB2YWwpOworCQlyZWdfd3JpdGUoY2hpcCwgcmVnLAorCQkJICAoY2hpcC0+dHhjc2JbcmVnLUFLNDExNF9SRUdfVFhDU0IwXSAmIH5tYXNrKSB8IHZhbCk7CiB9CiAKIHZvaWQgc25kX2FrNDExNF9yZWluaXQoc3RydWN0IGFrNDExNCAqY2hpcCkKQEAgLTE0Myw3ICsxMzcsNyBAQAogCiAJY2hpcC0+aW5pdCA9IDE7CiAJbWIoKTsKLQlmbHVzaF93b3JrcXVldWUoY2hpcC0+d29ya3F1ZXVlKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCS8qIGJyaW5nIHRoZSBjaGlwIHRvIHJlc2V0IHN0YXRlIGFuZCBwb3dlcmRvd24gc3RhdGUgKi8KIAlyZWdfd3JpdGUoY2hpcCwgQUs0MTE0X1JFR19QV1JETiwgb2xkICYgfihBSzQxMTRfUlNUfEFLNDExNF9QV04pKTsKIAl1ZGVsYXkoMjAwKTsKQEAgLTE1OCw4ICsxNTIsNyBAQAogCXJlZ193cml0ZShjaGlwLCBBSzQxMTRfUkVHX1BXUkROLCBvbGQgfCBBSzQxMTRfUlNUIHwgQUs0MTE0X1BXTik7CiAJLyogYnJpbmcgdXAgc3RhdGlzdGljcyAvIGV2ZW50IHF1ZWluZyAqLwogCWNoaXAtPmluaXQgPSAwOwotCUlOSVRfREVMQVlFRF9XT1JLKCZjaGlwLT53b3JrLCBhazQxMTRfc3RhdHMpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhjaGlwLT53b3JrcXVldWUsICZjaGlwLT53b3JrLCBIWiAvIDEwKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNoaXAtPndvcmssIEhaIC8gMTApOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGV4dGVybmFsX3JhdGUodW5zaWduZWQgY2hhciByY3MxKQpAQCAtNTY4LDcgKzU2MSw3IEBACiAJaWYgKGNoaXAtPmluaXQpCiAJCXJldHVybjsKIAlzbmRfYWs0MTE0X2NoZWNrX3JhdGVfYW5kX2Vycm9ycyhjaGlwLCAwKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoY2hpcC0+d29ya3F1ZXVlLCAmY2hpcC0+d29yaywgSFogLyAxMCk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGlwLT53b3JrLCBIWiAvIDEwKTsKIH0KIAogRVhQT1JUX1NZTUJPTChzbmRfYWs0MTE0X2NyZWF0ZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE3LmMgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTE3LmMKaW5kZXggNGU0NTk1Mi4uYzAyMmYyOSAxMDA2NDQKLS0tIGEvc291bmQvaTJjL290aGVyL2FrNDExNy5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTcuYwpAQCAtNzQsNyArNzQsNyBAQAogfQogCiBpbnQgc25kX2FrNDExN19jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBhazQxMTdfcmVhZF90ICpyZWFkLCBhazQxMTdfd3JpdGVfdCAqd3JpdGUsCi0JCSAgICAgIHVuc2lnbmVkIGNoYXIgcGdtWzVdLCB2b2lkICpwcml2YXRlX2RhdGEsIHN0cnVjdCBhazQxMTcgKipyX2FrNDExNykKKwkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBwZ21bNV0sIHZvaWQgKnByaXZhdGVfZGF0YSwgc3RydWN0IGFrNDExNyAqKnJfYWs0MTE3KQogewogCXN0cnVjdCBhazQxMTcgKmNoaXA7CiAJaW50IGVyciA9IDA7CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvYWs0eHh4LWFkZGEuYyBiL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jCmluZGV4IDVkYTQ5ZTIuLjg4MDUxMTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jCkBAIC0xNDAsNyArMTQwLDcgQEAKICAqIFVzZWQgZm9yIEFLNDUyNCBpbnB1dC9vdXB1dCBhdHRlbnVhdGlvbiwgQUs0NTI4LCBhbmQKICAqIEFLNTM2NSBpbnB1dCBhdHRlbnVhdGlvbgogICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciB2b2xfY3Z0X2RhdHRbMTI4XSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHZvbF9jdnRfZGF0dFsxMjhdID0gewogCTB4MDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDMsIDB4MDMsIDB4MDQsCiAJMHgwNCwgMHgwNCwgMHgwNCwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNiwgMHgwNiwKIAkweDA2LCAweDA3LCAweDA3LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDBhLApAQCAtMTYyLDE3ICsxNjIsMTcgQEAKIC8qCiAgKiBkQiB0YWJsZXMKICAqLwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3ZvbF9kYXR0LCAtNjM1MCwgNTAsIDEpOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzhiaXQsIC0xMjc1MCwgNTAsIDEpOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzdiaXQsIC02MzUwLCA1MCwgMSk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfTElORUFSKGRiX3NjYWxlX2xpbmVhciwgVExWX0RCX0dBSU5fTVVURSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfdm9sX2RhdHQsIC02MzUwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfOGJpdCwgLTEyNzUwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfN2JpdCwgLTYzNTAsIDUwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoZGJfc2NhbGVfbGluZWFyLCBUTFZfREJfR0FJTl9NVVRFLCAwKTsKIAogLyoKICAqIGluaXRpYWxpemUgYWxsIHRoZSBhazR4eHggY2hpcHMKICAqLwogdm9pZCBzbmRfYWttNHh4eF9pbml0KHN0cnVjdCBzbmRfYWttNHh4eCAqYWspCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5pdHNfYWs0NTI0W10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5pdHNfYWs0NTI0W10gPSB7CiAJCTB4MDAsIDB4MDcsIC8qIDA6IGFsbCBwb3dlciB1cCAqLwogCQkweDAxLCAweDAwLCAvKiAxOiBBREMvREFDIHJlc2V0ICovCiAJCTB4MDIsIDB4NjAsIC8qIDI6IDI0Yml0IEkyUyAqLwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJCTB4MDcsIDB4MDAsIC8qIDc6IERBQyByaWdodCBtdXRlZCAqLwogCQkweGZmLCAweGZmCiAJfTsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBpbml0c19hazQ1MjhbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbml0c19hazQ1MjhbXSA9IHsKIAkJMHgwMCwgMHgwNywgLyogMDogYWxsIHBvd2VyIHVwICovCiAJCTB4MDEsIDB4MDAsIC8qIDE6IEFEQy9EQUMgcmVzZXQgKi8KIAkJMHgwMiwgMHg2MCwgLyogMjogMjRiaXQgSTJTICovCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJMHgwNSwgMHgwMCwgLyogNTogQURDIHJpZ2h0IG11dGVkICovCiAJCTB4ZmYsIDB4ZmYKIAl9OwotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGluaXRzX2FrNDUyOVtdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGluaXRzX2FrNDUyOVtdID0gewogCQkweDA5LCAweDAxLCAvKiA5OiBBVFM9MCwgUlNUTj0xICovCiAJCTB4MGEsIDB4M2YsIC8qIEE6IGFsbCBwb3dlciB1cCwgbm8gemVyby9vdmVyZmxvdyBkZXRlY3Rpb24gKi8KIAkJMHgwMCwgMHgwYywgLyogMDogVERNPTAsIDI0Yml0IEkyUywgU01VVEU9MCAqLwpAQCAtMjEwLDcgKzIxMCw3IEBACiAJCTB4MDgsIDB4NTUsIC8qIDg6IGRlZW1waGFzaXMgYWxsIG9mZiAqLwogCQkweGZmLCAweGZmCiAJfTsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBpbml0c19hazQzNTVbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbml0c19hazQzNTVbXSA9IHsKIAkJMHgwMSwgMHgwMiwgLyogMTogcmVzZXQgYW5kIHNvZnQtbXV0ZSAqLwogCQkweDAwLCAweDA2LCAvKiAwOiBtb2RlMyhpMnMpLCBkaXNhYmxlIGF1dG8tY2xvY2sgZGV0ZWN0LAogCQkJICAgICAqIGRpc2FibGUgRFpGLCBzaGFycCByb2xsLW9mZiwgUlNUTiM9MCAqLwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJCTB4MDEsIDB4MDEsIC8qIDE6IHVuLXJlc2V0LCB1bm11dGUgKi8KIAkJMHhmZiwgMHhmZgogCX07Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5pdHNfYWs0MzU4W10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5pdHNfYWs0MzU4W10gPSB7CiAJCTB4MDEsIDB4MDIsIC8qIDE6IHJlc2V0IGFuZCBzb2Z0LW11dGUgKi8KIAkJMHgwMCwgMHgwNiwgLyogMDogbW9kZTMoaTJzKSwgZGlzYWJsZSBhdXRvLWNsb2NrIGRldGVjdCwKIAkJCSAgICAgKiBkaXNhYmxlIERaRiwgc2hhcnAgcm9sbC1vZmYsIFJTVE4jPTAgKi8KQEAgLTI0Niw3ICsyNDYsNyBAQAogCQkweDAxLCAweDAxLCAvKiAxOiB1bi1yZXNldCwgdW5tdXRlICovCiAJCTB4ZmYsIDB4ZmYKIAl9OwotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGluaXRzX2FrNDM4MVtdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGluaXRzX2FrNDM4MVtdID0gewogCQkweDAwLCAweDBjLCAvKiAwOiBtb2RlMyhpMnMpLCBkaXNhYmxlIGF1dG8tY2xvY2sgZGV0ZWN0ICovCiAJCTB4MDEsIDB4MDIsIC8qIDE6IGRlLWVtcGhhc2lzIG9mZiwgbm9ybWFsIHNwZWVkLAogCQkJICAgICAqIHNoYXJwIHJvbGwtb2ZmLCBEWkYgb2ZmICovCkBAIC0yNTksNyArMjU5LDggQEAKIAl9OwogCiAJaW50IGNoaXAsIG51bV9jaGlwczsKLQl1bnNpZ25lZCBjaGFyICpwdHIsIHJlZywgZGF0YSwgKmluaXRzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciwgKmluaXRzOworCXVuc2lnbmVkIGNoYXIgcmVnLCBkYXRhOwogCiAJbWVtc2V0KGFrLT5pbWFnZXMsIDAsIHNpemVvZihhay0+aW1hZ2VzKSk7CiAJbWVtc2V0KGFrLT52b2x1bWVzLCAwLCBzaXplb2YoYWstPnZvbHVtZXMpKTsKQEAgLTUxMyw2ICs1MTQsNjYgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCisjZGVmaW5lIEFLNTM2NV9OVU1fSU5QVVRTIDUKKworc3RhdGljIGludCBhazR4eHhfY2FwdHVyZV9zb3VyY2VfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCBzbmRfYWttNHh4eCAqYWsgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IG1peGVyX2NoID0gQUtfR0VUX1NISUZUKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwljb25zdCBjaGFyICoqaW5wdXRfbmFtZXM7CisJaW50ICBudW1fbmFtZXMsIGlkeDsKKworCWlucHV0X25hbWVzID0gYWstPmFkY19pbmZvW21peGVyX2NoXS5pbnB1dF9uYW1lczsKKworCW51bV9uYW1lcyA9IDA7CisJd2hpbGUgKG51bV9uYW1lcyA8IEFLNTM2NV9OVU1fSU5QVVRTICYmIGlucHV0X25hbWVzW251bV9uYW1lc10pCisJCSsrbnVtX25hbWVzOworCQorCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBudW1fbmFtZXM7CisJaWR4ID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbTsKKwlpZiAoaWR4ID49IG51bV9uYW1lcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3RybmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCBpbnB1dF9uYW1lc1tpZHhdLAorCQlzaXplb2YodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFrNHh4eF9jYXB0dXJlX3NvdXJjZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2FrbTR4eHggKmFrID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGlwID0gQUtfR0VUX0NISVAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCWludCBhZGRyID0gQUtfR0VUX0FERFIoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCWludCBtYXNrID0gQUtfR0VUX01BU0soa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJdmFsID0gc25kX2FrbTR4eHhfZ2V0KGFrLCBjaGlwLCBhZGRyKSAmIG1hc2s7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhazR4eHhfY2FwdHVyZV9zb3VyY2VfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9ha200eHh4ICphayA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hpcCA9IEFLX0dFVF9DSElQKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwlpbnQgYWRkciA9IEFLX0dFVF9BRERSKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwlpbnQgbWFzayA9IEFLX0dFVF9NQVNLKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwl1bnNpZ25lZCBjaGFyIG92YWwsIHZhbDsKKworCW92YWwgPSBzbmRfYWttNHh4eF9nZXQoYWssIGNoaXAsIGFkZHIpOworCXZhbCA9IG92YWwgJiB+bWFzazsKKwl2YWwgfD0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAmIG1hc2s7CisJaWYgKHZhbCAhPSBvdmFsKSB7CisJCXNuZF9ha200eHh4X3dyaXRlKGFrLCBjaGlwLCBhZGRyLCB2YWwpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBidWlsZCBBSzR4eHggY29udHJvbHMKICAqLwpAQCAtNjQ3LDkgKzcwOCwxMCBAQAogCiAJCWlmIChhay0+dHlwZSA9PSBTTkRfQUs1MzY1ICYmIChpZHggJSAyKSA9PSAwKSB7CiAJCQlpZiAoISBhay0+YWRjX2luZm8gfHwgCi0JCQkgICAgISBhay0+YWRjX2luZm9bbWl4ZXJfY2hdLnN3aXRjaF9uYW1lKQorCQkJICAgICEgYWstPmFkY19pbmZvW21peGVyX2NoXS5zd2l0Y2hfbmFtZSkgewogCQkJCWtuZXcubmFtZSA9ICJDYXB0dXJlIFN3aXRjaCI7Ci0JCQllbHNlCisJCQkJa25ldy5pbmRleCA9IG1peGVyX2NoICsgYWstPmlkeF9vZmZzZXQgKiAyOworCQkJfSBlbHNlCiAJCQkJa25ldy5uYW1lID0gYWstPmFkY19pbmZvW21peGVyX2NoXS5zd2l0Y2hfbmFtZTsKIAkJCWtuZXcuaW5mbyA9IGFrNHh4eF9zd2l0Y2hfaW5mbzsKIAkJCWtuZXcuZ2V0ID0gYWs0eHh4X3N3aXRjaF9nZXQ7CkBAIC02NjIsNiArNzI0LDI2IEBACiAJCQllcnIgPSBzbmRfY3RsX2FkZChhay0+Y2FyZCwgc25kX2N0bF9uZXcxKCZrbmV3LCBhaykpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKKworCQkJbWVtc2V0KCZrbmV3LCAwLCBzaXplb2Yoa25ldykpOworCQkJa25ldy5uYW1lID0gYWstPmFkY19pbmZvW21peGVyX2NoXS5zZWxlY3Rvcl9uYW1lOworCQkJaWYgKCFrbmV3Lm5hbWUpIHsKKwkJCQlrbmV3Lm5hbWUgPSAiQ2FwdHVyZSBDaGFubmVsIjsKKwkJCQlrbmV3LmluZGV4ID0gbWl4ZXJfY2ggKyBhay0+aWR4X29mZnNldCAqIDI7CisJCQl9CisKKwkJCWtuZXcuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwkJCWtuZXcuaW5mbyA9IGFrNHh4eF9jYXB0dXJlX3NvdXJjZV9pbmZvOworCQkJa25ldy5nZXQgPSBhazR4eHhfY2FwdHVyZV9zb3VyY2VfZ2V0OworCQkJa25ldy5wdXQgPSBhazR4eHhfY2FwdHVyZV9zb3VyY2VfcHV0OworCQkJa25ldy5hY2Nlc3MgPSAwOworCQkJLyogaW5wdXQgc2VsZWN0b3IgY29udHJvbDogcmVnLiAxLCBiaXRzIDAtMi4KKwkJCSAqIG1pcy11c2UgJ3NoaWZ0JyB0byBwYXNzIG1peGVyX2NoICovCisJCQlrbmV3LnByaXZhdGVfdmFsdWUKKwkJCQk9IEFLX0NPTVBPU0UoaWR4LzIsIDEsIG1peGVyX2NoLCAweDA3KTsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGFrLT5jYXJkLCBzbmRfY3RsX25ldzEoJmtuZXcsIGFrKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOwogCQl9CiAKIAkJaWR4ICs9IG51bV9zdGVyZW87CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvcHQyMjU4LmMgYi9zb3VuZC9pMmMvb3RoZXIvcHQyMjU4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxY2MzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9pMmMvb3RoZXIvcHQyMjU4LmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiAgIEFMU0EgRHJpdmVyIGZvciB0aGUgUFQyMjU4IHZvbHVtZSBjb250cm9sbGVyLgorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwNiAgSm9jaGVuIFZvc3MgPHZvc3NAc2VlaHVobi5kZT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovICAgICAgCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPHNvdW5kL2kyYy5oPgorI2luY2x1ZGUgPHNvdW5kL3B0MjI1OC5oPgorCitNT0RVTEVfQVVUSE9SKCJKb2NoZW4gVm9zcyA8dm9zc0BzZWVodWhuLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQVDIyNTggdm9sdW1lIGNvbnRyb2xsZXIgKFByaW5jZXRvbiBUZWNobm9sb2d5IENvcnAuKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIFBUMjI1OF9DTURfUkVTRVQgMHhjMAorI2RlZmluZSBQVDIyNThfQ01EX1VOTVVURSAweGY4CisjZGVmaW5lIFBUMjI1OF9DTURfTVVURSAweGY5CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHB0MjI1OF9jaGFubmVsX2NvZGVbMTJdID0geworCTB4ODAsIDB4OTAsCQkvKiBjaGFubmVsIDE6IC0xMGRCLCAtMWRCICovCisJMHg0MCwgMHg1MCwJCS8qIGNoYW5uZWwgMjogLTEwZEIsIC0xZEIgKi8KKwkweDAwLCAweDEwLAkJLyogY2hhbm5lbCAzOiAtMTBkQiwgLTFkQiAqLworCTB4MjAsIDB4MzAsCQkvKiBjaGFubmVsIDQ6IC0xMGRCLCAtMWRCICovCisJMHg2MCwgMHg3MCwJCS8qIGNoYW5uZWwgNTogLTEwZEIsIC0xZEIgKi8KKwkweGEwLCAweGIwCQkvKiBjaGFubmVsIDY6IC0xMGRCLCAtMWRCICovCit9OworCitpbnQgc25kX3B0MjI1OF9yZXNldChzdHJ1Y3Qgc25kX3B0MjI1OCAqcHQpCit7CisJdW5zaWduZWQgY2hhciBieXRlc1syXTsKKwlpbnQgaTsKKworCS8qIHJlc2V0IGNoaXAgKi8KKwlieXRlc1swXSA9IFBUMjI1OF9DTURfUkVTRVQ7CisJc25kX2kyY19sb2NrKHB0LT5pMmNfYnVzKTsKKwlpZiAoc25kX2kyY19zZW5kYnl0ZXMocHQtPmkyY19kZXYsIGJ5dGVzLCAxKSAhPSAxKQorCQlnb3RvIF9fZXJyb3I7CisJc25kX2kyY191bmxvY2socHQtPmkyY19idXMpOworCisJLyogbXV0ZSBhbGwgY2hhbm5lbHMgKi8KKwlwdC0+bXV0ZSA9IDE7CisJYnl0ZXNbMF0gPSBQVDIyNThfQ01EX01VVEU7CisJc25kX2kyY19sb2NrKHB0LT5pMmNfYnVzKTsKKwlpZiAoc25kX2kyY19zZW5kYnl0ZXMocHQtPmkyY19kZXYsIGJ5dGVzLCAxKSAhPSAxKQorCQlnb3RvIF9fZXJyb3I7CisJc25kX2kyY191bmxvY2socHQtPmkyY19idXMpOworCisJLyogc2V0IGFsbCBjaGFubmVscyB0byAwZEIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgKytpKQorCQlwdC0+dm9sdW1lW2ldID0gMDsKKwlieXRlc1swXSA9IDB4ZDA7CisJYnl0ZXNbMV0gPSAweGUwOworCXNuZF9pMmNfbG9jayhwdC0+aTJjX2J1cyk7CisJaWYgKHNuZF9pMmNfc2VuZGJ5dGVzKHB0LT5pMmNfZGV2LCBieXRlcywgMikgIT0gMikKKwkJZ290byBfX2Vycm9yOworCXNuZF9pMmNfdW5sb2NrKHB0LT5pMmNfYnVzKTsKKworCXJldHVybiAwOworCisgICAgICBfX2Vycm9yOgorCXNuZF9pMmNfdW5sb2NrKHB0LT5pMmNfYnVzKTsKKwlzbmRfcHJpbnRrKEtFUk5fRVJSICJQVDIyNTggcmVzZXQgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBwdDIyNThfc3RlcmVvX3ZvbHVtZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gNzk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHQyMjU4X3N0ZXJlb192b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3B0MjI1OCAqcHQgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCWludCBiYXNlID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisKKwkvKiBjaGlwIGRvZXMgbm90IHN1cHBvcnQgcmVnaXN0ZXIgcmVhZHMgKi8KKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDc5IC0gcHQtPnZvbHVtZVtiYXNlXTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IDc5IC0gcHQtPnZvbHVtZVtiYXNlICsgMV07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHQyMjU4X3N0ZXJlb192b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3B0MjI1OCAqcHQgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCWludCBiYXNlID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgY2hhciBieXRlc1syXTsKKwlpbnQgdmFsMCwgdmFsMTsKKworCXZhbDAgPSA3OSAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXZhbDEgPSA3OSAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCWlmICh2YWwwID09IHB0LT52b2x1bWVbYmFzZV0gJiYgdmFsMSA9PSBwdC0+dm9sdW1lW2Jhc2UgKyAxXSkKKwkJcmV0dXJuIDA7CisKKwlwdC0+dm9sdW1lW2Jhc2VdID0gdmFsMDsKKwlieXRlc1swXSA9IHB0MjI1OF9jaGFubmVsX2NvZGVbMiAqIGJhc2VdIHwgKHZhbDAgLyAxMCk7CisJYnl0ZXNbMV0gPSBwdDIyNThfY2hhbm5lbF9jb2RlWzIgKiBiYXNlICsgMV0gfCAodmFsMCAlIDEwKTsKKwlzbmRfaTJjX2xvY2socHQtPmkyY19idXMpOworCWlmIChzbmRfaTJjX3NlbmRieXRlcyhwdC0+aTJjX2RldiwgYnl0ZXMsIDIpICE9IDIpCisJCWdvdG8gX19lcnJvcjsKKwlzbmRfaTJjX3VubG9jayhwdC0+aTJjX2J1cyk7CisKKwlwdC0+dm9sdW1lW2Jhc2UgKyAxXSA9IHZhbDE7CisJYnl0ZXNbMF0gPSBwdDIyNThfY2hhbm5lbF9jb2RlWzIgKiBiYXNlICsgMl0gfCAodmFsMSAvIDEwKTsKKwlieXRlc1sxXSA9IHB0MjI1OF9jaGFubmVsX2NvZGVbMiAqIGJhc2UgKyAzXSB8ICh2YWwxICUgMTApOworCXNuZF9pMmNfbG9jayhwdC0+aTJjX2J1cyk7CisJaWYgKHNuZF9pMmNfc2VuZGJ5dGVzKHB0LT5pMmNfZGV2LCBieXRlcywgMikgIT0gMikKKwkJZ290byBfX2Vycm9yOworCXNuZF9pMmNfdW5sb2NrKHB0LT5pMmNfYnVzKTsKKworCXJldHVybiAxOworCisgICAgICBfX2Vycm9yOgorCXNuZF9pMmNfdW5sb2NrKHB0LT5pMmNfYnVzKTsKKwlzbmRfcHJpbnRrKEtFUk5fRVJSICJQVDIyNTggYWNjZXNzIGZhaWxlZFxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgcHQyMjU4X3N3aXRjaF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdDIyNThfc3dpdGNoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9wdDIyNTggKnB0ID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gIXB0LT5tdXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB0MjI1OF9zd2l0Y2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3B0MjI1OCAqcHQgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGNoYXIgYnl0ZXNbMl07CisJaW50IHZhbDsKKworCXZhbCA9ICF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlpZiAocHQtPm11dGUgPT0gdmFsKQorCQlyZXR1cm4gMDsKKworCXB0LT5tdXRlID0gdmFsOworCWJ5dGVzWzBdID0gdmFsID8gUFQyMjU4X0NNRF9NVVRFIDogUFQyMjU4X0NNRF9VTk1VVEU7CisJc25kX2kyY19sb2NrKHB0LT5pMmNfYnVzKTsKKwlpZiAoc25kX2kyY19zZW5kYnl0ZXMocHQtPmkyY19kZXYsIGJ5dGVzLCAxKSAhPSAxKQorCQlnb3RvIF9fZXJyb3I7CisJc25kX2kyY191bmxvY2socHQtPmkyY19idXMpOworCisJcmV0dXJuIDE7CisKKyAgICAgIF9fZXJyb3I6CisJc25kX2kyY191bmxvY2socHQtPmkyY19idXMpOworCXNuZF9wcmludGsoS0VSTl9FUlIgIlBUMjI1OCBhY2Nlc3MgZmFpbGVkIDJcbiIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUocHQyMjU4X2RiX3NjYWxlLCAtNzkwMCwgMTAwLCAwKTsKKworaW50IHNuZF9wdDIyNThfYnVpbGRfY29udHJvbHMoc3RydWN0IHNuZF9wdDIyNTggKnB0KQoreworCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGtuZXc7CisJY2hhciAqbmFtZXNbM10gPSB7CisJCSJNaWMgTG9vcGJhY2sgUGxheWJhY2sgVm9sdW1lIiwKKwkJIkxpbmUgTG9vcGJhY2sgUGxheWJhY2sgVm9sdW1lIiwKKwkJIkNEIExvb3BiYWNrIFBsYXliYWNrIFZvbHVtZSIKKwl9OworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisJCW1lbXNldCgma25ldywgMCwgc2l6ZW9mKGtuZXcpKTsKKwkJa25ldy5uYW1lID0gbmFtZXNbaV07CisJCWtuZXcuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwkJa25ldy5jb3VudCA9IDE7CisJCWtuZXcuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCSAgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQ7CisJCWtuZXcucHJpdmF0ZV92YWx1ZSA9IDIgKiBpOworCQlrbmV3LmluZm8gPSBwdDIyNThfc3RlcmVvX3ZvbHVtZV9pbmZvOworCQlrbmV3LmdldCA9IHB0MjI1OF9zdGVyZW9fdm9sdW1lX2dldDsKKwkJa25ldy5wdXQgPSBwdDIyNThfc3RlcmVvX3ZvbHVtZV9wdXQ7CisJCWtuZXcudGx2LnAgPSBwdDIyNThfZGJfc2NhbGU7CisKKwkJZXJyID0gc25kX2N0bF9hZGQocHQtPmNhcmQsIHNuZF9jdGxfbmV3MSgma25ldywgcHQpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCW1lbXNldCgma25ldywgMCwgc2l6ZW9mKGtuZXcpKTsKKwlrbmV3Lm5hbWUgPSAiTG9vcGJhY2sgU3dpdGNoIjsKKwlrbmV3LmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVI7CisJa25ldy5pbmZvID0gcHQyMjU4X3N3aXRjaF9pbmZvOworCWtuZXcuZ2V0ID0gcHQyMjU4X3N3aXRjaF9nZXQ7CisJa25ldy5wdXQgPSBwdDIyNThfc3dpdGNoX3B1dDsKKwlrbmV3LmFjY2VzcyA9IDA7CisJZXJyID0gc25kX2N0bF9hZGQocHQtPmNhcmQsIHNuZF9jdGxfbmV3MSgma25ldywgcHQpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNuZF9wdDIyNThfcmVzZXQpOworRVhQT1JUX1NZTUJPTChzbmRfcHQyMjU4X2J1aWxkX2NvbnRyb2xzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9LY29uZmlnIGIvc291bmQvaXNhL0tjb25maWcKaW5kZXggNTczNzFmMS4uNGUzYTk3MiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL0tjb25maWcKKysrIGIvc291bmQvaXNhL0tjb25maWcKQEAgLTM1OCw2ICszNTgsNyBAQAogY29uZmlnIFNORF9TQjE2X0NTUAogCWJvb2wgIlNvdW5kIEJsYXN0ZXIgMTYvQVdFIENTUCBzdXBwb3J0IgogCWRlcGVuZHMgb24gKFNORF9TQjE2IHx8IFNORF9TQkFXRSkgJiYgKEJST0tFTiB8fCAhUFBDKQorCXNlbGVjdCBGV19MT0FERVIKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIENTUCBjb3JlLiAgVGhpcyBzcGVjaWFsCiAJICBjb3Byb2Nlc3NvciBjYW4gZG8gdmFyaWFibGUgdGFza3MgbGlrZSB2YXJpb3VzIGNvbXByZXNzaW9uIGFuZApAQCAtMzkwLDYgKzM5MSw3IEBACiBjb25maWcgU05EX1dBVkVGUk9OVAogCXRyaXN0YXRlICJUdXJ0bGUgQmVhY2ggTWF1aSxUcm9wZXosVHJvcGV6KyAoV2F2ZWZyb250KSIKIAlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU05EX09QTDNfTElCCiAJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAogCXNlbGVjdCBTTkRfQ1M0MjMxX0xJQgpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YV9saWIuYyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmFfbGliLmMKaW5kZXggYjUyNGUwZC4uZWM5MjA5YyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YV9saWIuYworKysgYi9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhX2xpYi5jCkBAIC05MDYsMTEgKzkwNiwxMSBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV80Yml0LCAtNDUwMCwgMzAwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV81Yml0LCAtNDY1MCwgMTUwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV82Yml0LCAtOTQ1MCwgMTUwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV81Yml0XzEyZGJfbWF4LCAtMzQ1MCwgMTUwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9yZWNfZ2FpbiwgMCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV80Yml0LCAtNDUwMCwgMzAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV81Yml0LCAtNDY1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV82Yml0LCAtOTQ1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV81Yml0XzEyZGJfbWF4LCAtMzQ1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9yZWNfZ2FpbiwgMCwgMTUwLCAwKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9hZDE4MTZhX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKIEFEMTgxNkFfRE9VQkxFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgQUQxODE2QV9NQVNURVJfQVRULCAxNSwgNywgMSwgMSksCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvYWQxODQ4L2FkMTg0OF9saWIuYyBiL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4X2xpYi5jCmluZGV4IDY2NmIzYmMuLjgwOTQyODIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4X2xpYi5jCisrKyBiL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4X2xpYi5jCkBAIC0xMjIzLDkgKzEyMjMsOSBAQAogCiBFWFBPUlRfU1lNQk9MKHNuZF9hZDE4NDhfYWRkX2N0bF9lbGVtKTsKIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzZiaXQsIC05NDUwLCAxNTAsIDApOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzViaXRfMTJkYl9tYXgsIC0zNDUwLCAxNTAsIDApOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3JlY19nYWluLCAwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzZiaXQsIC05NDUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzViaXRfMTJkYl9tYXgsIC0zNDUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3JlY19nYWluLCAwLCAxNTAsIDApOwogCiBzdGF0aWMgc3RydWN0IGFkMTg0OF9taXhfZWxlbSBzbmRfYWQxODQ4X2NvbnRyb2xzW10gPSB7CiBBRDE4NDhfRE9VQkxFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMCwgQUQxODQ4X0xFRlRfT1VUUFVULCBBRDE4NDhfUklHSFRfT1VUUFVULCA3LCA3LCAxLCAxKSwKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvZ3VzX21haW4uYyBiL3NvdW5kL2lzYS9ndXMvZ3VzX21haW4uYwppbmRleCBiNjgwZmRkLi44Y2VkNWU4IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c19tYWluLmMKKysrIGIvc291bmQvaXNhL2d1cy9ndXNfbWFpbi5jCkBAIC0yOTQsMTAgKzI5NCwxMCBAQAogCQlndXMtPm1peF9jbnRybF9yZWcgfD0gNDsJLyogZW5hYmxlIE1JQyAqLwogCX0KIAlkbWExID0gZ3VzLT5nZjEuZG1hMTsKLQlkbWExID0gZG1hMSA8IDAgPyAtZG1hMSA6IGRtYTE7CisJZG1hMSA9IGFicyhkbWExKTsKIAlkbWExID0gZG1hc1tkbWExICYgN107CiAJZG1hMiA9IGd1cy0+Z2YxLmRtYTI7Ci0JZG1hMiA9IGRtYTIgPCAwID8gLWRtYTIgOiBkbWEyOworCWRtYTIgPSBhYnMoZG1hMik7CiAJZG1hMiA9IGRtYXNbZG1hMiAmIDddOwogCWRtYTEgfD0gZ3VzLT5lcXVhbF9kbWEgPyAweDQwIDogKGRtYTIgPDwgMyk7CiAKQEAgLTMwNiw3ICszMDYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaXJxID0gZ3VzLT5nZjEuaXJxOwotCWlycSA9IGlycSA8IDAgPyAtaXJxIDogaXJxOworCWlycSA9IGFicyhpcnEpOwogCWlycSA9IGlycXNbaXJxICYgMHgwZl07CiAJaWYgKGlycSA9PSAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIkVycm9yISBJUlEgaXNuJ3QgZGVmaW5lZC5cbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wbDNzYTIuYyBiL3NvdW5kL2lzYS9vcGwzc2EyLmMKaW5kZXggNDE5YjRlYi4uMWUzMDcxMyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL29wbDNzYTIuYworKysgYi9zb3VuZC9pc2Evb3BsM3NhMi5jCkBAIC00ODYsOCArNDg2LDggQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfbWFzdGVyLCAtMzAwMCwgMjAwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV81Yml0XzEyZGJfbWF4LCAtMzQ1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9tYXN0ZXIsIC0zMDAwLCAyMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzViaXRfMTJkYl9tYXgsIC0zNDUwLCAxNTAsIDApOwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX29wbDNzYTJfY29udHJvbHNbXSA9IHsKIE9QTDNTQTJfRE9VQkxFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMCwgMHgwNywgMHgwOCwgNywgNywgMSwgMSksCmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYyBiL3NvdW5kL2lzYS9zYi9zYjE2X2NzcC5jCmluZGV4IGZjZDYzODAuLjNkOWQ3ZTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9zYjE2X2NzcC5jCisrKyBiL3NvdW5kL2lzYS9zYi9zYjE2X2NzcC5jCkBAIC0xNjEsMTAgKzE2MSwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBzbmRfc2JfY3NwX2ZyZWUoc3RydWN0IHNuZF9od2RlcCAqaHdkZXApCiB7CisJaW50IGk7CiAJc3RydWN0IHNuZF9zYl9jc3AgKnAgPSBod2RlcC0+cHJpdmF0ZV9kYXRhOwogCWlmIChwKSB7CiAJCWlmIChwLT5ydW5uaW5nICYgU05EUlZfU0JfQ1NQX1NUX1JVTk5JTkcpCiAJCQlzbmRfc2JfY3NwX3N0b3AocCk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHAtPmNzcF9wcm9ncmFtcyk7ICsraSkKKwkJCXJlbGVhc2VfZmlybXdhcmUocC0+Y3NwX3Byb2dyYW1zW2ldKTsKIAkJa2ZyZWUocCk7CiAJfQogfQpAQCAtNjg3LDggKzY5MCw1MCBAQAogCXJldHVybiBlcnI7CiB9CiAKKyNkZWZpbmUgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAogI2luY2x1ZGUgInNiMTZfY3NwX2NvZGVjcy5oIgogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpcm13YXJlIHNuZF9zYl9jc3Bfc3RhdGljX3Byb2dyYW1zW10gPSB7CisJeyAuZGF0YSA9IG11bGF3X21haW4sIC5zaXplID0gc2l6ZW9mIG11bGF3X21haW4gfSwKKwl7IC5kYXRhID0gYWxhd19tYWluLCAuc2l6ZSA9IHNpemVvZiBhbGF3X21haW4gfSwKKwl7IC5kYXRhID0gaW1hX2FkcGNtX2luaXQsIC5zaXplID0gc2l6ZW9mIGltYV9hZHBjbV9pbml0IH0sCisJeyAuZGF0YSA9IGltYV9hZHBjbV9wbGF5YmFjaywgLnNpemUgPSBzaXplb2YgaW1hX2FkcGNtX3BsYXliYWNrIH0sCisJeyAuZGF0YSA9IGltYV9hZHBjbV9jYXB0dXJlLCAuc2l6ZSA9IHNpemVvZiBpbWFfYWRwY21fY2FwdHVyZSB9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHNuZF9zYl9jc3BfZmlybXdhcmVfbG9hZChzdHJ1Y3Qgc25kX3NiX2NzcCAqcCwgaW50IGluZGV4LCBpbnQgZmxhZ3MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzW10gPSB7CisJCSJzYjE2L211bGF3X21haW4uY3NwIiwKKwkJInNiMTYvYWxhd19tYWluLmNzcCIsCisJCSJzYjE2L2ltYV9hZHBjbV9pbml0LmNzcCIsCisJCSJzYjE2L2ltYV9hZHBjbV9wbGF5YmFjay5jc3AiLAorCQkic2IxNi9pbWFfYWRwY21fY2FwdHVyZS5jc3AiLAorCX07CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpwcm9ncmFtOworCWludCBlcnI7CisKKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShuYW1lcykgIT0gQ1NQX1BST0dSQU1fQ09VTlQpOworCXByb2dyYW0gPSBwLT5jc3BfcHJvZ3JhbXNbaW5kZXhdOworCWlmICghcHJvZ3JhbSkgeworCQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZwcm9ncmFtLCBuYW1lc1tpbmRleF0sCisJCQkJICAgICAgIHAtPmNoaXAtPmNhcmQtPmRldik7CisJCWlmIChlcnIgPj0gMCkKKwkJCXAtPmNzcF9wcm9ncmFtc1tpbmRleF0gPSBwcm9ncmFtOworCQllbHNlIHsKKyNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisJCQlwcm9ncmFtID0gJnNuZF9zYl9jc3Bfc3RhdGljX3Byb2dyYW1zW2luZGV4XTsKKyNlbHNlCisJCQlyZXR1cm4gZXJyOworI2VuZGlmCisJCX0KKwl9CisJcmV0dXJuIHNuZF9zYl9jc3BfbG9hZChwLCBwcm9ncmFtLT5kYXRhLCBwcm9ncmFtLT5zaXplLCBmbGFncyk7Cit9CisKIC8qCiAgKiBhdXRvbG9hZCBoYXJkd2FyZSBjb2RlYyBpZiBuZWNlc3NhcnkKICAqIHJldHVybiAwIGlmIENTUCBpcyBsb2FkZWQgYW5kIHJlYWR5IHRvIHJ1biAocC0+cnVubmluZyAhPSAwKQpAQCAtNzA4LDI3ICs3NTMsMjcgQEAKIAl9IGVsc2UgewogCQlzd2l0Y2ggKHBjbV9zZm10KSB7CiAJCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9NVV9MQVc6Ci0JCQllcnIgPSBzbmRfc2JfY3NwX2xvYWQocCwgJm11bGF3X21haW5bMF0sIHNpemVvZihtdWxhd19tYWluKSwgMCk7CisJCQllcnIgPSBzbmRfc2JfY3NwX2Zpcm13YXJlX2xvYWQocCwgQ1NQX1BST0dSQU1fTVVMQVcsIDApOwogCQkJcC0+YWNjX2Zvcm1hdCA9IFNORFJWX1BDTV9GTVRCSVRfTVVfTEFXOwogCQkJcC0+bW9kZSA9IFNORFJWX1NCX0NTUF9NT0RFX0RTUF9SRUFEIHwgU05EUlZfU0JfQ1NQX01PREVfRFNQX1dSSVRFOwogCQkJYnJlYWs7CiAJCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9BX0xBVzoKLQkJCWVyciA9IHNuZF9zYl9jc3BfbG9hZChwLCAmYWxhd19tYWluWzBdLCBzaXplb2YoYWxhd19tYWluKSwgMCk7CisJCQllcnIgPSBzbmRfc2JfY3NwX2Zpcm13YXJlX2xvYWQocCwgQ1NQX1BST0dSQU1fQUxBVywgMCk7CiAJCQlwLT5hY2NfZm9ybWF0ID0gU05EUlZfUENNX0ZNVEJJVF9BX0xBVzsKIAkJCXAtPm1vZGUgPSBTTkRSVl9TQl9DU1BfTU9ERV9EU1BfUkVBRCB8IFNORFJWX1NCX0NTUF9NT0RFX0RTUF9XUklURTsKIAkJCWJyZWFrOwogCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfSU1BX0FEUENNOgotCQkJZXJyID0gc25kX3NiX2NzcF9sb2FkKHAsICZpbWFfYWRwY21faW5pdFswXSwgc2l6ZW9mKGltYV9hZHBjbV9pbml0KSwKLQkJCQkJICAgICAgU05EUlZfU0JfQ1NQX0xPQURfSU5JVEJMT0NLKTsKKwkJCWVyciA9IHNuZF9zYl9jc3BfZmlybXdhcmVfbG9hZChwLCBDU1BfUFJPR1JBTV9BRFBDTV9JTklULAorCQkJCQkJICAgICAgIFNORFJWX1NCX0NTUF9MT0FEX0lOSVRCTE9DSyk7CiAJCQlpZiAoZXJyKQogCQkJCWJyZWFrOwogCQkJaWYgKHBsYXlfcmVjX21vZGUgPT0gU05EUlZfU0JfQ1NQX01PREVfRFNQX1dSSVRFKSB7Ci0JCQkJZXJyID0gc25kX3NiX2NzcF9sb2FkKHAsICZpbWFfYWRwY21fcGxheWJhY2tbMF0sCi0JCQkJCQkgICAgICBzaXplb2YoaW1hX2FkcGNtX3BsYXliYWNrKSwgMCk7CisJCQkJZXJyID0gc25kX3NiX2NzcF9maXJtd2FyZV9sb2FkCisJCQkJCShwLCBDU1BfUFJPR1JBTV9BRFBDTV9QTEFZQkFDSywgMCk7CiAJCQkJcC0+bW9kZSA9IFNORFJWX1NCX0NTUF9NT0RFX0RTUF9XUklURTsKIAkJCX0gZWxzZSB7Ci0JCQkJZXJyID0gc25kX3NiX2NzcF9sb2FkKHAsICZpbWFfYWRwY21fY2FwdHVyZVswXSwKLQkJCQkJCSAgICAgIHNpemVvZihpbWFfYWRwY21fY2FwdHVyZSksIDApOworCQkJCWVyciA9IHNuZF9zYl9jc3BfZmlybXdhcmVfbG9hZAorCQkJCQkocCwgQ1NQX1BST0dSQU1fQURQQ01fQ0FQVFVSRSwgMCk7CiAJCQkJcC0+bW9kZSA9IFNORFJWX1NCX0NTUF9NT0RFX0RTUF9SRUFEOwogCQkJfQogCQkJcC0+YWNjX2Zvcm1hdCA9IFNORFJWX1BDTV9GTVRCSVRfSU1BX0FEUENNOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnQuYyBiL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250LmMKaW5kZXggODVkYjUzNS4uZTJmZGQ1ZiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnQuYworKysgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jCkBAIC00MDIsNiArNDAyLDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhY2FyZC0+d2F2ZWZyb250LmludGVycnVwdF9zbGVlcGVyKTsKIAlzcGluX2xvY2tfaW5pdCgmYWNhcmQtPndhdmVmcm9udC5taWRpLm9wZW4pOwogCXNwaW5fbG9ja19pbml0KCZhY2FyZC0+d2F2ZWZyb250Lm1pZGkudmlydHVhbCk7CisJYWNhcmQtPndhdmVmcm9udC5jYXJkID0gY2FyZDsKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfd2F2ZWZyb250X2ZyZWU7CiAKIAlyZXR1cm4gY2FyZDsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X2Z4LmMgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9meC5jCmluZGV4IDRmMDg0NmYuLjE1MzMxZWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X2Z4LmMKKysrIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfZnguYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NuZF93YXZlZnJvbnQuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CkBAIC0zMiwzMjUgKzMzLDE3IEBACiAjZGVmaW5lIEZYX01TQl9UUkFOU0ZFUiAweDAyICAgIC8qIHRyYW5zZmVyIGFmdGVyIERTUCBNU0IgYnl0ZSB3cml0dGVuICovCiAjZGVmaW5lIEZYX0FVVE9fSU5DUiAgICAweDA0ICAgIC8qIGF1dG8taW5jcmVtZW50IERTUCBhZGRyZXNzIGFmdGVyIHRyYW5zZmVyICovCiAKLS8qIHdlaXJkIHN0dWZmLCBkZXJpdmVkIGZyb20gcG9ydCBJL08gdHJhY2luZyB3aXRoIGRvc2VtdSAqLworI2RlZmluZSBXQUlUX0lETEUJMHhmZgogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlX3plcm9bXSBfX2RldmluaXRkYXRhID0gewotMHgwMSwgMHg3YywgMHgwMCwgMHgxZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNSwgMHgwMCwKLTB4MTEsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MzIsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MDAsCi0weDAwLCAweDE0LCAweDAyLCAweDc2LCAweDAwLCAweDYwLCAweDAwLCAweDgwLCAweDAyLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDE5LAotMHgwMSwgMHgxYSwgMHgwMSwgMHgyMCwgMHgwMSwgMHg0MCwgMHgwMSwgMHgxNywgMHgwMCwgMHgwMCwgMHgwMSwKLTB4ODAsIDB4MDEsIDB4MjAsIDB4MDAsIDB4MTAsIDB4MDEsIDB4YTAsIDB4MDMsIDB4ZDEsIDB4MDAsIDB4MDAsCi0weDAxLCAweGYyLCAweDAyLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweGY0LCAweDAyLAotMHhlMCwgMHgwMCwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNywKLTB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDQwLCAweDAwLCAweDAwLCAweDAwLCAweDcxLCAweDAyLCAweDAwLCAweDAwLCAweDYwLCAweDAwLCAweDAwLAotMHgwMCwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMywgMHgwMiwKLTB4MDAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsCi0weDAwLCAweDgwLCAweDAwLCAweGY1LCAweDAwLCAweDIwLCAweDAwLCAweDcwLCAweDAwLCAweGEwLCAweDAyLAotMHgxMSwgMHgwMCwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwKLTB4MDIsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTcsIDB4MDAsIDB4MWIsIDB4MDAsCi0weDFkLCAweDAyLCAweGRmCi19OworI2RlZmluZSBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2Vfb25lW10gX19kZXZpbml0ZGF0YSA9IHsKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTksIDB4MDAsCi0weDFmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweGQ4LCAweDAwLCAweDAwLAotMHgwMiwgMHgyMCwgMHgwMCwgMHgxOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMSwKLTB4YzAsIDB4MDEsIDB4ZmEsIDB4MDAsIDB4MWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHg0MCwgMHgwMiwgMHg2MCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4YzAsIDB4MDIsIDB4ODAsIDB4MDAsCi0weDAwLCAweDAyLCAweGZiLCAweDAyLCAweGEwLCAweDAwLCAweDAwLCAweDAwLCAweDFiLCAweDAyLCAweGQ3LAotMHgwMCwgMHgwMCwgMHgwMiwgMHhmNywgMHgwMywgMHgyMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MWMsIDB4MDMsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDMsIDB4M2YsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YzAsCi0weDAwLCAweDAwLCAweDAzLCAweGRmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDVkLCAweDAwLAotMHgwMCwgMHgwMywgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg3ZCwgMHgwMCwgMHgwMCwgMHgwMywgMHhjMCwKLTB4MDAsIDB4MDAsIDB4MDMsIDB4OWUsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDMsCi0weGJlLCAweDAwLCAweDAwLCAweDAzLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwKLTB4ZGIsIDB4MDAsIDB4MDAsIDB4MDIsIDB4ZGIsIDB4MDAsIDB4MDAsIDB4MDIsIDB4ZTAsIDB4MDAsIDB4MDAsCi0weDAyLCAweGZiLCAweDAwLCAweDAwLCAweDAyLCAweGMwLCAweDAyLCAweDQwLCAweDAyLCAweGZiLCAweDAyLAotMHg2MCwgMHgwMCwgMHgxYgorI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKKyNpbmNsdWRlICJ5c3MyMjUuYyIKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgeXNzMjI1X3JlZ2lzdGVyc19maXJtd2FyZSA9IHsKKwkuZGF0YSA9ICh1OCAqKXlzczIyNV9yZWdpc3RlcnMsCisJLnNpemUgPSBzaXplb2YgeXNzMjI1X3JlZ2lzdGVycwogfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZV90d29bXSBfX2RldmluaXRkYXRhID0gewotMHhjNCwgMHgwMCwgMHg0NCwgMHgwNywgMHg0NCwgMHgwMCwgMHg0MCwgMHgyNSwgMHgwMSwgMHgwNiwgMHhjNCwKLTB4MDcsIDB4NDAsIDB4MjUsIDB4MDEsIDB4MDAsIDB4NDYsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ2LCAweDA3LAotMHgwNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwNywgMHgwNSwgMHgwNCwgMHgwNywgMHgwNSwgMHg0NCwgMHg0NiwKLTB4NDQsIDB4NDYsIDB4NDYsIDB4MDcsIDB4MDUsIDB4NDQsIDB4NDYsIDB4MDUsIDB4NDYsIDB4MDUsIDB4NDYsCi0weDA1LCAweDQ2LCAweDA1LCAweDQ0LCAweDQ2LCAweDA1LCAweDA3LCAweDQ0LCAweDQ2LCAweDA1LCAweDA3LAotMHg0NCwgMHg0NiwgMHgwNSwgMHgwNywgMHg0NCwgMHg0NiwgMHgwNSwgMHgwNywgMHg0NCwgMHgwNSwgMHgwNSwKLTB4MDUsIDB4NDQsIDB4MDUsIDB4MDUsIDB4MDUsIDB4NDYsIDB4MDUsIDB4NDYsIDB4MDUsIDB4NDYsIDB4MDUsCi0weDQ2LCAweDA1LCAweDQ2LCAweDA3LCAweDQ2LCAweDA3LCAweDQ0Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlX3RocmVlW10gX19kZXZpbml0ZGF0YSA9IHsKLTB4MDcsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDcsIDB4MDAsIDB4NDAsIDB4MDAsIDB4NDAsIDB4MDYsCi0weDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwKLTB4YzAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4NDAsIDB4MDAsCi0weDYwLCAweDAwLCAweDcwLCAweDAwLCAweDQwLCAweDAwLCAweDQwLCAweDAwLCAweDQyLCAweDAwLCAweDQwLAotMHgwMCwgMHgwMiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDQyLCAweDAwLCAweDQwLCAweDAwLCAweDQyLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLAotMHgwMiwgMHgwMCwgMHg0MiwgMHgwMCwgMHhjMCwgMHgwMCwgMHg0MAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZV9mb3VyW10gX19kZXZpbml0ZGF0YSA9IHsKLTB4NjMsIDB4MDMsIDB4MjYsIDB4MDIsIDB4MmMsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MmUsIDB4MDIsIDB4MDIsCi0weDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLTB4MjAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsCi0weDAwLCAweDIwLCAweDAwLCAweDIwLCAweDAwLCAweDIwLCAweDAwLCAweDIwLCAweDAwLCAweDYwLCAweDAwLAotMHgyMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg2MCwKLTB4MDAsIDB4MjAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDAsCi0weDIwLCAweDAwLCAweDIyLCAweDAyLCAweDIyLCAweDAyLCAweDIwLCAweDAwLCAweDYwLCAweDAwLCAweDIyLAotMHgwMiwgMHg2MiwgMHgwMiwgMHgyMCwgMHgwMSwgMHgyMSwgMHgwMQotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZV9zaXhbXSBfX2RldmluaXRkYXRhID0gewotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwKLTB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MGUsCi0weDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLAotMHgxNiwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgxYSwgMHgwMCwgMHgwMCwgMHgxYywgMHgwMCwKLTB4MDAsIDB4MWUsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MjQsCi0weDAwLCAweDAwLCAweDI2LCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDAwLCAweDJhLCAweDAwLCAweDAwLAotMHgyYywgMHgwMCwgMHgwMCwgMHgyZSwgMHgwMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgzMiwgMHgwMCwKLTB4MDAsIDB4MzQsIDB4MDAsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MDAsIDB4M2EsCi0weDAwLCAweDAwLCAweDNjLCAweDAwLCAweDAwLCAweDNlLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLAotMHg0MiwgMHgwMywgMHgwMCwgMHg0NCwgMHgwMSwgMHgwMCwgMHg0NiwgMHgwYSwgMHgyMSwgMHg0OCwgMHgwZCwKLTB4MjMsIDB4NGEsIDB4MjMsIDB4MWIsIDB4NGMsIDB4MzcsIDB4OGYsIDB4NGUsIDB4NDUsIDB4NzcsIDB4NTAsCi0weDUyLCAweGUyLCAweDUyLCAweDFjLCAweDkyLCAweDU0LCAweDFjLCAweDUyLCAweDU2LCAweDA3LCAweDAwLAotMHg1OCwgMHgyZiwgMHhjNiwgMHg1YSwgMHgwYiwgMHgwMCwgMHg1YywgMHgzMCwgMHgwNiwgMHg1ZSwgMHgxNywKLTB4MDAsIDB4NjAsIDB4M2QsIDB4ZGEsIDB4NjIsIDB4MjksIDB4MDAsIDB4NjQsIDB4M2UsIDB4NDEsIDB4NjYsCi0weDM5LCAweDAwLCAweDY4LCAweDRjLCAweDQ4LCAweDZhLCAweDQ5LCAweDAwLCAweDZjLCAweDRjLCAweDZjLAotMHg2ZSwgMHgxMSwgMHhkMiwgMHg3MCwgMHgxNiwgMHgwYywgMHg3MiwgMHgwMCwgMHgwMCwgMHg3NCwgMHgwMCwKLTB4ODAsIDB4NzYsIDB4MGYsIDB4MDAsIDB4NzgsIDB4MDAsIDB4ODAsIDB4N2EsIDB4MTMsIDB4MDAsIDB4N2MsCi0weDgwLCAweDAwLCAweDdlLCAweDgwLCAweDgwCi19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlX3NldmVuW10gX19kZXZpbml0ZGF0YSA9IHsKLTB4MGYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDBmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLAotMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwKLTB4ZmYsIDB4MGYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweGZmLCAweDBmLCAweGZmLAotMHgwZiwgMHhmZiwgMHgwZiwgMHhmZiwgMHgwMiwgMHhlOSwgMHgwNiwgMHg4YywgMHgwNiwgMHg4YywgMHgwZiwKLTB4ZmYsIDB4MWEsIDB4NzUsIDB4MGQsIDB4OGIsIDB4MDQsIDB4ZTksIDB4MGIsIDB4MTYsIDB4MWEsIDB4MzgsCi0weDBkLCAweGM4LCAweDA0LCAweDZmLCAweDBiLCAweDkxLCAweDBmLCAweGZmLCAweDA2LCAweDQwLCAweDA2LAotMHg0MCwgMHgwMiwgMHg4ZiwgMHgwZiwgMHhmZiwgMHgwNiwgMHg2MiwgMHgwNiwgMHg2MiwgMHgwMiwgMHg3YiwKLTB4MGYsIDB4ZmYsIDB4MDYsIDB4OTcsIDB4MDYsIDB4OTcsIDB4MDIsIDB4NTIsIDB4MGYsIDB4ZmYsIDB4MDYsCi0weGY2LCAweDA2LCAweGY2LCAweDAyLCAweDE5LCAweDA1LCAweDU1LCAweDA1LCAweDU1LCAweDA1LCAweDU1LAotMHgwNSwgMHg1NSwgMHgwNSwgMHg1NSwgMHgwNSwgMHg1NSwgMHgwNSwgMHg1NSwgMHgwNSwgMHg1NSwgMHgxNCwKLTB4ZGEsIDB4MGQsIDB4OTMsIDB4MDQsIDB4ZGEsIDB4MDUsIDB4OTMsIDB4MTQsIDB4ZGEsIDB4MGQsIDB4OTMsCi0weDA0LCAweGRhLCAweDA1LCAweDkzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMiwgMHgwMAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZV96ZXJvX3YyW10gX19kZXZpbml0ZGF0YSA9IHsKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZV9vbmVfdjJbXSBfX2RldmluaXRkYXRhID0gewotMHgwMSwgMHhjMCwgMHgwMSwgMHhmYSwgMHgwMCwgMHgxYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlX3R3b192MltdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDQ2LCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2VfdGhyZWVfdjJbXSBfX2RldmluaXRkYXRhID0gewotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlX2ZvdXJfdjJbXSBfX2RldmluaXRkYXRhID0gewotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2Vfc2V2ZW5fdjJbXSBfX2RldmluaXRkYXRhID0gewotMHgwZiwgMHhmZiwgMHgwZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBtb2RfdjJbXSBfX2RldmluaXRkYXRhID0gewotMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMiwKLTB4MDAsIDB4MDEsIDB4MDMsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDUsCi0weDAyLCAweDAwLCAweDAxLCAweDA2LCAweDAyLCAweDAwLCAweDAxLCAweDA3LCAweDAyLCAweDAwLCAweGIwLAotMHgyMCwgMHhiMSwgMHgyMCwgMHhiMiwgMHgyMCwgMHhiMywgMHgyMCwgMHhiNCwgMHgyMCwgMHhiNSwgMHgyMCwKLTB4YjYsIDB4MjAsIDB4YjcsIDB4MjAsIDB4ZjAsIDB4MjAsIDB4ZjEsIDB4MjAsIDB4ZjIsIDB4MjAsIDB4ZjMsCi0weDIwLCAweGY0LCAweDIwLCAweGY1LCAweDIwLCAweGY2LCAweDIwLCAweGY3LCAweDIwLCAweDEwLCAweGZmLAotMHgxMSwgMHhmZiwgMHgxMiwgMHhmZiwgMHgxMywgMHhmZiwgMHgxNCwgMHhmZiwgMHgxNSwgMHhmZiwgMHgxNiwKLTB4ZmYsIDB4MTcsIDB4ZmYsIDB4MjAsIDB4ZmYsIDB4MjEsIDB4ZmYsIDB4MjIsIDB4ZmYsIDB4MjMsIDB4ZmYsCi0weDI0LCAweGZmLCAweDI1LCAweGZmLCAweDI2LCAweGZmLCAweDI3LCAweGZmLCAweDMwLCAweDAwLCAweDMxLAotMHgwMCwgMHgzMiwgMHgwMCwgMHgzMywgMHgwMCwgMHgzNCwgMHgwMCwgMHgzNSwgMHgwMCwgMHgzNiwgMHgwMCwKLTB4MzcsIDB4MDAsIDB4NDAsIDB4MDAsIDB4NDEsIDB4MDAsIDB4NDIsIDB4MDAsIDB4NDMsIDB4MDAsIDB4NDQsCi0weDAwLCAweDQ1LCAweDAwLCAweDQ2LCAweDAwLCAweDQ3LCAweDAwLCAweDUwLCAweDAwLCAweDUxLCAweDAwLAotMHg1MiwgMHgwMCwgMHg1MywgMHgwMCwgMHg1NCwgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NiwgMHgwMCwgMHg1NywKLTB4MDAsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MDAsIDB4NjIsIDB4MDAsIDB4NjMsIDB4MDAsIDB4NjQsIDB4MDAsCi0weDY1LCAweDAwLCAweDY2LCAweDAwLCAweDY3LCAweDAwLCAweDcwLCAweGMwLCAweDcxLCAweGMwLCAweDcyLAotMHhjMCwgMHg3MywgMHhjMCwgMHg3NCwgMHhjMCwgMHg3NSwgMHhjMCwgMHg3NiwgMHhjMCwgMHg3NywgMHhjMCwKLTB4ODAsIDB4MDAsIDB4ODEsIDB4MDAsIDB4ODIsIDB4MDAsIDB4ODMsIDB4MDAsIDB4ODQsIDB4MDAsIDB4ODUsCi0weDAwLCAweDg2LCAweDAwLCAweDg3LCAweDAwLCAweDkwLCAweDAwLCAweDkxLCAweDAwLCAweDkyLCAweDAwLAotMHg5MywgMHgwMCwgMHg5NCwgMHgwMCwgMHg5NSwgMHgwMCwgMHg5NiwgMHgwMCwgMHg5NywgMHgwMCwgMHhhMCwKLTB4MDAsIDB4YTEsIDB4MDAsIDB4YTIsIDB4MDAsIDB4YTMsIDB4MDAsIDB4YTQsIDB4MDAsIDB4YTUsIDB4MDAsCi0weGE2LCAweDAwLCAweGE3LCAweDAwLCAweGMwLCAweDAwLCAweGMxLCAweDAwLCAweGMyLCAweDAwLCAweGMzLAotMHgwMCwgMHhjNCwgMHgwMCwgMHhjNSwgMHgwMCwgMHhjNiwgMHgwMCwgMHhjNywgMHgwMCwgMHhkMCwgMHgwMCwKLTB4ZDEsIDB4MDAsIDB4ZDIsIDB4MDAsIDB4ZDMsIDB4MDAsIDB4ZDQsIDB4MDAsIDB4ZDUsIDB4MDAsIDB4ZDYsCi0weDAwLCAweGQ3LCAweDAwLCAweGUwLCAweDAwLCAweGUxLCAweDAwLCAweGUyLCAweDAwLCAweGUzLCAweDAwLAotMHhlNCwgMHgwMCwgMHhlNSwgMHgwMCwgMHhlNiwgMHgwMCwgMHhlNywgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwKLTB4MDEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDMsCi0weDAyLCAweDAxLCAweDAxLCAweDA0LCAweDAyLCAweDAxLCAweDAxLCAweDA1LCAweDAyLCAweDAxLCAweDAxLAotMHgwNiwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwNywgMHgwMiwgMHgwMQotfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNvZWZmaWNpZW50c1tdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDA3LCAweDQ2LCAweDAwLCAweDAwLCAweDA3LCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDRiLCAweDAzLAotMHgxMSwgMHgwMCwgMHg0ZCwgMHgwMSwgMHgzMiwgMHgwNywgMHg0NiwgMHgwMCwgMHgwMCwgMHgwNywgMHg0OSwKLTB4MDAsIDB4MDAsIDB4MDcsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDEsCi0weDQwLCAweDAyLCAweDQwLCAweDAxLCAweDQxLCAweDAyLCAweDYwLCAweDA3LCAweDQwLCAweDAwLCAweDAwLAotMHgwNywgMHg0MSwgMHgwMCwgMHgwMCwgMHgwNywgMHg0NywgMHgwMCwgMHgwMCwgMHgwNywgMHg0YSwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4NDcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NGEsIDB4MDEsIDB4MjAsIDB4MDcsIDB4NDcsCi0weDAwLCAweDAwLCAweDA3LCAweDRhLCAweDAwLCAweDAwLCAweDA3LCAweDdjLCAweDAwLCAweDAwLCAweDA3LAotMHg3ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgxYywgMHgwNywgMHg3YywgMHgwMCwgMHgwMCwKLTB4MDcsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4MDEsCi0weDAwLCAweDA3LCAweDQ0LCAweDAwLCAweDAwLCAweDA3LCAweDQyLCAweDAwLCAweDAwLCAweDA3LCAweDQzLAotMHgwMCwgMHgwMCwgMHgwMCwgMHg0MiwgMHgwMSwgMHgxYSwgMHgwMCwgMHg0MywgMHgwMSwgMHgyMCwgMHgwNywKLTB4NDIsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDAsIDB4MDAsIDB4MDAsCi0weDA3LCAweDQxLCAweDAwLCAweDAwLCAweDAxLCAweDQwLCAweDAyLCAweDQwLCAweDAxLCAweDQxLCAweDAyLAotMHg2MCwgMHgwNywgMHg0MCwgMHgwMCwgMHgwMCwgMHgwNywgMHg0MSwgMHgwMCwgMHgwMCwgMHgwNywgMHg0NCwKLTB4MGYsIDB4ZmYsIDB4MDcsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDcsCi0weDQwLCAweDAwLCAweDAwLCAweDA3LCAweDQxLCAweDAwLCAweDAwLCAweDA3LCAweDUxLCAweDA2LCAweDQwLAotMHgwNywgMHg1MCwgMHgwNiwgMHg0MCwgMHgwNywgMHg0ZiwgMHgwMywgMHg4MSwgMHgwNywgMHg1MywgMHgxYSwKLTB4NzYsIDB4MDcsIDB4NTQsIDB4MGQsIDB4OGIsIDB4MDcsIDB4NTUsIDB4MDQsIDB4ZTksIDB4MDcsIDB4NTYsCi0weDBiLCAweDE3LCAweDA3LCAweDU3LCAweDFhLCAweDM4LCAweDA3LCAweDU4LCAweDBkLCAweGM5LCAweDA3LAotMHg1OSwgMHgwNCwgMHg2ZiwgMHgwNywgMHg1YSwgMHgwYiwgMHg5MSwgMHgwNywgMHg3MywgMHgxNCwgMHhkYSwKLTB4MDcsIDB4NzQsIDB4MGQsIDB4OTMsIDB4MDcsIDB4NzUsIDB4MDQsIDB4ZDksIDB4MDcsIDB4NzYsIDB4MDUsCi0weDkzLCAweDA3LCAweDc3LCAweDE0LCAweGRhLCAweDA3LCAweDc4LCAweDBkLCAweDkzLCAweDA3LCAweDc5LAotMHgwNCwgMHhkOSwgMHgwNywgMHg3YSwgMHgwNSwgMHg5MywgMHgwNywgMHg1ZSwgMHgwMywgMHg2OCwgMHgwNywKLTB4NWMsIDB4MDQsIDB4MzEsIDB4MDcsIDB4NWQsIDB4MDQsIDB4MzEsIDB4MDcsIDB4NjIsIDB4MDMsIDB4NTIsCi0weDA3LCAweDYwLCAweDA0LCAweDc2LCAweDA3LCAweDYxLCAweDA0LCAweDc2LCAweDA3LCAweDY2LCAweDAzLAotMHgyZSwgMHgwNywgMHg2NCwgMHgwNCwgMHhkYSwgMHgwNywgMHg2NSwgMHgwNCwgMHhkYSwgMHgwNywgMHg2YSwKLTB4MDIsIDB4ZjYsIDB4MDcsIDB4NjgsIDB4MDUsIDB4NjIsIDB4MDcsIDB4NjksIDB4MDUsIDB4NjIsIDB4MDYsCi0weDQ2LCAweDBhLCAweDIyLCAweDA2LCAweDQ4LCAweDBkLCAweDI0LCAweDA2LCAweDZlLCAweDExLCAweGQzLAotMHgwNiwgMHg3MCwgMHgxNSwgMHhjYiwgMHgwNiwgMHg1MiwgMHgyMCwgMHg5MywgMHgwNiwgMHg1NCwgMHgyMCwKLTB4NTQsIDB4MDYsIDB4NGEsIDB4MjcsIDB4MWQsIDB4MDYsIDB4NTgsIDB4MmYsIDB4YzgsIDB4MDYsIDB4NWMsCi0weDMwLCAweDA3LCAweDA2LCAweDRjLCAweDM3LCAweDkwLCAweDA2LCAweDYwLCAweDNkLCAweGRiLCAweDA2LAotMHg2NCwgMHgzZSwgMHg0MiwgMHgwNiwgMHg0ZSwgMHg0NSwgMHg3OCwgMHgwNiwgMHg2OCwgMHg0YywgMHg0OCwKLTB4MDYsIDB4NmMsIDB4NGMsIDB4NmMsIDB4MDYsIDB4NTAsIDB4NTIsIDB4ZTIsIDB4MDYsIDB4NDIsIDB4MDIsCi0weGJhCi19Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgY29lZmZpY2llbnRzMltdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDA3LCAweDQ2LCAweDAwLCAweDAwLCAweDA3LCAweDQ5LCAweDAwLCAweDAwLCAweDA3LCAweDQ1LCAweDBmLAotMHhmZiwgMHgwNywgMHg0OCwgMHgwZiwgMHhmZiwgMHgwNywgMHg3YiwgMHgwNCwgMHhjYywgMHgwNywgMHg3ZCwKLTB4MDQsIDB4Y2MsIDB4MDcsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDcsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDcsCi0weDQ2LCAweDAwLCAweDAwLCAweDA3LCAweDQ5LCAweDAwLCAweDAwLCAweDA3LCAweDQ3LCAweDAwLCAweDAwLAotMHgwNywgMHg0YSwgMHgwMCwgMHgwMCwgMHgwNywgMHg0YywgMHgwMCwgMHgwMCwgMHgwNywgMHg0ZSwgMHgwMCwgMHgwMAotfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNvZWZmaWNpZW50czNbXSBfX2RldmluaXRkYXRhID0gewotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHgyOCwgMHgwMCwgMHg1MSwgMHgwMCwKLTB4NTEsIDB4MDAsIDB4N2EsIDB4MDAsIDB4N2EsIDB4MDAsIDB4YTMsIDB4MDAsIDB4YTMsIDB4MDAsIDB4Y2MsCi0weDAwLCAweGNjLCAweDAwLCAweGY1LCAweDAwLCAweGY1LCAweDAxLCAweDFlLCAweDAxLCAweDFlLCAweDAxLAotMHg0NywgMHgwMSwgMHg0NywgMHgwMSwgMHg3MCwgMHgwMSwgMHg3MCwgMHgwMSwgMHg5OSwgMHgwMSwgMHg5OSwKLTB4MDEsIDB4YzIsIDB4MDEsIDB4YzIsIDB4MDEsIDB4ZWIsIDB4MDEsIDB4ZWIsIDB4MDIsIDB4MTQsIDB4MDIsCi0weDE0LCAweDAyLCAweDNkLCAweDAyLCAweDNkLCAweDAyLCAweDY2LCAweDAyLCAweDY2LCAweDAyLCAweDhmLAotMHgwMiwgMHg4ZiwgMHgwMiwgMHhiOCwgMHgwMiwgMHhiOCwgMHgwMiwgMHhlMSwgMHgwMiwgMHhlMSwgMHgwMywKLTB4MGEsIDB4MDMsIDB4MGEsIDB4MDMsIDB4MzMsIDB4MDMsIDB4MzMsIDB4MDMsIDB4NWMsIDB4MDMsIDB4NWMsCi0weDAzLCAweDg1LCAweDAzLCAweDg1LCAweDAzLCAweGFlLCAweDAzLCAweGFlLCAweDAzLCAweGQ3LCAweDAzLAotMHhkNywgMHgwNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwNCwgMHgyOCwgMHgwNCwgMHgyOCwgMHgwNCwgMHg1MSwKLTB4MDQsIDB4NTEsIDB4MDQsIDB4N2EsIDB4MDQsIDB4N2EsIDB4MDQsIDB4YTMsIDB4MDQsIDB4YTMsIDB4MDQsCi0weGNjLCAweDA0LCAweGNjLCAweDA0LCAweGY1LCAweDA0LCAweGY1LCAweDA1LCAweDFlLCAweDA1LCAweDFlLAotMHgwNSwgMHg0NywgMHgwNSwgMHg0NywgMHgwNSwgMHg3MCwgMHgwNSwgMHg3MCwgMHgwNSwgMHg5OSwgMHgwNSwKLTB4OTksIDB4MDUsIDB4YzIsIDB4MDUsIDB4YzIsIDB4MDUsIDB4ZWIsIDB4MDUsIDB4ZWIsIDB4MDYsIDB4MTQsCi0weDA2LCAweDE0LCAweDA2LCAweDNkLCAweDA2LCAweDNkLCAweDA2LCAweDY2LCAweDA2LCAweDY2LCAweDA2LAotMHg4ZiwgMHgwNiwgMHg4ZiwgMHgwNiwgMHhiOCwgMHgwNiwgMHhiOCwgMHgwNiwgMHhlMSwgMHgwNiwgMHhlMSwKLTB4MDcsIDB4MGEsIDB4MDcsIDB4MGEsIDB4MDcsIDB4MzMsIDB4MDcsIDB4MzMsIDB4MDcsIDB4NWMsIDB4MDcsCi0weDVjLCAweDA3LCAweDg1LCAweDA3LCAweDg1LCAweDA3LCAweGFlLCAweDA3LCAweGFlLCAweDA3LCAweGQ3LAotMHgwNywgMHhkNywgMHgwOCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwOCwgMHgyOCwgMHgwOCwgMHgyOCwgMHgwOCwKLTB4NTEsIDB4MDgsIDB4NTEsIDB4MDgsIDB4N2EsIDB4MDgsIDB4N2EsIDB4MDgsIDB4YTMsIDB4MDgsIDB4YTMsCi0weDA4LCAweGNjLCAweDA4LCAweGNjLCAweDA4LCAweGY1LCAweDA4LCAweGY1LCAweDA5LCAweDFlLCAweDA5LAotMHgxZSwgMHgwOSwgMHg0NywgMHgwOSwgMHg0NywgMHgwOSwgMHg3MCwgMHgwOSwgMHg3MCwgMHgwOSwgMHg5OSwKLTB4MDksIDB4OTksIDB4MDksIDB4YzIsIDB4MDksIDB4YzIsIDB4MDksIDB4ZWIsIDB4MDksIDB4ZWIsIDB4MGEsCi0weDE0LCAweDBhLCAweDE0LCAweDBhLCAweDNkLCAweDBhLCAweDNkLCAweDBhLCAweDY2LCAweDBhLCAweDY2LAotMHgwYSwgMHg4ZiwgMHgwYSwgMHg4ZiwgMHgwYSwgMHhiOCwgMHgwYSwgMHhiOCwgMHgwYSwgMHhlMSwgMHgwYSwKLTB4ZTEsIDB4MGIsIDB4MGEsIDB4MGIsIDB4MGEsIDB4MGIsIDB4MzMsIDB4MGIsIDB4MzMsIDB4MGIsIDB4NWMsCi0weDBiLCAweDVjLCAweDBiLCAweDg1LCAweDBiLCAweDg1LCAweDBiLCAweGFlLCAweDBiLCAweGFlLCAweDBiLAotMHhkNywgMHgwYiwgMHhkNywgMHgwYywgMHgwMCwgMHgwYywgMHgwMCwgMHgwYywgMHgyOCwgMHgwYywgMHgyOCwKLTB4MGMsIDB4NTEsIDB4MGMsIDB4NTEsIDB4MGMsIDB4N2EsIDB4MGMsIDB4N2EsIDB4MGMsIDB4YTMsIDB4MGMsCi0weGEzLCAweDBjLCAweGNjLCAweDBjLCAweGNjLCAweDBjLCAweGY1LCAweDBjLCAweGY1LCAweDBkLCAweDFlLAotMHgwZCwgMHgxZSwgMHgwZCwgMHg0NywgMHgwZCwgMHg0NywgMHgwZCwgMHg3MCwgMHgwZCwgMHg3MCwgMHgwZCwKLTB4OTksIDB4MGQsIDB4OTksIDB4MGQsIDB4YzIsIDB4MGQsIDB4YzIsIDB4MGQsIDB4ZWIsIDB4MGQsIDB4ZWIsCi0weDBlLCAweDE0LCAweDBlLCAweDE0LCAweDBlLCAweDNkLCAweDBlLCAweDNkLCAweDBlLCAweDY2LCAweDBlLAotMHg2NiwgMHgwZSwgMHg4ZiwgMHgwZSwgMHg4ZiwgMHgwZSwgMHhiOCwgMHgwZSwgMHhiOCwgMHgwZSwgMHhlMSwKLTB4MGUsIDB4ZTEsIDB4MGYsIDB4MGEsIDB4MGYsIDB4MGEsIDB4MGYsIDB4MzMsIDB4MGYsIDB4MzMsIDB4MGYsCi0weDVjLCAweDBmLCAweDVjLCAweDBmLCAweDg1LCAweDBmLCAweDg1LCAweDBmLCAweGFlLCAweDBmLCAweGFlLAotMHgwZiwgMHhkNywgMHgwZiwgMHhkNywgMHgwZiwgMHhmZiwgMHgwZiwgMHhmZgotfTsKKyNlbmRpZgogCiBzdGF0aWMgaW50CiB3YXZlZnJvbnRfZnhfaWRsZSAoc25kX3dhdmVmcm9udF90ICpkZXYpCkBAIC01NTUsNDY1ICsyNDgsNTYgQEAKICAgIG9mIHRoZSBwb3J0IEkvTyBkb25lLCB1c2luZyB0aGUgWWFtYWhhIGZheGJhY2sgZG9jdW1lbnQgYXMgYSBndWlkZQogICAgdG8gYWRkIG1vcmUgbG9naWMgdG8gdGhlIGNvZGUuIEl0cyByZWFsbHkgcHJldHR5IHdlaXJkLgogCi0gICBUaGVyZSB3YXMgYW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggb2YganVzdCBkdW1waW5nIHRoZSB3aG9sZSBJL08KKyAgIFRoaXMgaXMgdGhlIGFwcHJvYWNoIG9mIGp1c3QgZHVtcGluZyB0aGUgd2hvbGUgSS9PCiAgICBzZXF1ZW5jZSBhcyBhIHNlcmllcyBvZiBwb3J0L3ZhbHVlIHBhaXJzIGFuZCBhIHNpbXBsZSBsb29wCi0gICB0aGF0IG91dHB1dCBpdC4gSG93ZXZlciwgSSBob3BlIHRoYXQgZXZlbnR1YWxseSBJJ2xsIGdldCBtb3JlCi0gICBjb250cm9sIG92ZXIgd2hhdCB0aGlzIGNvZGUgZG9lcywgYW5kIHNvIEkgdHJpZWQgdG8gc3RpY2sgd2l0aAotICAgYSBzb21ld2hhdCAiYWxnb3JpdGhtaWMiIGFwcHJvYWNoLgorICAgdGhhdCBvdXRwdXRzIGl0LgogKi8KIAotCiBpbnQgX19kZXZpbml0CiBzbmRfd2F2ZWZyb250X2Z4X3N0YXJ0IChzbmRfd2F2ZWZyb250X3QgKmRldikKLQogewotCXVuc2lnbmVkIGludCBpLCBqOworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKIAotCS8qIFNldCBhbGwgYml0cyBmb3IgYWxsIGNoYW5uZWxzIG9uIHRoZSBNT0QgdW5pdCB0byB6ZXJvICovCi0JLyogWFhYIEJ1dCB3aHkgZG8gdGhpcyB0d2ljZSA/ICovCisJaWYgKGRldi0+ZnhfaW5pdGlhbGl6ZWQpCisJCXJldHVybiAwOwogCi0JZm9yIChqID0gMDsgaiA8IDI7IGorKykgewotCQlmb3IgKGkgPSAweDEwOyBpIDw9IDB4ZmY7IGkrKykgewotCSAgICAKLQkJCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHsKLQkJCQlyZXR1cm4gKC0xKTsKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZmaXJtd2FyZSwgInlhbWFoYS95c3MyMjVfcmVnaXN0ZXJzLmJpbiIsCisJCQkgICAgICAgZGV2LT5jYXJkLT5kZXYpOworCWlmIChlcnIgPCAwKSB7CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCQlmaXJtd2FyZSA9ICZ5c3MyMjVfcmVnaXN0ZXJzX2Zpcm13YXJlOworI2Vsc2UKKwkJZXJyID0gLTE7CisJCWdvdG8gb3V0OworI2VuZGlmCisJfQorCisJZm9yIChpID0gMDsgaSArIDEgPCBmaXJtd2FyZS0+c2l6ZTsgaSArPSAyKSB7CisJCWlmIChmaXJtd2FyZS0+ZGF0YVtpXSA+PSA4ICYmIGZpcm13YXJlLT5kYXRhW2ldIDwgMTYpIHsKKwkJCW91dGIoZmlybXdhcmUtPmRhdGFbaSArIDFdLAorCQkJICAgICBkZXYtPmJhc2UgKyBmaXJtd2FyZS0+ZGF0YVtpXSk7CisJCX0gZWxzZSBpZiAoZmlybXdhcmUtPmRhdGFbaV0gPT0gV0FJVF9JRExFKSB7CisJCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlKGRldikpIHsKKwkJCQllcnIgPSAtMTsKKwkJCQlnb3RvIG91dDsKIAkJCX0KLQkgICAgCi0JCQlvdXRiIChpLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQkJCW91dGIgKDB4MCwgZGV2LT5meF9tb2RfZGF0YSk7CisJCX0gZWxzZSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJpbnZhbGlkIGFkZHJlc3MiCisJCQkJICAgIiBpbiByZWdpc3RlciBkYXRhXG4iKTsKKwkJCWVyciA9IC0xOworCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDAyLCBkZXYtPmZ4X29wKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXRlIG9uICovCisJZGV2LT5meF9pbml0aWFsaXplZCA9IDE7CisJZXJyID0gMDsKIAotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCW91dGIgKDB4MDcsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4NDQsIGRldi0+ZnhfZHNwX2FkZHIpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX21zYik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbHNiKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDQyLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9tc2IpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2xzYik7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHgwNywgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHg0MywgZGV2LT5meF9kc3BfYWRkcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbXNiKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9sc2IpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCW91dGIgKDB4MDcsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4N2MsIGRldi0+ZnhfZHNwX2FkZHIpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX21zYik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbHNiKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDdlLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9tc2IpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2xzYik7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHgwNywgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHg0NiwgZGV2LT5meF9kc3BfYWRkcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbXNiKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9sc2IpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCW91dGIgKDB4MDcsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4NDksIGRldi0+ZnhfZHNwX2FkZHIpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX21zYik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbHNiKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDQ3LCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9tc2IpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2xzYik7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHgwNywgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHg0YSwgZGV2LT5meF9kc3BfYWRkcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbXNiKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9sc2IpOwotCi0JLyogZWl0aGVyIGJlY2F1c2Ugb2Ygc3R1cGlkaXR5IGJ5IFRCJ3MgcHJvZ3JhbW1lcnMsIG9yIGJlY2F1c2UgaXQKLQkgICBhY3R1YWxseSBkb2VzIHNvbWV0aGluZywgcmV6ZXJvIHRoZSBNT0QgcGFnZS4KLQkqLwotCWZvciAoaSA9IDB4MTA7IGkgPD0gMHhmZjsgaSsrKSB7Ci0JCi0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JCi0JCW91dGIgKGksIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiICgweDAsIGRldi0+ZnhfbW9kX2RhdGEpOwotCX0KLQkvKiBsb2FkIHBhZ2UgemVybyAqLwotCi0Jb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LT5meF9sY3IpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2FkZHIpOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV96ZXJvKTsgaSArPSAyKSB7Ci0JCW91dGIgKHBhZ2VfemVyb1tpXSwgZGV2LT5meF9kc3BfbXNiKTsKLQkJb3V0YiAocGFnZV96ZXJvW2krMV0sIGRldi0+ZnhfZHNwX2xzYik7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLQotCS8qIE5vdyBsb2FkIHBhZ2Ugb25lICovCi0KLQlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYtPmZ4X2xjcik7Ci0Jb3V0YiAoMHgwMSwgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfYWRkcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwYWdlX29uZSk7IGkgKz0gMikgewotCQlvdXRiIChwYWdlX29uZVtpXSwgZGV2LT5meF9kc3BfbXNiKTsKLQkJb3V0YiAocGFnZV9vbmVbaSsxXSwgZGV2LT5meF9kc3BfbHNiKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotICAgIAotCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi0+ZnhfbGNyKTsKLQlvdXRiICgweDAyLCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfdHdvKTsgaSsrKSB7Ci0JCW91dGIgKHBhZ2VfdHdvW2ldLCBkZXYtPmZ4X2RzcF9sc2IpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0gICAgCi0Jb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LT5meF9sY3IpOwotCW91dGIgKDB4MDMsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2FkZHIpOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV90aHJlZSk7IGkrKykgewotCQlvdXRiIChwYWdlX3RocmVlW2ldLCBkZXYtPmZ4X2RzcF9sc2IpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0gICAgCi0Jb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LT5meF9sY3IpOwotCW91dGIgKDB4MDQsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2FkZHIpOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV9mb3VyKTsgaSsrKSB7Ci0JCW91dGIgKHBhZ2VfZm91cltpXSwgZGV2LT5meF9kc3BfbHNiKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0JLyogTG9hZCBtZW1vcnkgYXJlYSAocGFnZSBzaXgpICovCi0gICAgCi0Jb3V0YiAoRlhfTFNCX1RSQU5TRkVSLCBkZXYtPmZ4X2xjcik7IAotCW91dGIgKDB4MDYsIGRldi0+ZnhfZHNwX3BhZ2UpOyAKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2Vfc2l4KTsgaSArPSAzKSB7Ci0JCW91dGIgKHBhZ2Vfc2l4W2ldLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQkJb3V0YiAocGFnZV9zaXhbaSsxXSwgZGV2LT5meF9kc3BfbXNiKTsKLQkJb3V0YiAocGFnZV9zaXhbaSsyXSwgZGV2LT5meF9kc3BfbHNiKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotICAgIAotCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi0+ZnhfbGNyKTsKLQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2Vfc2V2ZW4pOyBpICs9IDIpIHsKLQkJb3V0YiAocGFnZV9zZXZlbltpXSwgZGV2LT5meF9kc3BfbXNiKTsKLQkJb3V0YiAocGFnZV9zZXZlbltpKzFdLCBkZXYtPmZ4X2RzcF9sc2IpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQkvKiBOb3cgc2V0dXAgdGhlIE1PRCBhcmVhLiBXZSBkbyB0aGlzIGFsZ29yaXRobWljYWxseSBpbiBvcmRlciB0bwotCSAgIHNhdmUgYSBsaXR0bGUgZGF0YSBzcGFjZS4gSXQgY291bGQgYmUgZG9uZSBpbiB0aGUgc2FtZSBmYXNoaW9uCi0JICAgYXMgdGhlICJwYWdlcyIuCi0JKi8KLQotCWZvciAoaSA9IDB4MDA7IGkgPD0gMHgwZjsgaSsrKSB7Ci0JCW91dGIgKDB4MDEsIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiIChpLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JCW91dGIgKDB4MDIsIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiICgweDAwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0JZm9yIChpID0gMHhiMDsgaSA8PSAweGJmOyBpKyspIHsKLQkJb3V0YiAoaSwgZGV2LT5meF9tb2RfYWRkcik7Ci0JCW91dGIgKDB4MjAsIGRldi0+ZnhfbW9kX2RhdGEpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQlmb3IgKGkgPSAweGYwOyBpIDw9IDB4ZmY7IGkrKykgewotCQlvdXRiIChpLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQkJb3V0YiAoMHgyMCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLQotCWZvciAoaSA9IDB4MTA7IGkgPD0gMHgxZDsgaSsrKSB7Ci0JCW91dGIgKGksIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiICgweGZmLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0Jb3V0YiAoMHgxZSwgZGV2LT5meF9tb2RfYWRkcik7Ci0Jb3V0YiAoMHg0MCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0KLQlmb3IgKGkgPSAweDFmOyBpIDw9IDB4MmQ7IGkrKykgewotCQlvdXRiIChpLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQkJb3V0YiAoMHhmZiwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLQotCW91dGIgKDB4MmUsIGRldi0+ZnhfbW9kX2FkZHIpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfbW9kX2RhdGEpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCi0JZm9yIChpID0gMHgyZjsgaSA8PSAweDNlOyBpKyspIHsKLQkJb3V0YiAoaSwgZGV2LT5meF9tb2RfYWRkcik7Ci0JCW91dGIgKDB4MDAsIGRldi0+ZnhfbW9kX2RhdGEpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQlvdXRiICgweDNmLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQlvdXRiICgweDIwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQotCWZvciAoaSA9IDB4NDA7IGkgPD0gMHg0ZDsgaSsrKSB7Ci0JCW91dGIgKGksIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiICgweDAwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0Jb3V0YiAoMHg0ZSwgZGV2LT5meF9tb2RfYWRkcik7Ci0Jb3V0YiAoMHgwZSwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHg0ZiwgZGV2LT5meF9tb2RfYWRkcik7Ci0Jb3V0YiAoMHgwZSwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0KLQotCWZvciAoaSA9IDB4NTA7IGkgPD0gMHg2YjsgaSsrKSB7Ci0JCW91dGIgKGksIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiICgweDAwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0Jb3V0YiAoMHg2YywgZGV2LT5meF9tb2RfYWRkcik7Ci0Jb3V0YiAoMHg0MCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0KLQlvdXRiICgweDZkLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQotCW91dGIgKDB4NmUsIGRldi0+ZnhfbW9kX2FkZHIpOwotCW91dGIgKDB4NDAsIGRldi0+ZnhfbW9kX2RhdGEpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCi0Jb3V0YiAoMHg2ZiwgZGV2LT5meF9tb2RfYWRkcik7Ci0Jb3V0YiAoMHg0MCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0KLQlmb3IgKGkgPSAweDcwOyBpIDw9IDB4N2Y7IGkrKykgewotCQlvdXRiIChpLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQkJb3V0YiAoMHhjMCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLSAgICAKLQlmb3IgKGkgPSAweDgwOyBpIDw9IDB4YWY7IGkrKykgewotCQlvdXRiIChpLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQkJb3V0YiAoMHgwMCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLQotCWZvciAoaSA9IDB4YzA7IGkgPD0gMHhkZDsgaSsrKSB7Ci0JCW91dGIgKGksIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiICgweDAwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0Jb3V0YiAoMHhkZSwgZGV2LT5meF9tb2RfYWRkcik7Ci0Jb3V0YiAoMHgxMCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHhkZiwgZGV2LT5meF9tb2RfYWRkcik7Ci0Jb3V0YiAoMHgxMCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0KLQlmb3IgKGkgPSAweGUwOyBpIDw9IDB4ZWY7IGkrKykgewotCQlvdXRiIChpLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQkJb3V0YiAoMHgwMCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLQotCWZvciAoaSA9IDB4MDA7IGkgPD0gMHgwZjsgaSsrKSB7Ci0JCW91dGIgKDB4MDEsIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiIChpLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQkJb3V0YiAoMHgwMiwgZGV2LT5meF9tb2RfYWRkcik7Ci0JCW91dGIgKDB4MDEsIGRldi0+ZnhfbW9kX2RhdGEpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQlvdXRiICgweDAyLCBkZXYtPmZ4X29wKTsgLyogbXV0ZSBvbiAqLwotCi0JLyogTm93IHNldCB0aGUgY29lZmZpY2llbnRzIGFuZCBzbyBmb3J0aCBmb3IgdGhlIHByb2dyYW1zIGFib3ZlICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChjb2VmZmljaWVudHMpOyBpICs9IDQpIHsKLQkJb3V0YiAoY29lZmZpY2llbnRzW2ldLCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQkJb3V0YiAoY29lZmZpY2llbnRzW2krMV0sIGRldi0+ZnhfZHNwX2FkZHIpOwotCQlvdXRiIChjb2VmZmljaWVudHNbaSsyXSwgZGV2LT5meF9kc3BfbXNiKTsKLQkJb3V0YiAoY29lZmZpY2llbnRzW2krM10sIGRldi0+ZnhfZHNwX2xzYik7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLQotCS8qIFNvbWUgc2V0dGluZ3MgKD8pIHRoYXQgYXJlIHRvbyBzbWFsbCB0byBidW5kbGUgaW50byBsb29wcyAqLwotCi0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHgxZSwgZGV2LT5meF9tb2RfYWRkcik7Ci0Jb3V0YiAoMHgxNCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHhkZSwgZGV2LT5meF9tb2RfYWRkcik7Ci0Jb3V0YiAoMHgyMCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHhkZiwgZGV2LT5meF9tb2RfYWRkcik7Ci0Jb3V0YiAoMHgyMCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0gICAgCi0JLyogc29tZSBtb3JlIGNvZWZmaWNpZW50cyAqLwotCi0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHgwNiwgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHg3OCwgZGV2LT5meF9kc3BfYWRkcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbXNiKTsKLQlvdXRiICgweDQwLCBkZXYtPmZ4X2RzcF9sc2IpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCW91dGIgKDB4MDcsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4MDMsIGRldi0+ZnhfZHNwX2FkZHIpOwotCW91dGIgKDB4MGYsIGRldi0+ZnhfZHNwX21zYik7Ci0Jb3V0YiAoMHhmZiwgZGV2LT5meF9kc3BfbHNiKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDBiLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQlvdXRiICgweDBmLCBkZXYtPmZ4X2RzcF9tc2IpOwotCW91dGIgKDB4ZmYsIGRldi0+ZnhfZHNwX2xzYik7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHgwNywgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHgwMiwgZGV2LT5meF9kc3BfYWRkcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbXNiKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9sc2IpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCW91dGIgKDB4MDcsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4MGEsIGRldi0+ZnhfZHNwX2FkZHIpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX21zYik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbHNiKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDQ2LCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9tc2IpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2xzYik7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHgwNywgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHg0OSwgZGV2LT5meF9kc3BfYWRkcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbXNiKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9sc2IpOwotICAgIAotCS8qIE5vdywgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24sIGxldHMgcmVsb2FkIGV2ZXJ5IHBhZ2UKLQkgICBhbmQgYWxsIHRoZSBjb2VmZmljaWVudHMgb3ZlciBhZ2Fpbi4gSSBoYXZlICpOTyogaWRlYQotCSAgIHdoeSB0aGlzIGlzIGRvbmUuIEkgZG8ga25vdyB0aGF0IG5vIHNvdW5kIGlzIHByb2R1Y2VkCi0JICAgaXMgdGhpcyBwaGFzZSBpcyBvbWl0dGVkLgotCSovCi0KLQlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYtPmZ4X2xjcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfcGFnZSk7ICAKLQlvdXRiICgweDEwLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfemVyb192Mik7IGkgKz0gMikgewotCQlvdXRiIChwYWdlX3plcm9fdjJbaV0sIGRldi0+ZnhfZHNwX21zYik7Ci0JCW91dGIgKHBhZ2VfemVyb192MltpKzFdLCBkZXYtPmZ4X2RzcF9sc2IpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0gICAgCi0Jb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LT5meF9sY3IpOwotCW91dGIgKDB4MDEsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4MTAsIGRldi0+ZnhfZHNwX2FkZHIpOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV9vbmVfdjIpOyBpICs9IDIpIHsKLQkJb3V0YiAocGFnZV9vbmVfdjJbaV0sIGRldi0+ZnhfZHNwX21zYik7Ci0JCW91dGIgKHBhZ2Vfb25lX3YyW2krMV0sIGRldi0+ZnhfZHNwX2xzYik7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLSAgICAKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLSAgICAKLQlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYtPmZ4X2xjcik7Ci0Jb3V0YiAoMHgwMiwgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHgxMCwgZGV2LT5meF9kc3BfYWRkcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwYWdlX3R3b192Mik7IGkrKykgewotCQlvdXRiIChwYWdlX3R3b192MltpXSwgZGV2LT5meF9kc3BfbHNiKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi0+ZnhfbGNyKTsKLQlvdXRiICgweDAzLCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDEwLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfdGhyZWVfdjIpOyBpKyspIHsKLQkJb3V0YiAocGFnZV90aHJlZV92MltpXSwgZGV2LT5meF9kc3BfbHNiKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotICAgIAotCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi0+ZnhfbGNyKTsKLQlvdXRiICgweDA0LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDEwLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfZm91cl92Mik7IGkrKykgewotCQlvdXRiIChwYWdlX2ZvdXJfdjJbaV0sIGRldi0+ZnhfZHNwX2xzYik7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLSAgICAKLQlvdXRiIChGWF9MU0JfVFJBTlNGRVIsIGRldi0+ZnhfbGNyKTsKLQlvdXRiICgweDA2LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQotCS8qIFBhZ2Ugc2l4IHYuMiBpcyBhbGdvcml0aG1pYyAqLwotICAgIAotCWZvciAoaSA9IDB4MTA7IGkgPD0gMHgzZTsgaSArPSAyKSB7Ci0JCW91dGIgKGksIGRldi0+ZnhfZHNwX2FkZHIpOwotCQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9tc2IpOwotCQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9sc2IpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYtPmZ4X2xjcik7Ci0Jb3V0YiAoMHgwNywgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHgxMCwgZGV2LT5meF9kc3BfYWRkcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwYWdlX3NldmVuX3YyKTsgaSArPSAyKSB7Ci0JCW91dGIgKHBhZ2Vfc2V2ZW5fdjJbaV0sIGRldi0+ZnhfZHNwX21zYik7Ci0JCW91dGIgKHBhZ2Vfc2V2ZW5fdjJbaSsxXSwgZGV2LT5meF9kc3BfbHNiKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0JZm9yIChpID0gMHgwMDsgaSA8IHNpemVvZihtb2RfdjIpOyBpICs9IDIpIHsKLQkJb3V0YiAobW9kX3YyW2ldLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQkJb3V0YiAobW9kX3YyW2krMV0sIGRldi0+ZnhfbW9kX2RhdGEpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChjb2VmZmljaWVudHMyKTsgaSArPSA0KSB7Ci0JCW91dGIgKGNvZWZmaWNpZW50czJbaV0sIGRldi0+ZnhfZHNwX3BhZ2UpOwotCQlvdXRiIChjb2VmZmljaWVudHMyW2krMV0sIGRldi0+ZnhfZHNwX2FkZHIpOwotCQlvdXRiIChjb2VmZmljaWVudHMyW2krMl0sIGRldi0+ZnhfZHNwX21zYik7Ci0JCW91dGIgKGNvZWZmaWNpZW50czJbaSszXSwgZGV2LT5meF9kc3BfbHNiKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZiAoY29lZmZpY2llbnRzMyk7IGkgKz0gMikgewotCQlpbnQgeDsKLQotCQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQkJeCA9IChpICUgNCkgPyAweDRlIDogMHg0YzsKLQkJb3V0YiAoeCwgZGV2LT5meF9kc3BfYWRkcik7Ci0JCW91dGIgKGNvZWZmaWNpZW50czNbaV0sIGRldi0+ZnhfZHNwX21zYik7Ci0JCW91dGIgKGNvZWZmaWNpZW50czNbaSsxXSwgZGV2LT5meF9kc3BfbHNiKTsKLQl9Ci0KLQlvdXRiICgweDAwLCBkZXYtPmZ4X29wKTsgLyogbXV0ZSBvZmYgKi8KLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQotCXJldHVybiAoMCk7CitvdXQ6CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCWlmIChmaXJtd2FyZSAhPSAmeXNzMjI1X3JlZ2lzdGVyc19maXJtd2FyZSkKKyNlbmRpZgorCQlyZWxlYXNlX2Zpcm13YXJlKGZpcm13YXJlKTsKKwlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3dhdmVmcm9udC95c3MyMjUuYyBiL3NvdW5kL2lzYS93YXZlZnJvbnQveXNzMjI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2YmUzZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2lzYS93YXZlZnJvbnQveXNzMjI1LmMKQEAgLTAsMCArMSwyNzM5IEBACisvKgorICogIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIGJ5IFBhdWwgRGF2aXMgPHBiZEBvcC5uZXQ+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiB3ZWlyZCBzdHVmZiwgZGVyaXZlZCBmcm9tIHBvcnQgSS9PIHRyYWNpbmcgd2l0aCBkb3NlbXUgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBhZGRyOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKK30geXNzMjI1X3JlZ2lzdGVyc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisvKiBTZXQgYWxsIGJpdHMgZm9yIGFsbCBjaGFubmVscyBvbiB0aGUgTU9EIHVuaXQgdG8gemVybyAqLworeyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDExIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDE0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDE3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MWMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MWYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDIwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDIzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDI2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDI5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MmIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDJjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MmUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDJmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDMyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDM1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDM4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4M2EgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDNiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4M2QgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDNlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0MiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQ0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0NSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQ3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0OCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDRhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0YiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NGMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDRkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0ZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NGYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDUwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1MSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDUzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1NCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDU2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1NyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDU5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1YSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NWIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDVjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1ZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NWUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDVmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2MCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDYyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2MyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDY1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2NiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDY4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2OSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NmEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDZiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2YyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NmQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDZlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2ZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDcxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3MiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDc0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3NSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDc3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3OCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDdhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3YiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4N2MgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDdkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3ZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4N2YgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDgwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4MSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDgzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4NCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDg2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4NyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDg5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4YSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OGIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDhjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4ZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OGUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDhmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5MCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDkyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5MyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDk1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5NiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDk4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5OSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OWEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDliIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5YyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OWQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDllIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5ZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGExIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGE0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGE3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGFhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YWMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGFkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YWYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGIwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGIzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGI2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGI5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YmIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGJjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YmUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGJmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGMyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGM1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGM4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4Y2EgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGNiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4Y2QgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGNlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQ0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQ3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGUwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGUzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGU2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGU5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZWIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGVjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZWUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGVmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGYyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGY1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGY4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZmEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGZiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZmQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGZlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmZiB9LCB7IDB4ZiwgMHgwMCB9LAorCisvKiBYWFggQnV0IHdoeSBkbyB0aGlzIHR3aWNlPyAqLworeyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDExIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDE0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDE3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MWMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MWYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDIwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDIzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDI2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDI5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MmIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDJjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MmUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDJmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDMyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDM1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDM4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4M2EgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDNiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4M2QgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDNlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0MiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQ0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0NSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQ3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0OCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDRhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0YiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NGMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDRkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0ZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NGYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDUwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1MSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDUzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1NCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDU2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1NyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDU5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1YSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NWIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDVjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1ZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NWUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDVmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2MCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDYyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2MyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDY1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2NiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDY4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2OSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NmEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDZiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2YyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NmQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDZlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2ZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDcxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3MiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDc0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3NSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDc3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3OCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDdhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3YiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4N2MgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDdkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3ZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4N2YgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDgwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4MSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDgzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4NCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDg2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4NyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDg5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4YSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OGIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDhjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4ZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OGUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDhmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5MCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDkyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5MyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDk1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5NiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDk4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5OSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OWEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDliIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5YyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OWQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDllIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5ZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGExIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGE0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGE3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGFhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YWMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGFkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YWYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGIwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGIzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGI2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGI5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YmIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGJjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YmUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGJmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGMyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGM1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGM4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4Y2EgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGNiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4Y2QgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGNlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQ0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQ3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGUwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGUzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGU2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGU5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZWIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGVjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZWUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGVmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGYyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGY1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGY4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZmEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGZiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZmQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGZlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmZiB9LCB7IDB4ZiwgMHgwMCB9LAorCisvKiBtdXRlIG9uICovCit7IFdBSVRfSURMRSB9LCB7IDB4OCwgMHgwMiB9LAorCit7IFdBSVRfSURMRSB9LCB7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0NCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDIgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQzIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg3YyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4N2UgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ2IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0OSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDcgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRhIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sCisKKy8qIGVpdGhlciBiZWNhdXNlIG9mIHN0dXBpZGl0eSBieSBUQidzIHByb2dyYW1tZXJzLCBvciBiZWNhdXNlIGl0CisgICBhY3R1YWxseSBkb2VzIHNvbWV0aGluZywgcmV6ZXJvIHRoZSBNT0QgcGFnZS4gKi8KK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDEwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDEzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDE2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDE5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MWIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MWUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDIyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDI1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDI4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MmEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDJiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MmQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDJlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDMxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDM0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDM3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDNhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4M2MgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDNkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4M2YgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0MSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0NCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQ2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0NyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQ5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0YSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NGIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDRjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0ZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NGUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDRmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1MCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDUyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1MyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDU1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1NiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDU4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1OSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NWEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDViIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1YyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NWQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDVlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1ZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDYxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2MiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDY0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2NSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDY3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2OCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDZhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2YiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NmMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDZkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2ZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NmYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDcwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3MSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDczIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3NCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDc2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3NyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDc5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3YSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4N2IgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDdjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3ZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4N2UgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDdmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4MCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDgyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4MyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDg1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4NiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDg4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4OSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OGEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDhiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4YyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OGQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDhlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4ZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDkxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5MiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDk0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5NSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDk3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5OCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDlhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5YiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OWMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDlkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5ZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OWYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGEwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGEzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGE2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGE5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YWIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGFjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YWUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGFmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGIyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGI1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGI4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YmEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGJiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YmQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGJlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGMxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGM0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGM3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGNhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4Y2MgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGNkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4Y2YgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQ2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQ5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGUyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGU1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGU4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZWEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGViIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZWQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGVlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGYxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGY0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGY3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGZhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZmMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGZkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZmYgfSwgeyAweGYsIDB4MDAgfSwKKworLyogbG9hZCBwYWdlIHplcm8gKi8KK3sgMHg5LCAweDA1IH0sIHsgMHhiLCAweDAwIH0sIHsgMHhhLCAweDAwIH0sCisKK3sgMHhkLCAweDAxIH0sIHsgMHhjLCAweDdjIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxZSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHhmNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MTEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgzMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDEzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MTQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDc2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg2MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4ODAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxOCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MTkgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAxIH0sIHsgMHhjLCAweDFhIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDEgfSwgeyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAxIH0sIHsgMHhjLCAweDE3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDEgfSwgeyAweGMsIDB4ODAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAxIH0sIHsgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDEgfSwgeyAweGMsIDB4YTAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAzIH0sIHsgMHhjLCAweGQxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDEgfSwgeyAweGMsIDB4ZjIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxMyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweGY0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHhlMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MTUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxNiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDE3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg1MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4NzEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg2MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDkyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4ODAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHhiMyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweGEwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4ZDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4ODAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweGY1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4NzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweGEwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHgxMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MTYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDEwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MWIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDFkIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHhkZiB9LCB7IFdBSVRfSURMRSB9LAorCisvKiBOb3cgbG9hZCBwYWdlIG9uZSAqLworeyAweDksIDB4MDUgfSwgeyAweGIsIDB4MDEgfSwgeyAweGEsIDB4MDAgfSwKKworeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDE5IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDMgfSwgeyAweGMsIDB4ZDggfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MTkgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MTggfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAxIH0sIHsgMHhjLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHhmYSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MWEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHg2MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDgwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4ZmIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweGEwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MWIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweGQ3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4ZjcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAzIH0sIHsgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDFjIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHgzYyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAzIH0sIHsgMHhjLCAweDNmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDMgfSwgeyAweGMsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHhkZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHg1ZCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAzIH0sIHsgMHhjLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDMgfSwgeyAweGMsIDB4N2QgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAzIH0sIHsgMHhjLCAweDllIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDMgfSwgeyAweGMsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHhiZSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAzIH0sIHsgMHhjLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MWIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweGRiIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4ZGIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHhlMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweGZiIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHhmYiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4NjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDFiIH0sIHsgV0FJVF9JRExFIH0sCisKK3sgMHg5LCAweDA1IH0sIHsgMHhiLCAweDAyIH0sIHsgMHhhLCAweDAwIH0sCisKK3sgMHhjLCAweGM0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHhjNCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4OSwgMHgwNSB9LCB7IDB4YiwgMHgwMyB9LCB7IDB4YSwgMHgwMCB9LAorCit7IDB4YywgMHgwNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4ODAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDgwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDYwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKKworeyAweDksIDB4MDUgfSwgeyAweGIsIDB4MDQgfSwgeyAweGEsIDB4MDAgfSwKKworeyAweGMsIDB4NjMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyNiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDJjIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyZSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg2MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg2MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDYwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg2MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDYwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDYwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg2MiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCisKKy8qIExvYWQgbWVtb3J5IGFyZWEgKHBhZ2Ugc2l4KSAqLworeyAweDksIDB4MDEgfSwgeyAweGIsIDB4MDYgfSwKKworeyAweGEsIDB4MDAgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDAyIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgwNCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MDYgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDA4IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgwYSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MGMgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDBlIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgxMCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MTIgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDE0IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgxNiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MTggfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDFhIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgxYyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MWUgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDIwIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgyMiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MjQgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDI2IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgyOCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MmEgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDJjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgyZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MzAgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDMyIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgzNCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MzYgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDM4IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgzYSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4M2MgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDNlIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg0MCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NDIgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDQ0IH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg0NiB9LCB7IDB4ZCwgMHgwYSB9LCB7IDB4YywgMHgyMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NDggfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4MjMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDRhIH0sIHsgMHhkLCAweDIzIH0sIHsgMHhjLCAweDFiIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgzNyB9LCB7IDB4YywgMHg4ZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NGUgfSwgeyAweGQsIDB4NDUgfSwgeyAweGMsIDB4NzcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDUwIH0sIHsgMHhkLCAweDUyIH0sIHsgMHhjLCAweGUyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg1MiB9LCB7IDB4ZCwgMHgxYyB9LCB7IDB4YywgMHg5MiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NTQgfSwgeyAweGQsIDB4MWMgfSwgeyAweGMsIDB4NTIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDU2IH0sIHsgMHhkLCAweDA3IH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg1OCB9LCB7IDB4ZCwgMHgyZiB9LCB7IDB4YywgMHhjNiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NWEgfSwgeyAweGQsIDB4MGIgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDVjIH0sIHsgMHhkLCAweDMwIH0sIHsgMHhjLCAweDA2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg1ZSB9LCB7IDB4ZCwgMHgxNyB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NjAgfSwgeyAweGQsIDB4M2QgfSwgeyAweGMsIDB4ZGEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDYyIH0sIHsgMHhkLCAweDI5IH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg2NCB9LCB7IDB4ZCwgMHgzZSB9LCB7IDB4YywgMHg0MSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NjYgfSwgeyAweGQsIDB4MzkgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDY4IH0sIHsgMHhkLCAweDRjIH0sIHsgMHhjLCAweDQ4IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg2YSB9LCB7IDB4ZCwgMHg0OSB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NmMgfSwgeyAweGQsIDB4NGMgfSwgeyAweGMsIDB4NmMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDZlIH0sIHsgMHhkLCAweDExIH0sIHsgMHhjLCAweGQyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg3MCB9LCB7IDB4ZCwgMHgxNiB9LCB7IDB4YywgMHgwYyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NzIgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDc0IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDgwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg3NiB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NzggfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4ODAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDdhIH0sIHsgMHhkLCAweDEzIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg3YyB9LCB7IDB4ZCwgMHg4MCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4N2UgfSwgeyAweGQsIDB4ODAgfSwgeyAweGMsIDB4ODAgfSwgeyBXQUlUX0lETEUgfSwKKworeyAweDksIDB4MDUgfSwgeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4MDAgfSwKKworeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwOCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDggfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA4IH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwOCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweGU5IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHg4YyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDYgfSwgeyAweGMsIDB4OGMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgxYSB9LCB7IDB4YywgMHg3NSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGQgfSwgeyAweGMsIDB4OGIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA0IH0sIHsgMHhjLCAweGU5IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHgxNiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MWEgfSwgeyAweGMsIDB4MzggfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBkIH0sIHsgMHhjLCAweGM4IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHg2ZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGIgfSwgeyAweGMsIDB4OTEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDYgfSwgeyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDhmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDYgfSwgeyAweGMsIDB4NjIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA2IH0sIHsgMHhjLCAweDYyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHg3YiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA2IH0sIHsgMHhjLCAweDk3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHg5NyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4NTIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHhmNiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDYgfSwgeyAweGMsIDB4ZjYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDE5IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg1NSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDUgfSwgeyAweGMsIDB4NTUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA1IH0sIHsgMHhjLCAweDU1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg1NSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDUgfSwgeyAweGMsIDB4NTUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA1IH0sIHsgMHhjLCAweDU1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg1NSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDUgfSwgeyAweGMsIDB4NTUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDE0IH0sIHsgMHhjLCAweGRhIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHg5MyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDQgfSwgeyAweGMsIDB4ZGEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA1IH0sIHsgMHhjLCAweDkzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgxNCB9LCB7IDB4YywgMHhkYSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGQgfSwgeyAweGMsIDB4OTMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA0IH0sIHsgMHhjLCAweGRhIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg5MyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCisKKy8qIE5vdyBzZXR1cCB0aGUgTU9EIGFyZWEuICovCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwMyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwNiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDggfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwOSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDBhIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MGIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwYyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDBkIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MGUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKKworeyAweGUsIDB4YjAgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGIxIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiMiB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YjMgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGI0IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiNSB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YjYgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGI3IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiOCB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YjkgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGJhIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiYiB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YmMgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGJkIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiZSB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YmYgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKKworeyAweGUsIDB4ZjAgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGYxIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmMiB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZjMgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGY0IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmNSB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZjYgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGY3IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmOCB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZjkgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGZhIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmYiB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZmMgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGZkIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmZSB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZmYgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKKworeyAweGUsIDB4MTAgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDExIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxMiB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MTMgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDE0IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxNSB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MTYgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDE3IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxOCB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MTkgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDFhIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxYiB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MWMgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDFkIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxZSB9LCB7IDB4ZiwgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MWYgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDIwIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyMSB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MjIgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDIzIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyNCB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MjUgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDI2IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyNyB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MjggfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDI5IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyYSB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MmIgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDJjIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyZCB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MmUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDJmIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzMCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MzEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDMyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzMyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MzQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDM1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzNiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MzcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDM4IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzOSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4M2EgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDNiIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzYyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4M2QgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDNlIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzZiB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDQxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0MiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDQ0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0NSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDQ3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0OCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDkgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDRhIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0YiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NGMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDRkIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0ZSB9LCB7IDB4ZiwgMHgwZSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NGYgfSwgeyAweGYsIDB4MGUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDUwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1MSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NTIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDUzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1NCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NTUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDU2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1NyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NTggfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDU5IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1YSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NWIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDVjIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1ZCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NWUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDVmIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2MCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NjEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDYyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2MyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NjQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDY1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2NiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NjcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDY4IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2OSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NmEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDZiIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2YyB9LCB7IDB4ZiwgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NmQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDZlIH0sIHsgMHhmLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2ZiB9LCB7IDB4ZiwgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzAgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDcxIH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3MiB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzMgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDc0IH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3NSB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzYgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDc3IH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3OCB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzkgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDdhIH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3YiB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4N2MgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDdkIH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3ZSB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4N2YgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDgwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4MSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ODIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDgzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4NCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ODUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDg2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4NyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ODggfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDg5IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4YSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OGIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDhjIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4ZCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OGUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDhmIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5MCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OTEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDkyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5MyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OTQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDk1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5NiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OTcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDk4IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5OSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OWEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDliIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5YyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OWQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDllIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5ZiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGExIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGE0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhNSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGE3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhOCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTkgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGFhIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhYiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YWMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGFkIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhZSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YWYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKKworeyAweGUsIDB4YzAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGMxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YzMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGM0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjNSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YzYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGM3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjOCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YzkgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGNhIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjYiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4Y2MgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGNkIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjZSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4Y2YgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkMSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkNCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZDUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQ2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkNyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZDggfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQ5IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkYSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZGIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGRjIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkZCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZGUgfSwgeyAweGYsIDB4MTAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGRmIH0sIHsgMHhmLCAweDEwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlMCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZTEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGUyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlMyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZTQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGU1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlNiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZTcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGU4IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlOSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZWEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGViIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlYyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZWQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGVlIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlZiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwMCB9LCB7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDEgfSwgeyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDAyIH0sIHsgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwMyB9LCB7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDQgfSwgeyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA1IH0sIHsgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwNiB9LCB7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDcgfSwgeyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA4IH0sIHsgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwOSB9LCB7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MGEgfSwgeyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDBiIH0sIHsgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwYyB9LCB7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MGQgfSwgeyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDBlIH0sIHsgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwZiB9LCB7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAorCisvKiBtdXRlIG9uICovCit7IDB4OCwgMHgwMiB9LAorCisvKiBOb3cgc2V0IHRoZSBjb2VmZmljaWVudHMgYW5kIHNvIGZvcnRoIGZvciB0aGUgcHJvZ3JhbXMgYWJvdmUgKi8KK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ2IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0OSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDAgfSwgeyAweGEsIDB4NGIgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4MTEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDAwIH0sIHsgMHhhLCAweDRkIH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweDMyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0NiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDkgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQwIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0MSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDEgfSwgeyAweGEsIDB4NDAgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDAxIH0sIHsgMHhhLCAweDQxIH0sIHsgMHhkLCAweDAyIH0sIHsgMHhjLCAweDYwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0MCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDEgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ3IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDAgfSwgeyAweGEsIDB4NDcgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDAwIH0sIHsgMHhhLCAweDRhIH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0NyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGEgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDdjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg3ZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDAgfSwgeyAweGEsIDB4MDAgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4MWMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDdjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg3ZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDQgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDAwIH0sIHsgMHhhLCAweDQ0IH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0NCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDIgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQzIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwMCB9LCB7IDB4YSwgMHg0MiB9LCB7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHgxYSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDAgfSwgeyAweGEsIDB4NDMgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQyIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0MyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDAgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQxIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwMSB9LCB7IDB4YSwgMHg0MCB9LCB7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDEgfSwgeyAweGEsIDB4NDEgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4NjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQwIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0MSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDQgfSwgeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQyIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0MyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDAgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQxIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg1MSB9LCB7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NTAgfSwgeyAweGQsIDB4MDYgfSwgeyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRmIH0sIHsgMHhkLCAweDAzIH0sIHsgMHhjLCAweDgxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg1MyB9LCB7IDB4ZCwgMHgxYSB9LCB7IDB4YywgMHg3NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NTQgfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4OGIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDU1IH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweGU5IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg1NiB9LCB7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHgxNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NTcgfSwgeyAweGQsIDB4MWEgfSwgeyAweGMsIDB4MzggfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDU4IH0sIHsgMHhkLCAweDBkIH0sIHsgMHhjLCAweGM5IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg1OSB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHg2ZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NWEgfSwgeyAweGQsIDB4MGIgfSwgeyAweGMsIDB4OTEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDczIH0sIHsgMHhkLCAweDE0IH0sIHsgMHhjLCAweGRhIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg3NCB9LCB7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHg5MyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NzUgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4ZDkgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDc2IH0sIHsgMHhkLCAweDA1IH0sIHsgMHhjLCAweDkzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg3NyB9LCB7IDB4ZCwgMHgxNCB9LCB7IDB4YywgMHhkYSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NzggfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4OTMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDc5IH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweGQ5IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg3YSB9LCB7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg5MyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NWUgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4NjggfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDVjIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweDMxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg1ZCB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHgzMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NjIgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4NTIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDYwIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweDc2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg2MSB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHg3NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NjYgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4MmUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDY0IH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweGRhIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg2NSB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHhkYSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NmEgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4ZjYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDY4IH0sIHsgMHhkLCAweDA1IH0sIHsgMHhjLCAweDYyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg2OSB9LCB7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg2MiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NDYgfSwgeyAweGQsIDB4MGEgfSwgeyAweGMsIDB4MjIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA2IH0sIHsgMHhhLCAweDQ4IH0sIHsgMHhkLCAweDBkIH0sIHsgMHhjLCAweDI0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNiB9LCB7IDB4YSwgMHg2ZSB9LCB7IDB4ZCwgMHgxMSB9LCB7IDB4YywgMHhkMyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NzAgfSwgeyAweGQsIDB4MTUgfSwgeyAweGMsIDB4Y2IgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA2IH0sIHsgMHhhLCAweDUyIH0sIHsgMHhkLCAweDIwIH0sIHsgMHhjLCAweDkzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNiB9LCB7IDB4YSwgMHg1NCB9LCB7IDB4ZCwgMHgyMCB9LCB7IDB4YywgMHg1NCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NGEgfSwgeyAweGQsIDB4MjcgfSwgeyAweGMsIDB4MWQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA2IH0sIHsgMHhhLCAweDU4IH0sIHsgMHhkLCAweDJmIH0sIHsgMHhjLCAweGM4IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNiB9LCB7IDB4YSwgMHg1YyB9LCB7IDB4ZCwgMHgzMCB9LCB7IDB4YywgMHgwNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MzcgfSwgeyAweGMsIDB4OTAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA2IH0sIHsgMHhhLCAweDYwIH0sIHsgMHhkLCAweDNkIH0sIHsgMHhjLCAweGRiIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNiB9LCB7IDB4YSwgMHg2NCB9LCB7IDB4ZCwgMHgzZSB9LCB7IDB4YywgMHg0MiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4NDUgfSwgeyAweGMsIDB4NzggfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA2IH0sIHsgMHhhLCAweDY4IH0sIHsgMHhkLCAweDRjIH0sIHsgMHhjLCAweDQ4IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNiB9LCB7IDB4YSwgMHg2YyB9LCB7IDB4ZCwgMHg0YyB9LCB7IDB4YywgMHg2YyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NTAgfSwgeyAweGQsIDB4NTIgfSwgeyAweGMsIDB4ZTIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA2IH0sIHsgMHhhLCAweDQyIH0sIHsgMHhkLCAweDAyIH0sIHsgMHhjLCAweGJhIH0sIHsgV0FJVF9JRExFIH0sCisKKy8qIFNvbWUgc2V0dGluZ3MgKD8pICovCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxZSB9LCB7IDB4ZiwgMHgxNCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGUgfSwgeyAweGYsIDB4MjAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRmIH0sIHsgMHhmLCAweDIwIH0sCisKKy8qIHNvbWUgbW9yZSBjb2VmZmljaWVudHMgKi8KK3sgV0FJVF9JRExFIH0sIHsgMHhiLCAweDA2IH0sIHsgMHhhLCAweDc4IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDQwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHgwMyB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LAoreyBXQUlUX0lETEUgfSwgeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4MGIgfSwgeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhiLCAweDA3IH0sIHsgMHhhLCAweDAyIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHgwYSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDYgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ5IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sCisKKy8qIE5vdywgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24sIGxldHMgcmVsb2FkIGV2ZXJ5IHBhZ2UKKyAgIGFuZCBhbGwgdGhlIGNvZWZmaWNpZW50cyBvdmVyIGFnYWluLiBJIGhhdmUgKk5PKiBpZGVhCisgICB3aHkgdGhpcyBpcyBkb25lLiBJIGRvIGtub3cgdGhhdCBubyBzb3VuZCBpcyBwcm9kdWNlZAorICAgaXMgdGhpcyBwaGFzZSBpcyBvbWl0dGVkLiAqLworeyAweDksIDB4MDUgfSwgeyAweGIsIDB4MDAgfSwgeyAweGEsIDB4MTAgfSwKKworeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4OSwgMHgwNSB9LCB7IDB4YiwgMHgwMSB9LCB7IDB4YSwgMHgxMCB9LAorCit7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDEgfSwgeyAweGMsIDB4ZmEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDFhIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCisKK3sgV0FJVF9JRExFIH0sIHsgV0FJVF9JRExFIH0sCisKK3sgMHg5LCAweDA1IH0sIHsgMHhiLCAweDAyIH0sIHsgMHhhLCAweDEwIH0sCisKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKKworeyAweDksIDB4MDUgfSwgeyAweGIsIDB4MDMgfSwgeyAweGEsIDB4MTAgfSwKKworeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4OSwgMHgwNSB9LCB7IDB4YiwgMHgwNCB9LCB7IDB4YSwgMHgxMCB9LAorCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCisKKy8qIFBhZ2Ugc2l4IHYuMiAqLworeyAweDksIDB4MDEgfSwgeyAweGIsIDB4MDYgfSwKKworeyAweGEsIDB4MTAgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDEyIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgxNCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MTYgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDE4IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgxYSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MWMgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDFlIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgyMCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MjIgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDI0IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgyNiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MjggfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDJhIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgyYyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MmUgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDMwIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgzMiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MzQgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDM2IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgzOCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4M2EgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDNjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgzZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4OSwgMHgwNSB9LCB7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHgxMCB9LAorCit7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCisKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDAzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiMCB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YjEgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGIyIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiMyB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YjQgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGI1IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiNiB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YjcgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGYwIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmMSB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZjIgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGYzIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmNCB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZjUgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGY2IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmNyB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MTAgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDExIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxMiB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MTMgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDE0IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxNSB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MTYgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDE3IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyMCB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MjEgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDIyIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyMyB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MjQgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDI1IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyNiB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MjcgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDMwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzMSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MzIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDMzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzNCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MzUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDM2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzNyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDQxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0MiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDQ0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0NSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDQ3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1MCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NTEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDUyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1MyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NTQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDU1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1NiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NTcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDYwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2MSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NjIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDYzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2NCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NjUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDY2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2NyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzAgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDcxIH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3MiB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzMgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDc0IH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3NSB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzYgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDc3IH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4MCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ODEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDgyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4MyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ODQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDg1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4NiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ODcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDkwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5MSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OTIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDkzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5NCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OTUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDk2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5NyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGExIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGE0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhNSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGE3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjMCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YzEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGMyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjMyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YzQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGM1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjNiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YzcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkMSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkNCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZDUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQ2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkNyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZTAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGUxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZTMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGU0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlNSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZTYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGU3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwMyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwNiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0NiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDkgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ1IH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0OCB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4N2IgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4Y2MgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDdkIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweGNjIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg3YyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4N2UgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ2IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0OSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDcgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRhIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKKworeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgyOCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MjggfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDUxIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg1MSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4N2EgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDdhIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHhhMyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4YTMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweGNjIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHhjYyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4ZjUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweGY1IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHgxZSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4MWUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweDQ3IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHg0NyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4NzAgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweDcwIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHg5OSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4OTkgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweGMyIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHhjMiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4ZWIgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweGViIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHgxNCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4MTQgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAyIH0sIHsgMHhjLCAweDNkIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHgzZCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4NjYgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAyIH0sIHsgMHhjLCAweDY2IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHg4ZiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4OGYgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAyIH0sIHsgMHhjLCAweGI4IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHhiOCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4ZTEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAyIH0sIHsgMHhjLCAweGUxIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHgwYSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4MGEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAzIH0sIHsgMHhjLCAweDMzIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHgzMyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4NWMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAzIH0sIHsgMHhjLCAweDVjIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHg4NSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4ODUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAzIH0sIHsgMHhjLCAweGFlIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHhhZSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4ZDcgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAzIH0sIHsgMHhjLCAweGQ3IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHgwMCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4MDAgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweDI4IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHgyOCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4NTEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweDUxIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHg3YSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4N2EgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweGEzIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHhhMyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4Y2MgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweGNjIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHhmNSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4ZjUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA1IH0sIHsgMHhjLCAweDFlIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHgxZSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDUgfSwgeyAweGMsIDB4NDcgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA1IH0sIHsgMHhjLCAweDQ3IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg3MCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDUgfSwgeyAweGMsIDB4NzAgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA1IH0sIHsgMHhjLCAweDk5IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg5OSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDUgfSwgeyAweGMsIDB4YzIgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA1IH0sIHsgMHhjLCAweGMyIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHhlYiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDUgfSwgeyAweGMsIDB4ZWIgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA2IH0sIHsgMHhjLCAweDE0IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHgxNCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDYgfSwgeyAweGMsIDB4M2QgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA2IH0sIHsgMHhjLCAweDNkIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHg2NiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDYgfSwgeyAweGMsIDB4NjYgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA2IH0sIHsgMHhjLCAweDhmIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHg4ZiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDYgfSwgeyAweGMsIDB4YjggfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA2IH0sIHsgMHhjLCAweGI4IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHhlMSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDYgfSwgeyAweGMsIDB4ZTEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA3IH0sIHsgMHhjLCAweDBhIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNyB9LCB7IDB4YywgMHgwYSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDcgfSwgeyAweGMsIDB4MzMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA3IH0sIHsgMHhjLCAweDMzIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNyB9LCB7IDB4YywgMHg1YyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDcgfSwgeyAweGMsIDB4NWMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA3IH0sIHsgMHhjLCAweDg1IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNyB9LCB7IDB4YywgMHg4NSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDcgfSwgeyAweGMsIDB4YWUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA3IH0sIHsgMHhjLCAweGFlIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNyB9LCB7IDB4YywgMHhkNyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDcgfSwgeyAweGMsIDB4ZDcgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA4IH0sIHsgMHhjLCAweDAwIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwOCB9LCB7IDB4YywgMHgwMCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDggfSwgeyAweGMsIDB4MjggfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA4IH0sIHsgMHhjLCAweDI4IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwOCB9LCB7IDB4YywgMHg1MSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDggfSwgeyAweGMsIDB4NTEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA4IH0sIHsgMHhjLCAweDdhIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwOCB9LCB7IDB4YywgMHg3YSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDggfSwgeyAweGMsIDB4YTMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA4IH0sIHsgMHhjLCAweGEzIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwOCB9LCB7IDB4YywgMHhjYyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDggfSwgeyAweGMsIDB4Y2MgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA4IH0sIHsgMHhjLCAweGY1IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwOCB9LCB7IDB4YywgMHhmNSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDkgfSwgeyAweGMsIDB4MWUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA5IH0sIHsgMHhjLCAweDFlIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwOSB9LCB7IDB4YywgMHg0NyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDkgfSwgeyAweGMsIDB4NDcgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA5IH0sIHsgMHhjLCAweDcwIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwOSB9LCB7IDB4YywgMHg3MCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDkgfSwgeyAweGMsIDB4OTkgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA5IH0sIHsgMHhjLCAweDk5IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwOSB9LCB7IDB4YywgMHhjMiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDkgfSwgeyAweGMsIDB4YzIgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA5IH0sIHsgMHhjLCAweGViIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwOSB9LCB7IDB4YywgMHhlYiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGEgfSwgeyAweGMsIDB4MTQgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBhIH0sIHsgMHhjLCAweDE0IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYSB9LCB7IDB4YywgMHgzZCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGEgfSwgeyAweGMsIDB4M2QgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBhIH0sIHsgMHhjLCAweDY2IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwYSB9LCB7IDB4YywgMHg2NiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGEgfSwgeyAweGMsIDB4OGYgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBhIH0sIHsgMHhjLCAweDhmIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYSB9LCB7IDB4YywgMHhiOCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGEgfSwgeyAweGMsIDB4YjggfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBhIH0sIHsgMHhjLCAweGUxIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwYSB9LCB7IDB4YywgMHhlMSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGIgfSwgeyAweGMsIDB4MGEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBiIH0sIHsgMHhjLCAweDBhIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHgzMyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGIgfSwgeyAweGMsIDB4MzMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBiIH0sIHsgMHhjLCAweDVjIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHg1YyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGIgfSwgeyAweGMsIDB4ODUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBiIH0sIHsgMHhjLCAweDg1IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHhhZSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGIgfSwgeyAweGMsIDB4YWUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBiIH0sIHsgMHhjLCAweGQ3IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHhkNyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGMgfSwgeyAweGMsIDB4MDAgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBjIH0sIHsgMHhjLCAweDAwIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYyB9LCB7IDB4YywgMHgyOCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGMgfSwgeyAweGMsIDB4MjggfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBjIH0sIHsgMHhjLCAweDUxIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwYyB9LCB7IDB4YywgMHg1MSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGMgfSwgeyAweGMsIDB4N2EgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBjIH0sIHsgMHhjLCAweDdhIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYyB9LCB7IDB4YywgMHhhMyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGMgfSwgeyAweGMsIDB4YTMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBjIH0sIHsgMHhjLCAweGNjIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwYyB9LCB7IDB4YywgMHhjYyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGMgfSwgeyAweGMsIDB4ZjUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBjIH0sIHsgMHhjLCAweGY1IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHgxZSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4MWUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBkIH0sIHsgMHhjLCAweDQ3IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHg0NyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4NzAgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBkIH0sIHsgMHhjLCAweDcwIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHg5OSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4OTkgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBkIH0sIHsgMHhjLCAweGMyIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHhjMiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4ZWIgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBkIH0sIHsgMHhjLCAweGViIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZSB9LCB7IDB4YywgMHgxNCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGUgfSwgeyAweGMsIDB4MTQgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBlIH0sIHsgMHhjLCAweDNkIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZSB9LCB7IDB4YywgMHgzZCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGUgfSwgeyAweGMsIDB4NjYgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBlIH0sIHsgMHhjLCAweDY2IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZSB9LCB7IDB4YywgMHg4ZiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGUgfSwgeyAweGMsIDB4OGYgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBlIH0sIHsgMHhjLCAweGI4IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZSB9LCB7IDB4YywgMHhiOCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGUgfSwgeyAweGMsIDB4ZTEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBlIH0sIHsgMHhjLCAweGUxIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHgwYSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4MGEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweDMzIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHgzMyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4NWMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweDVjIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHg4NSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ODUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweGFlIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhhZSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZDcgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweGQ3IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwKKworLyogbXV0ZSBvZmYgKi8KK3sgMHg4LCAweDAwIH0sIHsgV0FJVF9JRExFIH0KK307CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvS2NvbmZpZyBiL3NvdW5kL3BjaS9LY29uZmlnCmluZGV4IDhhNmIxODAuLjFiY2ZiM2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9LY29uZmlnCisrKyBiL3NvdW5kL3BjaS9LY29uZmlnCkBAIC0yMzYsNyArMjM2LDcgQEAKIGNvbmZpZyBTTkRfREFSTEEyMAogCXRyaXN0YXRlICIoRWNob2F1ZGlvKSBEYXJsYTIwIgogCWRlcGVuZHMgb24gU05ECi0JZGVwZW5kcyBvbiBGV19MT0FERVIKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCiAJICBTYXkgJ1knIG9yICdNJyB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEVjaG9hdWRpbyBEYXJsYS4KQEAgLTI0Nyw3ICsyNDcsNyBAQAogY29uZmlnIFNORF9HSU5BMjAKIAl0cmlzdGF0ZSAiKEVjaG9hdWRpbykgR2luYTIwIgogCWRlcGVuZHMgb24gU05ECi0JZGVwZW5kcyBvbiBGV19MT0FERVIKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCiAJICBTYXkgJ1knIG9yICdNJyB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEVjaG9hdWRpbyBHaW5hLgpAQCAtMjU4LDcgKzI1OCw3IEBACiBjb25maWcgU05EX0xBWUxBMjAKIAl0cmlzdGF0ZSAiKEVjaG9hdWRpbykgTGF5bGEyMCIKIAlkZXBlbmRzIG9uIFNORAotCWRlcGVuZHMgb24gRldfTE9BREVSCisJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBTTkRfUkFXTUlESQogCXNlbGVjdCBTTkRfUENNCiAJaGVscApAQCAtMjcwLDcgKzI3MCw3IEBACiBjb25maWcgU05EX0RBUkxBMjQKIAl0cmlzdGF0ZSAiKEVjaG9hdWRpbykgRGFybGEyNCIKIAlkZXBlbmRzIG9uIFNORAotCWRlcGVuZHMgb24gRldfTE9BREVSCisJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBTTkRfUENNCiAJaGVscAogCSAgU2F5ICdZJyBvciAnTScgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBFY2hvYXVkaW8gRGFybGEyNC4KQEAgLTI4MSw3ICsyODEsNyBAQAogY29uZmlnIFNORF9HSU5BMjQKIAl0cmlzdGF0ZSAiKEVjaG9hdWRpbykgR2luYTI0IgogCWRlcGVuZHMgb24gU05ECi0JZGVwZW5kcyBvbiBGV19MT0FERVIKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCiAJICBTYXkgJ1knIG9yICdNJyB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEVjaG9hdWRpbyBHaW5hMjQuCkBAIC0yOTIsNyArMjkyLDcgQEAKIGNvbmZpZyBTTkRfTEFZTEEyNAogCXRyaXN0YXRlICIoRWNob2F1ZGlvKSBMYXlsYTI0IgogCWRlcGVuZHMgb24gU05ECi0JZGVwZW5kcyBvbiBGV19MT0FERVIKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9SQVdNSURJCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCkBAIC0zMDQsNyArMzA0LDcgQEAKIGNvbmZpZyBTTkRfTU9OQQogCXRyaXN0YXRlICIoRWNob2F1ZGlvKSBNb25hIgogCWRlcGVuZHMgb24gU05ECi0JZGVwZW5kcyBvbiBGV19MT0FERVIKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9SQVdNSURJCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCkBAIC0zMTYsNyArMzE2LDcgQEAKIGNvbmZpZyBTTkRfTUlBCiAJdHJpc3RhdGUgIihFY2hvYXVkaW8pIE1pYSIKIAlkZXBlbmRzIG9uIFNORAotCWRlcGVuZHMgb24gRldfTE9BREVSCisJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBTTkRfUkFXTUlESQogCXNlbGVjdCBTTkRfUENNCiAJaGVscApAQCAtMzI4LDcgKzMyOCw3IEBACiBjb25maWcgU05EX0VDSE8zRwogCXRyaXN0YXRlICIoRWNob2F1ZGlvKSAzRyBjYXJkcyIKIAlkZXBlbmRzIG9uIFNORAotCWRlcGVuZHMgb24gRldfTE9BREVSCisJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBTTkRfUkFXTUlESQogCXNlbGVjdCBTTkRfUENNCiAJaGVscApAQCAtMzQwLDcgKzM0MCw3IEBACiBjb25maWcgU05EX0lORElHTwogCXRyaXN0YXRlICIoRWNob2F1ZGlvKSBJbmRpZ28iCiAJZGVwZW5kcyBvbiBTTkQKLQlkZXBlbmRzIG9uIEZXX0xPQURFUgorCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU05EX1BDTQogCWhlbHAKIAkgIFNheSAnWScgb3IgJ00nIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgRWNob2F1ZGlvIEluZGlnby4KQEAgLTM1MSw3ICszNTEsNyBAQAogY29uZmlnIFNORF9JTkRJR09JTwogCXRyaXN0YXRlICIoRWNob2F1ZGlvKSBJbmRpZ28gSU8iCiAJZGVwZW5kcyBvbiBTTkQKLQlkZXBlbmRzIG9uIEZXX0xPQURFUgorCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU05EX1BDTQogCWhlbHAKIAkgIFNheSAnWScgb3IgJ00nIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgRWNob2F1ZGlvIEluZGlnbyBJTy4KQEAgLTM2Miw3ICszNjIsNyBAQAogY29uZmlnIFNORF9JTkRJR09ESgogCXRyaXN0YXRlICIoRWNob2F1ZGlvKSBJbmRpZ28gREoiCiAJZGVwZW5kcyBvbiBTTkQKLQlkZXBlbmRzIG9uIEZXX0xPQURFUgorCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU05EX1BDTQogCWhlbHAKIAkgIFNheSAnWScgb3IgJ00nIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgRWNob2F1ZGlvIEluZGlnbyBESi4KQEAgLTM3Myw2ICszNzMsNyBAQAogY29uZmlnIFNORF9FTVUxMEsxCiAJdHJpc3RhdGUgIkVtdTEwazEgKFNCIExpdmUhLCBBdWRpZ3ksIEUtbXUgQVBTKSIKIAlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU05EX0hXREVQCiAJc2VsZWN0IFNORF9SQVdNSURJCiAJc2VsZWN0IFNORF9BQzk3X0NPREVDCkBAIC01NzUsNiArNTc2LDcgQEAKIGNvbmZpZyBTTkRfS09SRzEyMTIKIAl0cmlzdGF0ZSAiS29yZyAxMjEyIElPIgogCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBTTkRfUENNCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEtvcmcgMTIxMklPIHNvdW5kY2FyZHMuCkBAIC01ODUsNiArNTg3LDcgQEAKIGNvbmZpZyBTTkRfTUFFU1RSTzMKIAl0cmlzdGF0ZSAiRVNTIEFsbGVncm8vTWFlc3RybzMiCiAJZGVwZW5kcyBvbiBTTkQKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9BQzk3X0NPREVDCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNvdW5kY2FyZHMgYmFzZWQgb24gRVNTIE1hZXN0cm8gMwpAQCAtNjI5LDcgKzYzMiw3IEBACiBjb25maWcgU05EX1JJUFRJREUKIAl0cmlzdGF0ZSAiQ29uZXhhbnQgUmlwdGlkZSIKIAlkZXBlbmRzIG9uIFNORAotCWRlcGVuZHMgb24gRldfTE9BREVSCisJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBTTkRfT1BMM19MSUIKIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCiAJc2VsZWN0IFNORF9BQzk3X0NPREVDCkBAIC03MzQsNiArNzM3LDcgQEAKIGNvbmZpZyBTTkRfWU1GUENJCiAJdHJpc3RhdGUgIllhbWFoYSBZTUY3MjQvNzQwLzc0NC83NTQiCiAJZGVwZW5kcyBvbiBTTkQKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9PUEwzX0xJQgogCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKIAlzZWxlY3QgU05EX0FDOTdfQ09ERUMKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYwppbmRleCBkMjk5NGNiLi43NGVkODEwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCkBAIC0xMTEsNyArMTExLDcgQEAKIHsgMHg0MTQ0NTM3MiwgMHhmZmZmZmZmZiwgIkFEMTk4MUEiLAkJcGF0Y2hfYWQxOTgxYSwJTlVMTCB9LAogeyAweDQxNDQ1Mzc0LCAweGZmZmZmZmZmLCAiQUQxOTgxQiIsCQlwYXRjaF9hZDE5ODFiLAlOVUxMIH0sCiB7IDB4NDE0NDUzNzUsIDB4ZmZmZmZmZmYsICJBRDE5ODUiLAkJcGF0Y2hfYWQxOTg1LAlOVUxMIH0sCi17IDB4NDE0NDUzNzgsIDB4ZmZmZmZmZmYsICJBRDE5ODYiLAkJcGF0Y2hfYWQxOTg1LAlOVUxMIH0sCit7IDB4NDE0NDUzNzgsIDB4ZmZmZmZmZmYsICJBRDE5ODYiLAkJcGF0Y2hfYWQxOTg2LAlOVUxMIH0sCiB7IDB4NDE0YzQzMDAsIDB4ZmZmZmZmMDAsICJBTEMxMDAsMTAwUCIsIAlOVUxMLAkJTlVMTCB9LAogeyAweDQxNGM0NzEwLCAweGZmZmZmZmYwLCAiQUxDMjAwLDIwMFAiLAlOVUxMLAkJTlVMTCB9LAogeyAweDQxNGM0NzIxLCAweGZmZmZmZmZmLCAiQUxDNjUwRCIsCQlOVUxMLAlOVUxMIH0sIC8qIGFscmVhZHkgcGF0Y2hlZCAqLwpAQCAtMTk0LDYgKzE5NCwxMyBAQAogCiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9wb3dlcl9yZWdzKHN0cnVjdCBzbmRfYWM5NyAqYWM5Nyk7CisjaWZkZWYgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUKKyNkZWZpbmUgYWM5N19pc19wb3dlcl9zYXZlX21vZGUoYWM5NykgXAorCSgoYWM5Ny0+c2NhcHMgJiBBQzk3X1NDQVBfUE9XRVJfU0FWRSkgJiYgcG93ZXJfc2F2ZSkKKyNlbHNlCisjZGVmaW5lIGFjOTdfaXNfcG93ZXJfc2F2ZV9tb2RlKGFjOTcpIDAKKyNlbmRpZgorCiAKIC8qCiAgKiAgSS9PIHJvdXRpbmVzCkBAIC05ODIsOCArOTg5LDggQEAKIHsKIAlpZiAoYWM5NykgewogI2lmZGVmIENPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFCi0JCWlmIChhYzk3LT5wb3dlcl93b3JrcSkKLQkJCWRlc3Ryb3lfd29ya3F1ZXVlKGFjOTctPnBvd2VyX3dvcmtxKTsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmYWM5Ny0+cG93ZXJfd29yayk7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAjZW5kaWYKIAkJc25kX2FjOTdfcHJvY19kb25lKGFjOTcpOwogCQlpZiAoYWM5Ny0+YnVzKQpAQCAtMTE4NCwxMyArMTE5MSwxMyBAQAogLyoKICAqIHNldCBkQiBpbmZvcm1hdGlvbgogICovCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNGJpdCwgLTQ1MDAsIDMwMCwgMCk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNWJpdCwgLTQ2NTAsIDE1MCwgMCk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNmJpdCwgLTk0NTAsIDE1MCwgMCk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNWJpdF8xMmRiX21heCwgLTM0NTAsIDE1MCwgMCk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfcmVjX2dhaW4sIDAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNGJpdCwgLTQ1MDAsIDMwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNWJpdCwgLTQ2NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNmJpdCwgLTk0NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNWJpdF8xMmRiX21heCwgLTM0NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfcmVjX2dhaW4sIDAsIDE1MCwgMCk7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgKmZpbmRfZGJfc2NhbGUodW5zaWduZWQgaW50IG1heHZhbCkKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgKmZpbmRfZGJfc2NhbGUodW5zaWduZWQgaW50IG1heHZhbCkKIHsKIAlzd2l0Y2ggKG1heHZhbCkgewogCWNhc2UgMHgwZjogcmV0dXJuIGRiX3NjYWxlXzRiaXQ7CkBAIC0xMjAwLDggKzEyMDcsOCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBzZXRfdGx2X2RiX3NjYWxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsIHVuc2lnbmVkIGludCAqdGx2KQotewkKK3N0YXRpYyB2b2lkIHNldF90bHZfZGJfc2NhbGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwgY29uc3QgdW5zaWduZWQgaW50ICp0bHYpCit7CiAJa2N0bC0+dGx2LnAgPSB0bHY7CiAJaWYgKHRsdikKIAkJa2N0bC0+dmRbMF0uYWNjZXNzIHw9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRDsKQEAgLTE5ODksNyArMTk5Niw2IEBACiAJbXV0ZXhfaW5pdCgmYWM5Ny0+cmVnX211dGV4KTsKIAltdXRleF9pbml0KCZhYzk3LT5wYWdlX211dGV4KTsKICNpZmRlZiBDT05GSUdfU05EX0FDOTdfUE9XRVJfU0FWRQotCWFjOTctPnBvd2VyX3dvcmtxID0gY3JlYXRlX3dvcmtxdWV1ZSgiYWM5NyIpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZhYzk3LT5wb3dlcl93b3JrLCBkb191cGRhdGVfcG93ZXIpOwogI2VuZGlmCiAKQEAgLTIyNzUsMTUgKzIyODEsMTMgQEAKIAl1ZGVsYXkoMTAwKTsKIAlwb3dlciB8PSBBQzk3X1BEX1BSMiB8IEFDOTdfUERfUFIzOwkvKiBBbmFsb2cgTWl4ZXIgcG93ZXJkb3duICovCiAJc25kX2FjOTdfd3JpdGUoYWM5NywgQUM5N19QT1dFUkRPV04sIHBvd2VyKTsKLSNpZmRlZiBDT05GSUdfU05EX0FDOTdfUE9XRVJfU0FWRQotCWlmIChwb3dlcl9zYXZlKSB7CisJaWYgKGFjOTdfaXNfcG93ZXJfc2F2ZV9tb2RlKGFjOTcpKSB7CiAJCXVkZWxheSgxMDApOwogCQkvKiBBQy1saW5rIHBvd2VyZG93biwgaW50ZXJuYWwgQ2xrIGRpc2FibGUgKi8KIAkJLyogRklYTUU6IHRoaXMgbWF5IGNhdXNlIGNsaWNrIG5vaXNlcyBvbiBzb21lIGJvYXJkcyAqLwogCQlwb3dlciB8PSBBQzk3X1BEX1BSNCB8IEFDOTdfUERfUFI1OwogCQlzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3X1BPV0VSRE9XTiwgcG93ZXIpOwogCX0KLSNlbmRpZgogfQogCiAKQEAgLTIzMzcsMTQgKzIzNDEsMTYgQEAKIAkJfQogCX0KIAotCWlmIChwb3dlcl9zYXZlICYmICFwb3dlcnVwICYmIGFjOTctPnBvd2VyX3dvcmtxKQorCWlmIChhYzk3X2lzX3Bvd2VyX3NhdmVfbW9kZShhYzk3KSAmJiAhcG93ZXJ1cCkKIAkJLyogYWRqdXN0IHBvd2VyLWRvd24gYml0cyBhZnRlciB0d28gc2Vjb25kcyBkZWxheQogCQkgKiAoZm9yIGF2b2lkaW5nIGxvdWQgY2xpY2sgbm9pc2VzIGZvciBtYW55IChPU1MpIGFwcHMKIAkJICogIHRoYXQgb3Blbi9jbG9zZSBmcmVxdWVudGx5KQogCQkgKi8KLQkJcXVldWVfZGVsYXllZF93b3JrKGFjOTctPnBvd2VyX3dvcmtxLCAmYWM5Ny0+cG93ZXJfd29yaywgSFoqMik7Ci0JZWxzZQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFjOTctPnBvd2VyX3dvcmssIEhaKjIpOworCWVsc2UgeworCQljYW5jZWxfZGVsYXllZF93b3JrKCZhYzk3LT5wb3dlcl93b3JrKTsKIAkJdXBkYXRlX3Bvd2VyX3JlZ3MoYWM5Nyk7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMzU3LDE5ICsyMzYzLDE1IEBACiAJdW5zaWduZWQgaW50IHBvd2VyX3VwLCBiaXRzOwogCWludCBpOwogCisJcG93ZXJfdXAgPSAoMSA8PCBQV0lEWF9GUk9OVCkgfCAoMSA8PCBQV0lEWF9BREMpOworCXBvd2VyX3VwIHw9ICgxIDw8IFBXSURYX01JQyk7CisJaWYgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX1NVUlJPVU5EX0RBQykKKwkJcG93ZXJfdXAgfD0gKDEgPDwgUFdJRFhfU1VSUik7CisJaWYgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX0NFTlRFUl9MRkVfREFDKQorCQlwb3dlcl91cCB8PSAoMSA8PCBQV0lEWF9DTEZFKTsKICNpZmRlZiBDT05GSUdfU05EX0FDOTdfUE9XRVJfU0FWRQotCWlmIChwb3dlcl9zYXZlKQorCWlmIChhYzk3X2lzX3Bvd2VyX3NhdmVfbW9kZShhYzk3KSkKIAkJcG93ZXJfdXAgPSBhYzk3LT5wb3dlcl91cDsKLQllbHNlIHsKLSNlbmRpZgotCQlwb3dlcl91cCA9ICgxIDw8IFBXSURYX0ZST05UKSB8ICgxIDw8IFBXSURYX0FEQyk7Ci0JCXBvd2VyX3VwIHw9ICgxIDw8IFBXSURYX01JQyk7Ci0JCWlmIChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9TVVJST1VORF9EQUMpCi0JCQlwb3dlcl91cCB8PSAoMSA8PCBQV0lEWF9TVVJSKTsKLQkJaWYgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX0NFTlRFUl9MRkVfREFDKQotCQkJcG93ZXJfdXAgfD0gKDEgPDwgUFdJRFhfQ0xGRSk7Ci0jaWZkZWYgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUKLQl9CiAjZW5kaWYKIAlpZiAocG93ZXJfdXApIHsKIAkJaWYgKGFjOTctPnJlZ3NbQUM5N19QT1dFUkRPV05dICYgQUM5N19QRF9QUjIpIHsKQEAgLTI0MTQsNiArMjQxNiwxMCBAQAogCQlyZXR1cm47CiAJaWYgKGFjOTctPmJ1aWxkX29wcy0+c3VzcGVuZCkKIAkJYWM5Ny0+YnVpbGRfb3BzLT5zdXNwZW5kKGFjOTcpOworI2lmZGVmIENPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmYWM5Ny0+cG93ZXJfd29yayk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKyNlbmRpZgogCXNuZF9hYzk3X3Bvd2VyZG93bihhYzk3KTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jIGIvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jCmluZGV4IGU4MTM5NjguLjY0MWQwYzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYworKysgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAogLyogcmVwbGFjZSB3aXRoIGEgbmV3IFRMViAqLwogc3RhdGljIHZvaWQgcmVzZXRfdGx2KHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgY29uc3QgY2hhciAqbmFtZSwKLQkJICAgICAgdW5zaWduZWQgaW50ICp0bHYpCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqdGx2KQogewogCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgc2lkOwogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CkBAIC0xOTAsMTQgKzE5MCwyOCBAQAogCXJldHVybiBhYzk3LT5jaGFubmVsX21vZGUgPj0gMjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaXNfc2hhcmVkX2xpbmVpbihzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCisvKiBzeXN0ZW0gaGFzIHNoYXJlZCBqYWNrcyB3aXRoIHN1cnJvdW5kIG91dCBlbmFibGVkICovCitzdGF0aWMgaW5saW5lIGludCBpc19zaGFyZWRfc3Vycm91dChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCiB7Ci0JcmV0dXJuICEgYWM5Ny0+aW5kZXBfc3Vycm91bmQgJiYgaXNfc3Vycm91bmRfb24oYWM5Nyk7CisJcmV0dXJuICFhYzk3LT5pbmRlcF9zdXJyb3VuZCAmJiBpc19zdXJyb3VuZF9vbihhYzk3KTsKIH0KIAorLyogc3lzdGVtIGhhcyBzaGFyZWQgamFja3Mgd2l0aCBjZW50ZXIvbGZlIG91dCBlbmFibGVkICovCitzdGF0aWMgaW5saW5lIGludCBpc19zaGFyZWRfY2xmZW91dChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCit7CisJcmV0dXJuICFhYzk3LT5pbmRlcF9zdXJyb3VuZCAmJiBpc19jbGZlX29uKGFjOTcpOworfQorCisvKiBzeXN0ZW0gaGFzIHNoYXJlZCBqYWNrcyB3aXRoIGxpbmUgaW4gZW5hYmxlZCAqLworc3RhdGljIGlubGluZSBpbnQgaXNfc2hhcmVkX2xpbmVpbihzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCit7CisJcmV0dXJuICFhYzk3LT5pbmRlcF9zdXJyb3VuZCAmJiAhaXNfc3Vycm91bmRfb24oYWM5Nyk7Cit9CisKKy8qIHN5c3RlbSBoYXMgc2hhcmVkIGphY2tzIHdpdGggbWljIGluIGVuYWJsZWQgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGlzX3NoYXJlZF9taWNpbihzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCiB7Ci0JcmV0dXJuICEgYWM5Ny0+aW5kZXBfc3Vycm91bmQgJiYgaXNfY2xmZV9vbihhYzk3KTsKKwlyZXR1cm4gIWFjOTctPmluZGVwX3N1cnJvdW5kICYmICFpc19jbGZlX29uKGFjOTcpOwogfQogCiAKQEAgLTk0MSw2ICs5NTUsOSBAQAogewogCWludCBlcnI7CiAKKwkvKiB0aGUgcmVnaXN0ZXIgYml0IGlzIHdyaXRhYmxlLCBidXQgdGhlIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZDogKi8KKwlzbmRfYWM5N19yZW1vdmVfY3RsKGFjOTcsICJQQ00gT3V0IFBhdGggJiBNdXRlIiwgTlVMTCk7CisKIAlzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChhYzk3LCAiSGVhZHBob25lIFBsYXliYWNrIiwgIlNpZ21hdGVsIFN1cnJvdW5kIFBsYXliYWNrIik7CiAJaWYgKChlcnIgPSBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCAmc25kX2FjOTdfc3RhYzk3MDhfYmlhc19jb250cm9sLCAxKSkgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtMTU1Miw3ICsxNTY5LDcgQEAKIAlBQzk3X1NJTkdMRSgiTGluZSBKYWNrIFNlbnNlIiwgQUM5N19BRF9KQUNLX1NQRElGLCA4LCAxLCAxKSwgLyogaW52ZXJ0ZWQgKi8KIH07CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV82Yml0XzZkYl9tYXgsIC04ODUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzZiaXRfNmRiX21heCwgLTg4NTAsIDE1MCwgMCk7CiAKIHN0YXRpYyBpbnQgcGF0Y2hfYWQxODg1X3NwZWNpZmljKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CkBAIC0xNjA5LDE5ICsxNjI2LDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIE1JU0MgYml0cyAqLworLyogTUlTQyBiaXRzIChBRDE4ODgvQUQxOTgwL0FEMTk4NSByZWdpc3RlciAweDc2KSAqLwogI2RlZmluZSBBQzk3X0FEMTk4WF9NQkMJCTB4MDAwMwkvKiBtaWMgYm9vc3QgKi8KICNkZWZpbmUgQUM5N19BRDE5OFhfTUJDXzIwCTB4MDAwMAkvKiArMjBkQiAqLwogI2RlZmluZSBBQzk3X0FEMTk4WF9NQkNfMTAJMHgwMDAxCS8qICsxMGRCICovCiAjZGVmaW5lIEFDOTdfQUQxOThYX01CQ18zMAkweDAwMDIJLyogKzMwZEIgKi8KICNkZWZpbmUgQUM5N19BRDE5OFhfVlJFRkQJMHgwMDA0CS8qIFZSRUYgaGlnaC1aICovCi0jZGVmaW5lIEFDOTdfQUQxOThYX1ZSRUZICTB4MDAwOAkvKiAyLjI1ViwgMy43ViAqLwotI2RlZmluZSBBQzk3X0FEMTk4WF9WUkVGXzAJMHgwMDBjCS8qIDBWICovCisjZGVmaW5lIEFDOTdfQUQxOThYX1ZSRUZICTB4MDAwOAkvKiAwPTIuMjVWLCAxPTMuN1YgKi8KKyNkZWZpbmUgQUM5N19BRDE5OFhfVlJFRl8wCTB4MDAwYwkvKiAwViAoQUQxOTg1IG9ubHkpICovCisjZGVmaW5lIEFDOTdfQUQxOThYX1ZSRUZfTUFTSwkoQUM5N19BRDE5OFhfVlJFRkggfCBBQzk3X0FEMTk4WF9WUkVGRCkKKyNkZWZpbmUgQUM5N19BRDE5OFhfVlJFRl9TSElGVAkyCiAjZGVmaW5lIEFDOTdfQUQxOThYX1NSVQkJMHgwMDEwCS8qIHNhbXBsZSByYXRlIHVubG9jayAqLwogI2RlZmluZSBBQzk3X0FEMTk4WF9MT1NFTAkweDAwMjAJLyogTElORV9PVVQgYW1wbGlmaWVycyBpbnB1dCBzZWxlY3QgKi8KICNkZWZpbmUgQUM5N19BRDE5OFhfMk1JQwkweDAwNDAJLyogMi1jaGFubmVsIG1pYyBzZWxlY3QgKi8KICNkZWZpbmUgQUM5N19BRDE5OFhfU1BSRAkweDAwODAJLyogU1BSRUFEIGVuYWJsZSAqLwotI2RlZmluZSBBQzk3X0FEMTk4WF9ETUlYMAkweDAxMDAJLyogZG93bm1peCBtb2RlOiAwID0gNi10by00LCAxID0gNi10by0yIGRvd25taXggKi8KKyNkZWZpbmUgQUM5N19BRDE5OFhfRE1JWDAJMHgwMTAwCS8qIGRvd25taXggbW9kZTogKi8KKwkJCQkJLyogIDAgPSA2LXRvLTQsIDEgPSA2LXRvLTIgZG93bm1peCAqLwogI2RlZmluZSBBQzk3X0FEMTk4WF9ETUlYMQkweDAyMDAJLyogZG93bm1peCBtb2RlOiAxID0gZW5hYmxlZCAqLwogI2RlZmluZSBBQzk3X0FEMTk4WF9IUFNFTAkweDA0MDAJLyogaGVhZHBob25lIGFtcGxpZmllciBpbnB1dCBzZWxlY3QgKi8KICNkZWZpbmUgQUM5N19BRDE5OFhfQ0xESVMJMHgwODAwCS8qIGNlbnRlci9sZmUgZGlzYWJsZSAqLwpAQCAtMTYzMCw2ICsxNjUwLDgzIEBACiAjZGVmaW5lIEFDOTdfQUQxOThYX0FDOTdOQwkweDQwMDAJLyogQUM5NyBubyBjb21wYXRpYmxlIG1vZGUgKi8KICNkZWZpbmUgQUM5N19BRDE5OFhfREFDWgkweDgwMDAJLyogREFDIHplcm8tZmlsbCBtb2RlICovCiAKKy8qIE1JU0MgMSBiaXRzIChBRDE5ODYgcmVnaXN0ZXIgMHg3NikgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTUJDCQkweDAwMDMJLyogbWljIGJvb3N0ICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X01CQ18yMAkweDAwMDAJLyogKzIwZEIgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTUJDXzEwCTB4MDAwMQkvKiArMTBkQiAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9NQkNfMzAJMHgwMDAyCS8qICszMGRCICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0xJU0VMMAkweDAwMDQJLyogTElORV9JTiBzZWxlY3QgYml0IDAgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTElTRUwxCTB4MDAwOAkvKiBMSU5FX0lOIHNlbGVjdCBiaXQgMSAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9MSVNFTF9NQVNLCShBQzk3X0FEMTk4Nl9MSVNFTDEgfCBBQzk3X0FEMTk4Nl9MSVNFTDApCisjZGVmaW5lIEFDOTdfQUQxOTg2X0xJU0VMX0xJCTB4MDAwMCAgLyogTElORV9JTiBwaW5zIGFzIExJTkVfSU4gc291cmNlICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0xJU0VMX1NVUlIJMHgwMDA0ICAvKiBTVVJST1VORCBwaW5zIGFzIExJTkVfSU4gc291cmNlICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0xJU0VMX01JQwkweDAwMDggIC8qIE1JQ18xLzIgcGlucyBhcyBMSU5FX0lOIHNvdXJjZSAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9TUlUJCTB4MDAxMAkvKiBzYW1wbGUgcmF0ZSB1bmxvY2sgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfU09TRUwJMHgwMDIwCS8qIFNVUlJPVU5EX09VVCBhbXBsaWZpZXJzIGlucHV0IHNlbCAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl8yTUlDCTB4MDA0MAkvKiAyLWNoYW5uZWwgbWljIHNlbGVjdCAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9TUFJECTB4MDA4MAkvKiBTUFJFQUQgZW5hYmxlICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0RNSVgwCTB4MDEwMAkvKiBkb3dubWl4IG1vZGU6ICovCisJCQkJCS8qICAwID0gNi10by00LCAxID0gNi10by0yIGRvd25taXggKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfRE1JWDEJMHgwMjAwCS8qIGRvd25taXggbW9kZTogMSA9IGVuYWJsZWQgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfQ0xESVMJMHgwODAwCS8qIGNlbnRlci9sZmUgZGlzYWJsZSAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9TT0RJUwkweDEwMDAJLyogU1VSUk9VTkRfT1VUIGRpc2FibGUgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTVNQTFQJMHgyMDAwCS8qIG11dGUgc3BsaXQgKHJlYWQgb25seSAxKSAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9BQzk3TkMJMHg0MDAwCS8qIEFDOTcgbm8gY29tcGF0aWJsZSBtb2RlIChyL28gMSkgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfREFDWgkweDgwMDAJLyogREFDIHplcm8tZmlsbCBtb2RlICovCisKKy8qIE1JU0MgMiBiaXRzIChBRDE5ODYgcmVnaXN0ZXIgMHg3MCkgKi8KKyNkZWZpbmUgQUM5N19BRF9NSVNDMgkJMHg3MAkvKiBNaXNjIENvbnRyb2wgQml0cyAyIChBRDE5ODYpICovCisKKyNkZWZpbmUgQUM5N19BRDE5ODZfQ1ZSRUYwCTB4MDAwNAkvKiBDL0xGRSBWUkVGX09VVCAyLjI1ViAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9DVlJFRjEJMHgwMDA4CS8qIEMvTEZFIFZSRUZfT1VUIDBWICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0NWUkVGMgkweDAwMTAJLyogQy9MRkUgVlJFRl9PVVQgMy43ViAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9DVlJFRl9NQVNLIFwKKwkoQUM5N19BRDE5ODZfQ1ZSRUYyIHwgQUM5N19BRDE5ODZfQ1ZSRUYxIHwgQUM5N19BRDE5ODZfQ1ZSRUYwKQorI2RlZmluZSBBQzk3X0FEMTk4Nl9KU01BUAkweDAwMjAJLyogSmFjayBTZW5zZSBNYXBwaW5nIDEgPSBhbHRlcm5hdGUgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTU1ESVMJMHgwMDgwCS8qIE1vbm8gTXV0ZSBEaXNhYmxlICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X01WUkVGMAkweDA0MDAJLyogTUlDIFZSRUZfT1VUIDIuMjVWICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X01WUkVGMQkweDA4MDAJLyogTUlDIFZSRUZfT1VUIDBWICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X01WUkVGMgkweDEwMDAJLyogTUlDIFZSRUZfT1VUIDMuN1YgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTVZSRUZfTUFTSyBcCisJKEFDOTdfQUQxOTg2X01WUkVGMiB8IEFDOTdfQUQxOTg2X01WUkVGMSB8IEFDOTdfQUQxOTg2X01WUkVGMCkKKworLyogTUlTQyAzIGJpdHMgKEFEMTk4NiByZWdpc3RlciAweDdhKSAqLworI2RlZmluZSBBQzk3X0FEX01JU0MzCQkweDdhCS8qIE1pc2MgQ29udHJvbCBCaXRzIDMgKEFEMTk4NikgKi8KKworI2RlZmluZSBBQzk3X0FEMTk4Nl9NTUlYCTB4MDAwNAkvKiBNaWMgTWl4LCBsZWZ0L3JpZ2h0ICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0dQTwkJMHgwMDA4CS8qIEdlbmVyYWwgUHVycG9zZSBPdXQgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTE9IUEVOCTB4MDAxMAkvKiBMSU5FX09VVCBoZWFkcGhvbmUgZHJpdmUgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTFZSRUYwCTB4MDEwMAkvKiBMSU5FX09VVCBWUkVGX09VVCAyLjI1ViAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9MVlJFRjEJMHgwMjAwCS8qIExJTkVfT1VUIFZSRUZfT1VUIDBWICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0xWUkVGMgkweDA0MDAJLyogTElORV9PVVQgVlJFRl9PVVQgMy43ViAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9MVlJFRl9NQVNLIFwKKwkoQUM5N19BRDE5ODZfTFZSRUYyIHwgQUM5N19BRDE5ODZfTFZSRUYxIHwgQUM5N19BRDE5ODZfTFZSRUYwKQorI2RlZmluZSBBQzk3X0FEMTk4Nl9KU0lOVkEJMHgwODAwCS8qIEphY2sgU2Vuc2UgSW52ZXJ0IFNFTlNFX0EgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTE9TRUwJMHgxMDAwCS8qIExJTkVfT1VUIGFtcGxpZmllcnMgaW5wdXQgc2VsZWN0ICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0hQU0VMMAkweDIwMDAJLyogSGVhZHBob25lIGFtcGxpZmllcnMgKi8KKwkJCQkJLyogICBpbnB1dCBzZWxlY3QgU3Vycm91bmQgREFDcyAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9IUFNFTDEJMHg0MDAwCS8qIEhlYWRwaG9uZSBhbXBsaWZpZXJzIGlucHV0ICovCisJCQkJCS8qICAgc2VsZWN0IEMvTEZFIERBQ3MgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfSlNJTlZCCTB4ODAwMAkvKiBKYWNrIFNlbnNlIEludmVydCBTRU5TRV9CICovCisKKy8qIFNlcmlhbCBDb25maWcgYml0cyAoQUQxOTg2IHJlZ2lzdGVyIDB4NzQpIChpbmNvbXBsZXRlKSAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9PTVMwCTB4MDEwMAkvKiBPcHRpb25hbCBNaWMgU2VsZWN0b3IgYml0IDAgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfT01TMQkweDAyMDAJLyogT3B0aW9uYWwgTWljIFNlbGVjdG9yIGJpdCAxICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X09NUzIJMHgwNDAwCS8qIE9wdGlvbmFsIE1pYyBTZWxlY3RvciBiaXQgMiAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9PTVNfTUFTSyBcCisJKEFDOTdfQUQxOTg2X09NUzIgfCBBQzk3X0FEMTk4Nl9PTVMxIHwgQUM5N19BRDE5ODZfT01TMCkKKyNkZWZpbmUgQUM5N19BRDE5ODZfT01TX00JMHgwMDAwICAvKiBNSUNfMS8yIHBpbnMgYXJlIE1JQyBzb3VyY2VzICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X09NU19MCTB4MDEwMCAgLyogTElORV9JTiBwaW5zIGFyZSBNSUMgc291cmNlcyAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9PTVNfQwkweDAyMDAgIC8qIENlbnRlci9MRkUgcGlucyBhcmUgTUNJIHNvdXJjZXMgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfT01TX01DCTB4MDQwMCAgLyogTWl4IG9mIE1JQyBhbmQgQy9MRkUgcGlucyAqLworCQkJCQkvKiAgIGFyZSBNSUMgc291cmNlcyAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9PTVNfTUwJMHgwNTAwICAvKiBNSVggb2YgTUlDIGFuZCBMSU5FX0lOIHBpbnMgKi8KKwkJCQkJLyogICBhcmUgTUlDIHNvdXJjZXMgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfT01TX0xDCTB4MDYwMCAgLyogTUlYIG9mIExJTkVfSU4gYW5kIEMvTEZFIHBpbnMgKi8KKwkJCQkJLyogICBhcmUgTUlDIHNvdXJjZXMgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfT01TX01MQwkweDA3MDAgIC8qIE1JWCBvZiBNSUMsIExJTkVfSU4sIEMvTEZFIHBpbnMgKi8KKwkJCQkJLyogICBhcmUgTUlDIHNvdXJjZXMgKi8KKwogCiBzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTk4eF9zcGRpZl9zb3VyY2VfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKQEAgLTE5NTIsOCArMjA0OSw4MCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTk4NV92cmVmb3V0X2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzWzRdID0geyJIaWdoLVoiLCAiMy43IFYiLCAiMi4yNSBWIiwgIjAgViJ9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDQ7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiAzKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMzsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkgICAgICAgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTk4NV92cmVmb3V0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RhdGljIGNvbnN0IGludCByZWcyY3RybFs0XSA9IHsyLCAwLCAxLCAzfTsKKwlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCXZhbCA9IChhYzk3LT5yZWdzW0FDOTdfQURfTUlTQ10gJiBBQzk3X0FEMTk4WF9WUkVGX01BU0spCisJICAgICAgPj4gQUM5N19BRDE5OFhfVlJFRl9TSElGVDsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gcmVnMmN0cmxbdmFsXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19hZDE5ODVfdnJlZm91dF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdGF0aWMgY29uc3QgaW50IGN0cmwycmVnWzRdID0gezEsIDIsIDAsIDN9OworCXN0cnVjdCBzbmRfYWM5NyAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IDMKKwkgICAgfHwgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXZhbCA9IGN0cmwycmVnW3Vjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF1dCisJICAgICAgPDwgQUM5N19BRDE5OFhfVlJFRl9TSElGVDsKKwlyZXR1cm4gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9NSVNDLAorCQkJCSAgICBBQzk3X0FEMTk4WF9WUkVGX01BU0ssIHZhbCk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfYWM5N19hZDE5ODVfY29udHJvbHNbXSA9IHsKLQlBQzk3X1NJTkdMRSgiRXhjaGFuZ2UgQ2VudGVyL0xGRSIsIEFDOTdfQURfU0VSSUFMX0NGRywgMywgMSwgMCkKKwlBQzk3X1NJTkdMRSgiRXhjaGFuZ2UgQ2VudGVyL0xGRSIsIEFDOTdfQURfU0VSSUFMX0NGRywgMywgMSwgMCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiRXhjaGFuZ2UgRnJvbnQvU3Vycm91bmQiLAorCQkuaW5mbyA9IHNuZF9hYzk3X2FkMTg4OF9sb2hwc2VsX2luZm8sCisJCS5nZXQgPSBzbmRfYWM5N19hZDE4ODhfbG9ocHNlbF9nZXQsCisJCS5wdXQgPSBzbmRfYWM5N19hZDE4ODhfbG9ocHNlbF9wdXQKKwl9LAorCUFDOTdfU0lOR0xFKCJIaWdoIFBhc3MgRmlsdGVyIEVuYWJsZSIsIEFDOTdfQURfVEVTVDIsIDEyLCAxLCAxKSwKKwlBQzk3X1NJTkdMRSgiU3ByZWFkIEZyb250IHRvIFN1cnJvdW5kIGFuZCBDZW50ZXIvTEZFIiwKKwkJICAgIEFDOTdfQURfTUlTQywgNywgMSwgMCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiRG93bm1peCIsCisJCS5pbmZvID0gc25kX2FjOTdfYWQxODg4X2Rvd25taXhfaW5mbywKKwkJLmdldCA9IHNuZF9hYzk3X2FkMTg4OF9kb3dubWl4X2dldCwKKwkJLnB1dCA9IHNuZF9hYzk3X2FkMTg4OF9kb3dubWl4X3B1dAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiVl9SRUZPVVQiLAorCQkuaW5mbyA9IHNuZF9hYzk3X2FkMTk4NV92cmVmb3V0X2luZm8sCisJCS5nZXQgPSBzbmRfYWM5N19hZDE5ODVfdnJlZm91dF9nZXQsCisJCS5wdXQgPSBzbmRfYWM5N19hZDE5ODVfdnJlZm91dF9wdXQKKwl9LAorCUFDOTdfU1VSUk9VTkRfSkFDS19NT0RFX0NUTCwKKwlBQzk3X0NIQU5ORUxfTU9ERV9DVEwsCisKKwlBQzk3X1NJTkdMRSgiSGVhZHBob25lIEphY2sgU2Vuc2UiLCBBQzk3X0FEX0pBQ0tfU1BESUYsIDEwLCAxLCAwKSwKKwlBQzk3X1NJTkdMRSgiTGluZSBKYWNrIFNlbnNlIiwgQUM5N19BRF9KQUNLX1NQRElGLCAxMiwgMSwgMCksCiB9OwogCiBzdGF0aWMgdm9pZCBhZDE5ODVfdXBkYXRlX2phY2tzKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKQEAgLTE5NjcsOSArMjEzNiwxNiBAQAogewogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IHBhdGNoX2FkMTk4MF9zcGVjaWZpYyhhYzk3KSkgPCAwKQorCS8qIHJlbmFtZSAweDA0IGFzICJNYXN0ZXIiIGFuZCAweDAyIGFzICJNYXN0ZXIgU3Vycm91bmQiICovCisJc25kX2FjOTdfcmVuYW1lX3ZvbF9jdGwoYWM5NywgIk1hc3RlciBQbGF5YmFjayIsCisJCQkJIk1hc3RlciBTdXJyb3VuZCBQbGF5YmFjayIpOworCXNuZF9hYzk3X3JlbmFtZV92b2xfY3RsKGFjOTcsICJIZWFkcGhvbmUgUGxheWJhY2siLCAiTWFzdGVyIFBsYXliYWNrIik7CisKKwlpZiAoKGVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsICZzbmRfYWM5N19hZDE5OHhfMmNtaWMsIDEpKSA8IDApCiAJCXJldHVybiBlcnI7Ci0JcmV0dXJuIHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsIHNuZF9hYzk3X2FkMTk4NV9jb250cm9scywgQVJSQVlfU0laRShzbmRfYWM5N19hZDE5ODVfY29udHJvbHMpKTsKKworCXJldHVybiBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCBzbmRfYWM5N19hZDE5ODVfY29udHJvbHMsCisJCQkJICAgIEFSUkFZX1NJWkUoc25kX2FjOTdfYWQxOTg1X2NvbnRyb2xzKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIHBhdGNoX2FkMTk4NV9idWlsZF9vcHMgPSB7CkBAIC0xOTg5LDI0ICsyMTY1LDMxMSBAQAogCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF9hZDE5ODVfYnVpbGRfb3BzOwogCW1pc2MgPSBzbmRfYWM5N19yZWFkKGFjOTcsIEFDOTdfQURfTUlTQyk7CiAJLyogc3dpdGNoIGZyb250L3N1cnJvdW5kIGxpbmUtb3V0L2hwLW91dCAqLwotCS8qIGNlbnRlci9MRkUsIG1pYyBpbiAzLjc1ViBtb2RlICovCiAJLyogQUQtY29tcGF0aWJsZSBtb2RlICovCiAJLyogU3RlcmVvIG11dGVzIGVuYWJsZWQgKi8KLQkvKiBpbiBhY2NvcmRhbmNlIHdpdGggQURJIGRyaXZlcjogbWlzYyB8IDB4NWMyOCAqLwogCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIEFDOTdfQURfTUlTQywgbWlzYyB8Ci0JCQkgICAgIEFDOTdfQUQxOThYX1ZSRUZIIHwKIAkJCSAgICAgQUM5N19BRDE5OFhfTE9TRUwgfAogCQkJICAgICBBQzk3X0FEMTk4WF9IUFNFTCB8Ci0JCQkgICAgIEFDOTdfQUQxOThYX0NMRElTIHwKLQkJCSAgICAgQUM5N19BRDE5OFhfTE9ESVMgfAogCQkJICAgICBBQzk3X0FEMTk4WF9NU1BMVCB8CiAJCQkgICAgIEFDOTdfQUQxOThYX0FDOTdOQyk7CiAJYWM5Ny0+ZmxhZ3MgfD0gQUM5N19TVEVSRU9fTVVURVM7CisKKwkvKiB1cGRhdGUgY3VycmVudCBqYWNrIGNvbmZpZ3VyYXRpb24gKi8KKwlhZDE5ODVfdXBkYXRlX2phY2tzKGFjOTcpOworCiAJLyogb24gQUQxOTg1IHJldi4gMywgQUMnOTcgcmV2aXNpb24gYml0cyBhcmUgemVybyAqLwogCWFjOTctPmV4dF9pZCA9IChhYzk3LT5leHRfaWQgJiB+QUM5N19FSV9SRVZfTUFTSykgfCBBQzk3X0VJX1JFVl8yMzsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzbmRfYWM5N19hZDE5ODZfYm9vbF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19hZDE5ODZfbG9zb3NlbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfYWM5NyAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwl2YWwgPSBhYzk3LT5yZWdzW0FDOTdfQURfTUlTQzNdOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHZhbCAmIEFDOTdfQUQxOTg2X0xPU0VMKSAhPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTk4Nl9sb3Nvc2VsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9hYzk3ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZXQwOworCWludCByZXQxOworCWludCBzcHJkID0gKGFjOTctPnJlZ3NbQUM5N19BRF9NSVNDXSAmIEFDOTdfQUQxOTg2X1NQUkQpICE9IDA7CisKKwlyZXQwID0gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9NSVNDMywgQUM5N19BRDE5ODZfTE9TRUwsCisJCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICE9IDAKKwkJCQkgICAgPyBBQzk3X0FEMTk4Nl9MT1NFTCA6IDApOworCWlmIChyZXQwIDwgMCkKKwkJcmV0dXJuIHJldDA7CisKKwkvKiBTT1NFTCBpcyBzZXQgdG8gdmFsdWVzIG9mICJTcHJlYWQiIG9yICJFeGNoYW5nZSBGL1MiIGNvbnRyb2xzICovCisJcmV0MSA9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfTUlTQywgQUM5N19BRDE5ODZfU09TRUwsCisJCQkJICAgICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAhPSAwCisJCQkJICAgICB8fCBzcHJkKQorCQkJCSAgICA/IEFDOTdfQUQxOTg2X1NPU0VMIDogMCk7CisJaWYgKHJldDEgPCAwKQorCQlyZXR1cm4gcmV0MTsKKworCXJldHVybiAocmV0MCA+IDAgfHwgcmV0MSA+IDApID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOTg2X3NwcmVhZF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9hYzk3ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCXZhbCA9IGFjOTctPnJlZ3NbQUM5N19BRF9NSVNDXTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh2YWwgJiBBQzk3X0FEMTk4Nl9TUFJEKSAhPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTk4Nl9zcHJlYWRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfYWM5NyAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgcmV0MDsKKwlpbnQgcmV0MTsKKwlpbnQgc3ByZCA9IChhYzk3LT5yZWdzW0FDOTdfQURfTUlTQzNdICYgQUM5N19BRDE5ODZfTE9TRUwpICE9IDA7CisKKwlyZXQwID0gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9NSVNDLCBBQzk3X0FEMTk4Nl9TUFJELAorCQkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAhPSAwCisJCQkJICAgID8gQUM5N19BRDE5ODZfU1BSRCA6IDApOworCWlmIChyZXQwIDwgMCkKKwkJcmV0dXJuIHJldDA7CisKKwkvKiBTT1NFTCBpcyBzZXQgdG8gdmFsdWVzIG9mICJTcHJlYWQiIG9yICJFeGNoYW5nZSBGL1MiIGNvbnRyb2xzICovCisJcmV0MSA9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfTUlTQywgQUM5N19BRDE5ODZfU09TRUwsCisJCQkJICAgICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAhPSAwCisJCQkJICAgICB8fCBzcHJkKQorCQkJCSAgICA/IEFDOTdfQUQxOTg2X1NPU0VMIDogMCk7CisJaWYgKHJldDEgPCAwKQorCQlyZXR1cm4gcmV0MTsKKworCXJldHVybiAocmV0MCA+IDAgfHwgcmV0MSA+IDApID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOTg2X21pY2xpc2VsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9hYzk3ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBhYzk3LT5zcGVjLmFkMTh4eC5zd2FwX21pY19saW5laW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOTg2X21pY2xpc2VsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9hYzk3ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgc3dhcCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICE9IDA7CisKKwlpZiAoc3dhcCAhPSBhYzk3LT5zcGVjLmFkMTh4eC5zd2FwX21pY19saW5laW4pIHsKKwkJYWM5Ny0+c3BlYy5hZDE4eHguc3dhcF9taWNfbGluZWluID0gc3dhcDsKKwkJaWYgKGFjOTctPmJ1aWxkX29wcy0+dXBkYXRlX2phY2tzKQorCQkJYWM5Ny0+YnVpbGRfb3BzLT51cGRhdGVfamFja3MoYWM5Nyk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19hZDE5ODZfdnJlZm91dF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCS8qIFVzZSBNSUNfMS8yIFZfUkVGT1VUIGFzIHRoZSAiZ2V0IiB2YWx1ZSAqLworCXN0cnVjdCBzbmRfYWM5NyAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJdW5zaWduZWQgc2hvcnQgcmVnID0gYWM5Ny0+cmVnc1tBQzk3X0FEX01JU0MyXTsKKwlpZiAoKHJlZyAmIEFDOTdfQUQxOTg2X01WUkVGMCkgIT0gMCkKKwkJdmFsID0gMjsKKwllbHNlIGlmICgocmVnICYgQUM5N19BRDE5ODZfTVZSRUYxKSAhPSAwKQorCQl2YWwgPSAzOworCWVsc2UgaWYgKChyZWcgJiBBQzk3X0FEMTk4Nl9NVlJFRjIpICE9IDApCisJCXZhbCA9IDE7CisJZWxzZQorCQl2YWwgPSAwOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOTg2X3ZyZWZvdXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgY3ZhbDsKKwl1bnNpZ25lZCBzaG9ydCBsdmFsOworCXVuc2lnbmVkIHNob3J0IG12YWw7CisJaW50IGNyZXQ7CisJaW50IGxyZXQ7CisJaW50IG1yZXQ7CisKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pCisJeworCWNhc2UgMDogLyogSGlnaC1aICovCisJCWN2YWwgPSAwOworCQlsdmFsID0gMDsKKwkJbXZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgMTogLyogMy43IFYgKi8KKwkJY3ZhbCA9IEFDOTdfQUQxOTg2X0NWUkVGMjsKKwkJbHZhbCA9IEFDOTdfQUQxOTg2X0xWUkVGMjsKKwkJbXZhbCA9IEFDOTdfQUQxOTg2X01WUkVGMjsKKwkJYnJlYWs7CisJY2FzZSAyOiAvKiAyLjI1IFYgKi8KKwkJY3ZhbCA9IEFDOTdfQUQxOTg2X0NWUkVGMDsKKwkJbHZhbCA9IEFDOTdfQUQxOTg2X0xWUkVGMDsKKwkJbXZhbCA9IEFDOTdfQUQxOTg2X01WUkVGMDsKKwkJYnJlYWs7CisJY2FzZSAzOiAvKiAwIFYgKi8KKwkJY3ZhbCA9IEFDOTdfQUQxOTg2X0NWUkVGMTsKKwkJbHZhbCA9IEFDOTdfQUQxOTg2X0xWUkVGMTsKKwkJbXZhbCA9IEFDOTdfQUQxOTg2X01WUkVGMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3JldCA9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfTUlTQzIsCisJCQkJICAgIEFDOTdfQUQxOTg2X0NWUkVGX01BU0ssIGN2YWwpOworCWlmIChjcmV0IDwgMCkKKwkJcmV0dXJuIGNyZXQ7CisJbHJldCA9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfTUlTQzMsCisJCQkJICAgIEFDOTdfQUQxOTg2X0xWUkVGX01BU0ssIGx2YWwpOworCWlmIChscmV0IDwgMCkKKwkJcmV0dXJuIGxyZXQ7CisJbXJldCA9IHNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfTUlTQzIsCisJCQkJICAgIEFDOTdfQUQxOTg2X01WUkVGX01BU0ssIG12YWwpOworCWlmIChtcmV0IDwgMCkKKwkJcmV0dXJuIG1yZXQ7CisKKwlyZXR1cm4gKGNyZXQgPiAwIHx8IGxyZXQgPiAwIHx8IG1yZXQgPiAwKSA/IDEgOiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2FjOTdfYWQxOTg2X2NvbnRyb2xzW10gPSB7CisJQUM5N19TSU5HTEUoIkV4Y2hhbmdlIENlbnRlci9MRkUiLCBBQzk3X0FEX1NFUklBTF9DRkcsIDMsIDEsIDApLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkV4Y2hhbmdlIEZyb250L1N1cnJvdW5kIiwKKwkJLmluZm8gPSBzbmRfYWM5N19hZDE5ODZfYm9vbF9pbmZvLAorCQkuZ2V0ID0gc25kX2FjOTdfYWQxOTg2X2xvc29zZWxfZ2V0LAorCQkucHV0ID0gc25kX2FjOTdfYWQxOTg2X2xvc29zZWxfcHV0CisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJFeGNoYW5nZSBNaWMvTGluZSBJbiIsCisJCS5pbmZvID0gc25kX2FjOTdfYWQxOTg2X2Jvb2xfaW5mbywKKwkJLmdldCA9IHNuZF9hYzk3X2FkMTk4Nl9taWNsaXNlbF9nZXQsCisJCS5wdXQgPSBzbmRfYWM5N19hZDE5ODZfbWljbGlzZWxfcHV0CisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJTcHJlYWQgRnJvbnQgdG8gU3Vycm91bmQgYW5kIENlbnRlci9MRkUiLAorCQkuaW5mbyA9IHNuZF9hYzk3X2FkMTk4Nl9ib29sX2luZm8sCisJCS5nZXQgPSBzbmRfYWM5N19hZDE5ODZfc3ByZWFkX2dldCwKKwkJLnB1dCA9IHNuZF9hYzk3X2FkMTk4Nl9zcHJlYWRfcHV0CisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJEb3dubWl4IiwKKwkJLmluZm8gPSBzbmRfYWM5N19hZDE4ODhfZG93bm1peF9pbmZvLAorCQkuZ2V0ID0gc25kX2FjOTdfYWQxODg4X2Rvd25taXhfZ2V0LAorCQkucHV0ID0gc25kX2FjOTdfYWQxODg4X2Rvd25taXhfcHV0CisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJWX1JFRk9VVCIsCisJCS5pbmZvID0gc25kX2FjOTdfYWQxOTg1X3ZyZWZvdXRfaW5mbywKKwkJLmdldCA9IHNuZF9hYzk3X2FkMTk4Nl92cmVmb3V0X2dldCwKKwkJLnB1dCA9IHNuZF9hYzk3X2FkMTk4Nl92cmVmb3V0X3B1dAorCX0sCisJQUM5N19TVVJST1VORF9KQUNLX01PREVfQ1RMLAorCUFDOTdfQ0hBTk5FTF9NT0RFX0NUTCwKKworCUFDOTdfU0lOR0xFKCJIZWFkcGhvbmUgSmFjayBTZW5zZSIsIEFDOTdfQURfSkFDS19TUERJRiwgMTAsIDEsIDApLAorCUFDOTdfU0lOR0xFKCJMaW5lIEphY2sgU2Vuc2UiLCBBQzk3X0FEX0pBQ0tfU1BESUYsIDEyLCAxLCAwKQorfTsKKworc3RhdGljIHZvaWQgYWQxOTg2X3VwZGF0ZV9qYWNrcyhzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCit7CisJdW5zaWduZWQgc2hvcnQgbWlzY192YWwgPSAwOworCXVuc2lnbmVkIHNob3J0IHNlcl92YWw7CisKKwkvKiBkaXNhYmxlIFNVUlJPVU5EIGFuZCBDRU5URVIvTEZFIGlmIG5vdCBzdXJyb3VuZCBtb2RlICovCisJaWYgKCEgaXNfc3Vycm91bmRfb24oYWM5NykpCisJCW1pc2NfdmFsIHw9IEFDOTdfQUQxOTg2X1NPRElTOworCWlmICghIGlzX2NsZmVfb24oYWM5NykpCisJCW1pc2NfdmFsIHw9IEFDOTdfQUQxOTg2X0NMRElTOworCisJLyogc2VsZWN0IGxpbmUgaW5wdXQgKGRlZmF1bHQ9TElORV9JTiwgU1VSUk9VTkQgb3IgTUlDXzEvMikgKi8KKwlpZiAoaXNfc2hhcmVkX2xpbmVpbihhYzk3KSkKKwkJbWlzY192YWwgfD0gQUM5N19BRDE5ODZfTElTRUxfU1VSUjsKKwllbHNlIGlmIChhYzk3LT5zcGVjLmFkMTh4eC5zd2FwX21pY19saW5laW4gIT0gMCkKKwkJbWlzY192YWwgfD0gQUM5N19BRDE5ODZfTElTRUxfTUlDOworCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfTUlTQywKKwkJCSAgICAgQUM5N19BRDE5ODZfU09ESVMgfCBBQzk3X0FEMTk4Nl9DTERJUyB8CisJCQkgICAgIEFDOTdfQUQxOTg2X0xJU0VMX01BU0ssCisJCQkgICAgIG1pc2NfdmFsKTsKKworCS8qIHNlbGVjdCBtaWNyb3Bob25lIGlucHV0IChNSUNfMS8yLCBDZW50ZXIvTEZFIG9yIExJTkVfSU4pICovCisJaWYgKGlzX3NoYXJlZF9taWNpbihhYzk3KSkKKwkJc2VyX3ZhbCA9IEFDOTdfQUQxOTg2X09NU19DOworCWVsc2UgaWYgKGFjOTctPnNwZWMuYWQxOHh4LnN3YXBfbWljX2xpbmVpbiAhPSAwKQorCQlzZXJfdmFsID0gQUM5N19BRDE5ODZfT01TX0w7CisJZWxzZQorCQlzZXJfdmFsID0gQUM5N19BRDE5ODZfT01TX007CisJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9TRVJJQUxfQ0ZHLAorCQkJICAgICBBQzk3X0FEMTk4Nl9PTVNfTUFTSywKKwkJCSAgICAgc2VyX3ZhbCk7Cit9CisKK3N0YXRpYyBpbnQgcGF0Y2hfYWQxOTg2X3NwZWNpZmljKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCAmc25kX2FjOTdfYWQxOTh4XzJjbWljLCAxKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsIHNuZF9hYzk3X2FkMTk4Nl9jb250cm9scywKKwkJCQkgICAgQVJSQVlfU0laRShzbmRfYWM5N19hZDE5ODVfY29udHJvbHMpKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idWlsZF9vcHMgcGF0Y2hfYWQxOTg2X2J1aWxkX29wcyA9IHsKKwkuYnVpbGRfcG9zdF9zcGRpZiA9IHBhdGNoX2FkMTk4eF9wb3N0X3NwZGlmLAorCS5idWlsZF9zcGVjaWZpYyA9IHBhdGNoX2FkMTk4Nl9zcGVjaWZpYywKKyNpZmRlZiBDT05GSUdfUE0KKwkucmVzdW1lID0gYWQxOHh4X3Jlc3VtZSwKKyNlbmRpZgorCS51cGRhdGVfamFja3MgPSBhZDE5ODZfdXBkYXRlX2phY2tzLAorfTsKKworaW50IHBhdGNoX2FkMTk4NihzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQoreworCXBhdGNoX2FkMTg4MShhYzk3KTsKKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfYWQxOTg2X2J1aWxkX29wczsKKwlhYzk3LT5mbGFncyB8PSBBQzk3X1NURVJFT19NVVRFUzsKKworCS8qIHVwZGF0ZSBjdXJyZW50IGphY2sgY29uZmlndXJhdGlvbiAqLworCWFkMTk4Nl91cGRhdGVfamFja3MoYWM5Nyk7CisKKwlyZXR1cm4gMDsKK30KKworCiAvKgogICogcmVhbHRlayBBTEM2NXgvODUwIGNvZGVjcwogICovCkBAIC0yMDE0LDEyICsyNDc3LDEyIEBACiB7CiAJaW50IHNoYXJlZDsKIAkKLQkvKiBzaGFyZWQgTGluZS1JbiAqLwotCXNoYXJlZCA9IGlzX3NoYXJlZF9saW5laW4oYWM5Nyk7CisJLyogc2hhcmVkIExpbmUtSW4gLyBTdXJyb3VuZCBPdXQgKi8KKwlzaGFyZWQgPSBpc19zaGFyZWRfc3Vycm91dChhYzk3KTsKIAlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FMQzY1MF9NVUxUSUNILCAxIDw8IDksCiAJCQkgICAgIHNoYXJlZCA/ICgxIDw8IDkpIDogMCk7Ci0JLyogdXBkYXRlIHNoYXJlZCBNaWMgKi8KLQlzaGFyZWQgPSBpc19zaGFyZWRfbWljaW4oYWM5Nyk7CisJLyogdXBkYXRlIHNoYXJlZCBNaWMgSW4gLyBDZW50ZXIvTEZFIE91dCAqLworCXNoYXJlZCA9IGlzX3NoYXJlZF9jbGZlb3V0KGFjOTcpOwogCS8qIGRpc2FibGUvZW5hYmxlIHZyZWYgKi8KIAlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FMQzY1MF9DTE9DSywgMSA8PCAxMiwKIAkJCSAgICAgc2hhcmVkID8gKDEgPDwgMTIpIDogMCk7CkBAIC0yMDY0LDcgKzI1MjcsNyBAQAogCS8qIEFDOTdfU0lOR0xFKCJJRUM5NTggSW5wdXQgTW9uaXRvciIsIEFDOTdfQUxDNjUwX01VTFRJQ0gsIDEzLCAxLCAwKSwgKi8KIH07CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV81Yml0XzNkYl9tYXgsIC00MzUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzViaXRfM2RiX21heCwgLTQzNTAsIDE1MCwgMCk7CiAKIHN0YXRpYyBpbnQgcGF0Y2hfYWxjNjUwX3NwZWNpZmljKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CkBAIC0yMTQ5LDEyICsyNjEyLDEyIEBACiB7CiAJaW50IHNoYXJlZDsKIAkKLQkvKiBzaGFyZWQgTGluZS1JbiAqLwotCXNoYXJlZCA9IGlzX3NoYXJlZF9saW5laW4oYWM5Nyk7CisJLyogc2hhcmVkIExpbmUtSW4gLyBTdXJyb3VuZCBPdXQgKi8KKwlzaGFyZWQgPSBpc19zaGFyZWRfc3Vycm91dChhYzk3KTsKIAlhYzk3X3VwZGF0ZV9iaXRzX3BhZ2UoYWM5NywgQUM5N19BTEM2NTBfTVVMVElDSCwgMSA8PCA5LAogCQkJICAgICAgc2hhcmVkID8gKDEgPDwgOSkgOiAwLCAwKTsKLQkvKiB1cGRhdGUgc2hhcmVkIG1pYyAqLwotCXNoYXJlZCA9IGlzX3NoYXJlZF9taWNpbihhYzk3KTsKKwkvKiB1cGRhdGUgc2hhcmVkIE1pYyBJbiAvIENlbnRlci9MRkUgT3V0ICovCisJc2hhcmVkID0gaXNfc2hhcmVkX2NsZmVvdXQoYWM5Nyk7CiAJLyogbWlzYyBjb250cm9sOyB2cmVmb3V0IGRpc2FibGUgKi8KIAlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FMQzY1MF9DTE9DSywgMSA8PCAxMiwKIAkJCSAgICAgc2hhcmVkID8gKDEgPDwgMTIpIDogMCk7CkBAIC0yMjY0LDcgKzI3MjcsOCBAQAogCQlpZiAoYWM5Ny0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDE0NjIgJiYKIAkJICAgIChhYzk3LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDEzMSB8fCAvKiBNU0kgUzI3MCBsYXB0b3AgKi8KIAkJICAgICBhYzk3LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDE2MSB8fCAvKiBMRyBLMSBFeHByZXNzICovCi0JCSAgICAgYWM5Ny0+c3Vic3lzdGVtX2RldmljZSA9PSAweDAzNTEpKSAgLyogTVNJIEw3MjUgbGFwdG9wICovCisJCSAgICAgYWM5Ny0+c3Vic3lzdGVtX2RldmljZSA9PSAweDAzNTEgfHwgLyogTVNJIEw3MjUgbGFwdG9wICovCisJCSAgICAgYWM5Ny0+c3Vic3lzdGVtX2RldmljZSA9PSAweDAwNjEpKSAgLyogTVNJIFMyNTAgbGFwdG9wICovCiAJCQl2YWwgJj0gfigxIDw8IDEpOyAvKiBQaW4gNDcgaXMgRUFQRCAoZm9yIGludGVybmFsIHNwZWFrZXIpICovCiAJCWVsc2UKIAkJCXZhbCB8PSAoMSA8PCAxKTsgLyogUGluIDQ3IGlzIHNwZGlmIGlucHV0IHBpbiAqLwpAQCAtMjI5NywxNiArMjc2MSwxNiBAQAogewogCWludCBzaGFyZWQ7CiAJCi0JLyogc2hhcmVkIExpbmUtSW4gKi8KLQlzaGFyZWQgPSBpc19zaGFyZWRfbGluZWluKGFjOTcpOworCS8qIHNoYXJlZCBMaW5lLUluIC8gU3Vycm91bmQgT3V0ICovCisJc2hhcmVkID0gaXNfc2hhcmVkX3N1cnJvdXQoYWM5Nyk7CiAJLyogU1VSUiAxa09obSAoYml0NCksIEFtcCAoYml0NSkgKi8KIAlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FMQzg1MF9NSVNDMSwgKDE8PDQpfCgxPDw1KSwKIAkJCSAgICAgc2hhcmVkID8gKDE8PDUpIDogKDE8PDQpKTsKIAkvKiBMSU5FLUlOID0gMCwgU1VSUk9VTkQgPSAyICovCiAJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BTEM4NTBfSkFDS19TRUxFQ1QsIDcgPDwgMTIsCiAJCQkgICAgIHNoYXJlZCA/ICgyPDwxMikgOiAoMDw8MTIpKTsKLQkvKiB1cGRhdGUgc2hhcmVkIG1pYyAqLwotCXNoYXJlZCA9IGlzX3NoYXJlZF9taWNpbihhYzk3KTsKKwkvKiB1cGRhdGUgc2hhcmVkIE1pYyBJbiAvIENlbnRlci9MRkUgT3V0ICovCisJc2hhcmVkID0gaXNfc2hhcmVkX2NsZmVvdXQoYWM5Nyk7CiAJLyogVnJlZiBkaXNhYmxlIChiaXQxMiksIDFrT2htIChiaXQxMykgKi8KIAlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FMQzg1MF9NSVNDMSwgKDE8PDEyKXwoMTw8MTMpLAogCQkJICAgICBzaGFyZWQgPyAoMTw8MTIpIDogKDE8PDEzKSk7CkBAIC0yMzc5LDkgKzI4NDMsOSBAQAogICovCiBzdGF0aWMgdm9pZCBjbTk3MzhfdXBkYXRlX2phY2tzKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKIHsKLQkvKiBzaGFyZWQgTGluZS1JbiAqLworCS8qIHNoYXJlZCBMaW5lLUluIC8gU3Vycm91bmQgT3V0ICovCiAJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19DTTk3MzhfVkVORE9SX0NUUkwsIDEgPDwgMTAsCi0JCQkgICAgIGlzX3NoYXJlZF9saW5laW4oYWM5NykgPyAoMSA8PCAxMCkgOiAwKTsKKwkJCSAgICAgaXNfc2hhcmVkX3N1cnJvdXQoYWM5NykgPyAoMSA8PCAxMCkgOiAwKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9hYzk3X2NtOTczOF9jb250cm9sc1tdID0gewpAQCAtMjQ2MywxMiArMjkyNywxMiBAQAogCiBzdGF0aWMgdm9pZCBjbTk3MzlfdXBkYXRlX2phY2tzKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKIHsKLQkvKiBzaGFyZWQgTGluZS1JbiAqLworCS8qIHNoYXJlZCBMaW5lLUluIC8gU3Vycm91bmQgT3V0ICovCiAJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19DTTk3MzlfTVVMVElfQ0hBTiwgMSA8PCAxMCwKLQkJCSAgICAgaXNfc2hhcmVkX2xpbmVpbihhYzk3KSA/ICgxIDw8IDEwKSA6IDApOwotCS8qIHNoYXJlZCBNaWMgKi8KKwkJCSAgICAgaXNfc2hhcmVkX3N1cnJvdXQoYWM5NykgPyAoMSA8PCAxMCkgOiAwKTsKKwkvKiBzaGFyZWQgTWljIEluIC8gQ2VudGVyL0xGRSBPdXQgKiovCiAJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19DTTk3MzlfTVVMVElfQ0hBTiwgMHgzMDAwLAotCQkJICAgICBpc19zaGFyZWRfbWljaW4oYWM5NykgPyAweDEwMDAgOiAweDIwMDApOworCQkJICAgICBpc19zaGFyZWRfY2xmZW91dChhYzk3KSA/IDB4MTAwMCA6IDB4MjAwMCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfYWM5N19jbTk3MzlfY29udHJvbHNbXSA9IHsKQEAgLTI1ODAsOCArMzA0NCw4IEBACiAKIAl2YWwgfD0gc3Vycl9vblthYzk3LT5zcGVjLmRldl9mbGFnc11baXNfc3Vycm91bmRfb24oYWM5NyldOwogCXZhbCB8PSBjbGZlX29uW2FjOTctPnNwZWMuZGV2X2ZsYWdzXVtpc19jbGZlX29uKGFjOTcpXTsKLQl2YWwgfD0gc3Vycl9zaGFyZWRbYWM5Ny0+c3BlYy5kZXZfZmxhZ3NdW2lzX3NoYXJlZF9saW5laW4oYWM5NyldOwotCXZhbCB8PSBjbGZlX3NoYXJlZFthYzk3LT5zcGVjLmRldl9mbGFnc11baXNfc2hhcmVkX21pY2luKGFjOTcpXTsKKwl2YWwgfD0gc3Vycl9zaGFyZWRbYWM5Ny0+c3BlYy5kZXZfZmxhZ3NdW2lzX3NoYXJlZF9zdXJyb3V0KGFjOTcpXTsKKwl2YWwgfD0gY2xmZV9zaGFyZWRbYWM5Ny0+c3BlYy5kZXZfZmxhZ3NdW2lzX3NoYXJlZF9jbGZlb3V0KGFjOTcpXTsKIAogCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQ005NzYxX01VTFRJX0NIQU4sIDB4M2M4OCwgdmFsKTsKIH0KQEAgLTI4MjEsNiArMzI4NSw3IEBACiAJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgMHg1YywgMHgyMCk7CiAJYWM5Ny0+ZXh0X2lkIHw9IEFDOTdfRUlfU1BESUY7CS8qIGZvcmNlIHRoZSBkZXRlY3Rpb24gb2Ygc3BkaWYgKi8KIAlhYzk3LT5yYXRlc1tBQzk3X1JBVEVTX1NQRElGXSA9IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDA7CisJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3Z0MTYxNl9vcHM7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI4MjgsMTIgKzMyOTMsMTIgQEAKICAqLwogc3RhdGljIHZvaWQgaXQyNjQ2X3VwZGF0ZV9qYWNrcyhzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCiB7Ci0JLyogc2hhcmVkIExpbmUtSW4gKi8KKwkvKiBzaGFyZWQgTGluZS1JbiAvIFN1cnJvdW5kIE91dCAqLwogCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIDB4NzYsIDEgPDwgOSwKLQkJCSAgICAgaXNfc2hhcmVkX2xpbmVpbihhYzk3KSA/ICgxPDw5KSA6IDApOwotCS8qIHNoYXJlZCBNaWMgKi8KKwkJCSAgICAgaXNfc2hhcmVkX3N1cnJvdXQoYWM5NykgPyAoMTw8OSkgOiAwKTsKKwkvKiBzaGFyZWQgTWljIC8gQ2VudGVyL0xGRSBPdXQgKi8KIAlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCAweDc2LCAxIDw8IDEwLAotCQkJICAgICBpc19zaGFyZWRfbWljaW4oYWM5NykgPyAoMTw8MTApIDogMCk7CisJCQkgICAgIGlzX3NoYXJlZF9jbGZlb3V0KGFjOTcpID8gKDE8PDEwKSA6IDApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2FjOTdfY29udHJvbHNfaXQyNjQ2W10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmggYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmgKaW5kZXggNzQxOTc5Mi4uOTQzNDBkYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5oCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guaApAQCAtNDgsNiArNDgsNyBAQAogaW50IHBhdGNoX2FkMTk4MWEoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7CiBpbnQgcGF0Y2hfYWQxOTgxYihzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKIGludCBwYXRjaF9hZDE5ODUoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7CitpbnQgcGF0Y2hfYWQxOTg2KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwogaW50IHBhdGNoX2FsYzY1MChzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKIGludCBwYXRjaF9hbGM2NTUoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7CiBpbnQgcGF0Y2hfYWxjODUwKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvYWs0NTMxX2NvZGVjLmMgYi9zb3VuZC9wY2kvYWM5Ny9hazQ1MzFfY29kZWMuYwppbmRleCBjMTUzY2I3Li5kYzI2ODIwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hazQ1MzFfY29kZWMuYworKysgYi9zb3VuZC9wY2kvYWM5Ny9hazQ1MzFfY29kZWMuYwpAQCAtMjY3LDkgKzI2Nyw5IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX21hc3RlciwgLTYyMDAsIDIwMCwgMCk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfbW9ubywgLTI4MDAsIDQwMCwgMCk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfaW5wdXQsIC01MDAwLCAyMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX21hc3RlciwgLTYyMDAsIDIwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfbW9ubywgLTI4MDAsIDQwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfaW5wdXQsIC01MDAwLCAyMDAsIDApOwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2FrNDUzMV9jb250cm9sc1tdID0gewogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzMzAwLmMgYi9zb3VuZC9wY2kvYWxzMzAwLmMKaW5kZXggOWY0MDZmYi4uOGFmY2I5OCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsczMwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHMzMDAuYwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgc25kX2FsczMwMF9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCQlzbmRfcGNtX2h3X3BhcmFtc190ICogaHdfcGFyYW1zKQorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKIHsKIAlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKIAkJCQkJcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKQEAgLTY3Myw3ICs2NzMsNyBAQAogCXNuZF9hbHMzMDBfZGJnY2FsbGxlYXZlKCk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9hbHMzMDBfY3JlYXRlKHNuZF9jYXJkX3QgKmNhcmQsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYWxzMzAwX2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCiAJCQkJICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2ksIGludCBjaGlwX3R5cGUsCiAJCQkJICAgICAgIHN0cnVjdCBzbmRfYWxzMzAwICoqcmNoaXApCiB7CkBAIC02ODEsNyArNjgxLDcgQEAKIAl2b2lkICppcnFfaGFuZGxlcjsKIAlpbnQgZXJyOwogCi0Jc3RhdGljIHNuZF9kZXZpY2Vfb3BzX3Qgb3BzID0geworCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgb3BzID0gewogCQkuZGV2X2ZyZWUgPSBzbmRfYWxzMzAwX2Rldl9mcmVlLAogCX07CiAJKnJjaGlwID0gTlVMTDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdGlpeHAuYyBiL3NvdW5kL3BjaS9hdGlpeHAuYwppbmRleCA0NzZjMzQzLi43ZDgwNTNiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXRpaXhwLmMKKysrIGIvc291bmQvcGNpL2F0aWl4cC5jCkBAIC00NSw2ICs0NSw3IEBACiBzdGF0aWMgaW50IGFjOTdfY2xvY2sgPSA0ODAwMDsKIHN0YXRpYyBjaGFyICphYzk3X3F1aXJrOwogc3RhdGljIGludCBzcGRpZl9hY2xpbmsgPSAxOworc3RhdGljIGludCBhYzk3X2NvZGVjID0gLTE7CiAKIG1vZHVsZV9wYXJhbShpbmRleCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgQVRJIElYUCBjb250cm9sbGVyLiIpOwpAQCAtNTQsNiArNTUsOCBAQAogTU9EVUxFX1BBUk1fREVTQyhhYzk3X2Nsb2NrLCAiQUMnOTcgY29kZWMgY2xvY2sgKGRlZmF1bHQgNDgwMDBIeikuIik7CiBtb2R1bGVfcGFyYW0oYWM5N19xdWlyaywgY2hhcnAsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhYzk3X3F1aXJrLCAiQUMnOTcgd29ya2Fyb3VuZCBmb3Igc3RyYW5nZSBoYXJkd2FyZS4iKTsKK21vZHVsZV9wYXJhbShhYzk3X2NvZGVjLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhYzk3X2NvZGVjLCAiU3BlY2lmeSBjb2RlYyBpbnN0ZWFkIG9mIHByb2JpbmcuIik7CiBtb2R1bGVfcGFyYW0oc3BkaWZfYWNsaW5rLCBib29sLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc3BkaWZfYWNsaW5rLCAiUy9QRElGIG92ZXIgQUMtbGluay4iKTsKIApAQCAtMjkzLDYgKzI5NiwxMCBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX2F0aWl4cF9pZHMpOwogCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgYXRpaXhwX3F1aXJrc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJU05EX1BDSV9RVUlSSygweDE1YmQsIDB4MzEwMCwgIkRGSSBSUzQ4MiIsIDApLAorCXsgfSAvKiB0ZXJtaW5hdG9yICovCit9OwogCiAvKgogICogbG93bGV2ZWwgZnVuY3Rpb25zCkBAIC01NTMsMTEgKzU2MCwzMyBAQAogCSAgICAgQVRJX1JFR19JU1JfQ09ERUMyX05PVF9SRUFEWSkKICNkZWZpbmUgQ09ERUNfQ0hFQ0tfQklUUyAoQUxMX0NPREVDX05PVF9SRUFEWXxBVElfUkVHX0lTUl9ORVdfRlJBTUUpCiAKK3N0YXRpYyBpbnQgYWM5N19wcm9iaW5nX2J1Z3Moc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwljb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqcTsKKworCXEgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChwY2ksIGF0aWl4cF9xdWlya3MpOworCWlmIChxKSB7CisJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiQXRpaXhwIHF1aXJrIGZvciAlcy4gICIKKwkJCSAgICAiRm9yY2luZyBjb2RlYyAlZFxuIiwgcS0+bmFtZSwgcS0+dmFsdWUpOworCQlyZXR1cm4gcS0+dmFsdWU7CisJfQorCS8qIHRoaXMgaGFyZHdhcmUgZG9lc24ndCBuZWVkIHdvcmthcm91bmRzLiAgUHJvYmUgZm9yIGNvZGVjICovCisJcmV0dXJuIC0xOworfQorCiBzdGF0aWMgaW50IHNuZF9hdGlpeHBfY29kZWNfZGV0ZWN0KHN0cnVjdCBhdGlpeHAgKmNoaXApCiB7CiAJaW50IHRpbWVvdXQ7CiAKIAljaGlwLT5jb2RlY19ub3RfcmVhZHlfYml0cyA9IDA7CisJaWYgKGFjOTdfY29kZWMgPT0gLTEpCisJCWFjOTdfY29kZWMgPSBhYzk3X3Byb2JpbmdfYnVncyhjaGlwLT5wY2kpOworCWlmIChhYzk3X2NvZGVjID49IDApIHsKKwkJY2hpcC0+Y29kZWNfbm90X3JlYWR5X2JpdHMgfD0gCisJCQlDT0RFQ19DSEVDS19CSVRTIF4gKDEgPDwgKGFjOTdfY29kZWMgKyAxMCkpOworCQlyZXR1cm4gMDsKKwl9CisKIAlhdGlpeHBfd3JpdGUoY2hpcCwgSUVSLCBDT0RFQ19DSEVDS19CSVRTKTsKIAkvKiB3YWl0IGZvciB0aGUgaW50ZXJydXB0cyAqLwogCXRpbWVvdXQgPSA1MDsKQEAgLTEzOTYsNyArMTQyNSw3IEBACiAJCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKIAkJYWM5Ny5wY2kgPSBjaGlwLT5wY2k7CiAJCWFjOTcubnVtID0gaTsKLQkJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX01PREVNOworCQlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX1NLSVBfTU9ERU0gfCBBQzk3X1NDQVBfUE9XRVJfU0FWRTsKIAkJaWYgKCEgY2hpcC0+c3BkaWZfb3Zlcl9hY2xpbmspCiAJCQlhYzk3LnNjYXBzIHw9IEFDOTdfU0NBUF9OT19TUERJRjsKIAkJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmNoaXAtPmFjOTdbaV0pKSA8IDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYyBiL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYwppbmRleCBjYzJlNmI5Li45MDQwMjNmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKKysrIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCkBAIC0xMDkwLDcgKzEwOTAsNyBAQAogCQlhYzk3LnByaXZhdGVfZGF0YSA9IGNoaXA7CiAJCWFjOTcucGNpID0gY2hpcC0+cGNpOwogCQlhYzk3Lm51bSA9IGk7Ci0JCWFjOTcuc2NhcHMgPSBBQzk3X1NDQVBfU0tJUF9BVURJTzsKKwkJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX0FVRElPIHwgQUM5N19TQ0FQX1BPV0VSX1NBVkU7CiAJCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZjaGlwLT5hYzk3W2ldKSkgPCAwKSB7CiAJCQljaGlwLT5hYzk3W2ldID0gTlVMTDsgLyogdG8gYmUgc3VyZSAqLwogCQkJc25kX3ByaW50ZGQoImF0aWl4cC1tb2RlbTogY29kZWMgJWQgbm90IGF2YWlsYWJsZSBmb3IgbW9kZW1cbiIsIGkpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCmluZGV4IGY2MWYwNTIuLmVhNjcxMmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYworKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKQEAgLTEzODIsNyArMTM4Miw2IEBACiAJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgU1BESUZfU0VMRUNUMSwgMCwgMHhmKTsKIAlzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCBTUERJRl9TRUxFQ1QyLCAwLCAweDAwMGYwMDAwKTsgLyogMHgwYjAwMDAwMCBmb3IgZGlnaXRhbCwgMHgwMDBiMDAwMCBmb3IgYW5hbG9nLCBmcm9tIHdpbjIwMDAgZHJpdmVycy4gVXNlIDB4MDAwZjAwMDAgZm9yIHN1cnJvdW5kNzEgKi8KIAljaGlwLT5zcGRpZl9lbmFibGUgPSAwOyAvKiBTZXQgZGlnaXRhbCBTUERJRiBvdXRwdXQgb2ZmICovCi0JY2hpcC0+Y2FwdHVyZV9zb3VyY2UgPSAzOyAvKiBTZXQgQ0FQVFVSRV9TT1VSQ0UgKi8KIAkvL3NuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIDB4NDUsIDAsIDApOyAvKiBBbmFsb2d1ZSBvdXQgKi8KIAkvL3NuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIDB4NDUsIDAsIDB4ZjAwKTsgLyogRGlnaXRhbCBvdXQgKi8KIApAQCAtMTQwMiw4ICsxNDAxLDIyIEBACiAJCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIFBMQVlCQUNLX1ZPTFVNRTEsIGNoLCAweGZmZmZmZmZmKTsgLyogTXV0ZSAqLwogCQlzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCBQTEFZQkFDS19WT0xVTUUyLCBjaCwgMHhmZmZmZmZmZik7IC8qIE11dGUgKi8KIAl9Ci0gICAgICAgIHNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIENBUFRVUkVfU09VUkNFLCAweDAsIDB4MzMzMzAwZTQpOyAvKiBTZWxlY3QgTUlDLCBMaW5lIGluLCBUQUQgaW4sIEFVWCBpbiAqLwotCWNoaXAtPmNhcHR1cmVfc291cmNlID0gMzsgLyogU2V0IENBUFRVUkVfU09VUkNFICovCisJaWYgKGNoaXAtPmRldGFpbHMtPmkyY19hZGMgPT0gMSkgeworCSAgICAgICAgLyogU2VsZWN0IE1JQywgTGluZSBpbiwgVEFEIGluLCBBVVggaW4gKi8KKwkgICAgICAgIHNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIENBUFRVUkVfU09VUkNFLCAweDAsIDB4MzMzMzAwZTQpOworCQkvKiBEZWZhdWx0IHRvIENBUFRVUkVfU09VUkNFIHRvIGkycyBpbiAqLworCQljaGlwLT5jYXB0dXJlX3NvdXJjZSA9IDM7CisJfSBlbHNlIGlmIChjaGlwLT5kZXRhaWxzLT5hYzk3ID09IDEpIHsKKwkgICAgICAgIC8qIERlZmF1bHQgdG8gQUM5NyBpbiAqLworCSAgICAgICAgc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgQ0FQVFVSRV9TT1VSQ0UsIDB4MCwgMHg0NDQ0MDBlNCk7CisJCS8qIERlZmF1bHQgdG8gQ0FQVFVSRV9TT1VSQ0UgdG8gQUM5NyBpbiAqLworCQljaGlwLT5jYXB0dXJlX3NvdXJjZSA9IDQ7CisJfSBlbHNlIHsKKwkgICAgICAgIC8qIFNlbGVjdCBNSUMsIExpbmUgaW4sIFRBRCBpbiwgQVVYIGluICovCisJICAgICAgICBzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCBDQVBUVVJFX1NPVVJDRSwgMHgwLCAweDMzMzMwMGU0KTsKKwkJLyogRGVmYXVsdCB0byBTZXQgQ0FQVFVSRV9TT1VSQ0UgdG8gaTJzIGluICovCisJCWNoaXAtPmNhcHR1cmVfc291cmNlID0gMzsKKwl9CiAKICAgICAgICAgaWYgKGNoaXAtPmRldGFpbHMtPmdwaW9fdHlwZSA9PSAyKSB7IC8qIFRoZSBTQjA0MzggdXNlIEdQSU8gZGlmZmVyZW50bHkuICovCiAJCS8qIEZJWE1FOiBTdGlsbCBuZWVkIHRvIGZpbmQgb3V0IHdoYXQgdGhlIG90aGVyIEdQSU8gYml0cyBkby4gRS5nLiBGb3IgZGlnaXRhbCBzcGRpZiBvdXQuICovCkBAIC0xNjA1LDYgKzE2MTgsOCBAQAogCXNuZF9jYTAxMDZfcHJvY19pbml0KGNoaXApOwogI2VuZGlmCiAKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwY2ktPmRldik7CisKIAlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21peGVyLmMgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9taXhlci5jCmluZGV4IDk4NTVmNTIuLmI5MTNhMWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21peGVyLmMKKysrIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWl4ZXIuYwpAQCAtNzQsOCArNzQsOCBAQAogCiAjaW5jbHVkZSAiY2EwMTA2LmgiCiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShzbmRfY2EwMTA2X2RiX3NjYWxlMSwgLTUxNzUsIDI1LCAxKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShzbmRfY2EwMTA2X2RiX3NjYWxlMiwgLTEwMzUwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoc25kX2NhMDEwNl9kYl9zY2FsZTEsIC01MTc1LCAyNSwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoc25kX2NhMDEwNl9kYl9zY2FsZTIsIC0xMDM1MCwgNTAsIDEpOwogCiBzdGF0aWMgaW50IHNuZF9jYTAxMDZfc2hhcmVkX3NwZGlmX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCkBAIC00ODIsMTkgKzQ4Miw2IEBACiAJLnByaXZhdGVfdmFsdWUgPSAoKGNoaWQpIDw8IDgpIHwgKHJlZykJCQlcCiB9CiAKLSNkZWZpbmUgSTJDX1ZPTFVNRSh4bmFtZSxjaGlkKSBcCi17CQkJCQkJCQlcCi0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsCVwKLQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CQlcCi0JICAgICAgICAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCwJCVwKLQkuaW5mbyA9ICBzbmRfY2EwMTA2X2kyY192b2x1bWVfaW5mbywJCQlcCi0JLmdldCA9ICAgc25kX2NhMDEwNl9pMmNfdm9sdW1lX2dldCwJCQlcCi0JLnB1dCA9ICAgc25kX2NhMDEwNl9pMmNfdm9sdW1lX3B1dCwJCQlcCi0JLnRsdiA9IHsgLnAgPSBzbmRfY2EwMTA2X2RiX3NjYWxlMiB9LAkJCVwKLQkucHJpdmF0ZV92YWx1ZSA9IGNoaWQJCQkJCVwKLX0KLQotCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2NhMDEwNl92b2x1bWVfY3Rsc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJQ0FfVk9MVU1FKCJBbmFsb2cgRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwKIAkJICBDT05UUk9MX0ZST05UX0NIQU5ORUwsIFBMQVlCQUNLX1ZPTFVNRTIpLApAQCAtNTE3LDExICs1MDQsNiBAQAogICAgICAgICBDQV9WT0xVTUUoIkNBUFRVUkUgZmVlZGJhY2sgUGxheWJhY2sgVm9sdW1lIiwKIAkJICAxLCBDQVBUVVJFX0NPTlRST0wpLAogCi0gICAgICAgIEkyQ19WT0xVTUUoIlBob25lIENhcHR1cmUgVm9sdW1lIiwgMCksCi0gICAgICAgIEkyQ19WT0xVTUUoIk1pYyBDYXB0dXJlIFZvbHVtZSIsIDEpLAotICAgICAgICBJMkNfVk9MVU1FKCJMaW5lIGluIENhcHR1cmUgVm9sdW1lIiwgMiksCi0gICAgICAgIEkyQ19WT0xVTUUoIkF1eCBDYXB0dXJlIFZvbHVtZSIsIDMpLAotCiAJewogCQkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCiAJCS5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCkBAIC01MzksMTQgKzUyMSwxNCBAQAogCX0sCiAJewogCQkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPQkJIkRpZ2l0YWwgQ2FwdHVyZSBTb3VyY2UiLAorCQkubmFtZSA9CQkiRGlnaXRhbCBTb3VyY2UgQ2FwdHVyZSBFbnVtIiwKIAkJLmluZm8gPQkJc25kX2NhMDEwNl9jYXB0dXJlX3NvdXJjZV9pbmZvLAogCQkuZ2V0ID0JCXNuZF9jYTAxMDZfY2FwdHVyZV9zb3VyY2VfZ2V0LAogCQkucHV0ID0JCXNuZF9jYTAxMDZfY2FwdHVyZV9zb3VyY2VfcHV0CiAJfSwKIAl7CiAJCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9CQkiQ2FwdHVyZSBTb3VyY2UiLAorCQkubmFtZSA9CQkiQW5hbG9nIFNvdXJjZSBDYXB0dXJlIEVudW0iLAogCQkuaW5mbyA9CQlzbmRfY2EwMTA2X2kyY19jYXB0dXJlX3NvdXJjZV9pbmZvLAogCQkuZ2V0ID0JCXNuZF9jYTAxMDZfaTJjX2NhcHR1cmVfc291cmNlX2dldCwKIAkJLnB1dCA9CQlzbmRfY2EwMTA2X2kyY19jYXB0dXJlX3NvdXJjZV9wdXQKQEAgLTU2MSw2ICs1NDMsMjUgQEAKIAl9LAogfTsKIAorI2RlZmluZSBJMkNfVk9MVU1FKHhuYW1lLGNoaWQpIFwKK3sJCQkJCQkJCVwKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwJXAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwJCVwKKwkgICAgICAgICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFELAkJXAorCS5pbmZvID0gIHNuZF9jYTAxMDZfaTJjX3ZvbHVtZV9pbmZvLAkJCVwKKwkuZ2V0ID0gICBzbmRfY2EwMTA2X2kyY192b2x1bWVfZ2V0LAkJCVwKKwkucHV0ID0gICBzbmRfY2EwMTA2X2kyY192b2x1bWVfcHV0LAkJCVwKKwkudGx2ID0geyAucCA9IHNuZF9jYTAxMDZfZGJfc2NhbGUyIH0sCQkJXAorCS5wcml2YXRlX3ZhbHVlID0gY2hpZAkJCQkJXAorfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2NhMDEwNl92b2x1bWVfaTJjX2FkY19jdGxzW10gX19kZXZpbml0ZGF0YSA9IHsKKyAgICAgICAgSTJDX1ZPTFVNRSgiUGhvbmUgQ2FwdHVyZSBWb2x1bWUiLCAwKSwKKyAgICAgICAgSTJDX1ZPTFVNRSgiTWljIENhcHR1cmUgVm9sdW1lIiwgMSksCisgICAgICAgIEkyQ19WT0xVTUUoIkxpbmUgaW4gQ2FwdHVyZSBWb2x1bWUiLCAyKSwKKyAgICAgICAgSTJDX1ZPTFVNRSgiQXV4IENhcHR1cmUgVm9sdW1lIiwgMyksCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCByZW1vdmVfY3RsKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIGlkOwpAQCAtNjQ1LDYgKzY0NiwxMSBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAJaWYgKGVtdS0+ZGV0YWlscy0+aTJjX2FkYyA9PSAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNuZF9jYTAxMDZfdm9sdW1lX2kyY19hZGNfY3Rscyk7IGkrKykgeworCQkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfY2EwMTA2X3ZvbHVtZV9pMmNfYWRjX2N0bHNbaV0sIGVtdSkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQogCQlpZiAoZW11LT5kZXRhaWxzLT5ncGlvX3R5cGUgPT0gMSkKIAkJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2NhMDEwNl9jYXB0dXJlX21pY19saW5lX2luLCBlbXUpKTsKIAkJZWxzZSAgLyogZ3Bpb190eXBlID09IDIgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQyODEuYyBiL3NvdW5kL3BjaS9jczQyODEuYwppbmRleCA4ZTU1MTlkLi40NGNmNTQ2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0MjgxLmMKKysrIGIvc291bmQvcGNpL2NzNDI4MS5jCkBAIC0xMDU1LDcgKzEwNTUsNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9kc3AsIC00NjUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2RzcCwgLTQ2NTAsIDE1MCwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfY3M0MjgxX2ZtX3ZvbCA9IAogewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9kYXJsYTIwLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjAuYwppbmRleCBiNzEwOGUyLi44ZTdmZTAzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjAuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjAuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9kYXJsYTI0LmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYwppbmRleCBlNTlhOTgyLi5hMTNjNjIzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYwpAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvM2cuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNobzNnLmMKaW5kZXggMTIwOTlmZS4uOGZiMTU4MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvM2cuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG8zZy5jCkBAIC01OCw2ICs1OCw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG8zZ19kc3AuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNobzNnX2RzcC5jCmluZGV4IGQyNmExZDEuLjQ4ZWI3YzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNobzNnX2RzcC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNobzNnX2RzcC5jCkBAIC0zOSw3ICszOSw3IEBACiBzdGF0aWMgaW50IHdyaXRlX2NvbnRyb2xfcmVnKHN0cnVjdCBlY2hvYXVkaW8gKmNoaXAsIHUzMiBjdGwsIHUzMiBmcnEsCiAJCQkgICAgIGNoYXIgZm9yY2UpOwogCi0jaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKIHN0YXRpYyBpbnQgaW5pdF9odyhzdHJ1Y3QgZWNob2F1ZGlvICpjaGlwLCB1MTYgZGV2aWNlX2lkLCB1MTYgc3ViZGV2aWNlX2lkKQogewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMKaW5kZXggMDQ3ZTBiNS4uNmE0MjhiOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jCkBAIC0zNCw2ICszNCw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgIkVuYWJsZSAiIEVDSE9DQVJEX05BTUUgIiBzb3VuZGNhcmQuIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY2hhbm5lbHNfbGlzdFsxMF0gPSB7MSwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTYsIDk5OTk5OX07CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfb3V0cHV0X2dhaW4sIC0xMjgwMCwgMTAwLCAxKTsKIAogc3RhdGljIGludCBnZXRfZmlybXdhcmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZndfZW50cnksCiAJCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZybSwgc3RydWN0IGVjaG9hdWRpbyAqY2hpcCkKQEAgLTEwMTEsMTcgKzEwMTIsMjEgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfZWNob19saW5lX291dHB1dF9nYWluIF9fZGV2aW5pdGRhdGEgPSB7CiAJLm5hbWUgPSAiTGluZSBQbGF5YmFjayBWb2x1bWUiLAogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFELAogCS5pbmZvID0gc25kX2VjaG9fb3V0cHV0X2dhaW5faW5mbywKIAkuZ2V0ID0gc25kX2VjaG9fb3V0cHV0X2dhaW5fZ2V0LAogCS5wdXQgPSBzbmRfZWNob19vdXRwdXRfZ2Fpbl9wdXQsCisJLnRsdiA9IHsucCA9IGRiX3NjYWxlX291dHB1dF9nYWlufSwKIH07CiAjZWxzZQogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9lY2hvX3BjbV9vdXRwdXRfZ2FpbiBfX2RldmluaXRkYXRhID0gewogCS5uYW1lID0gIlBDTSBQbGF5YmFjayBWb2x1bWUiLAogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFELAogCS5pbmZvID0gc25kX2VjaG9fb3V0cHV0X2dhaW5faW5mbywKIAkuZ2V0ID0gc25kX2VjaG9fb3V0cHV0X2dhaW5fZ2V0LAogCS5wdXQgPSBzbmRfZWNob19vdXRwdXRfZ2Fpbl9wdXQsCisJLnRsdiA9IHsucCA9IGRiX3NjYWxlX291dHB1dF9nYWlufSwKIH07CiAjZW5kaWYKIApAQCAtMTA4MCwxMiArMTA4NSwxNiBAQAogCXJldHVybiBjaGFuZ2VkOwogfQogCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfaW5wdXRfZ2FpbiwgLTI1MDAsIDUwLCAwKTsKKwogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9lY2hvX2xpbmVfaW5wdXRfZ2FpbiBfX2RldmluaXRkYXRhID0gewogCS5uYW1lID0gIkxpbmUgQ2FwdHVyZSBWb2x1bWUiLAogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFELAogCS5pbmZvID0gc25kX2VjaG9faW5wdXRfZ2Fpbl9pbmZvLAogCS5nZXQgPSBzbmRfZWNob19pbnB1dF9nYWluX2dldCwKIAkucHV0ID0gc25kX2VjaG9faW5wdXRfZ2Fpbl9wdXQsCisJLnRsdiA9IHsucCA9IGRiX3NjYWxlX2lucHV0X2dhaW59LAogfTsKIAogI2VuZGlmIC8qIEVDSE9DQVJEX0hBU19JTlBVVF9HQUlOICovCkBAIC0xMjc3LDkgKzEyODYsMTEgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfZWNob19tb25pdG9yX21peGVyIF9fZGV2aW5pdGRhdGEgPSB7CiAJLm5hbWUgPSAiTW9uaXRvciBNaXhlciBWb2x1bWUiLAogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFELAogCS5pbmZvID0gc25kX2VjaG9fbWl4ZXJfaW5mbywKIAkuZ2V0ID0gc25kX2VjaG9fbWl4ZXJfZ2V0LAogCS5wdXQgPSBzbmRfZWNob19taXhlcl9wdXQsCisJLnRsdiA9IHsucCA9IGRiX3NjYWxlX291dHB1dF9nYWlufSwKIH07CiAKICNlbmRpZiAvKiBFQ0hPQ0FSRF9IQVNfTU9OSVRPUiAqLwpAQCAtMTM0Myw5ICsxMzU0LDExIEBACiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2VjaG9fdm1peGVyIF9fZGV2aW5pdGRhdGEgPSB7CiAJLm5hbWUgPSAiVk1peGVyIFZvbHVtZSIsCiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCiAJLmluZm8gPSBzbmRfZWNob192bWl4ZXJfaW5mbywKIAkuZ2V0ID0gc25kX2VjaG9fdm1peGVyX2dldCwKIAkucHV0ID0gc25kX2VjaG9fdm1peGVyX3B1dCwKKwkudGx2ID0gey5wID0gZGJfc2NhbGVfb3V0cHV0X2dhaW59LAogfTsKIAogI2VuZGlmIC8qIEVDSE9DQVJEX0hBU19WTUlYRVIgKi8KQEAgLTE3NTMsOSArMTc2NiwxMiBAQAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9lY2hvX3Z1bWV0ZXJzIF9fZGV2aW5pdGRhdGEgPSB7CiAJLm5hbWUgPSAiVlUtbWV0ZXJzIiwKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwKKwkJICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUgfAorCQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCwKIAkuaW5mbyA9IHNuZF9lY2hvX3Z1bWV0ZXJzX2luZm8sCiAJLmdldCA9IHNuZF9lY2hvX3Z1bWV0ZXJzX2dldCwKKwkudGx2ID0gey5wID0gZGJfc2NhbGVfb3V0cHV0X2dhaW59LAogfTsKIAogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyMC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9naW5hMjAuYwppbmRleCAyOWQ2ZDEyLi5hZjRkMzIwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyMC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTIwLmMKQEAgLTUxLDYgKzUxLDcgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTI0LmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyNC5jCmluZGV4IGU0NjRkNzIuLjlmZjQ1NGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTI0LmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9naW5hMjQuYwpAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ28uYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvLmMKaW5kZXggYmZkMjQ2Ny4uMzdlYjcyNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ28uYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnby5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2RqLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2RqLmMKaW5kZXggOGVkN2ZmMS4uZGM4YjkxOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29kai5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvZGouYwpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29pby5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29pby5jCmluZGV4IGE4Nzg4ZTkuLmVhZGYzMjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvaW8uYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2lvLmMKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyMC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMKaW5kZXggZTUwM2Q3NC4uNmNlZGU0OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyNC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTI0LmMKaW5kZXggZDQ1ODFmZC4uNDRmNzM1NCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTI0LmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTI0LmMKQEAgLTU4LDYgKzU4LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlhLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21pYS5jCmluZGV4IGJlNDBjNjQuLmRjMTcyZDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlhLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9taWEuYwpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9tb25hLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21vbmEuYwppbmRleCA1ZGM1MTJhLi5jODU2ZWQ1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL21vbmEuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21vbmEuYwpAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYwppbmRleCA5NzJlYzQwLi44MGFhNTg1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYwpAQCAtMyw4ICszLDEwIEBACiAgKiAgICAgICAgICAgICAgICAgICBDcmVhdGl2ZSBMYWJzLCBJbmMuCiAgKiAgUm91dGluZXMgZm9yIGNvbnRyb2wgb2YgRU1VMTBLMSBjaGlwcwogICoKLSAqICBDb3B5cmlnaHQgKGMpIGJ5IEphbWVzIENvdXJ0aWVyLUR1dHRvbiA8SmFtZXNAc3VwZXJidWcuZGVtb24uY28udWs+CisgKiAgQ29weXJpZ2h0IChjKSBieSBKYW1lcyBDb3VydGllci1EdXR0b24gPEphbWVzQHN1cGVyYnVnLmNvLnVrPgogICogICAgICBBZGRlZCBzdXBwb3J0IGZvciBBdWRpZ3kgMiBWYWx1ZS4KKyAqICAJQWRkZWQgRU1VIDEwMTAgc3VwcG9ydC4KKyAqICAJR2VuZXJhbCBidWcgZml4ZXMgYW5kIGVuaGFuY2VtZW50cy4KICAqCiAgKgogICogIEJVR1M6CkBAIC00MSw4ICs0MywxMCBAQAogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2VtdTEwazEuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgInAxNnYuaCIKICNpbmNsdWRlICJ0aW5hMi5oIgorI2luY2x1ZGUgInAxN3YuaCIKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTE3LDExICsxMjEsMjggQEAKIAkJMHgwNjIyLAogCQkweDE0MDAsCiB9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGkyY19hZGNfaW5pdFtdWzJdID0geworCXsgMHgxNywgMHgwMCB9LCAvKiBSZXNldCAqLworCXsgMHgwNywgMHgwMCB9LCAvKiBUaW1lb3V0ICovCisJeyAweDBiLCAweDIyIH0sICAvKiBJbnRlcmZhY2UgY29udHJvbCAqLworCXsgMHgwYywgMHgyMiB9LCAgLyogTWFzdGVyIG1vZGUgY29udHJvbCAqLworCXsgMHgwZCwgMHgwOCB9LCAgLyogUG93ZXJkb3duIGNvbnRyb2wgKi8KKwl7IDB4MGUsIDB4Y2YgfSwgIC8qIEF0dGVudWF0aW9uIExlZnQgIDB4MDEgPSAtMTAzZEIsIDB4ZmYgPSAyNGRCICovCisJeyAweDBmLCAweGNmIH0sICAvKiBBdHRlbnVhdGlvbiBSaWdodCAwLjVkQiBzdGVwcyAqLworCXsgMHgxMCwgMHg3YiB9LCAgLyogQUxDIENvbnRyb2wgMSAqLworCXsgMHgxMSwgMHgwMCB9LCAgLyogQUxDIENvbnRyb2wgMiAqLworCXsgMHgxMiwgMHgzMiB9LCAgLyogQUxDIENvbnRyb2wgMyAqLworCXsgMHgxMywgMHgwMCB9LCAgLyogTm9pc2UgZ2F0ZSBjb250cm9sICovCisJeyAweDE0LCAweGE2IH0sICAvKiBMaW1pdGVyIGNvbnRyb2wgKi8KKwl7IDB4MTUsIEFEQ19NVVhfMiB9LCAgLyogQURDIE1peGVyIGNvbnRyb2wuIE1pYyBmb3IgQXVkaWd5IDIgWlMgTm90ZWJvb2sgKi8KK307CiAJCiBzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2luaXQoc3RydWN0IHNuZF9lbXUxMGsxICplbXUsIGludCBlbmFibGVfaXIsIGludCByZXN1bWUpCiB7CiAJdW5zaWduZWQgaW50IHNpbGVudF9wYWdlOwogCWludCBjaDsKKwl1MzIgdG1wOwogCiAJLyogZGlzYWJsZSBhdWRpbyBhbmQgbG9jayBjYWNoZSAqLwogCW91dGwoSENGR19MT0NLU09VTkRDQUNIRSB8IEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLIHwgSENGR19NVVRFQlVUVE9ORU5BQkxFLApAQCAtMTYwLDggKzE4MSw2IEBACiAKIAlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+Y2EwMTUxX2NoaXApIHsgLyogYXVkaWd5MiAqLwogCQkvKiBIYWNrcyBmb3IgQWxpY2UzIHRvIHdvcmsgaW5kZXBlbmRlbnQgb2YgaGFQMTZWIGRyaXZlciAqLwotCQl1MzIgdG1wOwotCiAJCS8vU2V0dXAgU1JDTXVsdGlfSTJTIFNhbXBsaW5nUmF0ZQogCQl0bXAgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIEFfU1BESUZfU0FNUExFUkFURSwgMCk7CiAJCXRtcCAmPSAweGZmZmZmMWZmOwpAQCAtMTgxLDggKzIwMCw2IEBACiAJfQogCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5jYTAxMDhfY2hpcCkgeyAvKiBhdWRpZ3kyIFZhbHVlICovCiAJCS8qIEhhY2tzIGZvciBBbGljZTMgdG8gd29yayBpbmRlcGVuZGVudCBvZiBoYVAxNlYgZHJpdmVyICovCi0JCXUzMiB0bXA7Ci0KIAkJc25kX3ByaW50ayhLRVJOX0lORk8gIkF1ZGlneTIgdmFsdWU6IFNwZWNpYWwgY29uZmlnLlxuIik7CiAJCS8vU2V0dXAgU1JDTXVsdGlfSTJTIFNhbXBsaW5nUmF0ZQogCQl0bXAgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIEFfU1BESUZfU0FNUExFUkFURSwgMCk7CkBAIC0yMTEsNyArMjI4LDcgQEAKIAkJaW50IHNpemUsIG47CiAKIAkJc2l6ZSA9IEFSUkFZX1NJWkUoc3BpX2RhY19pbml0KTsKLQkJZm9yIChuPTA7IG4gPCBzaXplOyBuKyspCisJCWZvciAobiA9IDA7IG4gPCBzaXplOyBuKyspCiAJCQlzbmRfZW11MTBrMV9zcGlfd3JpdGUoZW11LCBzcGlfZGFjX2luaXRbbl0pOwogCiAJCXNuZF9lbXUxMGsxX3B0cjIwX3dyaXRlKGVtdSwgMHg2MCwgMCwgMHgxMCk7CkBAIC0yMjgsNiArMjQ1LDIzIEBACiAJCW91dGwoMHg3NiwgZW11LT5wb3J0ICsgQV9JT0NGRyk7IC8qIFdpbmRvd3MgdXNlcyAweDNmNzYgKi8KIAogCX0KKwlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+aTJjX2FkYykgeyAvKiBBdWRpZ3kgMiBaUyBOb3RlYm9vayB3aXRoIEFEQyBXb2xmc29uIFdNODc3NSAqLworCQlpbnQgc2l6ZSwgbjsKKworCQlzbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUsIFAxN1ZfSTJTX1NSQ19TRUwsIDAsIDB4MjAyMDIwNWYpOworCQl0bXAgPSBpbmwoZW11LT5wb3J0ICsgQV9JT0NGRyk7CisJCW91dGwodG1wIHwgMHg0LCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsgIC8qIFNldCBiaXQgMiBmb3IgbWljIGlucHV0ICovCisJCXRtcCA9IGlubChlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwkJc2l6ZSA9IEFSUkFZX1NJWkUoaTJjX2FkY19pbml0KTsKKwkJZm9yIChuID0gMDsgbiA8IHNpemU7IG4rKykKKwkJCXNuZF9lbXUxMGsxX2kyY193cml0ZShlbXUsIGkyY19hZGNfaW5pdFtuXVswXSwgaTJjX2FkY19pbml0W25dWzFdKTsKKwkJZm9yIChuPTA7IG4gPCA0OyBuKyspIHsKKwkJCWVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW25dWzBdPSAweGNmOworCQkJZW11LT5pMmNfY2FwdHVyZV92b2x1bWVbbl1bMV09IDB4Y2Y7CisJCX0KKworCX0KKwogCQogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFBUQiwgMCwgZW11LT5wdGJfcGFnZXMuYWRkcik7CiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgVENCLCAwLCAwKTsJLyogdGFrZW4gZnJvbSBvcmlnaW5hbCBkcml2ZXIgKi8KQEAgLTIzOSw2ICsyNzMsMTAgQEAKIAkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgTUFQQiwgY2gsIHNpbGVudF9wYWdlKTsKIAl9CiAKKwlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTAxMCkgeworCQlvdXRsKEhDRkdfQVVUT01VVEVfQVNZTkMgfAorCQkJSENGR19FTVUzMl9TTEFWRSB8CisJCQlIQ0ZHX0FVRElPRU5BQkxFLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKIAkvKgogCSAqICBIb2theSwgc2V0dXAgSENGRwogCSAqICAgTXV0ZSBEaXNhYmxlIEF1ZGlvID0gMApAQCAtMjQ2LDcgKzI4NCw3IEBACiAJICogICBMb2NrIFNvdW5kIE1lbW9yeSA9IDAKIAkgKiAgIEF1dG8gTXV0ZSA9IDEKIAkgKi8KLQlpZiAoZW11LT5hdWRpZ3kpIHsKKwl9IGVsc2UgaWYgKGVtdS0+YXVkaWd5KSB7CiAJCWlmIChlbXUtPnJldmlzaW9uID09IDQpIC8qIGF1ZGlneTIgKi8KIAkJCW91dGwoSENGR19BVURJT0VOQUJMRSB8CiAJCQkgICAgIEhDRkdfQUMzRU5BQkxFX0NEU1BESUYgfApAQCAtMjY1LDggKzMwMywxMCBAQAogCQlvdXRsKEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLIHwgSENGR19BVVRPTVVURSB8IEhDRkdfSk9ZRU5BQkxFLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKIAogCWlmIChlbmFibGVfaXIpIHsJLyogZW5hYmxlIElSIGZvciBTQiBMaXZlICovCi0JCWlmICggZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTIxMm0pIHsKLQkJCTsgIC8qIERpc2FibGUgYWxsIGFjY2VzcyB0byBBX0lPQ0ZHIGZvciB0aGUgZW11MTIxMm0gKi8KKwkJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEwMTApIHsKKwkJCTsgIC8qIERpc2FibGUgYWxsIGFjY2VzcyB0byBBX0lPQ0ZHIGZvciB0aGUgZW11MTAxMCAqLworCQl9IGVsc2UgaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmkyY19hZGMpIHsKKwkJCTsgIC8qIERpc2FibGUgQV9JT0NGRyBmb3IgQXVkaWd5IDIgWlMgTm90ZWJvb2sgKi8KIAkJfSBlbHNlIGlmIChlbXUtPmF1ZGlneSkgewogCQkJdW5zaWduZWQgaW50IHJlZyA9IGlubChlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKIAkJCW91dGwocmVnIHwgQV9JT0NGR19HUE9VVDIsIGVtdS0+cG9ydCArIEFfSU9DRkcpOwpAQCAtMjg0LDggKzMyNCwxMCBAQAogIAkJfQogCX0KIAkKLQlpZiAoIGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEyMTJtKSB7Ci0JCTsgIC8qIERpc2FibGUgYWxsIGFjY2VzcyB0byBBX0lPQ0ZHIGZvciB0aGUgZW11MTIxMm0gKi8KKwlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTAxMCkgeworCQk7ICAvKiBEaXNhYmxlIGFsbCBhY2Nlc3MgdG8gQV9JT0NGRyBmb3IgdGhlIGVtdTEwMTAgKi8KKwl9IGVsc2UgaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmkyY19hZGMpIHsKKwkJOyAgLyogRGlzYWJsZSBBX0lPQ0ZHIGZvciBBdWRpZ3kgMiBaUyBOb3RlYm9vayAqLwogCX0gZWxzZSBpZiAoZW11LT5hdWRpZ3kpIHsJLyogZW5hYmxlIGFuYWxvZyBvdXRwdXQgKi8KIAkJdW5zaWduZWQgaW50IHJlZyA9IGlubChlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKIAkJb3V0bChyZWcgfCBBX0lPQ0ZHX0dQT1VUMCwgZW11LT5wb3J0ICsgQV9JT0NGRyk7CkBAIC0zMDIsOCArMzQ0LDEwIEBACiAJb3V0bChpbmwoZW11LT5wb3J0ICsgSENGRykgfCBIQ0ZHX0FVRElPRU5BQkxFLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKIAogCS8qIEVuYWJsZSBhbmFsb2cvZGlnaXRhbCBvdXRzIG9uIGF1ZGlneSAqLwotCWlmICggZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTIxMm0pIHsKLQkJOyAgLyogRGlzYWJsZSBhbGwgYWNjZXNzIHRvIEFfSU9DRkcgZm9yIHRoZSBlbXUxMjEybSAqLworCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMDEwKSB7CisJCTsgIC8qIERpc2FibGUgYWxsIGFjY2VzcyB0byBBX0lPQ0ZHIGZvciB0aGUgZW11MTAxMCAqLworCX0gZWxzZSBpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+aTJjX2FkYykgeworCQk7ICAvKiBEaXNhYmxlIEFfSU9DRkcgZm9yIEF1ZGlneSAyIFpTIE5vdGVib29rICovCiAJfSBlbHNlIGlmIChlbXUtPmF1ZGlneSkgewogCQlvdXRsKGlubChlbXUtPnBvcnQgKyBBX0lPQ0ZHKSAmIH4weDQ0LCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKICAKQEAgLTU5NiwxMzMgKzY0MCw0MjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzbmRfZW11MTIxMm1fZnBnYV93cml0ZShzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUsIGludCByZWcsIGludCB2YWx1ZSkKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfbG9hZF9maXJtd2FyZShzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUsIGNvbnN0IGNoYXIgKiBmaWxlbmFtZSkKIHsKLQlpZiAocmVnPDAgfHwgcmVnPjB4M2YpCi0JCXJldHVybiAxOwotCXJlZys9MHg0MDsgLyogMHg0MCB1cHdhcmRzIGFyZSByZWdpc3RlcnMuICovCi0JaWYgKHZhbHVlPDAgfHwgdmFsdWU+MHgzZikgLyogMCB0byAweDNmIGFyZSB2YWx1ZXMgKi8KLQkJcmV0dXJuIDE7Ci0Jb3V0bChyZWcsIGVtdS0+cG9ydCArIEFfSU9DRkcpOwotCW91dGwocmVnIHwgMHg4MCwgZW11LT5wb3J0ICsgQV9JT0NGRyk7ICAvKiBIaWdoIGJpdCBjbG9ja3MgdGhlIHZhbHVlIGludG8gdGhlIGZwZ2EuICovCi0Jb3V0bCh2YWx1ZSwgZW11LT5wb3J0ICsgQV9JT0NGRyk7Ci0Jb3V0bCh2YWx1ZSB8IDB4ODAgLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsgIC8qIEhpZ2ggYml0IGNsb2NrcyB0aGUgdmFsdWUgaW50byB0aGUgZnBnYS4gKi8KKwlpbnQgZXJyOworCWludCBuLCBpOworCWludCByZWc7CisJaW50IHZhbHVlOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7CiAKKwlpZiAoKGVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBmaWxlbmFtZSwgJmVtdS0+cGNpLT5kZXYpKSAhPSAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImZpcm13YXJlOiAlcyBub3QgZm91bmQuIEVycj0lZFxuIixmaWxlbmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJc25kX3ByaW50ayhLRVJOX0lORk8gImZpcm13YXJlIHNpemU9MHglenhcbiIsIGZ3X2VudHJ5LT5zaXplKTsKKwlpZiAoZndfZW50cnktPnNpemUgIT0gMHgxMzNhNCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJmaXJtd2FyZTogJXMgd3Jvbmcgc2l6ZS5cbiIsZmlsZW5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBUaGUgRlBHQSBpcyBhIFhpbGlueCBTcGFydGFuIElJRSBYQzJTNTBFICovCisJLyogR1BJTzcgLT4gRlBHQSBQR01OCisJICogR1BJTzYgLT4gRlBHQSBDQ0xLCisJICogR1BJTzUgLT4gRlBHQSBESU4KKwkgKiBGUEdBIENPTkZJRyBPRkYgLT4gRlBHQSBQR01OCisJICovCisJb3V0bCgweDAwLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsgLyogU2V0IFBHTU4gbG93IGZvciAxdVMuICovCisJdWRlbGF5KDEpOworCW91dGwoMHg4MCwgZW11LT5wb3J0ICsgQV9JT0NGRyk7IC8qIExlYXZlIGJpdCA3IHNldCBkdXJpbmcgbmV0bGlzdCBzZXR1cC4gKi8KKwl1ZGVsYXkoMTAwKTsgLyogQWxsb3cgRlBHQSBtZW1vcnkgdG8gY2xlYW4gKi8KKwlmb3IobiA9IDA7IG4gPCBmd19lbnRyeS0+c2l6ZTsgbisrKSB7CisJCXZhbHVlPWZ3X2VudHJ5LT5kYXRhW25dOwkKKwkJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlyZWcgPSAweDgwOworCQkJaWYgKHZhbHVlICYgMHgxKQorCQkJCXJlZyA9IHJlZyB8IDB4MjA7CisJCQl2YWx1ZSA9IHZhbHVlID4+IDE7ICAgCisJCQlvdXRsKHJlZywgZW11LT5wb3J0ICsgQV9JT0NGRyk7CisJCQlvdXRsKHJlZyB8IDB4NDAsIGVtdS0+cG9ydCArIEFfSU9DRkcpOworCQl9CisJfQorCS8qIEFmdGVyIHByb2dyYW1taW5nLCBzZXQgR1BJTyBiaXQgNCBoaWdoIGFnYWluLiAqLworCW91dGwoMHgxMCwgZW11LT5wb3J0ICsgQV9JT0NGRyk7CisJCisKKyAgICAgICAgcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX2VtdTEyMTJtX2ZwZ2FfcmVhZChzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUsIGludCByZWcsIGludCAqdmFsdWUpCi17Ci0JaWYgKHJlZzwwIHx8IHJlZz4weDNmKQotCQlyZXR1cm4gMTsKLQlyZWcrPTB4NDA7IC8qIDB4NDAgdXB3YXJkcyBhcmUgcmVnaXN0ZXJzLiAqLwotCW91dGwocmVnLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKLQlvdXRsKHJlZyB8IDB4ODAsIGVtdS0+cG9ydCArIEFfSU9DRkcpOyAgLyogSGlnaCBiaXQgY2xvY2tzIHRoZSB2YWx1ZSBpbnRvIHRoZSBmcGdhLiAqLwotCSp2YWx1ZSA9IGlubChlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoc3RydWN0IHNuZF9lbXUxMGsxICogZW11LCBpbnQgcmVnLCBpbnQgdmFsdWUpCi17Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDAwLCAoKHJlZyA+PiA4KSAmIDB4M2YpICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDAxLCAocmVnICYgMHgzZikgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MDIsICgodmFsdWUgPj4gOCkgJiAweDNmKSApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwMywgKHZhbHVlICYgMHgzZikgKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9lbXUxMGsxX2VtdTEyMTJtX2luaXQoc3RydWN0IHNuZF9lbXUxMGsxICogZW11KQorc3RhdGljIGludCBzbmRfZW11MTBrMV9lbXUxMDEwX2luaXQoc3RydWN0IHNuZF9lbXUxMGsxICogZW11KQogewogCXVuc2lnbmVkIGludCBpOwotCWludCB0bXA7CisJaW50IHRtcCx0bXAyOworCWludCByZWc7CisJaW50IGVycjsKKwljb25zdCBjaGFyICpoYW5hX2ZpbGVuYW1lID0gImVtdS9oYW5hLmZ3IjsKKwljb25zdCBjaGFyICpkb2NrX2ZpbGVuYW1lID0gImVtdS9hdWRpb19kb2NrLmZ3IjsKIAotCXNuZF9wcmludGsoS0VSTl9FUlIgImVtdTEyMTJtOiBTcGVjaWFsIGNvbmZpZy5cbiIpOworCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBTcGVjaWFsIGNvbmZpZy5cbiIpOworCS8qIEFDOTcgMi4xLCBBbnkgMTZNZWcgb2YgNEdpZyBhZGRyZXNzLCBBdXRvLU11dGUsIEVNVTMyIFNsYXZlLAorCSAqIExvY2sgU291bmQgTWVtb3J5IENhY2hlLCBMb2NrIFRhbmsgTWVtb3J5IENhY2hlLAorCSAqIE11dGUgYWxsIGNvZGVjcy4KKwkgKi8KIAlvdXRsKDB4MDAwNWEwMGMsIGVtdS0+cG9ydCArIEhDRkcpOwotCW91dGwoMHgwMDA1YTAwNCwgZW11LT5wb3J0ICsgSENGRyk7CisJLyogQUM5NyAyLjEsIEFueSAxNk1lZyBvZiA0R2lnIGFkZHJlc3MsIEF1dG8tTXV0ZSwgRU1VMzIgU2xhdmUsCisJICogTG9jayBUYW5rIE1lbW9yeSBDYWNoZSwKKwkgKiBNdXRlIGFsbCBjb2RlY3MuCisJICovCisJb3V0bCgweDAwMDVhMDA0LCBlbXUtPnBvcnQgKyBIQ0ZHKTsgCisJLyogQUM5NyAyLjEsIEFueSAxNk1lZyBvZiA0R2lnIGFkZHJlc3MsIEF1dG8tTXV0ZSwgRU1VMzIgU2xhdmUsCisJICogTXV0ZSBhbGwgY29kZWNzLgorCSAqLwogCW91dGwoMHgwMDA1YTAwMCwgZW11LT5wb3J0ICsgSENGRyk7CisJLyogQUM5NyAyLjEsIEFueSAxNk1lZyBvZiA0R2lnIGFkZHJlc3MsIEF1dG8tTXV0ZSwgRU1VMzIgU2xhdmUsCisJICogTXV0ZSBhbGwgY29kZWNzLgorCSAqLwogCW91dGwoMHgwMDA1YTAwMCwgZW11LT5wb3J0ICsgSENGRyk7CiAKLQlzbmRfZW11MTIxMm1fZnBnYV9yZWFkKGVtdSwgMHgyMiwgJnRtcCApOwotCXNuZF9lbXUxMjEybV9mcGdhX3JlYWQoZW11LCAweDIzLCAmdG1wICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfcmVhZChlbXUsIDB4MjQsICZ0bXAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MDQsIDB4MDEgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9yZWFkKGVtdSwgMHgwYiwgJnRtcCApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwYiwgMHgwMSApOwotCXNuZF9lbXUxMjEybV9mcGdhX3JlYWQoZW11LCAweDEwLCAmdG1wICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDEwLCAweDAwICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfcmVhZChlbXUsIDB4MTEsICZ0bXAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MTEsIDB4MzAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9yZWFkKGVtdSwgMHgxMywgJnRtcCApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgxMywgMHgwZiApOwotCXNuZF9lbXUxMjEybV9mcGdhX3JlYWQoZW11LCAweDExLCAmdG1wICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDExLCAweDMwICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfcmVhZChlbXUsIDB4MGEsICZ0bXAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MGEsIDB4MTAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MGMsIDB4MTkgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MTIsIDB4MGMgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MDksIDB4MGYgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MDYsIDB4MDAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MDUsIDB4MDAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MGUsIDB4MTIgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMDAwLCAweDAyMDApOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAwMDEsIDB4MDIwMSk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDAwMiwgMHgwNTAwKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMDAzLCAweDA1MDEpOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAwMDQsIDB4MDQwMCk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDAwNSwgMHgwNDAxKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMDA2LCAweDA0MDIpOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAwMDcsIDB4MDQwMyk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDAwOCwgMHgwNDA0KTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMDA5LCAweDA0MDUpOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAwMGEsIDB4MDQwNik7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDAwYiwgMHgwNDA3KTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMDBjLCAweDAxMDApOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAwMGQsIDB4MDEwNCk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDAwZSwgMHgwMjAwKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMDBmLCAweDAyMDEpOwotCWZvciAoaT0wO2kgPCAweDIwO2krKykgewotCQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMTAwK2ksIDB4MDAwMCk7Ci0JfQotCWZvciAoaT0wO2kgPCA0O2krKykgewotCQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMjAwK2ksIDB4MDAwMCk7Ci0JfQotCWZvciAoaT0wO2kgPCA3O2krKykgewotCQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMzAwK2ksIDB4MDAwMCk7Ci0JfQotCWZvciAoaT0wO2kgPCA3O2krKykgewotCQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwNDAwK2ksIDB4MDAwMCk7Ci0JfQotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDA1MDAsIDB4MDEwOCk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDUwMSwgMHgwMTBjKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwNjAwLCAweDAxMTApOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDA2MDEsIDB4MDExNCk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDcwMCwgMHgwMTE4KTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwNzAxLCAweDAxMWMpOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwNywgMHgwMSApOworCS8qIERpc2FibGUgNDhWb2x0IHBvd2VyIHRvIEF1ZGlvIERvY2sgKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgIEVNVV9IQU5BX0RPQ0tfUFdSLCAgMCApOwogCi0Jc25kX2VtdTEyMTJtX2ZwZ2FfcmVhZChlbXUsIDB4MjEsICZ0bXAgKTsKKwkvKiBJRCwgc2hvdWxkIHJlYWQgJiAweDdmID0gMHg1NS4gKEJpdCA3IGlzIHRoZSBJUlEgYml0KSAqLworCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0lELCAmcmVnICk7CisJc25kX3ByaW50ZGQoInJlZzE9MHgleFxuIixyZWcpOworCWlmIChyZWcgPT0gMHg1NSkgeworCQkvKiBGUEdBIG5ldGxpc3QgYWxyZWFkeSBwcmVzZW50IHNvIGNsZWFyIGl0ICovCisJCS8qIFJldHVybiB0byBwcm9ncmFtbWluZyBtb2RlICovCiAKLQlvdXRsKDB4MDAwMGEwMDAsIGVtdS0+cG9ydCArIEhDRkcpOworCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgIEVNVV9IQU5BX0ZQR0FfQ09ORklHLCAweDAyICk7CisJfQorCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0lELCAmcmVnICk7CisJc25kX3ByaW50ZGQoInJlZzI9MHgleFxuIixyZWcpOworCWlmIChyZWcgPT0gMHg1NSkgeworCQkvKiBGUEdBIGZhaWxlZCB0byByZXR1cm4gdG8gcHJvZ3JhbW1pbmcgbW9kZSAqLworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IEVNVV9IQU5BX0lEPTB4JXhcbiIscmVnKTsKKwlpZiAoKGVyciA9IHNuZF9lbXUxMDEwX2xvYWRfZmlybXdhcmUoZW11LCBoYW5hX2ZpbGVuYW1lKSkgIT0gMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogTG9hZGluZyBIYW5hIEZpcm13YXJlIGZpbGUgJXMgZmFpbGVkXG4iLCBoYW5hX2ZpbGVuYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBJRCwgc2hvdWxkIHJlYWQgJiAweDdmID0gMHg1NSB3aGVuIEZQR0EgcHJvZ3JhbW1lZC4gKi8KKwlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9JRCwgJnJlZyApOworCWlmIChyZWcgIT0gMHg1NSkgeworCQkvKiBGUEdBIGZhaWxlZCB0byBiZSBwcm9ncmFtbWVkICovCisJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBMb2FkaW5nIEhhbmEgRmlybXdhcmUgZmlsZSBmYWlsZWQsIHJlZz0weCV4XG4iLCByZWcpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogSGFuYSBGaXJtd2FyZSBsb2FkZWRcbiIpOworCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX01BSk9SX1JFViwgJnRtcCApOworCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX01JTk9SX1JFViwgJnRtcDIgKTsKKwlzbmRfcHJpbnRrKCJIYW5hIHZlcjolZC4lZFxuIix0bXAgLHRtcDIpOworCS8qIEVuYWJsZSA0OFZvbHQgcG93ZXIgdG8gQXVkaW8gRG9jayAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCAgRU1VX0hBTkFfRE9DS19QV1IsICBFTVVfSEFOQV9ET0NLX1BXUl9PTiApOworCisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSU9OX0NBUkRTLCAmcmVnICk7CisJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IENhcmQgb3B0aW9ucz0weCV4XG4iLHJlZyk7CisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSU9OX0NBUkRTLCAmcmVnICk7CisJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IENhcmQgb3B0aW9ucz0weCV4XG4iLHJlZyk7CisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSUNBTF9UWVBFLCAmdG1wICk7IAorCS8qIEFEQVQgaW5wdXQuICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX09QVElDQUxfVFlQRSwgMHgwMSApOworCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0FEQ19QQURTLCAmdG1wICk7CisJLyogU2V0IG5vIGF0dGVudWF0aW9uIG9uIEF1ZGlvIERvY2sgcGFkcy4gKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfQURDX1BBRFMsIDB4MDAgKTsKKwllbXUtPmVtdTEwMTAuYWRjX3BhZHMgPSAweDAwOworCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0RPQ0tfTUlTQywgJnRtcCApOworCS8qIFVubXV0ZSBBdWRpbyBkb2NrIERBQ3MsIEhlYWRwaG9uZSBzb3VyY2UgREFDLTQuICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0RPQ0tfTUlTQywgMHgzMCApOworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9ET0NLX0xFRFNfMiwgMHgxMiApOworCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0RBQ19QQURTLCAmdG1wICk7CisJLyogREFDIFBBRHMuICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0RBQ19QQURTLCAweDBmICk7CisJZW11LT5lbXUxMDEwLmRhY19wYWRzID0gMHgwZjsKKwlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9ET0NLX01JU0MsICZ0bXAgKTsKKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfRE9DS19NSVNDLCAweDMwICk7CisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfU1BESUZfTU9ERSwgJnRtcCApOworCS8qIFNQRElGIEZvcm1hdC4gU2V0IENvbnN1bWVyIG1vZGUsIDI0Yml0LCBjb3B5IGVuYWJsZSAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9TUERJRl9NT0RFLCAweDEwICk7CisJLyogTUlESSByb3V0aW5nICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX01JRElfSU4sIDB4MTkgKTsKKwkvKiBVbmtub3duLiAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9NSURJX09VVCwgMHgwYyApOworCS8qIHNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCAweDA5LCAweDBmICk7IC8vIElSUSBFbmFibGU6IEFsbCBvbiAqLworCS8qIElSUSBFbmFibGU6IEFsbCBvZmYgKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfSVJRX0VOQUJMRSwgMHgwMCApOworCisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSU9OX0NBUkRTLCAmcmVnICk7CisJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IENhcmQgb3B0aW9uczM9MHgleFxuIixyZWcpOworCS8qIERlZmF1bHQgV0NMSyBzZXQgdG8gNDhrSHouICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0RFRkNMT0NLLCAweDAwICk7CisJLyogV29yZCBDbG9jayBzb3VyY2UsIEludGVybmFsIDQ4a0h6IHgxICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX1dDTE9DSywgRU1VX0hBTkFfV0NMT0NLX0lOVF80OEsgKTsKKwkvL3NuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9XQ0xPQ0ssIEVNVV9IQU5BX1dDTE9DS19JTlRfNDhLIHwgRU1VX0hBTkFfV0NMT0NLXzRYICk7CisJLyogQXVkaW8gRG9jayBMRURzLiAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9ET0NLX0xFRFNfMiwgMHgxMiApOworCisjaWYgMAorCS8qIEZvciA5NmtIeiAqLworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfMCwgRU1VX1NSQ19IQU1PQV9BRENfTEVGVDEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfMSwgRU1VX1NSQ19IQU1PQV9BRENfUklHSFQxKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzQsIEVNVV9TUkNfSEFNT0FfQURDX0xFRlQyKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzUsIEVNVV9TUkNfSEFNT0FfQURDX1JJR0hUMik7CisjZW5kaWYKKyNpZiAwCisJLyogRm9yIDE5MmtIeiAqLworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfMCwgRU1VX1NSQ19IQU1PQV9BRENfTEVGVDEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfMSwgRU1VX1NSQ19IQU1PQV9BRENfUklHSFQxKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzIsIEVNVV9TUkNfSEFNT0FfQURDX0xFRlQyKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzMsIEVNVV9TUkNfSEFNT0FfQURDX1JJR0hUMik7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl80LCBFTVVfU1JDX0hBTU9BX0FEQ19MRUZUMyk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl81LCBFTVVfU1JDX0hBTU9BX0FEQ19SSUdIVDMpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfNiwgRU1VX1NSQ19IQU1PQV9BRENfTEVGVDQpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfNywgRU1VX1NSQ19IQU1PQV9BRENfUklHSFQ0KTsKKyNlbmRpZgorI2lmIDEKKwkvKiBGb3IgNDhrSHogKi8KKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzAsIEVNVV9TUkNfRE9DS19NSUNfQTEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfMSwgRU1VX1NSQ19ET0NLX01JQ19CMSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl8yLCBFTVVfU1JDX0hBTU9BX0FEQ19MRUZUMik7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl8zLCBFTVVfU1JDX0hBTU9BX0FEQ19MRUZUMik7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl80LCBFTVVfU1JDX0RPQ0tfQURDMV9MRUZUMSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl81LCBFTVVfU1JDX0RPQ0tfQURDMV9SSUdIVDEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfNiwgRU1VX1NSQ19ET0NLX0FEQzJfTEVGVDEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfNywgRU1VX1NSQ19ET0NLX0FEQzJfUklHSFQxKTsKKyNlbmRpZgorI2lmIDAKKwkvKiBPcmlnaW5hbCAqLworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfNCwgRU1VX1NSQ19IQU5BX0FEQVQpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfNSwgRU1VX1NSQ19IQU5BX0FEQVQgKyAxKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzYsIEVNVV9TUkNfSEFOQV9BREFUICsgMik7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl83LCBFTVVfU1JDX0hBTkFfQURBVCArIDMpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfOCwgRU1VX1NSQ19IQU5BX0FEQVQgKyA0KTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzksIEVNVV9TUkNfSEFOQV9BREFUICsgNSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl9BLCBFTVVfU1JDX0hBTkFfQURBVCArIDYpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfQiwgRU1VX1NSQ19IQU5BX0FEQVQgKyA3KTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyX0MsIEVNVV9TUkNfRE9DS19NSUNfQTEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfRCwgRU1VX1NSQ19ET0NLX01JQ19CMSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl9FLCBFTVVfU1JDX0hBTU9BX0FEQ19MRUZUMik7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl9GLCBFTVVfU1JDX0hBTU9BX0FEQ19MRUZUMik7CisjZW5kaWYKKwlmb3IgKGkgPSAwO2kgPCAweDIwOyBpKysgKSB7CisJCS8qIEF1ZGlvRG9jayBFbGluayA8LSAgU2lsZW5jZSAqLworCQlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsIDB4MDEwMCtpLCBFTVVfU1JDX1NJTEVOQ0UpOworCX0KKwlmb3IgKGkgPSAwO2kgPCA0OyBpKyspIHsKKwkJLyogSGFuYSBTUERJRiBPdXQgPC0gU2lsZW5jZSAqLworCQlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsIDB4MDIwMCtpLCBFTVVfU1JDX1NJTEVOQ0UpOworCX0KKwlmb3IgKGkgPSAwO2kgPCA3OyBpKyspIHsKKwkJLyogSGFtb2EgREFDIDwtIFNpbGVuY2UgKi8KKwkJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LCAweDAzMDAraSwgRU1VX1NSQ19TSUxFTkNFKTsKKwl9CisJZm9yIChpID0gMDtpIDwgNzsgaSsrKSB7CisJCS8qIEhhbmEgQURBVCBPdXQgPC0gU2lsZW5jZSAqLworCQlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsIEVNVV9EU1RfSEFOQV9BREFUICsgaSwgRU1VX1NSQ19TSUxFTkNFKTsKKwl9CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFX0kyUzBfTEVGVCwgRU1VX1NSQ19ET0NLX0FEQzFfTEVGVDEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRV9JMlMwX1JJR0hULCBFTVVfU1JDX0RPQ0tfQURDMV9SSUdIVDEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRV9JMlMxX0xFRlQsIEVNVV9TUkNfRE9DS19BREMyX0xFRlQxKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0VfSTJTMV9SSUdIVCwgRU1VX1NSQ19ET0NLX0FEQzJfUklHSFQxKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0VfSTJTMl9MRUZULCBFTVVfU1JDX0RPQ0tfQURDM19MRUZUMSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFX0kyUzJfUklHSFQsIEVNVV9TUkNfRE9DS19BREMzX1JJR0hUMSk7CisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX1VOTVVURSwgMHgwMSApOyAvLyBVbm11dGUgYWxsCisKKwlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9PUFRJT05fQ0FSRFMsICZ0bXAgKTsKKwkKKwkvKiBBQzk3IDEuMDMsIEFueSAzMk1lZyBvZiAyR2lnIGFkZHJlc3MsIEF1dG8tTXV0ZSwgRU1VMzIgU2xhdmUsCisJICogTG9jayBTb3VuZCBNZW1vcnkgQ2FjaGUsIExvY2sgVGFuayBNZW1vcnkgQ2FjaGUsCisJICogTXV0ZSBhbGwgY29kZWNzLgorCSAqLworCW91dGwoMHgwMDAwYTAwMCwgZW11LT5wb3J0ICsgSENGRyk7IAorCS8qIEFDOTcgMS4wMywgQW55IDMyTWVnIG9mIDJHaWcgYWRkcmVzcywgQXV0by1NdXRlLCBFTVUzMiBTbGF2ZSwKKwkgKiBMb2NrIFNvdW5kIE1lbW9yeSBDYWNoZSwgTG9jayBUYW5rIE1lbW9yeSBDYWNoZSwKKwkgKiBVbi1NdXRlIGFsbCBjb2RlY3MuCisJICovCiAJb3V0bCgweDAwMDBhMDAxLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKKyAKIAkvKiBJbml0aWFsIGJvb3QgY29tcGxldGUuIE5vdyBwYXRjaGVzICovCiAKLQlzbmRfZW11MTIxMm1fZnBnYV9yZWFkKGVtdSwgMHgyMSwgJnRtcCApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwYywgMHgxOSApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgxMiwgMHgwYyApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwYywgMHgxOSApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgxMiwgMHgwYyApOwotCXNuZF9lbXUxMjEybV9mcGdhX3JlYWQoZW11LCAweDBhLCAmdG1wICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDBhLCAweDEwICk7CisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSU9OX0NBUkRTLCAmdG1wICk7CisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX01JRElfSU4sIDB4MTkgKTsgLyogTUlESSBSb3V0ZSAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9NSURJX09VVCwgMHgwYyApOyAvKiBVbmtub3duICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX01JRElfSU4sIDB4MTkgKTsgLyogTUlESSBSb3V0ZSAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9NSURJX09VVCwgMHgwYyApOyAvKiBVbmtub3duICovCisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfU1BESUZfTU9ERSwgJnRtcCApOyAKKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfU1BESUZfTU9ERSwgMHgxMCApOyAvKiBTUERJRiBGb3JtYXQgc3BkaWYgIChvciAweDExIGZvciBhZXMvZWJ1KSAqLwogCi0Jc25kX2VtdTEyMTJtX2ZwZ2FfcmVhZChlbXUsIDB4MjAsICZ0bXAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9yZWFkKGVtdSwgMHgyMSwgJnRtcCApOworCS8qIERlbGF5IHRvIGFsbG93IEF1ZGlvIERvY2sgdG8gc2V0dGxlICovCisJbXNsZWVwKDEwMCk7CisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfSVJRX1NUQVRVUywgJnRtcCApOyAvKiBJUlEgU3RhdHVzICovCisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfT1BUSU9OX0NBUkRTLCAmcmVnICk7IC8qIE9QVElPTlM6IFdoaWNoIGNhcmRzIGFyZSBhdHRhY2hlZCB0byB0aGUgRU1VICovCisJLyogRklYTUU6IFRoZSBsb2FkaW5nIG9mIHRoaXMgc2hvdWxkIGJlIGFibGUgdG8gaGFwcGVuIGFueSB0aW1lLAorCSAqIGFzIHRoZSB1c2VyIGNhbiBwbHVnL3VucGx1ZyBpdCBhdCBhbnkgdGltZQorCSAqLworCWlmIChyZWcgJiAoRU1VX0hBTkFfT1BUSU9OX0RPQ0tfT05MSU5FIHwgRU1VX0hBTkFfT1BUSU9OX0RPQ0tfT0ZGTElORSkgKSB7CisJCS8qIEF1ZGlvIERvY2sgYXR0YWNoZWQgKi8KKwkJLyogUmV0dXJuIHRvIEF1ZGlvIERvY2sgcHJvZ3JhbW1pbmcgbW9kZSAqLworCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogTG9hZGluZyBBdWRpbyBEb2NrIEZpcm13YXJlXG4iKTsKKwkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsICBFTVVfSEFOQV9GUEdBX0NPTkZJRywgRU1VX0hBTkFfRlBHQV9DT05GSUdfQVVESU9ET0NLICk7CisJCWlmICgoZXJyID0gc25kX2VtdTEwMTBfbG9hZF9maXJtd2FyZShlbXUsIGRvY2tfZmlsZW5hbWUpKSAhPSAwKSB7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCAgRU1VX0hBTkFfRlBHQV9DT05GSUcsIDAgKTsKKwkJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfSVJRX1NUQVRVUywgJnJlZyApOworCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogRU1VX0hBTkErRE9DS19JUlFfU1RBVFVTPTB4JXhcbiIscmVnKTsKKwkJLyogSUQsIHNob3VsZCByZWFkICYgMHg3ZiA9IDB4NTUgd2hlbiBGUEdBIHByb2dyYW1tZWQuICovCisJCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0lELCAmcmVnICk7CisJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBFTVVfSEFOQStET0NLX0lEPTB4JXhcbiIscmVnKTsKKwkJaWYgKHJlZyAhPSAweDU1KSB7CisJCQkvKiBGUEdBIGZhaWxlZCB0byBiZSBwcm9ncmFtbWVkICovCisJCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogTG9hZGluZyBBdWRpbyBEb2NrIEZpcm13YXJlIGZpbGUgZmFpbGVkLCByZWc9MHgleFxuIiwgcmVnKTsKKwkJCXJldHVybiAwOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IEF1ZGlvIERvY2sgRmlybXdhcmUgbG9hZGVkXG4iKTsKKwkJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0RPQ0tfTUFKT1JfUkVWLCAmdG1wICk7CisJCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9ET0NLX01JTk9SX1JFViwgJnRtcDIgKTsKKwkJc25kX3ByaW50aygiQXVkaW8gRG9jayB2ZXI6JWQuJWRcbiIsdG1wICx0bXAyKTsKKwl9CisjaWYgMAorCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU1PQV9EQUNfTEVGVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJCICsgMik7IC8qIEFMSUNFMiBidXMgMHhhMiAqLworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU1PQV9EQUNfUklHSFQxLCBFTVVfU1JDX0FMSUNFX0VNVTMyQiArIDMpOyAvKiBBTElDRTIgYnVzIDB4YTMgKi8KKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFOQV9TUERJRl9MRUZUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAyKTsgLyogQUxJQ0UyIGJ1cyAweGIyICovCisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0hBTkFfU1BESUZfUklHSFQxLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDMpOyAvKiBBTElDRTIgYnVzIDB4YjMgKi8KKyNlbmRpZgorCS8qIERlZmF1bHQgb3V0cHV0cyAqLworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9ET0NLX0RBQzFfTEVGVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgMCk7IC8qIEFMSUNFMiBidXMgMHhhMCAqLworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzBdID0gMjE7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0RPQ0tfREFDMV9SSUdIVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgMSk7CisJZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbMV0gPSAyMjsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfRE9DS19EQUMyX0xFRlQxLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDIpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzJdID0gMjM7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0RPQ0tfREFDMl9SSUdIVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgMyk7CisJZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbM10gPSAyNDsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfRE9DS19EQUMzX0xFRlQxLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDQpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzRdID0gMjU7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0RPQ0tfREFDM19SSUdIVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgNSk7CisJZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbNV0gPSAyNjsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfRE9DS19EQUM0X0xFRlQxLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDYpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzZdID0gMjc7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0RPQ0tfREFDNF9SSUdIVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgNyk7CisJZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbN10gPSAyODsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfRE9DS19QSE9ORVNfTEVGVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgMCk7IC8qIEFMSUNFMiBidXMgMHhhMCAqLworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzhdID0gMjE7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0RPQ0tfUEhPTkVTX1JJR0hUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAxKTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVs5XSA9IDIyOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9ET0NLX1NQRElGX0xFRlQxLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDApOyAvKiBBTElDRTIgYnVzIDB4YTAgKi8KKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsxMF0gPSAyMTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfRE9DS19TUERJRl9SSUdIVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgMSk7CisJZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbMTFdID0gMjI7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0hBTkFfU1BESUZfTEVGVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgMCk7IC8qIEFMSUNFMiBidXMgMHhhMCAqLworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzEyXSA9IDIxOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU5BX1NQRElGX1JJR0hUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAxKTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsxM10gPSAyMjsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFNT0FfREFDX0xFRlQxLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDApOyAvKiBBTElDRTIgYnVzIDB4YTAgKi8KKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsxNF0gPSAyMTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFNT0FfREFDX1JJR0hUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAxKTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsxNV0gPSAyMjsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFOQV9BREFULCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDApOyAvKiBBTElDRTIgYnVzIDB4YTAgKi8KKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsxNl0gPSAyMTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFOQV9BREFUICsgMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAxKTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsxN10gPSAyMjsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFOQV9BREFUICsgMiwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAyKTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsxOF0gPSAyMzsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFOQV9BREFUICsgMywgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAzKTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsxOV0gPSAyNDsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFOQV9BREFUICsgNCwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyA0KTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsyMF0gPSAyNTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFOQV9BREFUICsgNSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyA1KTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsyMV0gPSAyNjsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFOQV9BREFUICsgNiwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyA2KTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsyMl0gPSAyNzsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFOQV9BREFUICsgNywgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyA3KTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsyM10gPSAyODsKIAotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAzMDAsIDB4MDMxMik7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDMwMSwgMHgwMzEzKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMjAwLCAweDAzMDIpOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAyMDEsIDB4MDMwMyk7CisJLyogVEVNUDogU2VsZWN0IFNQRElGIGluL291dCAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9PUFRJQ0FMX1RZUEUsIDB4MCk7IC8qIE91dHB1dCBzcGRpZiAqLworCisJLyogVEVNUDogU2VsZWN0IDQ4a0h6IFNQRElGIG91dCAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9VTk1VVEUsIDB4MCk7IC8qIE11dGUgYWxsICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0RFRkNMT0NLLCAweDApOyAvKiBEZWZhdWx0IGZhbGxiYWNrIGNsb2NrIDQ4a0h6ICovCisJLyogV29yZCBDbG9jayBzb3VyY2UsIEludGVybmFsIDQ4a0h6IHgxICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX1dDTE9DSywgRU1VX0hBTkFfV0NMT0NLX0lOVF80OEsgKTsKKwkvL3NuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9XQ0xPQ0ssIEVNVV9IQU5BX1dDTE9DS19JTlRfNDhLIHwgRU1VX0hBTkFfV0NMT0NLXzRYICk7CisJZW11LT5lbXUxMDEwLmludGVybmFsX2Nsb2NrID0gMTsgLyogNDgwMDAgKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfRE9DS19MRURTXzIsIDB4MTIpOy8qIFNldCBMRURzIG9uIEF1ZGlvIERvY2sgKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfVU5NVVRFLCAweDEpOyAvKiBVbm11dGUgYWxsICovCisJLy9zbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgMHg3LCAweDApOyAvKiBNdXRlIGFsbCAqLworCS8vc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIDB4NywgMHgxKTsgLyogVW5tdXRlIGFsbCAqLworCS8vc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIDB4ZSwgMHgxMik7IC8qIFNldCBMRURzIG9uIEF1ZGlvIERvY2sgKi8KIAogCXJldHVybiAwOwogfQpAQCAtNzQ3LDYgKzEwODEsMTAgQEAKIAkJfQogCQlzbmRfZW11MTBrMV9mcmVlX2VmeChlbXUpOwogICAgICAgIAl9CisJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEwMTApIHsKKwkJLyogRGlzYWJsZSA0OFZvbHQgcG93ZXIgdG8gQXVkaW8gRG9jayAqLworCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgIEVNVV9IQU5BX0RPQ0tfUFdSLCAgMCApOworCX0KIAlpZiAoZW11LT5tZW1oZHIpCiAJCXNuZF91dGlsX21lbWhkcl9mcmVlKGVtdS0+bWVtaGRyKTsKIAlpZiAoZW11LT5zaWxlbnRfcGFnZS5hcmVhKQpAQCAtODM4LDEwICsxMTc2LDExIEBACiAJIC5hZGNfMTM2MXQgPSAxLCAgLyogMjQgYml0IGNhcHR1cmUgaW5zdGVhZCBvZiAxNmJpdCAqLwogCSAuYWM5N19jaGlwID0gMX0gLAogCS8qIEF1ZGlneSAyIFpTIE5vdGVib29rIENhcmRidXMgY2FyZC4qLwotCS8qIFRlc3RlZCBieSBKYW1lc0BzdXBlcmJ1Zy5jby51ayAyMnRoIERlY2VtYmVyIDIwMDUgKi8KKwkvKiBUZXN0ZWQgYnkgSmFtZXNAc3VwZXJidWcuY28udWsgNnRoIE5vdmVtYmVyIDIwMDYgKi8KIAkvKiBBdWRpbyBvdXRwdXQgNy4xL0hlYWRwaG9uZXMgd29ya2luZy4KIAkgKiBEaWdpdGFsIG91dHB1dCB3b3JraW5nLiAoQUMzIG5vdCBjaGVja2VkLCBvbmx5IFBDTSkKLQkgKiBBdWRpbyBpbnB1dHMgbm90IHRlc3RlZC4KKwkgKiBBdWRpbyBNaWMvTGluZSBpbnB1dHMgd29ya2luZy4KKwkgKiBEaWdpdGFsIGlucHV0IG5vdCB0ZXN0ZWQuCiAJICovIAogCS8qIERTUDogVGluYTIKIAkgKiBEQUM6IFdvbGZzb24gV004NzY4L1dNODU2OApAQCAtODQ5LDYgKzExODgsMjUgQEAKIAkgKiBBQzk3OiBOb25lCiAJICogQ0EwMTUxOiBOb25lCiAJICovCisJLyogVGVzdGVkIGJ5IEphbWVzQHN1cGVyYnVnLmNvLnVrIDR0aCBBcHJpbCAyMDA2ICovCisJLyogQV9JT0NGRyBiaXRzCisJICogT3V0cHV0CisJICogMDogTm90IFVzZWQKKwkgKiAxOiAwID0gTXV0ZSBhbGwgdGhlIDcuMSBjaGFubmVsIG91dC4gMSA9IHVubXV0ZS4KKwkgKiAyOiBBbmFsb2cgaW5wdXQgMCA9IGxpbmUgaW4sIDEgPSBtaWMgaW4KKwkgKiAzOiBOb3QgVXNlZAorCSAqIDQ6IERpZ2l0YWwgb3V0cHV0IDAgPSBvZmYsIDEgPSBvbi4KKwkgKiA1OiBOb3QgVXNlZAorCSAqIDY6IE5vdCBVc2VkCisJICogNzogTm90IFVzZWQKKwkgKiBJbnB1dAorCSAqICAgICAgQWxsIGJpdHMgMSAoMHgzZnh4KSBtZWFucyBub3RoaW5nIHBsdWdnZWQgaW4uCisJICogOC05OiAwID0gTGluZSBpbi9NaWMsIDIgPSBPcHRpY2FsIGluLCAzID0gTm90aGluZy4KKwkgKiBBLUI6IDAgPSBIZWFkcGhvbmVzLCAyID0gT3B0aWNhbCBvdXQsIDMgPSBOb3RoaW5nLgorCSAqIEMtRDogMiA9IEZyb250L1JlYXIvZXRjLCAzID0gbm90aGluZy4KKwkgKiBFLUY6IEFsd2F5cyAwCisJICoKKwkgKi8KIAl7LnZlbmRvciA9IDB4MTEwMiwgLmRldmljZSA9IDB4MDAwOCwgLnN1YnN5c3RlbSA9IDB4MjAwMTExMDIsCiAJIC5kcml2ZXIgPSAiQXVkaWd5MiIsIC5uYW1lID0gIkF1ZGlneSAyIFpTIE5vdGVib29rIFtTQjA1MzBdIiwgCiAJIC5pZCA9ICJBdWRpZ3kyIiwKQEAgLTg1Niw2ICsxMjE0LDcgQEAKIAkgLmNhMDEwOF9jaGlwID0gMSwKIAkgLmNhX2NhcmRidXNfY2hpcCA9IDEsCiAJIC5zcGlfZGFjID0gMSwKKwkgLmkyY19hZGMgPSAxLAogCSAuc3BrNzEgPSAxfSAsCiAJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDgsIAogCSAuZHJpdmVyID0gIkF1ZGlneTIiLCAubmFtZSA9ICJBdWRpZ3kgMiBWYWx1ZSBbVW5rbm93bl0iLCAKQEAgLTg2NSwxMSArMTIyNCwxMiBAQAogCSAuYWM5N19jaGlwID0gMX0gLAogCS8qIFRlc3RlZCBieSBKYW1lc0BzdXBlcmJ1Zy5jby51ayA4dGggSnVseSAyMDA1LiBObyBzb3VuZCBhdmFpbGFibGUgeWV0LiAqLwogCXsudmVuZG9yID0gMHgxMTAyLCAuZGV2aWNlID0gMHgwMDA0LCAuc3Vic3lzdGVtID0gMHg0MDAxMTEwMiwKLQkgLmRyaXZlciA9ICJBdWRpZ3kyIiwgLm5hbWUgPSAiRS1tdSAxMjEybSBbNDAwMV0iLCAKLQkgLmlkID0gIkVNVTEyMTJtIiwKKwkgLmRyaXZlciA9ICJBdWRpZ3kyIiwgLm5hbWUgPSAiRS1tdSAxMDEwIFs0MDAxXSIsIAorCSAuaWQgPSAiRU1VMTAxMCIsCiAJIC5lbXUxMGsyX2NoaXAgPSAxLAogCSAuY2EwMTAyX2NoaXAgPSAxLAotCSAuZW11MTIxMm0gPSAxfSAsCisJIC5zcGs3MSA9IDEsCisJIC5lbXUxMDEwID0gMX0gLAogCS8qIFRlc3RlZCBieSBKYW1lc0BzdXBlcmJ1Zy5jby51ayAzcmQgSnVseSAyMDA1ICovCiAJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDQsIC5zdWJzeXN0ZW0gPSAweDIwMDcxMTAyLAogCSAuZHJpdmVyID0gIkF1ZGlneTIiLCAubmFtZSA9ICJBdWRpZ3kgNCBQUk8gW1NCMDM4MF0iLCAKQEAgLTEyOTcsOCArMTY1Nyw4IEBACiAJfSBlbHNlIGlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5jYV9jYXJkYnVzX2NoaXApIHsKIAkJaWYgKChlcnIgPSBzbmRfZW11MTBrMV9jYXJkYnVzX2luaXQoZW11KSkgPCAwKQogCQkJZ290byBlcnJvcjsKLSAJfSBlbHNlIGlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMjEybSkgewotIAkJaWYgKChlcnIgPSBzbmRfZW11MTBrMV9lbXUxMjEybV9pbml0KGVtdSkpIDwgMCkgeworIAl9IGVsc2UgaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEwMTApIHsKKyAJCWlmICgoZXJyID0gc25kX2VtdTEwazFfZW11MTAxMF9pbml0KGVtdSkpIDwgMCkgewogIAkJCXNuZF9lbXUxMGsxX2ZyZWUoZW11KTsKICAJCQlyZXR1cm4gZXJyOwogIAkJfQpAQCAtMTQ0Niw4ICsxODA2LDggQEAKIAkJc25kX2VtdTEwazFfZWNhcmRfaW5pdChlbXUpOwogCWVsc2UgaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmNhX2NhcmRidXNfY2hpcCkKIAkJc25kX2VtdTEwazFfY2FyZGJ1c19pbml0KGVtdSk7Ci0JZWxzZSBpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTIxMm0pCi0gCQlzbmRfZW11MTBrMV9lbXUxMjEybV9pbml0KGVtdSk7CisJZWxzZSBpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTAxMCkKKyAJCXNuZF9lbXUxMGsxX2VtdTEwMTBfaW5pdChlbXUpOwogCWVsc2UKIAkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQUM5N1NMT1QsIDAsIEFDOTdTTE9UX0NOVFJ8QUM5N1NMT1RfTEZFKTsKIAlzbmRfZW11MTBrMV9pbml0KGVtdSwgZW11LT5lbmFibGVfaXIsIDEpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKaW5kZXggMjE5OWI0Mi4uYmIwZmVjNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCkBAIC00NjAsNyArNDYwLDcgQEAKIAl1MzIgcGVyaW9kX3NpemVfYnl0ZXMgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcnVudGltZS0+cGVyaW9kX3NpemUpOwogCWludCBpOwogCQotCWZvcihpPTA7IGkgPCBydW50aW1lLT5wZXJpb2RzOyBpKyspIHsKKwlmb3IoaSA9IDA7IGkgPCBydW50aW1lLT5wZXJpb2RzOyBpKyspIHsKIAkJKnRhYmxlX2Jhc2UrKz1ydW50aW1lLT5kbWFfYWRkcisoaSpwZXJpb2Rfc2l6ZV9ieXRlcyk7CiAJCSp0YWJsZV9iYXNlKys9cGVyaW9kX3NpemVfYnl0ZXM8PDE2OwogCX0KQEAgLTEwNDIsOCArMTA0Miw4IEBACiAJCWlmIChzc2NhbmYobGluZSwgIiV4ICV4ICV4IiwgJnJlZywgJmNoYW5uZWxfaWQsICZ2YWwpICE9IDMpCiAJCQljb250aW51ZTsKIAotCQlpZiAoKHJlZyA8IDB4NDkpICYmIChyZWcgPj0wKSAmJiAodmFsIDw9IDB4ZmZmZmZmZmYpIAotCQkgICAgJiYgKGNoYW5uZWxfaWQgPj0wKSAmJiAoY2hhbm5lbF9pZCA8PSAyKSApCisJCWlmICgocmVnIDwgMHg0OSkgJiYgKHJlZyA+PSAwKSAmJiAodmFsIDw9IDB4ZmZmZmZmZmYpIAorCQkgICAgJiYgKGNoYW5uZWxfaWQgPj0gMCkgJiYgKGNoYW5uZWxfaWQgPD0gMikgKQogCQkJc25kX2VtdTEwazF4X3B0cl93cml0ZShlbXUsIHJlZywgY2hhbm5lbF9pZCwgdmFsKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11ZnguYwppbmRleCAxM2NkNmNlLi5jMDIwMTJjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdWZ4LmMKQEAgLTMsNiArMyw5IEBACiAgKiAgICAgICAgICAgICAgICAgICBDcmVhdGl2ZSBMYWJzLCBJbmMuCiAgKiAgUm91dGluZXMgZm9yIGVmZmVjdCBwcm9jZXNzb3IgRlg4MDEwCiAgKgorICogIENvcHlyaWdodCAoYykgYnkgSmFtZXMgQ291cnRpZXItRHV0dG9uIDxKYW1lc0BzdXBlcmJ1Zy5jby51az4KKyAqICAJQWRkZWQgRU1VIDEwMTAgc3VwcG9ydC4KKyAqCiAgKiAgQlVHUzoKICAqICAgIC0tCiAgKgpAQCAtMjkzLDcgKzI5Niw3IEBACiB9OwogCiAvKiBFTVUxMGsxL0VNVTEwazIgRFNQIGNvbnRyb2wgZGIgZ2FpbiAqLwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKHNuZF9lbXUxMGsxX2RiX3NjYWxlMSwgLTQwMDAsIDQwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShzbmRfZW11MTBrMV9kYl9zY2FsZTEsIC00MDAwLCA0MCwgMSk7CiAKIHN0YXRpYyBjb25zdCB1MzIgb25vZmZfdGFibGVbMl0gPSB7CiAJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMQpAQCAtNjUyLDEzICs2NTUsNjYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorI2RlZmluZSBNQVhfVExWX1NJWkUJMjU2CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgKmNvcHlfdGx2KGNvbnN0IHVuc2lnbmVkIGludCBfX3VzZXIgKl90bHYpCit7CisJdW5zaWduZWQgaW50IGRhdGFbMl07CisJdW5zaWduZWQgaW50ICp0bHY7CisKKwlpZiAoIV90bHYpCisJCXJldHVybiBOVUxMOworCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBfdGx2LCBzaXplb2YoZGF0YSkpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZGF0YVsxXSA+PSBNQVhfVExWX1NJWkUpCisJCXJldHVybiBOVUxMOworCXRsdiA9IGttYWxsb2MoZGF0YVsxXSAqIDQgKyBzaXplb2YoZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghdGx2KQorCQlyZXR1cm4gTlVMTDsKKwltZW1jcHkodGx2LCBkYXRhLCBzaXplb2YoZGF0YSkpOworCWlmIChjb3B5X2Zyb21fdXNlcih0bHYgKyAyLCBfdGx2ICsgMiwgZGF0YVsxXSkpIHsKKwkJa2ZyZWUodGx2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB0bHY7Cit9CisKK3N0YXRpYyBpbnQgY29weV9nY3RsKHN0cnVjdCBzbmRfZW11MTBrMSAqZW11LAorCQkgICAgIHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHIgKmdjdGwsCisJCSAgICAgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciBfX3VzZXIgKl9nY3RsLAorCQkgICAgIGludCBpZHgpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX29sZF9ncHIgX191c2VyICpvY3RsOworCisJaWYgKGVtdS0+c3VwcG9ydF90bHYpCisJCXJldHVybiBjb3B5X2Zyb21fdXNlcihnY3RsLCAmX2djdGxbaWR4XSwgc2l6ZW9mKCpnY3RsKSk7CisJb2N0bCA9IChzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfb2xkX2dwciBfX3VzZXIgKilfZ2N0bDsKKwlpZiAoY29weV9mcm9tX3VzZXIoZ2N0bCwgJm9jdGxbaWR4XSwgc2l6ZW9mKCpvY3RsKSkpCisJCXJldHVybiAtRUZBVUxUOworCWdjdGwtPnRsdiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29weV9nY3RsX3RvX3VzZXIoc3RydWN0IHNuZF9lbXUxMGsxICplbXUsCisJCSAgICAgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciBfX3VzZXIgKl9nY3RsLAorCQkgICAgIHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHIgKmdjdGwsCisJCSAgICAgaW50IGlkeCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfb2xkX2dwciBfX3VzZXIgKm9jdGw7CisKKwlpZiAoZW11LT5zdXBwb3J0X3RsdikKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigmX2djdGxbaWR4XSwgZ2N0bCwgc2l6ZW9mKCpnY3RsKSk7CisJCisJb2N0bCA9IChzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfb2xkX2dwciBfX3VzZXIgKilfZ2N0bDsKKwlyZXR1cm4gY29weV90b191c2VyKCZvY3RsW2lkeF0sIGdjdGwsIHNpemVvZigqb2N0bCkpOworfQorCiBzdGF0aWMgaW50IHNuZF9lbXUxMGsxX3ZlcmlmeV9jb250cm9scyhzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwKIAkJCQkgICAgICAgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb2RlICppY29kZSkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIF9fdXNlciAqX2lkOwogCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgaWQ7Ci0Jc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciBfX3VzZXIgKl9nY3RsOwogCXN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHIgKmdjdGw7CiAJaW50IGVycjsKIAkKQEAgLTY3Myw5ICs3MjksOCBAQAogCWlmICghIGdjdGwpCiAJCXJldHVybiAtRU5PTUVNOwogCWVyciA9IDA7Ci0JZm9yIChpID0gMCwgX2djdGwgPSBpY29kZS0+Z3ByX2FkZF9jb250cm9sczsKLQkgICAgIGkgPCBpY29kZS0+Z3ByX2FkZF9jb250cm9sX2NvdW50OyBpKyssIF9nY3RsKyspIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGdjdGwsIF9nY3RsLCBzaXplb2YoKmdjdGwpKSkgeworCWZvciAoaSA9IDA7IGkgPCBpY29kZS0+Z3ByX2FkZF9jb250cm9sX2NvdW50OyBpKyspIHsKKwkJaWYgKGNvcHlfZ2N0bChlbXUsIGdjdGwsIGljb2RlLT5ncHJfYWRkX2NvbnRyb2xzLCBpKSkgewogCQkJZXJyID0gLUVGQVVMVDsKIAkJCWdvdG8gX19lcnJvcjsKIAkJfQpAQCAtNjk0LDEwICs3NDksOSBAQAogCQkJZ290byBfX2Vycm9yOwogCQl9CiAJfQotCWZvciAoaSA9IDAsIF9nY3RsID0gaWNvZGUtPmdwcl9saXN0X2NvbnRyb2xzOwotCSAgICAgaSA8IGljb2RlLT5ncHJfbGlzdF9jb250cm9sX2NvdW50OyBpKyssIF9nY3RsKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgaWNvZGUtPmdwcl9saXN0X2NvbnRyb2xfY291bnQ7IGkrKykgewogCSAgICAgCS8qIEZJWE1FOiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBXUklURSBhY2Nlc3MgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGdjdGwsIF9nY3RsLCBzaXplb2YoKmdjdGwpKSkgeworCQlpZiAoY29weV9nY3RsKGVtdSwgZ2N0bCwgaWNvZGUtPmdwcl9saXN0X2NvbnRyb2xzLCBpKSkgewogCQkJZXJyID0gLUVGQVVMVDsKIAkJCWdvdG8gX19lcnJvcjsKIAkJfQpAQCAtNzE1LDEzICs3NjksMTQgQEAKIAlrY3RsLT5wcml2YXRlX3ZhbHVlID0gMDsKIAlsaXN0X2RlbCgmY3RsLT5saXN0KTsKIAlrZnJlZShjdGwpOworCWlmIChrY3RsLT50bHYucCkKKwkJa2ZyZWUoa2N0bC0+dGx2LnApOwogfQogCiBzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwKIAkJCQkgICAgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb2RlICppY29kZSkKIHsKIAl1bnNpZ25lZCBpbnQgaSwgajsKLQlzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByIF9fdXNlciAqX2djdGw7CiAJc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciAqZ2N0bDsKIAlzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2N0bCAqY3RsLCAqbmN0bDsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBrbmV3OwpAQCAtNzM3LDkgKzc5Miw4IEBACiAJCWdvdG8gX19lcnJvcjsKIAl9CiAKLQlmb3IgKGkgPSAwLCBfZ2N0bCA9IGljb2RlLT5ncHJfYWRkX2NvbnRyb2xzOwotCSAgICAgaSA8IGljb2RlLT5ncHJfYWRkX2NvbnRyb2xfY291bnQ7IGkrKywgX2djdGwrKykgewotCQlpZiAoY29weV9mcm9tX3VzZXIoZ2N0bCwgX2djdGwsIHNpemVvZigqZ2N0bCkpKSB7CisJZm9yIChpID0gMDsgaSA8IGljb2RlLT5ncHJfYWRkX2NvbnRyb2xfY291bnQ7IGkrKykgeworCQlpZiAoY29weV9nY3RsKGVtdSwgZ2N0bCwgaWNvZGUtPmdwcl9hZGRfY29udHJvbHMsIGkpKSB7CiAJCQllcnIgPSAtRUZBVUxUOwogCQkJZ290byBfX2Vycm9yOwogCQl9CkBAIC03NjAsMTEgKzgxNCwxMCBAQAogCQlrbmV3LmRldmljZSA9IGdjdGwtPmlkLmRldmljZTsKIAkJa25ldy5zdWJkZXZpY2UgPSBnY3RsLT5pZC5zdWJkZXZpY2U7CiAJCWtuZXcuaW5mbyA9IHNuZF9lbXUxMGsxX2dwcl9jdGxfaW5mbzsKLQkJaWYgKGdjdGwtPnRsdi5wKSB7Ci0JCQlrbmV3LnRsdi5wID0gZ2N0bC0+dGx2LnA7CisJCWtuZXcudGx2LnAgPSBjb3B5X3RsdihnY3RsLT50bHYpOworCQlpZiAoa25ldy50bHYucCkKIAkJCWtuZXcuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CiAJCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEOwotCQl9IAogCQlrbmV3LmdldCA9IHNuZF9lbXUxMGsxX2dwcl9jdGxfZ2V0OwogCQlrbmV3LnB1dCA9IHNuZF9lbXUxMGsxX2dwcl9jdGxfcHV0OwogCQltZW1zZXQobmN0bCwgMCwgc2l6ZW9mKCpuY3RsKSk7CkBAIC03ODIsMTIgKzgzNSwxNCBAQAogCQkJY3RsID0ga21hbGxvYyhzaXplb2YoKmN0bCksIEdGUF9LRVJORUwpOwogCQkJaWYgKGN0bCA9PSBOVUxMKSB7CiAJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlrZnJlZShrbmV3LnRsdi5wKTsKIAkJCQlnb3RvIF9fZXJyb3I7CiAJCQl9CiAJCQlrbmV3LnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZyljdGw7CiAJCQkqY3RsID0gKm5jdGw7CiAJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGVtdS0+Y2FyZCwga2N0bCA9IHNuZF9jdGxfbmV3MSgma25ldywgZW11KSkpIDwgMCkgewogCQkJCWtmcmVlKGN0bCk7CisJCQkJa2ZyZWUoa25ldy50bHYucCk7CiAJCQkJZ290byBfX2Vycm9yOwogCQkJfQogCQkJa2N0bC0+cHJpdmF0ZV9mcmVlID0gc25kX2VtdTEwazFfY3RsX3ByaXZhdGVfZnJlZTsKQEAgLTgzOCw3ICs4OTMsNiBAQAogCXVuc2lnbmVkIGludCBpID0gMCwgajsKIAl1bnNpZ25lZCBpbnQgdG90YWwgPSAwOwogCXN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHIgKmdjdGw7Ci0Jc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciBfX3VzZXIgKl9nY3RsOwogCXN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY3RsICpjdGw7CiAJc3RydWN0IHNuZF9jdGxfZWxlbV9pZCAqaWQ7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKQEAgLTg0NywxMSArOTAxLDExIEBACiAJaWYgKCEgZ2N0bCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlfZ2N0bCA9IGljb2RlLT5ncHJfbGlzdF9jb250cm9sczsJCiAJbGlzdF9mb3JfZWFjaChsaXN0LCAmZW11LT5meDgwMTAuZ3ByX2N0bCkgewogCQljdGwgPSBlbXUxMGsxX2dwcl9jdGwobGlzdCk7CiAJCXRvdGFsKys7Ci0JCWlmIChfZ2N0bCAmJiBpIDwgaWNvZGUtPmdwcl9saXN0X2NvbnRyb2xfY291bnQpIHsKKwkJaWYgKGljb2RlLT5ncHJfbGlzdF9jb250cm9scyAmJgorCQkgICAgaSA8IGljb2RlLT5ncHJfbGlzdF9jb250cm9sX2NvdW50KSB7CiAJCQltZW1zZXQoZ2N0bCwgMCwgc2l6ZW9mKCpnY3RsKSk7CiAJCQlpZCA9ICZjdGwtPmtjb250cm9sLT5pZDsKIAkJCWdjdGwtPmlkLmlmYWNlID0gaWQtPmlmYWNlOwpAQCAtODY4LDExICs5MjIsMTEgQEAKIAkJCWdjdGwtPm1pbiA9IGN0bC0+bWluOwogCQkJZ2N0bC0+bWF4ID0gY3RsLT5tYXg7CiAJCQlnY3RsLT50cmFuc2xhdGlvbiA9IGN0bC0+dHJhbnNsYXRpb247Ci0JCQlpZiAoY29weV90b191c2VyKF9nY3RsLCBnY3RsLCBzaXplb2YoKmdjdGwpKSkgeworCQkJaWYgKGNvcHlfZ2N0bF90b191c2VyKGVtdSwgaWNvZGUtPmdwcl9saXN0X2NvbnRyb2xzLAorCQkJCQkgICAgICBnY3RsLCBpKSkgewogCQkJCWtmcmVlKGdjdGwpOwogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQotCQkJX2djdGwrKzsKIAkJCWkrKzsKIAkJfQogCX0KQEAgLTEwMjMsNyArMTA3Nyw3IEBACiAJY3RsLT5ncHJbMF0gPSBncHIgKyAwOyBjdGwtPnZhbHVlWzBdID0gZGVmdmFsOwogCWN0bC0+bWluID0gMDsKIAljdGwtPm1heCA9IDEwMDsKLQljdGwtPnRsdi5wID0gc25kX2VtdTEwazFfZGJfc2NhbGUxOworCWN0bC0+dGx2ID0gc25kX2VtdTEwazFfZGJfc2NhbGUxOwogCWN0bC0+dHJhbnNsYXRpb24gPSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9UQUJMRTEwMDsJCiB9CiAKQEAgLTEwMzgsNyArMTA5Miw3IEBACiAJY3RsLT5ncHJbMV0gPSBncHIgKyAxOyBjdGwtPnZhbHVlWzFdID0gZGVmdmFsOwogCWN0bC0+bWluID0gMDsKIAljdGwtPm1heCA9IDEwMDsKLQljdGwtPnRsdi5wID0gc25kX2VtdTEwazFfZGJfc2NhbGUxOworCWN0bC0+dGx2ID0gc25kX2VtdTEwazFfZGJfc2NhbGUxOwogCWN0bC0+dHJhbnNsYXRpb24gPSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9UQUJMRTEwMDsKIH0KIApAQCAtMTA2OSw2ICsxMTIzLDIxIEBACiAJY3RsLT50cmFuc2xhdGlvbiA9IEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX09OT0ZGOwogfQogCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2F1ZGlneV9kc3BfY29udmVydF8zMl90b18yeDE2KAorCQkJCXN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29kZSAqaWNvZGUsCisJCQkJdTMyICpwdHIsIGludCB0bXAsIGludCBiaXRfc2hpZnRlcjE2LAorCQkJCWludCByZWdfaW4sIGludCByZWdfb3V0KQoreworCUFfT1AoaWNvZGUsIHB0ciwgaUFDQzMsIEFfR1BSKHRtcCArIDEpLCByZWdfaW4sIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKKwlBX09QKGljb2RlLCBwdHIsIGlBTkRYT1IsIEFfR1BSKHRtcCksIEFfR1BSKHRtcCArIDEpLCBBX0dQUihiaXRfc2hpZnRlcjE2IC0gMSksIEFfQ18wMDAwMDAwMCk7CisJQV9PUChpY29kZSwgcHRyLCBpVFNUTkVHLCBBX0dQUih0bXAgKyAyKSwgQV9HUFIodG1wKSwgQV9DXzgwMDAwMDAwLCBBX0dQUihiaXRfc2hpZnRlcjE2IC0gMikpOworCUFfT1AoaWNvZGUsIHB0ciwgaUFORFhPUiwgQV9HUFIodG1wICsgMiksIEFfR1BSKHRtcCArIDIpLCBBX0NfODAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7CisJQV9PUChpY29kZSwgcHRyLCBpQU5EWE9SLCBBX0dQUih0bXApLCBBX0dQUih0bXApLCBBX0dQUihiaXRfc2hpZnRlcjE2IC0gMyksIEFfQ18wMDAwMDAwMCk7CisJQV9PUChpY29kZSwgcHRyLCBpTUFDSU5UMCwgQV9HUFIodG1wKSwgQV9DXzAwMDAwMDAwLCBBX0dQUih0bXApLCBBX0NfMDAwMTAwMDApOworCUFfT1AoaWNvZGUsIHB0ciwgaUFORFhPUiwgcmVnX291dCwgQV9HUFIodG1wKSwgQV9DX2ZmZmZmZmZmLCBBX0dQUih0bXAgKyAyKSk7CisJQV9PUChpY29kZSwgcHRyLCBpQUNDMywgcmVnX291dCArIDEsIEFfR1BSKHRtcCArIDEpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7CisJcmV0dXJuIDE7Cit9CiAKIC8qCiAgKiBpbml0aWFsIERTUCBjb25maWd1cmF0aW9uIGZvciBBdWRpZ3kKQEAgLTEwNzcsNiArMTE0Niw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBfc25kX2VtdTEwazFfYXVkaWd5X2luaXRfZWZ4KHN0cnVjdCBzbmRfZW11MTBrMSAqZW11KQogewogCWludCBlcnIsIGksIHosIGdwciwgbmN0bDsKKwlpbnQgYml0X3NoaWZ0ZXIxNjsKIAljb25zdCBpbnQgcGxheWJhY2sgPSAxMDsKIAljb25zdCBpbnQgY2FwdHVyZSA9IHBsYXliYWNrICsgKFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICogMik7IC8qIHdlIHJlc2VydmUgMTAgdm9pY2VzICovCiAJY29uc3QgaW50IHN0ZXJlb19taXggPSBjYXB0dXJlICsgMjsKQEAgLTExMTQsMTcgKzExODQsMTQgQEAKIAlwdHIgPSAwOwogCW5jdGwgPSAwOwogCWdwciA9IHN0ZXJlb19taXggKyAxMDsKKwlncHJfbWFwW2dwcisrXSA9IDB4MDAwMDdmZmY7CisJZ3ByX21hcFtncHIrK10gPSAweDAwMDA4MDAwOworCWdwcl9tYXBbZ3ByKytdID0gMHgwMDAwZmZmZjsKKwliaXRfc2hpZnRlcjE2ID0gZ3ByOwogCiAJLyogc3RvcCBGWCBwcm9jZXNzb3IgKi8KIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX0RCRywgMCwgKGVtdS0+Zng4MDEwLmRiZyA9IDApIHwgQV9EQkdfU0lOR0xFX1NURVApOwogCi0jaWYgMAotCS8qIEZJWDogamNkIHRlc3QgKi8KLQlmb3IgKHogPSAwOyB6IDwgODA7IHo9eisyKSB7Ci0JCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0VYVE9VVCh6KSwgQV9GWEJVUyhGWEJVU19QQ01fTEVGVF9GUk9OVCksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsgLyogbGVmdCAqLwotCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9FWFRPVVQoeisxKSwgQV9GWEJVUyhGWEJVU19QQ01fUklHSFRfRlJPTlQpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7IC8qIHJpZ2h0ICovCi0JfQotI2VuZGlmIC8qIGpjZCB0ZXN0ICovCiAjaWYgMQogCS8qIFBDTSBmcm9udCBQbGF5YmFjayBWb2x1bWUgKGluZGVwZW5kZW50IGZyb20gc3RlcmVvIG1peCkgKi8KIAlBX09QKGljb2RlLCAmcHRyLCBpTUFDMCwgQV9HUFIocGxheWJhY2spLCBBX0NfMDAwMDAwMDAsIEFfR1BSKGdwciksIEFfRlhCVVMoRlhCVVNfUENNX0xFRlRfRlJPTlQpKTsKQEAgLTExODIsMTMgKzEyNDksMjAgQEAKIAlBX09QKGljb2RlLCAmcHRyLCBpTUFDMCwgQV9HUFIoY2FwdHVyZSsxKSwgQV9HUFIoY2FwdHVyZSsxKSwgQV9HUFIoZ3ByKzEpLCBBX0ZYQlVTKEZYQlVTX01JRElfUklHSFQpKTsKIAlzbmRfZW11MTBrMV9pbml0X3N0ZXJlb19jb250cm9sKCZjb250cm9sc1tuY3RsKytdLCAiU3ludGggQ2FwdHVyZSBWb2x1bWUiLCBncHIsIDApOwogCWdwciArPSAyOwotCisgICAgICAKIAkvKgogCSAqIGlucHV0cwogCSAqLwogI2RlZmluZSBBX0FERF9WT0xVTUVfSU4odmFyLHZvbCxpbnB1dCkgXAogQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKHZhciksIEFfR1BSKHZhciksIEFfR1BSKHZvbCksIEFfRVhUSU4oaW5wdXQpKQogCisJLyogZW11MTIxMiBEU1AgMCBhbmQgRFNQIDEgQ2FwdHVyZSAqLworCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMDEwKSB7CisJCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihjYXB0dXJlKzApLCBBX0dQUihjYXB0dXJlKzApLCBBX0dQUihncHIpLCBBX1AxNlZJTigweDApKTsKKwkJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKGNhcHR1cmUrMSksIEFfR1BSKGNhcHR1cmUrMSksIEFfR1BSKGdwcisxKSwgQV9QMTZWSU4oMHgxKSk7CisJCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woJmNvbnRyb2xzW25jdGwrK10sICJFTVUgQ2FwdHVyZSBWb2x1bWUiLCBncHIsIDApOworCQlncHIgKz0gMjsKKwl9CiAJLyogQUMnOTcgUGxheWJhY2sgVm9sdW1lIC0gdXNlZCBvbmx5IGZvciBtaWMgKHJlbmFtZWQgbGF0ZXIpICovCiAJQV9BRERfVk9MVU1FX0lOKHN0ZXJlb19taXgsIGdwciwgQV9FWFRJTl9BQzk3X0wpOwogCUFfQUREX1ZPTFVNRV9JTihzdGVyZW9fbWl4KzEsIGdwcisxLCBBX0VYVElOX0FDOTdfUik7CkBAIC0xNDI5LDYgKzE1MDMsMTMgQEAKIAogCS8qIGRpZ2l0YWwgb3V0cHV0cyAqLwogCS8qIEFfUFVUX1NURVJFT19PVVRQVVQoQV9FWFRPVVRfRlJPTlRfTCwgQV9FWFRPVVRfRlJPTlRfUiwgcGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyk7ICovCisJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEwMTApIHsKKwkJLyogRU1VMTAxMCBPdXRwdXRzIGZyb20gUENNIEZyb250LCBSZWFyLCBDZW50ZXIsIExGRSwgU2lkZSAqLworCQlzbmRfcHJpbnRrKCJFTVUgb3V0cHV0cyBvblxuIik7CisJCWZvciAoeiA9IDA7IHogPCA4OyB6KyspIHsKKwkJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0VNVTMyT1VUTCh6KSwgQV9HUFIocGxheWJhY2sgKyBTTkRfRU1VMTBLMV9QTEFZQkFDS19DSEFOTkVMUyArIHopLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7CisJCX0KKwl9CiAKIAkvKiBJRUM5NTggT3B0aWNhbCBSYXcgUGxheWJhY2sgU3dpdGNoICovIAogCWdwcl9tYXBbZ3ByKytdID0gMDsKQEAgLTE0NjYsOSArMTU0Nyw1NyBAQAogCUFfUFVUX09VVFBVVChBX0VYVE9VVF9BRENfQ0FQX1IsIGNhcHR1cmUrMSk7CiAjZW5kaWYKIAotCS8qIEVGWCBjYXB0dXJlIC0gY2FwdHVyZSB0aGUgMTYgRVhUSU5zICovCi0JZm9yICh6ID0gMDsgeiA8IDE2OyB6KyspIHsKLQkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfRlhCVVMyKHopLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCwgQV9FWFRJTih6KSk7CisJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEwMTApIHsKKwkJc25kX3ByaW50aygiRU1VIGlucHV0cyBvblxuIik7CisJCS8qIENhcHR1cmUgOCBjaGFubmVscyBvZiBTMzJfTEUgc291bmQgKi8KKwkJCisJCS8qIHByaW50aygiZW11ZnguYzogZ3ByPTB4JXgsIHRtcD0weCV4XG4iLGdwciwgdG1wKTsgKi8KKwkJLyogRm9yIHRoZSBFTVUxMDEwOiBIb3cgdG8gZ2V0IDMyYml0IHZhbHVlcyBmcm9tIHRoZSBEU1AuIEhpZ2ggMTZiaXRzIGludG8gTCwgbG93IDE2Yml0cyBpbnRvIFIuICovCisJCS8qIEFfUDE2VklOKDApIGlzIGRlbGF5ZWQgYnkgb25lIHNhbXBsZSwKKwkJICogc28gYWxsIG90aGVyIEFfUDE2VklOIGNoYW5uZWxzIHdpbGwgbmVlZCB0byBhbHNvIGJlIGRlbGF5ZWQKKwkJICovCisJCS8qIExlZnQgQURDIGluLiAxIG9mIDIgKi8KKwkJc25kX2VtdTEwazFfYXVkaWd5X2RzcF9jb252ZXJ0XzMyX3RvXzJ4MTYoIGljb2RlLCAmcHRyLCB0bXAsIGJpdF9zaGlmdGVyMTYsIEFfUDE2VklOKDB4MCksIEFfRlhCVVMyKDApICk7CisJCS8qIFJpZ2h0IEFEQyBpbiAxIG9mIDIgKi8KKwkJZ3ByX21hcFtncHIrK10gPSAweDAwMDAwMDAwOworCQlzbmRfZW11MTBrMV9hdWRpZ3lfZHNwX2NvbnZlcnRfMzJfdG9fMngxNiggaWNvZGUsICZwdHIsIHRtcCwgYml0X3NoaWZ0ZXIxNiwgQV9HUFIoZ3ByIC0gMSksIEFfRlhCVVMyKDIpICk7CisJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0dQUihncHIgLSAxKSwgQV9QMTZWSU4oMHgxKSwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDApOworCQlncHJfbWFwW2dwcisrXSA9IDB4MDAwMDAwMDA7CisJCXNuZF9lbXUxMGsxX2F1ZGlneV9kc3BfY29udmVydF8zMl90b18yeDE2KCBpY29kZSwgJnB0ciwgdG1wLCBiaXRfc2hpZnRlcjE2LCBBX0dQUihncHIgLSAxKSwgQV9GWEJVUzIoNCkgKTsKKwkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfR1BSKGdwciAtIDEpLCBBX1AxNlZJTigweDIpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7CisJCWdwcl9tYXBbZ3ByKytdID0gMHgwMDAwMDAwMDsKKwkJc25kX2VtdTEwazFfYXVkaWd5X2RzcF9jb252ZXJ0XzMyX3RvXzJ4MTYoIGljb2RlLCAmcHRyLCB0bXAsIGJpdF9zaGlmdGVyMTYsIEFfR1BSKGdwciAtIDEpLCBBX0ZYQlVTMig2KSApOworCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9HUFIoZ3ByIC0gMSksIEFfUDE2VklOKDB4MyksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKKwkJLyogRm9yIDk2a0h6IG1vZGUgKi8KKwkJLyogTGVmdCBBREMgaW4uIDIgb2YgMiAqLworCQlncHJfbWFwW2dwcisrXSA9IDB4MDAwMDAwMDA7CisJCXNuZF9lbXUxMGsxX2F1ZGlneV9kc3BfY29udmVydF8zMl90b18yeDE2KCBpY29kZSwgJnB0ciwgdG1wLCBiaXRfc2hpZnRlcjE2LCBBX0dQUihncHIgLSAxKSwgQV9GWEJVUzIoMHg4KSApOworCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9HUFIoZ3ByIC0gMSksIEFfUDE2VklOKDB4NCksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKKwkJLyogUmlnaHQgQURDIGluIDIgb2YgMiAqLworCQlncHJfbWFwW2dwcisrXSA9IDB4MDAwMDAwMDA7CisJCXNuZF9lbXUxMGsxX2F1ZGlneV9kc3BfY29udmVydF8zMl90b18yeDE2KCBpY29kZSwgJnB0ciwgdG1wLCBiaXRfc2hpZnRlcjE2LCBBX0dQUihncHIgLSAxKSwgQV9GWEJVUzIoMHhhKSApOworCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9HUFIoZ3ByIC0gMSksIEFfUDE2VklOKDB4NSksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKKwkJZ3ByX21hcFtncHIrK10gPSAweDAwMDAwMDAwOworCQlzbmRfZW11MTBrMV9hdWRpZ3lfZHNwX2NvbnZlcnRfMzJfdG9fMngxNiggaWNvZGUsICZwdHIsIHRtcCwgYml0X3NoaWZ0ZXIxNiwgQV9HUFIoZ3ByIC0gMSksIEFfRlhCVVMyKDB4YykgKTsKKwkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfR1BSKGdwciAtIDEpLCBBX1AxNlZJTigweDYpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7CisJCWdwcl9tYXBbZ3ByKytdID0gMHgwMDAwMDAwMDsKKwkJc25kX2VtdTEwazFfYXVkaWd5X2RzcF9jb252ZXJ0XzMyX3RvXzJ4MTYoIGljb2RlLCAmcHRyLCB0bXAsIGJpdF9zaGlmdGVyMTYsIEFfR1BSKGdwciAtIDEpLCBBX0ZYQlVTMigweGUpICk7CisJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0dQUihncHIgLSAxKSwgQV9QMTZWSU4oMHg3KSwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDApOworCisjaWYgMAorCQlmb3IgKHogPSA0OyB6IDwgODsgeisrKSB7CisJCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9GWEJVUzIoeiksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDApOworCQl9CisJCWZvciAoeiA9IDB4YzsgeiA8IDB4MTA7IHorKykgeworCQkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfRlhCVVMyKHopLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKKwkJfQorI2VuZGlmCisJfSBlbHNlIHsKKwkJLyogRUZYIGNhcHR1cmUgLSBjYXB0dXJlIHRoZSAxNiBFWFRJTnMgKi8KKwkJLyogQ2FwdHVyZSAxNiBjaGFubmVscyBvZiBTMTZfTEUgc291bmQgKi8KKwkJZm9yICh6ID0gMDsgeiA8IDE2OyB6KyspIHsKKwkJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0ZYQlVTMih6KSwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDAsIEFfRVhUSU4oeikpOworCQl9CiAJfQogCQogI2VuZGlmIC8qIEpDRCB0ZXN0ICovCkBAIC0xNDg4LDcgKzE2MTcsOSBAQAogCXNlZyA9IHNuZF9lbnRlcl91c2VyKCk7CiAJaWNvZGUtPmdwcl9hZGRfY29udHJvbF9jb3VudCA9IG5jdGw7CiAJaWNvZGUtPmdwcl9hZGRfY29udHJvbHMgPSAoc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciBfX3VzZXIgKiljb250cm9sczsKKwllbXUtPnN1cHBvcnRfdGx2ID0gMTsgLyogc3VwcG9ydCBUTFYgKi8KIAllcnIgPSBzbmRfZW11MTBrMV9pY29kZV9wb2tlKGVtdSwgaWNvZGUpOworCWVtdS0+c3VwcG9ydF90bHYgPSAwOyAvKiBjbGVhciBhZ2FpbiAqLwogCXNuZF9sZWF2ZV91c2VyKHNlZyk7CiAKICBfX2VycjoKQEAgLTIxMDUsNyArMjIzNiw5IEBACiAJc2VnID0gc25kX2VudGVyX3VzZXIoKTsKIAlpY29kZS0+Z3ByX2FkZF9jb250cm9sX2NvdW50ID0gaTsKIAlpY29kZS0+Z3ByX2FkZF9jb250cm9scyA9IChzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByIF9fdXNlciAqKWNvbnRyb2xzOworCWVtdS0+c3VwcG9ydF90bHYgPSAxOyAvKiBzdXBwb3J0IFRMViAqLwogCWVyciA9IHNuZF9lbXUxMGsxX2ljb2RlX3Bva2UoZW11LCBpY29kZSk7CisJZW11LT5zdXBwb3J0X3RsdiA9IDA7IC8qIGNsZWFyIGFnYWluICovCiAJc25kX2xlYXZlX3VzZXIoc2VnKTsKIAlpZiAoZXJyID49IDApCiAJCWVyciA9IHNuZF9lbXUxMGsxX2lwY21fcG9rZShlbXUsIGlwY20pOwpAQCAtMjEzOCw3ICsyMjcxLDcgQEAKIAkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgREJHLCAwLCBlbXUtPmZ4ODAxMC5kYmcgPSBFTVUxMEsxX0RCR19TSU5HTEVfU1RFUCk7CiB9CiAKLSNpZiAwIC8vIEZJWE1FOiB3aG8gdXNlIHRoZW0/CisjaWYgMCAvKiBGSVhNRTogd2hvIHVzZSB0aGVtPyAqLwogaW50IHNuZF9lbXUxMGsxX2Z4ODAxMF90b25lX2NvbnRyb2xfYWN0aXZhdGUoc3RydWN0IHNuZF9lbXUxMGsxICplbXUsIGludCBvdXRwdXQpCiB7CiAJaWYgKG91dHB1dCA8IDAgfHwgb3V0cHV0ID49IDYpCkBAIC0yMjQ5LDYgKzIzODIsOSBAQAogCWludCByZXM7CiAJCiAJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX0VNVTEwSzFfSU9DVExfUFZFUlNJT046CisJCWVtdS0+c3VwcG9ydF90bHYgPSAxOworCQlyZXR1cm4gcHV0X3VzZXIoU05EUlZfRU1VMTBLMV9WRVJTSU9OLCAoaW50IF9fdXNlciAqKWFyZ3ApOwogCWNhc2UgU05EUlZfRU1VMTBLMV9JT0NUTF9JTkZPOgogCQlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFpbmZvKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1peGVyLmMKaW5kZXggYzMxZjNkMC4uNGRiNmUxYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVtaXhlci5jCkBAIC01LDYgKzUsOSBAQAogICogIFJvdXRpbmVzIGZvciBjb250cm9sIG9mIEVNVTEwSzEgY2hpcHMgLyBtaXhlciByb3V0aW5lcwogICogIE11bHRpY2hhbm5lbCBQQ00gc3VwcG9ydCBDb3B5cmlnaHQgKGMpIExlZSBSZXZlbGwgPHJscmV2ZWxsQGpvZS1qb2IuY29tPgogICoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphbWVzIENvdXJ0aWVyLUR1dHRvbiA8SmFtZXNAc3VwZXJidWcuY28udWs+CisgKiAgCUFkZGVkIEVNVSAxMDEwIHN1cHBvcnQuCisgKgogICogIEJVR1M6CiAgKiAgICAtLQogICoKQEAgLTMyLDkgKzM1LDE1IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworI2luY2x1ZGUgInAxN3YuaCIKIAogI2RlZmluZSBBQzk3X0lEX1NUQUM5NzU4CTB4ODM4NDc2NTgKIAorc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHNuZF9hdWRpZ3lfZGJfc2NhbGUyLCAtMTAzNTAsIDUwLCAxKTsgLyogV004Nzc1IGdhaW4gc2NhbGUgKi8KKwogc3RhdGljIGludCBzbmRfZW11MTBrMV9zcGRpZl9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewogCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CkBAIC02OCw2ICs3Nyw2NjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNoYXIgKmVtdTEwMTBfc3JjX3RleHRzW10gPSB7IAorCSJTaWxlbmNlIiwKKwkiRG9jayBNaWMgQSIsCisJIkRvY2sgTWljIEIiLAorCSJEb2NrIEFEQzEgTGVmdCIsCisJIkRvY2sgQURDMSBSaWdodCIsCisJIkRvY2sgQURDMiBMZWZ0IiwKKwkiRG9jayBBREMyIFJpZ2h0IiwKKwkiRG9jayBBREMzIExlZnQiLAorCSJEb2NrIEFEQzMgUmlnaHQiLAorCSIwMjAyIEFEQyBMZWZ0IiwKKwkiMDIwMiBBREMgUmlnaHQiLAorCSIwMjAyIFNQRElGIExlZnQiLAorCSIwMjAyIFNQRElGIFJpZ2h0IiwKKwkiQURBVCAwIiwKKwkiQURBVCAxIiwKKwkiQURBVCAyIiwKKwkiQURBVCAzIiwKKwkiQURBVCA0IiwKKwkiQURBVCA1IiwKKwkiQURBVCA2IiwKKwkiQURBVCA3IiwKKwkiRFNQIDAiLAorCSJEU1AgMSIsCisJIkRTUCAyIiwKKwkiRFNQIDMiLAorCSJEU1AgNCIsCisJIkRTUCA1IiwKKwkiRFNQIDYiLAorCSJEU1AgNyIsCisJIkRTUCA4IiwKKwkiRFNQIDkiLAorCSJEU1AgMTAiLAorCSJEU1AgMTEiLAorCSJEU1AgMTIiLAorCSJEU1AgMTMiLAorCSJEU1AgMTQiLAorCSJEU1AgMTUiLAorCSJEU1AgMTYiLAorCSJEU1AgMTciLAorCSJEU1AgMTgiLAorCSJEU1AgMTkiLAorCSJEU1AgMjAiLAorCSJEU1AgMjEiLAorCSJEU1AgMjIiLAorCSJEU1AgMjMiLAorCSJEU1AgMjQiLAorCSJEU1AgMjUiLAorCSJEU1AgMjYiLAorCSJEU1AgMjciLAorCSJEU1AgMjgiLAorCSJEU1AgMjkiLAorCSJEU1AgMzAiLAorCSJEU1AgMzEiLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBlbXUxMDEwX3NyY19yZWdzW10gPSB7CisJRU1VX1NSQ19TSUxFTkNFLC8qIDAgKi8KKwlFTVVfU1JDX0RPQ0tfTUlDX0ExLCAvKiAxICovCisJRU1VX1NSQ19ET0NLX01JQ19CMSwgLyogMiAqLworCUVNVV9TUkNfRE9DS19BREMxX0xFRlQxLCAvKiAzICovCisJRU1VX1NSQ19ET0NLX0FEQzFfUklHSFQxLCAvKiA0ICovCisJRU1VX1NSQ19ET0NLX0FEQzJfTEVGVDEsIC8qIDUgKi8KKwlFTVVfU1JDX0RPQ0tfQURDMl9SSUdIVDEsIC8qIDYgKi8KKwlFTVVfU1JDX0RPQ0tfQURDM19MRUZUMSwgLyogNyAqLworCUVNVV9TUkNfRE9DS19BREMzX1JJR0hUMSwgLyogOCAqLworCUVNVV9TUkNfSEFNT0FfQURDX0xFRlQxLCAvKiA5ICovCisJRU1VX1NSQ19IQU1PQV9BRENfUklHSFQxLCAvKiAxMCAqLworCUVNVV9TUkNfSEFOQV9TUERJRl9MRUZUMSwgLyogMTEgKi8KKwlFTVVfU1JDX0hBTkFfU1BESUZfUklHSFQxLCAvKiAxMiAqLworCUVNVV9TUkNfSEFOQV9BREFULCAvKiAxMyAqLworCUVNVV9TUkNfSEFOQV9BREFUKzEsIC8qIDE0ICovCisJRU1VX1NSQ19IQU5BX0FEQVQrMiwgLyogMTUgKi8KKwlFTVVfU1JDX0hBTkFfQURBVCszLCAvKiAxNiAqLworCUVNVV9TUkNfSEFOQV9BREFUKzQsIC8qIDE3ICovCisJRU1VX1NSQ19IQU5BX0FEQVQrNSwgLyogMTggKi8KKwlFTVVfU1JDX0hBTkFfQURBVCs2LCAvKiAxOSAqLworCUVNVV9TUkNfSEFOQV9BREFUKzcsIC8qIDIwICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkEsIC8qIDIxICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkErMSwgLyogMjIgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQSsyLCAvKiAyMyAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJBKzMsIC8qIDI0ICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkErNCwgLyogMjUgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQSs1LCAvKiAyNiAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJBKzYsIC8qIDI3ICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkErNywgLyogMjggKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQSs4LCAvKiAyOSAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJBKzksIC8qIDMwICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkErMHhhLCAvKiAzMSAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJBKzB4YiwgLyogMzIgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQSsweGMsIC8qIDMzICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkErMHhkLCAvKiAzNCAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJBKzB4ZSwgLyogMzUgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQSsweGYsIC8qIDM2ICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkIsIC8qIDM3ICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkIrMSwgLyogMzggKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQisyLCAvKiAzOSAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJCKzMsIC8qIDQwICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkIrNCwgLyogNDEgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQis1LCAvKiA0MiAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJCKzYsIC8qIDQzICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkIrNywgLyogNDQgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQis4LCAvKiA0NSAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJCKzksIC8qIDQ2ICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkIrMHhhLCAvKiA0NyAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJCKzB4YiwgLyogNDggKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQisweGMsIC8qIDQ5ICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkIrMHhkLCAvKiA1MCAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJCKzB4ZSwgLyogNTEgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQisweGYsIC8qIDUyICovCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGVtdTEwMTBfb3V0cHV0X2RzdFtdID0geworCUVNVV9EU1RfRE9DS19EQUMxX0xFRlQxLCAvKiAwICovCisJRU1VX0RTVF9ET0NLX0RBQzFfUklHSFQxLCAvKiAxICovCisJRU1VX0RTVF9ET0NLX0RBQzJfTEVGVDEsIC8qIDIgKi8KKwlFTVVfRFNUX0RPQ0tfREFDMl9SSUdIVDEsIC8qIDMgKi8KKwlFTVVfRFNUX0RPQ0tfREFDM19MRUZUMSwgLyogNCAqLworCUVNVV9EU1RfRE9DS19EQUMzX1JJR0hUMSwgLyogNSAqLworCUVNVV9EU1RfRE9DS19EQUM0X0xFRlQxLCAvKiA2ICovCisJRU1VX0RTVF9ET0NLX0RBQzRfUklHSFQxLCAvKiA3ICovCisJRU1VX0RTVF9ET0NLX1BIT05FU19MRUZUMSwgLyogOCAqLworCUVNVV9EU1RfRE9DS19QSE9ORVNfUklHSFQxLCAvKiA5ICovCisJRU1VX0RTVF9ET0NLX1NQRElGX0xFRlQxLCAvKiAxMCAqLworCUVNVV9EU1RfRE9DS19TUERJRl9SSUdIVDEsIC8qIDExICovCisJRU1VX0RTVF9IQU5BX1NQRElGX0xFRlQxLCAvKiAxMiAqLworCUVNVV9EU1RfSEFOQV9TUERJRl9SSUdIVDEsIC8qIDEzICovCisJRU1VX0RTVF9IQU1PQV9EQUNfTEVGVDEsIC8qIDE0ICovCisJRU1VX0RTVF9IQU1PQV9EQUNfUklHSFQxLCAvKiAxNSAqLworCUVNVV9EU1RfSEFOQV9BREFULCAvKiAxNiAqLworCUVNVV9EU1RfSEFOQV9BREFUKzEsIC8qIDE3ICovCisJRU1VX0RTVF9IQU5BX0FEQVQrMiwgLyogMTggKi8KKwlFTVVfRFNUX0hBTkFfQURBVCszLCAvKiAxOSAqLworCUVNVV9EU1RfSEFOQV9BREFUKzQsIC8qIDIwICovCisJRU1VX0RTVF9IQU5BX0FEQVQrNSwgLyogMjEgKi8KKwlFTVVfRFNUX0hBTkFfQURBVCs2LCAvKiAyMiAqLworCUVNVV9EU1RfSEFOQV9BREFUKzcsIC8qIDIzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGVtdTEwMTBfaW5wdXRfZHN0W10gPSB7CisJRU1VX0RTVF9BTElDRTJfRU1VMzJfMCwKKwlFTVVfRFNUX0FMSUNFMl9FTVUzMl8xLAorCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzIsCisJRU1VX0RTVF9BTElDRTJfRU1VMzJfMywKKwlFTVVfRFNUX0FMSUNFMl9FTVUzMl80LAorCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzUsCisJRU1VX0RTVF9BTElDRTJfRU1VMzJfNiwKKwlFTVVfRFNUX0FMSUNFMl9FTVUzMl83LAorCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzgsCisJRU1VX0RTVF9BTElDRTJfRU1VMzJfOSwKKwlFTVVfRFNUX0FMSUNFMl9FTVUzMl9BLAorCUVNVV9EU1RfQUxJQ0UyX0VNVTMyX0IsCisJRU1VX0RTVF9BTElDRTJfRU1VMzJfQywKKwlFTVVfRFNUX0FMSUNFMl9FTVUzMl9ELAorCUVNVV9EU1RfQUxJQ0UyX0VNVTMyX0UsCisJRU1VX0RTVF9BTElDRTJfRU1VMzJfRiwKKwlFTVVfRFNUX0FMSUNFX0kyUzBfTEVGVCwKKwlFTVVfRFNUX0FMSUNFX0kyUzBfUklHSFQsCisJRU1VX0RTVF9BTElDRV9JMlMxX0xFRlQsCisJRU1VX0RTVF9BTElDRV9JMlMxX1JJR0hULAorCUVNVV9EU1RfQUxJQ0VfSTJTMl9MRUZULAorCUVNVV9EU1RfQUxJQ0VfSTJTMl9SSUdIVCwKK307CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfaW5wdXRfb3V0cHV0X3NvdXJjZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA1MzsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgZW11MTAxMF9zcmNfdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMDEwX291dHB1dF9zb3VyY2VfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5uZWw7CisKKwljaGFubmVsID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlW2NoYW5uZWxdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMDEwX291dHB1dF9zb3VyY2VfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZSA9IDA7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbm5lbDsKKworCWNoYW5uZWwgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpICYgMHhmZjsKKwlpZiAoZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbY2hhbm5lbF0gIT0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSkgeworCQl2YWwgPSBlbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVtjaGFubmVsXSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJCWNoYW5nZSA9IDE7CisJCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJCWVtdTEwMTBfb3V0cHV0X2RzdFtjaGFubmVsXSwgZW11MTAxMF9zcmNfcmVnc1t2YWxdKTsKKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIGludCBzbmRfZW11MTAxMF9pbnB1dF9zb3VyY2VfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5uZWw7CisKKwljaGFubmVsID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGVtdS0+ZW11MTAxMC5pbnB1dF9zb3VyY2VbY2hhbm5lbF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfaW5wdXRfc291cmNlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2UgPSAwOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNoYW5uZWw7CisKKwljaGFubmVsID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKSAmIDB4ZmY7CisJaWYgKGVtdS0+ZW11MTAxMC5pbnB1dF9zb3VyY2VbY2hhbm5lbF0gIT0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSkgeworCQl2YWwgPSBlbXUtPmVtdTEwMTAuaW5wdXRfc291cmNlW2NoYW5uZWxdID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwkJY2hhbmdlID0gMTsKKwkJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQkJZW11MTAxMF9pbnB1dF9kc3RbY2hhbm5lbF0sIGVtdTEwMTBfc3JjX3JlZ3NbdmFsXSk7CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKHhuYW1lLGNoaWQpIFwKK3sJCQkJCQkJCVwKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwJXAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAkJXAorCS5pbmZvID0gIHNuZF9lbXUxMDEwX2lucHV0X291dHB1dF9zb3VyY2VfaW5mbywJCVwKKwkuZ2V0ID0gICBzbmRfZW11MTAxMF9vdXRwdXRfc291cmNlX2dldCwJCQlcCisJLnB1dCA9ICAgc25kX2VtdTEwMTBfb3V0cHV0X3NvdXJjZV9wdXQsCQkJXAorCS5wcml2YXRlX3ZhbHVlID0gY2hpZAkJCQkJXAorfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2VtdTEwMTBfb3V0cHV0X2VudW1fY3Rsc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCJEb2NrIERBQzEgTGVmdCBQbGF5YmFjayBFbnVtIiwgMCksCisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCJEb2NrIERBQzEgUmlnaHQgUGxheWJhY2sgRW51bSIsIDEpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiRG9jayBEQUMyIExlZnQgUGxheWJhY2sgRW51bSIsIDIpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiRG9jayBEQUMyIFJpZ2h0IFBsYXliYWNrIEVudW0iLCAzKSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIkRvY2sgREFDMyBMZWZ0IFBsYXliYWNrIEVudW0iLCA0KSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIkRvY2sgREFDMyBSaWdodCBQbGF5YmFjayBFbnVtIiwgNSksCisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCJEb2NrIERBQzQgTGVmdCBQbGF5YmFjayBFbnVtIiwgNiksCisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCJEb2NrIERBQzQgUmlnaHQgUGxheWJhY2sgRW51bSIsIDcpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiRG9jayBQaG9uZXMgTGVmdCBQbGF5YmFjayBFbnVtIiwgOCksCisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCJEb2NrIFBob25lcyBSaWdodCBQbGF5YmFjayBFbnVtIiwgOSksCisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCJEb2NrIFNQRElGIExlZnQgUGxheWJhY2sgRW51bSIsIDB4YSksCisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCJEb2NrIFNQRElGIFJpZ2h0IFBsYXliYWNrIEVudW0iLCAweGIpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiMTAxMCBTUERJRiBMZWZ0IFBsYXliYWNrIEVudW0iLCAweGMpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiMTAxMCBTUERJRiBSaWdodCBQbGF5YmFjayBFbnVtIiwgMHhkKSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIjAyMDIgREFDIExlZnQgUGxheWJhY2sgRW51bSIsIDB4ZSksCisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCIwMjAyIERBQyBSaWdodCBQbGF5YmFjayBFbnVtIiwgMHhmKSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIjEwMTAgQURBVCAwIFBsYXliYWNrIEVudW0iLCAweDEwKSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIjEwMTAgQURBVCAxIFBsYXliYWNrIEVudW0iLCAweDExKSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIjEwMTAgQURBVCAyIFBsYXliYWNrIEVudW0iLCAweDEyKSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIjEwMTAgQURBVCAzIFBsYXliYWNrIEVudW0iLCAweDEzKSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIjEwMTAgQURBVCA0IFBsYXliYWNrIEVudW0iLCAweDE0KSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIjEwMTAgQURBVCA1IFBsYXliYWNrIEVudW0iLCAweDE1KSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIjEwMTAgQURBVCA2IFBsYXliYWNrIEVudW0iLCAweDE2KSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIjEwMTAgQURBVCA3IFBsYXliYWNrIEVudW0iLCAweDE3KSwKK307CisKKyNkZWZpbmUgRU1VMTAxMF9TT1VSQ0VfSU5QVVQoeG5hbWUsY2hpZCkgXAorewkJCQkJCQkJXAorCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLAlcCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCQlcCisJLmluZm8gPSAgc25kX2VtdTEwMTBfaW5wdXRfb3V0cHV0X3NvdXJjZV9pbmZvLAkJXAorCS5nZXQgPSAgIHNuZF9lbXUxMDEwX2lucHV0X3NvdXJjZV9nZXQsCQkJXAorCS5wdXQgPSAgIHNuZF9lbXUxMDEwX2lucHV0X3NvdXJjZV9wdXQsCQkJXAorCS5wcml2YXRlX3ZhbHVlID0gY2hpZAkJCQkJXAorfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2VtdTEwMTBfaW5wdXRfZW51bV9jdGxzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIDAgQ2FwdHVyZSBFbnVtIiwgMCksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCAxIENhcHR1cmUgRW51bSIsIDEpLAorCUVNVTEwMTBfU09VUkNFX0lOUFVUKCJEU1AgMiBDYXB0dXJlIEVudW0iLCAyKSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIDMgQ2FwdHVyZSBFbnVtIiwgMyksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCA0IENhcHR1cmUgRW51bSIsIDQpLAorCUVNVTEwMTBfU09VUkNFX0lOUFVUKCJEU1AgNSBDYXB0dXJlIEVudW0iLCA1KSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIDYgQ2FwdHVyZSBFbnVtIiwgNiksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCA3IENhcHR1cmUgRW51bSIsIDcpLAorCUVNVTEwMTBfU09VUkNFX0lOUFVUKCJEU1AgOCBDYXB0dXJlIEVudW0iLCA4KSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIDkgQ2FwdHVyZSBFbnVtIiwgOSksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCBBIENhcHR1cmUgRW51bSIsIDB4YSksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCBCIENhcHR1cmUgRW51bSIsIDB4YiksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCBDIENhcHR1cmUgRW51bSIsIDB4YyksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCBEIENhcHR1cmUgRW51bSIsIDB4ZCksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCBFIENhcHR1cmUgRW51bSIsIDB4ZSksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCBGIENhcHR1cmUgRW51bSIsIDB4ZiksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCAxMCBDYXB0dXJlIEVudW0iLCAweDEwKSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIDExIENhcHR1cmUgRW51bSIsIDB4MTEpLAorCUVNVTEwMTBfU09VUkNFX0lOUFVUKCJEU1AgMTIgQ2FwdHVyZSBFbnVtIiwgMHgxMiksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCAxMyBDYXB0dXJlIEVudW0iLCAweDEzKSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIDE0IENhcHR1cmUgRW51bSIsIDB4MTQpLAorCUVNVTEwMTBfU09VUkNFX0lOUFVUKCJEU1AgMTUgQ2FwdHVyZSBFbnVtIiwgMHgxNSksCit9OworCisKKworCitzdGF0aWMgaW50IHNuZF9lbXUxMDEwX2FkY19wYWRzX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfYWRjX3BhZHNfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IChlbXUtPmVtdTEwMTAuYWRjX3BhZHMgJiBtYXNrKSA/IDEgOiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMDEwX2FkY19wYWRzX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IG1hc2sgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJdW5zaWduZWQgaW50IHZhbCwgY2FjaGU7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJY2FjaGUgPSBlbXUtPmVtdTEwMTAuYWRjX3BhZHM7CisJaWYgKHZhbCA9PSAxKSAKKwkJY2FjaGUgPSBjYWNoZSB8IG1hc2s7CisJZWxzZQorCQljYWNoZSA9IGNhY2hlICYgfm1hc2s7CisJaWYgKGNhY2hlICE9IGVtdS0+ZW11MTAxMC5hZGNfcGFkcykgeworCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfQURDX1BBRFMsIGNhY2hlICk7CisJICAgICAgICBlbXUtPmVtdTEwMTAuYWRjX3BhZHMgPSBjYWNoZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisKKyNkZWZpbmUgRU1VMTAxMF9BRENfUEFEUyh4bmFtZSxjaGlkKSBcCit7CQkJCQkJCQlcCisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsCVwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwJCVwKKwkuaW5mbyA9ICBzbmRfZW11MTAxMF9hZGNfcGFkc19pbmZvLAkJCVwKKwkuZ2V0ID0gICBzbmRfZW11MTAxMF9hZGNfcGFkc19nZXQsCQkJXAorCS5wdXQgPSAgIHNuZF9lbXUxMDEwX2FkY19wYWRzX3B1dCwJCQlcCisJLnByaXZhdGVfdmFsdWUgPSBjaGlkCQkJCQlcCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfZW11MTAxMF9hZGNfcGFkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJRU1VMTAxMF9BRENfUEFEUygiQURDMSAxNGRCIFBBRCBBdWRpbyBEb2NrIENhcHR1cmUgU3dpdGNoIiwgRU1VX0hBTkFfRE9DS19BRENfUEFEMSksCisJRU1VMTAxMF9BRENfUEFEUygiQURDMiAxNGRCIFBBRCBBdWRpbyBEb2NrIENhcHR1cmUgU3dpdGNoIiwgRU1VX0hBTkFfRE9DS19BRENfUEFEMiksCisJRU1VMTAxMF9BRENfUEFEUygiQURDMyAxNGRCIFBBRCBBdWRpbyBEb2NrIENhcHR1cmUgU3dpdGNoIiwgRU1VX0hBTkFfRE9DS19BRENfUEFEMyksCisJRU1VMTAxMF9BRENfUEFEUygiQURDMSAxNGRCIFBBRCAwMjAyIENhcHR1cmUgU3dpdGNoIiwgRU1VX0hBTkFfMDIwMl9BRENfUEFEMSksCit9OworCitzdGF0aWMgaW50IHNuZF9lbXUxMDEwX2RhY19wYWRzX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfZGFjX3BhZHNfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IChlbXUtPmVtdTEwMTAuZGFjX3BhZHMgJiBtYXNrKSA/IDEgOiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMDEwX2RhY19wYWRzX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IG1hc2sgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJdW5zaWduZWQgaW50IHZhbCwgY2FjaGU7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJY2FjaGUgPSBlbXUtPmVtdTEwMTAuZGFjX3BhZHM7CisJaWYgKHZhbCA9PSAxKSAKKwkJY2FjaGUgPSBjYWNoZSB8IG1hc2s7CisJZWxzZQorCQljYWNoZSA9IGNhY2hlICYgfm1hc2s7CisJaWYgKGNhY2hlICE9IGVtdS0+ZW11MTAxMC5kYWNfcGFkcykgeworCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfREFDX1BBRFMsIGNhY2hlICk7CisJICAgICAgICBlbXUtPmVtdTEwMTAuZGFjX3BhZHMgPSBjYWNoZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisKKyNkZWZpbmUgRU1VMTAxMF9EQUNfUEFEUyh4bmFtZSxjaGlkKSBcCit7CQkJCQkJCQlcCisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsCVwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwJCVwKKwkuaW5mbyA9ICBzbmRfZW11MTAxMF9kYWNfcGFkc19pbmZvLAkJCVwKKwkuZ2V0ID0gICBzbmRfZW11MTAxMF9kYWNfcGFkc19nZXQsCQkJXAorCS5wdXQgPSAgIHNuZF9lbXUxMDEwX2RhY19wYWRzX3B1dCwJCQlcCisJLnByaXZhdGVfdmFsdWUgPSBjaGlkCQkJCQlcCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfZW11MTAxMF9kYWNfcGFkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJRU1VMTAxMF9EQUNfUEFEUygiREFDMSBBdWRpbyBEb2NrIDE0ZEIgUEFEIFBsYXliYWNrIFN3aXRjaCIsIEVNVV9IQU5BX0RPQ0tfREFDX1BBRDEpLAorCUVNVTEwMTBfREFDX1BBRFMoIkRBQzIgQXVkaW8gRG9jayAxNGRCIFBBRCBQbGF5YmFjayBTd2l0Y2giLCBFTVVfSEFOQV9ET0NLX0RBQ19QQUQyKSwKKwlFTVUxMDEwX0RBQ19QQURTKCJEQUMzIEF1ZGlvIERvY2sgMTRkQiBQQUQgUGxheWJhY2sgU3dpdGNoIiwgRU1VX0hBTkFfRE9DS19EQUNfUEFEMyksCisJRU1VMTAxMF9EQUNfUEFEUygiREFDNCBBdWRpbyBEb2NrIDE0ZEIgUEFEIFBsYXliYWNrIFN3aXRjaCIsIEVNVV9IQU5BX0RPQ0tfREFDX1BBRDQpLAorCUVNVTEwMTBfREFDX1BBRFMoIkRBQzEgMDIwMiAxNGRCIFBBRCBQbGF5YmFjayBTd2l0Y2giLCBFTVVfSEFOQV8wMjAyX0RBQ19QQUQxKSwKK307CisKKworc3RhdGljIGludCBzbmRfZW11MTAxMF9pbnRlcm5hbF9jbG9ja19pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzWzJdID0geworCQkiNDQxMDAiLCAiNDgwMDAiCisJfTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAyOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gMSkKKyAgICAgICAgICAgICAgICB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMDEwX2ludGVybmFsX2Nsb2NrX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZW11LT5lbXUxMDEwLmludGVybmFsX2Nsb2NrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMDEwX2ludGVybmFsX2Nsb2NrX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbmdlID0gMDsKKworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gOworCWNoYW5nZSA9IChlbXUtPmVtdTEwMTAuaW50ZXJuYWxfY2xvY2sgIT0gdmFsKTsKKwlpZiAoY2hhbmdlKSB7CisJCWVtdS0+ZW11MTAxMC5pbnRlcm5hbF9jbG9jayA9IHZhbDsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSAwOgorCQkJLyogNDQxMDAgKi8KKwkJCS8qIE11dGUgYWxsICovCisJCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfVU5NVVRFLCBFTVVfTVVURSApOworCQkJLyogRGVmYXVsdCBmYWxsYmFjayBjbG9jayA0OGtIeiAqLworCQkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0RFRkNMT0NLLCBFTVVfSEFOQV9ERUZDTE9DS180NF8xSyApOworCQkJLyogV29yZCBDbG9jayBzb3VyY2UsIEludGVybmFsIDQ0LjFrSHogeDEgKi8KKwkJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9XQ0xPQ0ssCisJCQlFTVVfSEFOQV9XQ0xPQ0tfSU5UXzQ0XzFLIHwgRU1VX0hBTkFfV0NMT0NLXzFYICk7CisJCQkvKiBTZXQgTEVEcyBvbiBBdWRpbyBEb2NrICovCisJCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfRE9DS19MRURTXzIsCisJCQkJRU1VX0hBTkFfRE9DS19MRURTXzJfNDRLIHwgRU1VX0hBTkFfRE9DS19MRURTXzJfTE9DSyApOworCQkJLyogQWxsb3cgRExMIHRvIHNldHRsZSAqLworCQkJbXNsZWVwKDEwKTsKKwkJCS8qIFVubXV0ZSBhbGwgKi8KKwkJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9VTk1VVEUsIEVNVV9VTk1VVEUgKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkvKiA0ODAwMCAqLworCQkJLyogTXV0ZSBhbGwgKi8KKwkJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9VTk1VVEUsIEVNVV9NVVRFICk7CisJCQkvKiBEZWZhdWx0IGZhbGxiYWNrIGNsb2NrIDQ4a0h6ICovCisJCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfREVGQ0xPQ0ssIEVNVV9IQU5BX0RFRkNMT0NLXzQ4SyApOworCQkJLyogV29yZCBDbG9jayBzb3VyY2UsIEludGVybmFsIDQ4a0h6IHgxICovCisJCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfV0NMT0NLLAorCQkJCUVNVV9IQU5BX1dDTE9DS19JTlRfNDhLIHwgRU1VX0hBTkFfV0NMT0NLXzFYICk7CisJCQkvKiBTZXQgTEVEcyBvbiBBdWRpbyBEb2NrICovCisJCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfRE9DS19MRURTXzIsCisJCQkJRU1VX0hBTkFfRE9DS19MRURTXzJfNDhLIHwgRU1VX0hBTkFfRE9DS19MRURTXzJfTE9DSyApOworCQkJLyogQWxsb3cgRExMIHRvIHNldHRsZSAqLworCQkJbXNsZWVwKDEwKTsKKwkJCS8qIFVubXV0ZSBhbGwgKi8KKwkJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9VTk1VVEUsIEVNVV9VTk1VVEUgKTsKKwkJCWJyZWFrOworCQl9CisJfQorICAgICAgICByZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2VtdTEwMTBfaW50ZXJuYWxfY2xvY2sgPQoreworCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCS5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgIkNsb2NrIEludGVybmFsIFJhdGUiLAorCS5jb3VudCA9CTEsCisJLmluZm8gPSAgICAgICAgIHNuZF9lbXUxMDEwX2ludGVybmFsX2Nsb2NrX2luZm8sCisJLmdldCA9ICAgICAgICAgIHNuZF9lbXUxMDEwX2ludGVybmFsX2Nsb2NrX2dldCwKKwkucHV0ID0gICAgICAgICAgc25kX2VtdTEwMTBfaW50ZXJuYWxfY2xvY2tfcHV0Cit9OworCitzdGF0aWMgaW50IHNuZF9hdWRpZ3lfaTJjX2NhcHR1cmVfc291cmNlX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKyNpZiAwCisJc3RhdGljIGNoYXIgKnRleHRzWzRdID0geworCQkiVW5rbm93bjEiLCAiVW5rbm93bjIiLCAiTWljIiwgIkxpbmUiCisJfTsKKyNlbmRpZgorCXN0YXRpYyBjaGFyICp0ZXh0c1syXSA9IHsKKwkJIk1pYyIsICJMaW5lIgorCX07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDEpCisgICAgICAgICAgICAgICAgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYXVkaWd5X2kyY19jYXB0dXJlX3NvdXJjZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGVtdS0+aTJjX2NhcHR1cmVfc291cmNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hdWRpZ3lfaTJjX2NhcHR1cmVfc291cmNlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IHNvdXJjZV9pZDsKKwl1bnNpZ25lZCBpbnQgbmdhaW4sIG9nYWluOworCXUzMiBncGlvOworCWludCBjaGFuZ2UgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHNvdXJjZTsKKwkvKiBJZiB0aGUgY2FwdHVyZSBzb3VyY2UgaGFzIGNoYW5nZWQsCisJICogdXBkYXRlIHRoZSBjYXB0dXJlIHZvbHVtZSBmcm9tIHRoZSBjYWNoZWQgdmFsdWUKKwkgKiBmb3IgdGhlIHBhcnRpY3VsYXIgc291cmNlLgorCSAqLworCXNvdXJjZV9pZCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07IC8qIFVzZSAyIGFuZCAzICovCisJY2hhbmdlID0gKGVtdS0+aTJjX2NhcHR1cmVfc291cmNlICE9IHNvdXJjZV9pZCk7CisJaWYgKGNoYW5nZSkgeworCQlzbmRfZW11MTBrMV9pMmNfd3JpdGUoZW11LCBBRENfTVVYLCAwKTsgLyogTXV0ZSBpbnB1dCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCQlncGlvID0gaW5sKGVtdS0+cG9ydCArIEFfSU9DRkcpOworCQlpZiAoc291cmNlX2lkPT0wKQorCQkJb3V0bChncGlvIHwgMHg0LCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwkJZWxzZQorCQkJb3V0bChncGlvICYgfjB4NCwgZW11LT5wb3J0ICsgQV9JT0NGRyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKworCQluZ2FpbiA9IGVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW3NvdXJjZV9pZF1bMF07IC8qIExlZnQgKi8KKwkJb2dhaW4gPSBlbXUtPmkyY19jYXB0dXJlX3ZvbHVtZVtlbXUtPmkyY19jYXB0dXJlX3NvdXJjZV1bMF07IC8qIExlZnQgKi8KKwkJaWYgKG5nYWluICE9IG9nYWluKQorCQkJc25kX2VtdTEwazFfaTJjX3dyaXRlKGVtdSwgQURDX0FUVEVOX0FEQ0wsICgobmdhaW4pICYgMHhmZikpOworCQluZ2FpbiA9IGVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW3NvdXJjZV9pZF1bMV07IC8qIFJpZ2h0ICovCisJCW9nYWluID0gZW11LT5pMmNfY2FwdHVyZV92b2x1bWVbZW11LT5pMmNfY2FwdHVyZV9zb3VyY2VdWzFdOyAvKiBSaWdodCAqLworCQlpZiAobmdhaW4gIT0gb2dhaW4pCisJCQlzbmRfZW11MTBrMV9pMmNfd3JpdGUoZW11LCBBRENfQVRURU5fQURDUiwgKChuZ2FpbikgJiAweGZmKSk7CisKKwkJc291cmNlID0gMSA8PCAoc291cmNlX2lkICsgMik7CisJCXNuZF9lbXUxMGsxX2kyY193cml0ZShlbXUsIEFEQ19NVVgsIHNvdXJjZSk7IC8qIFNldCBzb3VyY2UgKi8KKwkJZW11LT5pMmNfY2FwdHVyZV9zb3VyY2UgPSBzb3VyY2VfaWQ7CisJfQorICAgICAgICByZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2F1ZGlneV9pMmNfY2FwdHVyZV9zb3VyY2UgPQoreworCQkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPQkJIkNhcHR1cmUgU291cmNlIiwKKwkJLmluZm8gPQkJc25kX2F1ZGlneV9pMmNfY2FwdHVyZV9zb3VyY2VfaW5mbywKKwkJLmdldCA9CQlzbmRfYXVkaWd5X2kyY19jYXB0dXJlX3NvdXJjZV9nZXQsCisJCS5wdXQgPQkJc25kX2F1ZGlneV9pMmNfY2FwdHVyZV9zb3VyY2VfcHV0Cit9OworCitzdGF0aWMgaW50IHNuZF9hdWRpZ3lfaTJjX3ZvbHVtZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMjU1OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hdWRpZ3lfaTJjX3ZvbHVtZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBzb3VyY2VfaWQ7CisKKwlzb3VyY2VfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZW11LT5pMmNfY2FwdHVyZV92b2x1bWVbc291cmNlX2lkXVswXTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW3NvdXJjZV9pZF1bMV07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2F1ZGlneV9pMmNfdm9sdW1lX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IG9nYWluOworCXVuc2lnbmVkIGludCBuZ2FpbjsKKwlpbnQgc291cmNlX2lkOworCWludCBjaGFuZ2UgPSAwOworCisJc291cmNlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJb2dhaW4gPSBlbXUtPmkyY19jYXB0dXJlX3ZvbHVtZVtzb3VyY2VfaWRdWzBdOyAvKiBMZWZ0ICovCisJbmdhaW4gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlpZiAobmdhaW4gPiAweGZmKQorCQlyZXR1cm4gMDsKKwlpZiAob2dhaW4gIT0gbmdhaW4pIHsKKwkJaWYgKGVtdS0+aTJjX2NhcHR1cmVfc291cmNlID09IHNvdXJjZV9pZCkKKwkJCXNuZF9lbXUxMGsxX2kyY193cml0ZShlbXUsIEFEQ19BVFRFTl9BRENMLCAoKG5nYWluKSAmIDB4ZmYpICk7CisJCWVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW3NvdXJjZV9pZF1bMF0gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwkJY2hhbmdlID0gMTsKKwl9CisJb2dhaW4gPSBlbXUtPmkyY19jYXB0dXJlX3ZvbHVtZVtzb3VyY2VfaWRdWzFdOyAvKiBSaWdodCAqLworCW5nYWluID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJaWYgKG5nYWluID4gMHhmZikKKwkJcmV0dXJuIDA7CisJaWYgKG9nYWluICE9IG5nYWluKSB7CisJCWlmIChlbXUtPmkyY19jYXB0dXJlX3NvdXJjZSA9PSBzb3VyY2VfaWQpCisJCQlzbmRfZW11MTBrMV9pMmNfd3JpdGUoZW11LCBBRENfQVRURU5fQURDUiwgKChuZ2FpbikgJiAweGZmKSk7CisJCWVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW3NvdXJjZV9pZF1bMV0gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwkJY2hhbmdlID0gMTsKKwl9CisKKwlyZXR1cm4gY2hhbmdlOworfQorCisjZGVmaW5lIEkyQ19WT0xVTUUoeG5hbWUsY2hpZCkgXAorewkJCQkJCQkJXAorCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLAlcCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAkJXAorCSAgICAgICAgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCQlcCisJLmluZm8gPSAgc25kX2F1ZGlneV9pMmNfdm9sdW1lX2luZm8sCQkJXAorCS5nZXQgPSAgIHNuZF9hdWRpZ3lfaTJjX3ZvbHVtZV9nZXQsCQkJXAorCS5wdXQgPSAgIHNuZF9hdWRpZ3lfaTJjX3ZvbHVtZV9wdXQsCQkJXAorCS50bHYgPSB7IC5wID0gc25kX2F1ZGlneV9kYl9zY2FsZTIgfSwJCQlcCisJLnByaXZhdGVfdmFsdWUgPSBjaGlkCQkJCQlcCit9CisKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9hdWRpZ3lfaTJjX3ZvbHVtZV9jdGxzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlJMkNfVk9MVU1FKCJNaWMgQ2FwdHVyZSBWb2x1bWUiLCAwKSwKKwlJMkNfVk9MVU1FKCJMaW5lIENhcHR1cmUgVm9sdW1lIiwgMCkKK307CisKICNpZiAwCiBzdGF0aWMgaW50IHNuZF9hdWRpZ3lfc3BkaWZfb3V0cHV0X3JhdGVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKQEAgLTY2OCw3ICsxMzQwLDkgQEAKIAlpbnQgY2hhbmdlID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnJlZ19sb2NrLCBmbGFncyk7Ci0JaWYgKGVtdS0+YXVkaWd5KSB7CisJaWYgKCBlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5pMmNfYWRjKSB7CisJCS8qIERvIG5vdGhpbmcgZm9yIEF1ZGlneSAyIFpTIE5vdGVib29rICovCisJfSBlbHNlIGlmIChlbXUtPmF1ZGlneSkgewogCQlyZWcgPSBpbmwoZW11LT5wb3J0ICsgQV9JT0NGRyk7CiAJCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gQV9JT0NGR19HUE9VVDAgOiAwOwogCQljaGFuZ2UgPSAocmVnICYgQV9JT0NGR19HUE9VVDApICE9IHZhbDsKQEAgLTgwNiw2ICsxNDgwLDI0IEBACiAJCSJBTWljIFBsYXliYWNrIFZvbHVtZSIsICJNaWMgUGxheWJhY2sgVm9sdW1lIiwKIAkJTlVMTAogCX07CisJc3RhdGljIGNoYXIgKmF1ZGlneV9yZW5hbWVfY3Rsc19pMmNfYWRjW10gPSB7CisJCS8vIkFuYWxvZyBNaXggQ2FwdHVyZSBWb2x1bWUiLCJPTEQgQW5hbG9nIE1peCBDYXB0dXJlIFZvbHVtZSIsCisJCSJMaW5lIENhcHR1cmUgVm9sdW1lIiwgIkFuYWxvZyBNaXggQ2FwdHVyZSBWb2x1bWUiLAorCQkiV2F2ZSBQbGF5YmFjayBWb2x1bWUiLCAiT0xEIFBDTSBQbGF5YmFjayBWb2x1bWUiLAorCQkiV2F2ZSBNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLAorCQkiQU1pYyBQbGF5YmFjayBWb2x1bWUiLCAiT2xkIE1pYyBQbGF5YmFjayBWb2x1bWUiLAorCQkiQ0QgQ2FwdHVyZSBWb2x1bWUiLCAiSUVDOTU4IE9wdGljYWwgQ2FwdHVyZSBWb2x1bWUiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY2hhciAqYXVkaWd5X3JlbW92ZV9jdGxzX2kyY19hZGNbXSA9IHsKKwkJLyogT24gdGhlIEF1ZGlneTIgWlMgTm90ZWJvb2sKKwkJICogQ2FwdHVyZSB2aWEgV004Nzc1ICAqLworCQkiTWljIENhcHR1cmUgVm9sdW1lIiwKKwkJIkFuYWxvZyBNaXggQ2FwdHVyZSBWb2x1bWUiLAorCQkiQXV4IENhcHR1cmUgVm9sdW1lIiwKKwkJIklFQzk1OCBPcHRpY2FsIENhcHR1cmUgVm9sdW1lIiwKKwkJTlVMTAorCX07CiAJc3RhdGljIGNoYXIgKmF1ZGlneV9yZW1vdmVfY3Rsc18xMzYxdF9hZGNbXSA9IHsKIAkJLyogT24gdGhlIEF1ZGlneTIgdGhlIEFDOTcgcGxheWJhY2sgaXMgcGlwZWQgaW50bwogCQkgKiB0aGUgUGhpbGlwcyBBREMgZm9yIDI0Yml0IGNhcHR1cmUgKi8KQEAgLTg5MCw2ICsxNTgyLDcgQEAKIAkJCWlmIChlbXUtPmFjOTctPmlkID09IEFDOTdfSURfU1RBQzk3NTgpIHsKIAkJCQllbXUtPnJlYXJfYWM5NyA9IDE7CiAJCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQUM5N1NMT1QsIDAsIEFDOTdTTE9UX0NOVFJ8QUM5N1NMT1RfTEZFfEFDOTdTTE9UX1JFQVJfTEVGVHxBQzk3U0xPVF9SRUFSX1JJR0hUKTsKKwkJCQlzbmRfYWM5N193cml0ZV9jYWNoZShlbXUtPmFjOTcsIEFDOTdfSEVBRFBIT05FLCAweDAyMDIpOwogCQkJfQogCQkJLyogcmVtb3ZlIHVudXNlZCBBQzk3IGNvbnRyb2xzICovCiAJCQlzbmRfYWM5N193cml0ZV9jYWNoZShlbXUtPmFjOTcsIEFDOTdfU1VSUk9VTkRfTUFTVEVSLCAweDAyMDIpOwpAQCAtODk4LDYgKzE1OTEsMTAgQEAKIAkJfQogCQlmb3IgKDsgKmM7IGMrKykKIAkJCXJlbW92ZV9jdGwoY2FyZCwgKmMpOworCX0gZWxzZSBpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+aTJjX2FkYykgeworCQljID0gYXVkaWd5X3JlbW92ZV9jdGxzX2kyY19hZGM7CisJCWZvciAoOyAqYzsgYysrKQorCQkJcmVtb3ZlX2N0bChjYXJkLCAqYyk7CiAJfSBlbHNlIHsKIAlub19hYzk3OgogCQlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZWNhcmQpCkBAIC05MTEsNiArMTYwOCw4IEBACiAJaWYgKGVtdS0+YXVkaWd5KQogCQlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+YWRjXzEzNjF0KQogCQkJYyA9IGF1ZGlneV9yZW5hbWVfY3Rsc18xMzYxdF9hZGM7CisJCWVsc2UgaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmkyY19hZGMpCisJCQljID0gYXVkaWd5X3JlbmFtZV9jdGxzX2kyY19hZGM7CiAJCWVsc2UKIAkJCWMgPSBhdWRpZ3lfcmVuYW1lX2N0bHM7CiAJZWxzZQpAQCAtMTAyMSw3ICsxNzIwLDcgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKCBlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMjEybSkgeworCWlmICggZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTAxMCkgewogCQk7ICAvKiBEaXNhYmxlIHRoZSBzbmRfYXVkaWd5X3NwZGlmX3NoYXJlZF9zcGRpZiAqLwogCX0gZWxzZSBpZiAoZW11LT5hdWRpZ3kpIHsKIAkJaWYgKChrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfYXVkaWd5X3NoYXJlZF9zcGRpZiwgZW11KSkgPT0gTlVMTCkKQEAgLTEwNDUsNiArMTc0NCw0OCBAQAogCQlpZiAoKGVyciA9IHNuZF9wMTZ2X21peGVyKGVtdSkpKQogCQkJcmV0dXJuIGVycjsKIAl9CisKKwlpZiAoIGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEwMTApIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc25kX2VtdTEwMTBfb3V0cHV0X2VudW1fY3Rscyk7IGkrKykgeworCQkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfZW11MTAxMF9vdXRwdXRfZW51bV9jdGxzW2ldLCBlbXUpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc25kX2VtdTEwMTBfaW5wdXRfZW51bV9jdGxzKTsgaSsrKSB7CisJCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMDEwX2lucHV0X2VudW1fY3Rsc1tpXSwgZW11KSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNuZF9lbXUxMDEwX2FkY19wYWRzKTsgaSsrKSB7CisJCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMDEwX2FkY19wYWRzW2ldLCBlbXUpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc25kX2VtdTEwMTBfZGFjX3BhZHMpOyBpKyspIHsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2VtdTEwMTBfZGFjX3BhZHNbaV0sIGVtdSkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMDEwX2ludGVybmFsX2Nsb2NrLCBlbXUpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmICggZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+aTJjX2FkYykgeworCQlpbnQgaTsKKworCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9hdWRpZ3lfaTJjX2NhcHR1cmVfc291cmNlLCBlbXUpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNuZF9hdWRpZ3lfaTJjX3ZvbHVtZV9jdGxzKTsgaSsrKSB7CisJCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9hdWRpZ3lfaTJjX3ZvbHVtZV9jdGxzW2ldLCBlbXUpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwl9CiAJCQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11cGNtLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYwppbmRleCA3MTdlOTJlLi5hYjRmNWRmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJCQkJCSAgICAgIDEsCiAJCQkJCSAgICAgICZlcGNtLT5leHRyYSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQkvLyBwcmludGsoInBjbV9jaGFubmVsX2FsbG9jOiBmYWlsZWQgZXh0cmE6IHZvaWNlcz0lZCwgZnJhbWU9JWRcbiIsIHZvaWNlcywgZnJhbWUpOworCQkJLyogcHJpbnRrKCJwY21fY2hhbm5lbF9hbGxvYzogZmFpbGVkIGV4dHJhOiB2b2ljZXM9JWQsIGZyYW1lPSVkXG4iLCB2b2ljZXMsIGZyYW1lKTsgKi8KIAkJCWZvciAoaSA9IDA7IGkgPCB2b2ljZXM7IGkrKykgewogCQkJCXNuZF9lbXUxMGsxX3ZvaWNlX2ZyZWUoZXBjbS0+ZW11LCBlcGNtLT52b2ljZXNbaV0pOwogCQkJCWVwY20tPnZvaWNlc1tpXSA9IE5VTEw7CkBAIC0zMzksNyArMzM5LDcgQEAKIAkJfQogCX0KIAotCS8vIHNldHVwIHJvdXRpbmcKKwkvKiBzZXR1cCByb3V0aW5nICovCiAJaWYgKGVtdS0+YXVkaWd5KSB7CiAJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfRlhSVDEsIHZvaWNlLAogCQkJCSAgICAgIHNuZF9lbXUxMGsxX2NvbXBvc2VfYXVkaWd5X2Z4cnQxKHNlbmRfcm91dGluZykpOwpAQCAtMzUzLDEyICszNTMsMTUgQEAKIAl9IGVsc2UKIAkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgRlhSVCwgdm9pY2UsCiAJCQkJICAgICAgc25kX2VtdTEwazFfY29tcG9zZV9zZW5kX3JvdXRpbmcoc2VuZF9yb3V0aW5nKSk7Ci0JLy8gU3RvcCBDQQotCS8vIEFzc3VtcHRpb24gdGhhdCBQVCBpcyBhbHJlYWR5IDAgc28gbm8gaGFybSBvdmVyd3JpdGluZworCS8qIFN0b3AgQ0EgKi8KKwkvKiBBc3N1bXB0aW9uIHRoYXQgUFQgaXMgYWxyZWFkeSAwIHNvIG5vIGhhcm0gb3ZlcndyaXRpbmcgKi8KIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBQVFJYLCB2b2ljZSwgKHNlbmRfYW1vdW50WzBdIDw8IDgpIHwgc2VuZF9hbW91bnRbMV0pOwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIERTTCwgdm9pY2UsIGVuZF9hZGRyIHwgKHNlbmRfYW1vdW50WzNdIDw8IDI0KSk7CiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgUFNTVCwgdm9pY2UsIHN0YXJ0X2FkZHIgfCAoc2VuZF9hbW91bnRbMl0gPDwgMjQpKTsKLQlwaXRjaF90YXJnZXQgPSBlbXUxMGsxX2NhbGNfcGl0Y2hfdGFyZ2V0KHJ1bnRpbWUtPnJhdGUpOworCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMDEwKQorCQlwaXRjaF90YXJnZXQgPSBQSVRDSF80ODAwMDsgLyogRGlzYWJsZSBpbnRlcnBvbGF0b3JzIG9uIGVtdTEwMTAgY2FyZCAqLworCWVsc2UgCisJCXBpdGNoX3RhcmdldCA9IGVtdTEwazFfY2FsY19waXRjaF90YXJnZXQocnVudGltZS0+cmF0ZSk7CiAJaWYgKGV4dHJhKQogCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDQ0NBLCB2b2ljZSwgc3RhcnRfYWRkciB8CiAJCQkgICAgICBlbXUxMGsxX3NlbGVjdF9pbnRlcnByb20ocGl0Y2hfdGFyZ2V0KSB8CkBAIC0zNjcsMTQgKzM3MCwxNCBAQAogCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDQ0NBLCB2b2ljZSwgKHN0YXJ0X2FkZHIgKyBjY2lzKSB8CiAJCQkgICAgICBlbXUxMGsxX3NlbGVjdF9pbnRlcnByb20ocGl0Y2hfdGFyZ2V0KSB8CiAJCQkgICAgICAod18xNiA/IDAgOiBDQ0NBXzhCSVRTRUxFQ1QpKTsKLQkvLyBDbGVhciBmaWx0ZXIgZGVsYXkgbWVtb3J5CisJLyogQ2xlYXIgZmlsdGVyIGRlbGF5IG1lbW9yeSAqLwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFoxLCB2b2ljZSwgMCk7CiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgWjIsIHZvaWNlLCAwKTsKLQkvLyBpbnZhbGlkYXRlIG1hcHMKKwkvKiBpbnZhbGlkYXRlIG1hcHMgKi8KIAlzaWxlbnRfcGFnZSA9ICgodW5zaWduZWQgaW50KWVtdS0+c2lsZW50X3BhZ2UuYWRkciA8PCAxKSB8IE1BUF9QVElfTUFTSzsKIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBNQVBBLCB2b2ljZSwgc2lsZW50X3BhZ2UpOwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIE1BUEIsIHZvaWNlLCBzaWxlbnRfcGFnZSk7Ci0JLy8gbW9kdWxhdGlvbiBlbnZlbG9wZQorCS8qIG1vZHVsYXRpb24gZW52ZWxvcGUgKi8KIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDVkNGLCB2b2ljZSwgMHhmZmZmKTsKIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBWVEZULCB2b2ljZSwgMHhmZmZmKTsKIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBVEtITERNLCB2b2ljZSwgMCk7CkBAIC0zODUsMTIgKzM4OCwxMiBAQAogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFRSRU1GUlEsIHZvaWNlLCAwKTsKIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBGTTJGUlEyLCB2b2ljZSwgMCk7CiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgRU5WVkFMLCB2b2ljZSwgMHg4MDAwKTsKLQkvLyB2b2x1bWUgZW52ZWxvcGUKKwkvKiB2b2x1bWUgZW52ZWxvcGUgKi8KIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBVEtITERWLCB2b2ljZSwgMHg3ZjdmKTsKIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBFTlZWT0wsIHZvaWNlLCAweDAwMDApOwotCS8vIGZpbHRlciBlbnZlbG9wZQorCS8qIGZpbHRlciBlbnZlbG9wZSAqLwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFBFRkVfRklMVEVSQU1PVU5ULCB2b2ljZSwgMHg3Zik7Ci0JLy8gcGl0Y2ggZW52ZWxvcGUKKwkvKiBwaXRjaCBlbnZlbG9wZSAqLwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFBFRkVfUElUQ0hBTU9VTlQsIHZvaWNlLCAwKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKQEAgLTQ2OCw3ICs0NzEsNyBAQAogCQlzbmRfZW11MTBrMV92b2ljZV9mcmVlKGVwY20tPmVtdSwgZXBjbS0+ZXh0cmEpOwogCQllcGNtLT5leHRyYSA9IE5VTEw7CiAJfQotCWZvciAoaT0wOyBpIDwgTlVNX0VGWF9QTEFZQkFDSzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE5VTV9FRlhfUExBWUJBQ0s7IGkrKykgewogCQlpZiAoZXBjbS0+dm9pY2VzW2ldKSB7CiAJCQlzbmRfZW11MTBrMV92b2ljZV9mcmVlKGVwY20tPmVtdSwgZXBjbS0+dm9pY2VzW2ldKTsKIAkJCWVwY20tPnZvaWNlc1tpXSA9IE5VTEw7CkBAIC02MzcsNyArNjQwLDcgQEAKIAlzdGVyZW8gPSAoIWV4dHJhICYmIHJ1bnRpbWUtPmNoYW5uZWxzID09IDIpOwogCXNhbXBsZSA9IHNuZF9wY21fZm9ybWF0X3dpZHRoKHJ1bnRpbWUtPmZvcm1hdCkgPT0gMTYgPyAwIDogMHg4MDgwODA4MDsKIAljY2lzID0gZW11MTBrMV9jY2lzKHN0ZXJlbywgc2FtcGxlID09IDApOwotCS8vIHNldCBjcyB0byAyICogbnVtYmVyIG9mIGNhY2hlIHJlZ2lzdGVycyBiZXNpZGUgdGhlIGludmFsaWRhdGVkCisJLyogc2V0IGNzIHRvIDIgKiBudW1iZXIgb2YgY2FjaGUgcmVnaXN0ZXJzIGJlc2lkZSB0aGUgaW52YWxpZGF0ZWQgKi8KIAljcyA9IChzYW1wbGUgPT0gMCkgPyAoMzItY2NpcykgOiAoNjQtY2NpcysxKSA+PiAxOwogCWlmIChjcyA+IDE2KSBjcyA9IDE2OwogCWZvciAoaSA9IDA7IGkgPCBjczsgaSsrKSB7CkBAIC02NDYsMTQgKzY0OSwxNCBAQAogCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ0QwICsgaSwgdm9pY2UgKyAxLCBzYW1wbGUpOwogCQl9CiAJfQotCS8vIHJlc2V0IGNhY2hlCisJLyogcmVzZXQgY2FjaGUgKi8KIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDQ1JfQ0FDSEVJTlZBTElEU0laRSwgdm9pY2UsIDApOwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENDUl9SRUFEQUREUkVTUywgdm9pY2UsIGNyYSk7CiAJaWYgKHN0ZXJlbykgewogCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDQ1JfQ0FDSEVJTlZBTElEU0laRSwgdm9pY2UgKyAxLCAwKTsKIAkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ0NSX1JFQURBRERSRVNTLCB2b2ljZSArIDEsIGNyYSk7CiAJfQotCS8vIGZpbGwgY2FjaGUKKwkvKiBmaWxsIGNhY2hlICovCiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ0NSX0NBQ0hFSU5WQUxJRFNJWkUsIHZvaWNlLCBjY2lzKTsKIAlpZiAoc3RlcmVvKSB7CiAJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENDUl9DQUNIRUlOVkFMSURTSVpFLCB2b2ljZSsxLCBjY2lzKTsKQEAgLTY5OCw3ICs3MDEsMTAgQEAKIAl2b2ljZSA9IGV2b2ljZS0+bnVtYmVyOwogCiAJcGl0Y2ggPSBzbmRfZW11MTBrMV9yYXRlX3RvX3BpdGNoKHJ1bnRpbWUtPnJhdGUpID4+IDg7Ci0JcGl0Y2hfdGFyZ2V0ID0gZW11MTBrMV9jYWxjX3BpdGNoX3RhcmdldChydW50aW1lLT5yYXRlKTsKKwlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTAxMCkKKwkJcGl0Y2hfdGFyZ2V0ID0gUElUQ0hfNDgwMDA7IC8qIERpc2FibGUgaW50ZXJwb2xhdG9ycyBvbiBlbXUxMDEwIGNhcmQgKi8KKwllbHNlIAorCQlwaXRjaF90YXJnZXQgPSBlbXUxMGsxX2NhbGNfcGl0Y2hfdGFyZ2V0KHJ1bnRpbWUtPnJhdGUpOwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFBUUlhfUElUQ0hUQVJHRVQsIHZvaWNlLCBwaXRjaF90YXJnZXQpOwogCWlmIChtYXN0ZXIgfHwgZXZvaWNlLT5lcGNtLT50eXBlID09IFBMQVlCQUNLX0VGWCkKIAkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ1BGX0NVUlJFTlRQSVRDSCwgdm9pY2UsIHBpdGNoX3RhcmdldCk7CkBAIC03MzIsNyArNzM4LDcgQEAKIAlzdHJ1Y3Qgc25kX2VtdTEwazFfcGNtX21peGVyICptaXg7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQkvLyBwcmludGsoInRyaWdnZXIgLSBlbXUxMGsxID0gMHgleCwgY21kID0gJWksIHBvaW50ZXIgPSAlaVxuIiwgKGludCllbXUsIGNtZCwgc3Vic3RyZWFtLT5vcHMtPnBvaW50ZXIoc3Vic3RyZWFtKSk7CisJLyogcHJpbnRrKCJ0cmlnZ2VyIC0gZW11MTBrMSA9IDB4JXgsIGNtZCA9ICVpLCBwb2ludGVyID0gJWlcbiIsIChpbnQpZW11LCBjbWQsIHN1YnN0cmVhbS0+b3BzLT5wb2ludGVyKHN1YnN0cmVhbSkpOyAqLwogCXNwaW5fbG9jaygmZW11LT5yZWdfbG9jayk7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgpAQCAtNzc4LDEwICs3ODQsMTAgQEAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JCS8vIGhtbSB0aGlzIHNob3VsZCBjYXVzZSBmdWxsIGFuZCBoYWxmIGZ1bGwgaW50ZXJydXB0IHRvIGJlIHJhaXNlZD8gIAorCQkvKiBobW0gdGhpcyBzaG91bGQgY2F1c2UgZnVsbCBhbmQgaGFsZiBmdWxsIGludGVycnVwdCB0byBiZSByYWlzZWQ/ICovCiAJCW91dGwoZXBjbS0+Y2FwdHVyZV9pcHIsIGVtdS0+cG9ydCArIElQUik7CiAJCXNuZF9lbXUxMGsxX2ludHJfZW5hYmxlKGVtdSwgZXBjbS0+Y2FwdHVyZV9pbnRlKTsKLQkJLy8gcHJpbnRrKCJhZGNjciA9IDB4JXgsIGFkY2JzID0gMHgleFxuIiwgZXBjbS0+YWRjY3IsIGVwY20tPmFkY2JzKTsKKwkJLyogcHJpbnRrKCJhZGNjciA9IDB4JXgsIGFkY2JzID0gMHgleFxuIiwgZXBjbS0+YWRjY3IsIGVwY20tPmFkY2JzKTsgKi8KIAkJc3dpdGNoIChlcGNtLT50eXBlKSB7CiAJCWNhc2UgQ0FQVFVSRV9BQzk3QURDOgogCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQURDQ1IsIDAsIGVwY20tPmNhcHR1cmVfY3JfdmFsKTsKQEAgLTc5MCw2ICs3OTYsNyBAQAogCQkJaWYgKGVtdS0+YXVkaWd5KSB7CiAJCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9GWFdDMSwgMCwgZXBjbS0+Y2FwdHVyZV9jcl92YWwpOwogCQkJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfRlhXQzIsIDAsIGVwY20tPmNhcHR1cmVfY3JfdmFsMik7CisJCQkJc25kX3ByaW50ZGQoImNyX3ZhbD0weCV4LCBjcl92YWwyPTB4JXhcbiIsIGVwY20tPmNhcHR1cmVfY3JfdmFsLCBlcGNtLT5jYXB0dXJlX2NyX3ZhbDIpOwogCQkJfSBlbHNlCiAJCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgRlhXQywgMCwgZXBjbS0+Y2FwdHVyZV9jcl92YWwpOwogCQkJYnJlYWs7CkBAIC04NTEsNyArODU4LDcgQEAKIAkJCXB0ciAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKIAl9CiAjZW5kaWYKLQkvLyBwcmludGsoInB0ciA9IDB4JXgsIGJ1ZmZlcl9zaXplID0gMHgleCwgcGVyaW9kX3NpemUgPSAweCV4XG4iLCBwdHIsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CisJLyogcHJpbnRrKCJwdHIgPSAweCV4LCBidWZmZXJfc2l6ZSA9IDB4JXgsIHBlcmlvZF9zaXplID0gMHgleFxuIiwgcHRyLCBydW50aW1lLT5idWZmZXJfc2l6ZSwgcnVudGltZS0+cGVyaW9kX3NpemUpOyAqLwogCXJldHVybiBwdHI7CiB9CiAKQEAgLTg2OCw3ICs4NzUsNyBAQAogCXNwaW5fbG9jaygmZW11LT5yZWdfbG9jayk7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQkvLyBwcmVwYXJlIHZvaWNlcworCQkvKiBwcmVwYXJlIHZvaWNlcyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0VGWF9QTEFZQkFDSzsgaSsrKSB7CQogCQkJc25kX2VtdTEwazFfcGxheWJhY2tfaW52YWxpZGF0ZV9jYWNoZShlbXUsIDAsIGVwY20tPnZvaWNlc1tpXSk7CiAJCX0KQEAgLTkxNyw3ICs5MjQsNyBAQAogCWlmICghZXBjbS0+cnVubmluZykKIAkJcmV0dXJuIDA7CiAJaWYgKGVwY20tPmZpcnN0X3B0cikgewotCQl1ZGVsYXkoNTApOwkvLyBoYWNrLCBpdCB0YWtlcyBhd2hpbGUgdW50aWwgY2FwdHVyZSBpcyBzdGFydGVkCisJCXVkZWxheSg1MCk7CS8qIGhhY2ssIGl0IHRha2VzIGF3aGlsZSB1bnRpbCBjYXB0dXJlIGlzIHN0YXJ0ZWQgKi8KIAkJZXBjbS0+Zmlyc3RfcHRyID0gMDsKIAl9CiAJcHRyID0gc25kX2VtdTEwazFfcHRyX3JlYWQoZW11LCBlcGNtLT5jYXB0dXJlX2lkeF9yZWcsIDApICYgMHgwMDAwZmZmZjsKQEAgLTk3Miw2ICs5NzksMjggQEAKIAkuZmlmb19zaXplID0JCTAsCiB9OwogCitzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX2VtdTEwazFfY2FwdHVyZV9lZnggPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cyA9CQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8IAorCQkJCSBTTkRSVl9QQ01fUkFURV84ODIwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwgCisJCQkJIFNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzE5MjAwMCwKKwkucmF0ZV9taW4gPQkJNDQxMDAsCisJLnJhdGVfbWF4ID0JCTE5MjAwMCwKKwkuY2hhbm5lbHNfbWluID0JCTgsCisJLmNoYW5uZWxzX21heCA9CQk4LAorCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDY0KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JMzg0LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JKDY0KjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkyLAorCS5wZXJpb2RzX21heCA9CQkyLAorCS5maWZvX3NpemUgPQkJMCwKK307CisKIC8qCiAgKgogICovCkBAIC0xMDE2LDcgKzEwNDUsNyBAQAogCXN0cnVjdCBzbmRfZW11MTBrMV9wY21fbWl4ZXIgKm1peDsKIAlpbnQgaTsKIAotCWZvciAoaT0wOyBpIDwgTlVNX0VGWF9QTEFZQkFDSzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE5VTV9FRlhfUExBWUJBQ0s7IGkrKykgewogCQltaXggPSAmZW11LT5lZnhfcGNtX21peGVyW2ldOwogCQltaXgtPmVwY20gPSBOVUxMOwogCQlzbmRfZW11MTBrMV9wY21fZWZ4X21peGVyX25vdGlmeShlbXUsIGksIDApOwpAQCAtMTA0NSw3ICsxMDc0LDcgQEAKIAlydW50aW1lLT5wcml2YXRlX2ZyZWUgPSBzbmRfZW11MTBrMV9wY21fZnJlZV9zdWJzdHJlYW07CiAJcnVudGltZS0+aHcgPSBzbmRfZW11MTBrMV9lZnhfcGxheWJhY2s7CiAJCi0JZm9yIChpPTA7IGkgPCBOVU1fRUZYX1BMQVlCQUNLOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0VGWF9QTEFZQkFDSzsgaSsrKSB7CiAJCW1peCA9ICZlbXUtPmVmeF9wY21fbWl4ZXJbaV07CiAJCW1peC0+c2VuZF9yb3V0aW5nWzBdWzBdID0gaTsKIAkJbWVtc2V0KCZtaXgtPnNlbmRfdm9sdW1lLCAwLCBzaXplb2YobWl4LT5zZW5kX3ZvbHVtZSkpOwpAQCAtMTE5OSwxNSArMTIyOCw2OSBAQAogCWVwY20tPmNhcHR1cmVfaWR4X3JlZyA9IEZYSURYOwogCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhID0gZXBjbTsKIAlzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZnJlZSA9IHNuZF9lbXUxMGsxX3BjbV9mcmVlX3N1YnN0cmVhbTsKLQlydW50aW1lLT5odyA9IHNuZF9lbXUxMGsxX2NhcHR1cmU7CisJcnVudGltZS0+aHcgPSBzbmRfZW11MTBrMV9jYXB0dXJlX2VmeDsKIAlydW50aW1lLT5ody5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwOwogCXJ1bnRpbWUtPmh3LnJhdGVfbWluID0gcnVudGltZS0+aHcucmF0ZV9tYXggPSA0ODAwMDsKIAlzcGluX2xvY2tfaXJxKCZlbXUtPnJlZ19sb2NrKTsKLQlydW50aW1lLT5ody5jaGFubmVsc19taW4gPSBydW50aW1lLT5ody5jaGFubmVsc19tYXggPSAwOwotCWZvciAoaWR4ID0gMDsgaWR4IDwgbmVmeDsgaWR4KyspIHsKLQkJaWYgKGVtdS0+ZWZ4X3ZvaWNlc19tYXNrW2lkeC8zMl0gJiAoMSA8PCAoaWR4JTMyKSkpIHsKLQkJCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbisrOwotCQkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4Kys7CisJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEwMTApIHsKKwkJLyogVE9ETyAKKwkJICogU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRQorCQkgKiBTTkRSVl9QQ01fUkFURV80NDEwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKKwkJICogU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCSAqIFNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzE5MjAwMAorCQkgKiByYXRlX21pbiA9IDQ0MTAwLAorCQkgKiByYXRlX21heCA9IDE5MjAwMCwKKwkJICogY2hhbm5lbHNfbWluID0gOCwKKwkJICogY2hhbm5lbHNfbWF4ID0gOCwKKwkJICogTmVlZCB0byBhZGQgbWl4ZXIgY29udHJvbCB0byBmaXggc2FtcGxlIHJhdGUKKwkJICogICAgICAgICAgICAgICAgIAorCQkgKiBUaGVyZSBhcmUgMTYgbW9ubyBjaGFubmVscyBvZiAxNmJpdHMgZWFjaC4KKwkJICogMjRiaXQgQXVkaW8gdXNlcyAyeCBjaGFubmVscyBvdmVyIDE2Yml0CisJCSAqIDk2a0h6IHVzZXMgMnggY2hhbm5lbHMgb3ZlciA0OGtIegorCQkgKiAxOTJrSHogdXNlcyA0eCBjaGFubmVscyBvdmVyIDQ4a0h6CisJCSAqIFNvLCBmb3IgNDhrSHogMjRiaXQsIG9uZSBoYXMgOCBjaGFubmVscworCQkgKiBmb3IgOTZrSHogMjRiaXQsIG9uZSBoYXMgNCBjaGFubmVscworCQkgKiBmb3IgMTkya0h6IDI0Yml0LCBvbmUgaGFzIDIgY2hhbm5lbHMKKwkJICovCisjaWYgMQorCQlzd2l0Y2ggKGVtdS0+ZW11MTAxMC5pbnRlcm5hbF9jbG9jaykgeworCQljYXNlIDA6CisJCQkvKiBGb3IgNDQuMWtIeiAqLworCQkJcnVudGltZS0+aHcucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80NDEwMDsKKwkJCXJ1bnRpbWUtPmh3LnJhdGVfbWluID0gcnVudGltZS0+aHcucmF0ZV9tYXggPSA0NDEwMDsKKwkJCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9IHJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IDg7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJLyogRm9yIDQ4a0h6ICovCisJCQlydW50aW1lLT5ody5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwOworCQkJcnVudGltZS0+aHcucmF0ZV9taW4gPSBydW50aW1lLT5ody5yYXRlX21heCA9IDQ4MDAwOworCQkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gODsKKwkJCWJyZWFrOworCQl9OworI2VuZGlmCisjaWYgMAorCQkvKiBGb3IgOTZrSHogKi8KKwkJcnVudGltZS0+aHcucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV85NjAwMDsKKwkJcnVudGltZS0+aHcucmF0ZV9taW4gPSBydW50aW1lLT5ody5yYXRlX21heCA9IDk2MDAwOworCQlydW50aW1lLT5ody5jaGFubmVsc19taW4gPSBydW50aW1lLT5ody5jaGFubmVsc19tYXggPSA0OworI2VuZGlmCisjaWYgMAorCQkvKiBGb3IgMTkya0h6ICovCisJCXJ1bnRpbWUtPmh3LnJhdGVzID0gU05EUlZfUENNX1JBVEVfMTkyMDAwOworCQlydW50aW1lLT5ody5yYXRlX21pbiA9IHJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gMTkyMDAwOworCQlydW50aW1lLT5ody5jaGFubmVsc19taW4gPSBydW50aW1lLT5ody5jaGFubmVsc19tYXggPSAyOworI2VuZGlmCisJCXJ1bnRpbWUtPmh3LmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRTsKKwkJLyogZWZ4X3ZvaWNlc19tYXNrWzBdIGlzIGV4cGVjdGVkIHRvIGJlIHplcm8KKyAJCSAqIGVmeF92b2ljZXNfbWFza1sxXSBpcyBleHBlY3RlZCB0byBoYXZlIDE2Yml0cyBzZXQKKwkJICovCisJfSBlbHNlIHsKKwkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gMDsKKwkJZm9yIChpZHggPSAwOyBpZHggPCBuZWZ4OyBpZHgrKykgeworCQkJaWYgKGVtdS0+ZWZ4X3ZvaWNlc19tYXNrW2lkeC8zMl0gJiAoMSA8PCAoaWR4JTMyKSkpIHsKKwkJCQlydW50aW1lLT5ody5jaGFubmVsc19taW4rKzsKKwkJCQlydW50aW1lLT5ody5jaGFubmVsc19tYXgrKzsKKwkJCX0KIAkJfQogCX0KIAllcGNtLT5jYXB0dXJlX2NyX3ZhbCA9IGVtdS0+ZWZ4X3ZvaWNlc19tYXNrWzBdOwpAQCAtMTQ2MCw3ICsxNTQzLDcgQEAKIAkJCQkJCSAgIHVuc2lnbmVkIGludCBjb3VudCwKIAkJCQkJCSAgIHVuc2lnbmVkIGludCB0cmFtX3NoaWZ0KQogewotCS8vIHByaW50aygidHJhbV9wb2tlMTogZHN0X2xlZnQgPSAweCVwLCBkc3RfcmlnaHQgPSAweCVwLCBzcmMgPSAweCVwLCBjb3VudCA9IDB4JXhcbiIsIGRzdF9sZWZ0LCBkc3RfcmlnaHQsIHNyYywgY291bnQpOworCS8qIHByaW50aygidHJhbV9wb2tlMTogZHN0X2xlZnQgPSAweCVwLCBkc3RfcmlnaHQgPSAweCVwLCBzcmMgPSAweCVwLCBjb3VudCA9IDB4JXhcbiIsIGRzdF9sZWZ0LCBkc3RfcmlnaHQsIHNyYywgY291bnQpOyAqLwogCWlmICgodHJhbV9zaGlmdCAmIDEpID09IDApIHsKIAkJd2hpbGUgKGNvdW50LS0pIHsKIAkJCSpkc3RfbGVmdC0tID0gKnNyYysrOwpAQCAtMTUzNyw3ICsxNjIwLDcgQEAKIAlzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX3BjbSAqcGNtID0gJmVtdS0+Zng4MDEwLnBjbVtzdWJzdHJlYW0tPm51bWJlcl07CiAJdW5zaWduZWQgaW50IGk7CiAJCi0JLy8gcHJpbnRrKCJwcmVwYXJlOiBldHJhbV9wYWdlcyA9IDB4JXAsIGRtYV9hcmVhID0gMHgleCwgYnVmZmVyX3NpemUgPSAweCV4ICgweCV4KVxuIiwgZW11LT5meDgwMTAuZXRyYW1fcGFnZXMsIHJ1bnRpbWUtPmRtYV9hcmVhLCBydW50aW1lLT5idWZmZXJfc2l6ZSwgcnVudGltZS0+YnVmZmVyX3NpemUgPDwgMik7CisJLyogcHJpbnRrKCJwcmVwYXJlOiBldHJhbV9wYWdlcyA9IDB4JXAsIGRtYV9hcmVhID0gMHgleCwgYnVmZmVyX3NpemUgPSAweCV4ICgweCV4KVxuIiwgZW11LT5meDgwMTAuZXRyYW1fcGFnZXMsIHJ1bnRpbWUtPmRtYV9hcmVhLCBydW50aW1lLT5idWZmZXJfc2l6ZSwgcnVudGltZS0+YnVmZmVyX3NpemUgPDwgMik7ICovCiAJbWVtc2V0KCZwY20tPnBjbV9yZWMsIDAsIHNpemVvZihwY20tPnBjbV9yZWMpKTsKIAlwY20tPnBjbV9yZWMuaHdfYnVmZmVyX3NpemUgPSBwY20tPmJ1ZmZlcl9zaXplICogMjsgLyogYnl0ZSBzaXplICovCiAJcGNtLT5wY21fcmVjLnN3X2J1ZmZlcl9zaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwcm9jLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVwcm9jLmMKaW5kZXggYjkzOWUwMy4uMmMxNTg1OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11cHJvYy5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXByb2MuYwpAQCAtMyw2ICszLDkgQEAKICAqICAgICAgICAgICAgICAgICAgIENyZWF0aXZlIExhYnMsIEluYy4KICAqICBSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBFTVUxMEsxIGNoaXBzIC8gcHJvYyBpbnRlcmZhY2Ugcm91dGluZXMKICAqCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYW1lcyBDb3VydGllci1EdXR0b24gPEphbWVzQHN1cGVyYnVnLmNvLnVrPgorICogIAlBZGRlZCBFTVUgMTAxMCBzdXBwb3J0LgorICoKICAqICBCVUdTOgogICogICAgLS0KICAqCkBAIC0yNTUsNyArMjU4LDcgQEAKIAl1bnNpZ25lZCBpbnQgdmFsLCB0bXAsIG47CiAJdmFsID0gc25kX2VtdTEwazFfcHRyMjBfcmVhZChlbXUsIENBUFRVUkVfUkFURV9TVEFUVVMsIDApOwogCXRtcCA9ICh2YWwgPj4gMTYpICYgMHg4OwotCWZvciAobj0wO248NDtuKyspIHsKKwlmb3IgKG4gPSAwOyBuIDwgNDsgbisrKSB7CiAJCXRtcCA9IHZhbCA+PiAoMTYgKyAobio0KSk7CiAJCWlmICh0bXAgJiAweDgpIHNuZF9pcHJpbnRmKGJ1ZmZlciwgIkNoYW5uZWwgJWQ6IFJhdGU9JWRcbiIsIG4sIHNhbXBsZXJhdGVbdG1wICYgMHg3XSk7CiAJCWVsc2Ugc25kX2lwcmludGYoYnVmZmVyLCAiQ2hhbm5lbCAlZDogTm8gaW5wdXRcbiIsIG4pOwpAQCAtMzcyLDYgKzM3NSwyNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRworc3RhdGljIHZvaWQgc25kX2VtdV9wcm9jX2VtdTEwMTBfcmVnX3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKKwkJCQkgICAgIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgcmVnczsKKwlpbnQgaTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJFTVUxMDEwIFJlZ2lzdGVyczpcblxuIik7CisKKwlmb3IoaSA9IDA7IGkgPCAweDMwOyBpKz0xKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJCXJlZ3M9aSsweDQwOyAvKiAweDQwIHVwd2FyZHMgYXJlIHJlZ2lzdGVycy4gKi8KKwkJb3V0bChyZWdzLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwkJb3V0bChyZWdzIHwgMHg4MCwgZW11LT5wb3J0ICsgQV9JT0NGRyk7ICAvKiBIaWdoIGJpdCBjbG9ja3MgdGhlIHZhbHVlIGludG8gdGhlIGZwZ2EuICovCisJCXZhbHVlID0gaW5sKGVtdS0+cG9ydCArIEFfSU9DRkcpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwMlg6ICUwOGxYLCAlMDJsWFxuIiwgaSwgdmFsdWUsICh2YWx1ZSA+PiA4KSAmIDB4N2YpOworCX0KK30KKwogc3RhdGljIHZvaWQgc25kX2VtdV9wcm9jX2lvX3JlZ19yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCiAJCQkJICAgICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCiB7CkBAIC0zOTgsNyArNDIyLDcgQEAKIAl3aGlsZSAoIXNuZF9pbmZvX2dldF9saW5lKGJ1ZmZlciwgbGluZSwgc2l6ZW9mKGxpbmUpKSkgewogCQlpZiAoc3NjYW5mKGxpbmUsICIleCAleCIsICZyZWcsICZ2YWwpICE9IDIpCiAJCQljb250aW51ZTsKLQkJaWYgKChyZWcgPCAweDQwKSAmJiAocmVnID49MCkgJiYgKHZhbCA8PSAweGZmZmZmZmZmKSApIHsKKwkJaWYgKChyZWcgPCAweDQwKSAmJiAocmVnID49IDApICYmICh2YWwgPD0gMHhmZmZmZmZmZikgKSB7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOwogCQkJb3V0bCh2YWwsIGVtdS0+cG9ydCArIChyZWcgJiAweGZmZmZmZmZjKSk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CkBAIC00NzQsNyArNDk4LDcgQEAKIAl3aGlsZSAoIXNuZF9pbmZvX2dldF9saW5lKGJ1ZmZlciwgbGluZSwgc2l6ZW9mKGxpbmUpKSkgewogCQlpZiAoc3NjYW5mKGxpbmUsICIleCAleCAleCIsICZyZWcsICZjaGFubmVsX2lkLCAmdmFsKSAhPSAzKQogCQkJY29udGludWU7Ci0JCWlmICgocmVnIDwgMHhhMCkgJiYgKHJlZyA+PTApICYmICh2YWwgPD0gMHhmZmZmZmZmZikgJiYgKGNoYW5uZWxfaWQgPj0wKSAmJiAoY2hhbm5lbF9pZCA8PSAzKSApCisJCWlmICgocmVnIDwgMHhhMCkgJiYgKHJlZyA+PSAwKSAmJiAodmFsIDw9IDB4ZmZmZmZmZmYpICYmIChjaGFubmVsX2lkID49IDApICYmIChjaGFubmVsX2lkIDw9IDMpICkKIAkJCXNuZF9wdHJfd3JpdGUoZW11LCBpb2Jhc2UsIHJlZywgY2hhbm5lbF9pZCwgdmFsKTsKIAl9CiB9CkBAIC01MzEsNiArNTU1LDEwIEBACiB7CiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJaWYgKChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMDEwKSAmJgorCSAgICAgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAiZW11MTAxMF9yZWdzIiwgJmVudHJ5KSkgeworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgc25kX2VtdV9wcm9jX2VtdTEwMTBfcmVnX3JlYWQpOworCX0KIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJpb19yZWdzIiwgJmVudHJ5KSkgewogCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgc25kX2VtdV9wcm9jX2lvX3JlZ19yZWFkKTsKIAkJZW50cnktPmMudGV4dC53cml0ZSA9IHNuZF9lbXVfcHJvY19pb19yZWdfd3JpdGU7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9pby5jIGIvc291bmQvcGNpL2VtdTEwazEvaW8uYwppbmRleCAwMjllNzg1Li4xMTZlMWM4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9pby5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2lvLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvZW11MTBrMS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAicDE3di5oIgogCiB1bnNpZ25lZCBpbnQgc25kX2VtdTEwazFfcHRyX3JlYWQoc3RydWN0IHNuZF9lbXUxMGsxICogZW11LCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgY2huKQogewpAQCAtMTY3LDYgKzE2OCwxMDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogVGhlIEFEQyBkb2VzIG5vdCBzdXBwb3J0IGkyYyByZWFkLCBzbyBvbmx5IHdyaXRlIGlzIGltcGxlbWVudGVkICovCitpbnQgc25kX2VtdTEwazFfaTJjX3dyaXRlKHN0cnVjdCBzbmRfZW11MTBrMSAqZW11LAorCQkJCXUzMiByZWcsCisJCQkJdTMyIHZhbHVlKQoreworCXUzMiB0bXA7CisJaW50IHRpbWVvdXQgPSAwOworCWludCBzdGF0dXM7CisJaW50IHJldHJ5OworCWlmICgocmVnID4gMHg3ZikgfHwgKHZhbHVlID4gMHgxZmYpKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImkyY193cml0ZTogaW52YWxpZCB2YWx1ZXMuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdG1wID0gcmVnIDw8IDI1IHwgdmFsdWUgPDwgMTY7CisJLy8gc25kX3ByaW50aygiSTJDLXdyaXRlOnJlZz0weCV4LCB2YWx1ZT0weCV4XG4iLCByZWcsIHZhbHVlKTsKKwkvKiBOb3Qgc3VyZSB3aGF0IHRoaXMgSTJDIGNoYW5uZWwgY29udHJvbHMuICovCisJLyogc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgUDE3Vl9JMkNfMCwgMCwgdG1wKTsgKi8KKworCS8qIFRoaXMgY29udHJvbHMgdGhlIEkyQyBjb25uZWN0ZWQgdG8gdGhlIFdNODc3NSBBREMgQ29kZWMgKi8KKwlzbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUsIFAxN1ZfSTJDXzEsIDAsIHRtcCk7CisJdG1wID0gc25kX2VtdTEwazFfcHRyMjBfcmVhZChlbXUsIFAxN1ZfSTJDXzEsIDApOyAvKiB3cml0ZSBwb3N0ICovCisKKwlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCAxMDsgcmV0cnkrKykgeworCQkvKiBTZW5kIHRoZSBkYXRhIHRvIGkyYyAqLworCQkvL3RtcCA9IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgUDE3Vl9JMkNfQUREUiwgMCk7CisJCS8vdG1wID0gdG1wICYgfihJMkNfQV9BRENfUkVBRHxJMkNfQV9BRENfTEFTVHxJMkNfQV9BRENfU1RBUlR8STJDX0FfQURDX0FERF9NQVNLKTsKKwkJdG1wID0gMDsKKwkJdG1wID0gdG1wIHwgKEkyQ19BX0FEQ19MQVNUfEkyQ19BX0FEQ19TVEFSVHxJMkNfQV9BRENfQUREKTsKKwkJc25kX2VtdTEwazFfcHRyMjBfd3JpdGUoZW11LCBQMTdWX0kyQ19BRERSLCAwLCB0bXApOworCisJCS8qIFdhaXQgdGlsbCB0aGUgdHJhbnNhY3Rpb24gZW5kcyAqLworCQl3aGlsZSAoMSkgeworCQkJdWRlbGF5KDEwKTsKKwkJCXN0YXR1cyA9IHNuZF9lbXUxMGsxX3B0cjIwX3JlYWQoZW11LCBQMTdWX0kyQ19BRERSLCAwKTsKKyAgICAgICAgICAgICAgICAJLy8gc25kX3ByaW50aygiSTJDOnN0YXR1cz0weCV4XG4iLCBzdGF0dXMpOworCQkJdGltZW91dCsrOworCQkJaWYgKChzdGF0dXMgJiBJMkNfQV9BRENfU1RBUlQpID09IDApCisJCQkJYnJlYWs7CisKKwkJCWlmICh0aW1lb3V0ID4gMTAwMCkgeworICAgICAgICAgICAgICAgIAkJc25kX3ByaW50aygiZW11MTBrMTpJMkM6dGltZW91dCBzdGF0dXM9MHgleFxuIiwgc3RhdHVzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvL1JlYWQgYmFjayBhbmQgc2VlIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBzdWNjZXNzZnVsCisJCWlmICgoc3RhdHVzICYgSTJDX0FfQURDX0FCT1JUKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHJldHJ5ID09IDEwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIldyaXRpbmcgdG8gQURDIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisgICAgCisgICAgCXJldHVybiAwOworfQorCitpbnQgc25kX2VtdTEwMTBfZnBnYV93cml0ZShzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUsIGludCByZWcsIGludCB2YWx1ZSkKK3sKKwlpZiAocmVnIDwgMCB8fCByZWcgPiAweDNmKQorCQlyZXR1cm4gMTsKKwlyZWcgKz0gMHg0MDsgLyogMHg0MCB1cHdhcmRzIGFyZSByZWdpc3RlcnMuICovCisJaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDB4M2YpIC8qIDAgdG8gMHgzZiBhcmUgdmFsdWVzICovCisJCXJldHVybiAxOworCW91dGwocmVnLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwl1ZGVsYXkoMTApOworCW91dGwocmVnIHwgMHg4MCwgZW11LT5wb3J0ICsgQV9JT0NGRyk7ICAvKiBIaWdoIGJpdCBjbG9ja3MgdGhlIHZhbHVlIGludG8gdGhlIGZwZ2EuICovCisJdWRlbGF5KDEwKTsKKwlvdXRsKHZhbHVlLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwl1ZGVsYXkoMTApOworCW91dGwodmFsdWUgfCAweDgwICwgZW11LT5wb3J0ICsgQV9JT0NGRyk7ICAvKiBIaWdoIGJpdCBjbG9ja3MgdGhlIHZhbHVlIGludG8gdGhlIGZwZ2EuICovCisKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUsIGludCByZWcsIGludCAqdmFsdWUpCit7CisJaWYgKHJlZyA8IDAgfHwgcmVnID4gMHgzZikKKwkJcmV0dXJuIDE7CisJcmVnICs9IDB4NDA7IC8qIDB4NDAgdXB3YXJkcyBhcmUgcmVnaXN0ZXJzLiAqLworCW91dGwocmVnLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwl1ZGVsYXkoMTApOworCW91dGwocmVnIHwgMHg4MCwgZW11LT5wb3J0ICsgQV9JT0NGRyk7ICAvKiBIaWdoIGJpdCBjbG9ja3MgdGhlIHZhbHVlIGludG8gdGhlIGZwZ2EuICovCisJdWRlbGF5KDEwKTsKKwkqdmFsdWUgPSAoKGlubChlbXUtPnBvcnQgKyBBX0lPQ0ZHKSA+PiA4KSAmIDB4N2YpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEVhY2ggRGVzdGluYXRpb24gaGFzIG9uZSBhbmQgb25seSBvbmUgU291cmNlLAorICogYnV0IG9uZSBTb3VyY2UgY2FuIGZlZWQgYW55IG51bWJlciBvZiBEZXN0aW5hdGlvbnMgc2ltdWx0YW5lb3VzbHkuCisgKi8KK2ludCBzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUsIGludCBkc3QsIGludCBzcmMpCit7CisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIDB4MDAsICgoZHN0ID4+IDgpICYgMHgzZikgKTsKKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgMHgwMSwgKGRzdCAmIDB4M2YpICk7CisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIDB4MDIsICgoc3JjID4+IDgpICYgMHgzZikgKTsKKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgMHgwMywgKHNyYyAmIDB4M2YpICk7CisKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBzbmRfZW11MTBrMV9pbnRyX2VuYWJsZShzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwgdW5zaWduZWQgaW50IGludHJlbmIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYwppbmRleCA0ZTBmOTU0Li40NjVmOGQ1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvcDE2di5jCkBAIC0yNTMsNyArMjUzLDcgQEAKIAlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAkvL3N0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJLy9zdHJ1Y3Qgc25kX2VtdTEwazFfcGNtICplcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWVtdS0+cDE2dl92b2ljZXNbc3Vic3RyZWFtLT5wY20tPmRldmljZSAtIGVtdS0+cDE2dl9kZXZpY2Vfb2Zmc2V0XS51c2U9MDsKKwllbXUtPnAxNnZfdm9pY2VzW3N1YnN0cmVhbS0+cGNtLT5kZXZpY2UgLSBlbXUtPnAxNnZfZGV2aWNlX29mZnNldF0udXNlID0gMDsKIAkvKiBGSVhNRTogbWF5YmUgemVybyBvdGhlcnMgKi8KIAlyZXR1cm4gMDsKIH0KQEAgLTI2NCw3ICsyNjQsNyBAQAogCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCS8vc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAkvL3N0cnVjdCBzbmRfZW11MTBrMV9wY20gKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JZW11LT5wMTZ2X2NhcHR1cmVfdm9pY2UudXNlPTA7CisJZW11LT5wMTZ2X2NhcHR1cmVfdm9pY2UudXNlID0gMDsKIAkvKiBGSVhNRTogbWF5YmUgemVybyBvdGhlcnMgKi8KIAlyZXR1cm4gMDsKIH0KQEAgLTM0OSw3ICszNDksNyBAQAogCSAgYnJlYWs7CiAJfQogCS8qIEZJWE1FOiBDaGVjayBlbXUtPmJ1ZmZlci5zaXplIGJlZm9yZSBhY3R1YWxseSB3cml0aW5nIHRvIGl0LiAqLwotCWZvcihpPTA7IGkgPCBydW50aW1lLT5wZXJpb2RzOyBpKyspIHsKKwlmb3IoaSA9IDA7IGkgPCBydW50aW1lLT5wZXJpb2RzOyBpKyspIHsKIAkJdGFibGVfYmFzZVtpKjJdPXJ1bnRpbWUtPmRtYV9hZGRyKyhpKnBlcmlvZF9zaXplX2J5dGVzKTsKIAkJdGFibGVfYmFzZVsoaSoyKSsxXT1wZXJpb2Rfc2l6ZV9ieXRlczw8MTY7CiAJfQpAQCAtMzk0LDcgKzM5NCw3IEBACiAJLyogRklYTUU6IENoZWNrIGVtdS0+YnVmZmVyLnNpemUgYmVmb3JlIGFjdHVhbGx5IHdyaXRpbmcgdG8gaXQuICovCiAJc25kX2VtdTEwazFfcHRyMjBfd3JpdGUoZW11LCAweDEzLCBjaGFubmVsLCAwKTsKIAlzbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUsIENBUFRVUkVfRE1BX0FERFIsIGNoYW5uZWwsIHJ1bnRpbWUtPmRtYV9hZGRyKTsKLQlzbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUsIENBUFRVUkVfQlVGRkVSX1NJWkUsIGNoYW5uZWwsIGZyYW1lc190b19ieXRlcyhydW50aW1lLCBydW50aW1lLT5idWZmZXJfc2l6ZSk8PDE2KTsgLy8gYnVmZmVyIHNpemUgaW4gYnl0ZXMKKwlzbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUsIENBUFRVUkVfQlVGRkVSX1NJWkUsIGNoYW5uZWwsIGZyYW1lc190b19ieXRlcyhydW50aW1lLCBydW50aW1lLT5idWZmZXJfc2l6ZSkgPDwgMTYpOyAvLyBidWZmZXIgc2l6ZSBpbiBieXRlcwogCXNuZF9lbXUxMGsxX3B0cjIwX3dyaXRlKGVtdSwgQ0FQVFVSRV9QT0lOVEVSLCBjaGFubmVsLCAwKTsKIAkvL3NuZF9lbXUxMGsxX3B0cjIwX3dyaXRlKGVtdSwgQ0FQVFVSRV9TT1VSQ0UsIDB4MCwgMHgzMzMzMDBlNCk7IC8qIFNlbGVjdCBNSUMgb3IgTGluZSBpbiAqLwogCS8vc25kX2VtdTEwazFfcHRyMjBfd3JpdGUoZW11LCBFWFRFTkRFRF9JTlRfTUFTSywgMCwgc25kX2VtdTEwazFfcHRyMjBfcmVhZChlbXUsIEVYVEVOREVEX0lOVF9NQVNLLCAwKSB8ICgweDExMDAwMDw8Y2hhbm5lbCkpOwpAQCAtNDM3LDcgKzQzNyw3IEBACiAgICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKIAl1MzIgYmFzaWMgPSAwOwogCXUzMiBpbnRlID0gMDsKLQlpbnQgcnVubmluZz0wOworCWludCBydW5uaW5nID0gMDsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKQEAgLTQ0NSw3ICs0NDUsNyBAQAogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CiAJZGVmYXVsdDoKLQkJcnVubmluZz0wOworCQlydW5uaW5nID0gMDsKIAkJYnJlYWs7CiAJfQogICAgICAgICBzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7CkBAIC03ODUsNyArNzg1LDcgQEAKIAl9CiAgICAgICAgIHJldHVybiBjaGFuZ2U7CiB9Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoc25kX3AxNnZfZGJfc2NhbGUxLCAtNTE3NSwgMjUsIDEpOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHNuZF9wMTZ2X2RiX3NjYWxlMSwgLTUxNzUsIDI1LCAxKTsKIAogI2RlZmluZSBQMTZWX1ZPTCh4bmFtZSx4cmVnLHhobCkgeyBcCiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxN3YuaCBiL3NvdW5kL3BjaS9lbXUxMGsxL3AxN3YuaAppbmRleCA3ZGRiNWJlLi40ZWY1ZjY4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9wMTd2LmgKKysrIGIvc291bmQvcGNpL2VtdTEwazEvcDE3di5oCkBAIC00Myw2ICs0Myw1MyBAQAogI2RlZmluZSBQMTdWX0kyQ19BRERSCQkweDNkCS8qIEkyQyBBZGRyZXNzICovCiAjZGVmaW5lIFAxN1ZfSTJDXzAJCTB4M2UJLyogSTJDIERhdGEgKi8KICNkZWZpbmUgUDE3Vl9JMkNfMQkJMHgzZgkvKiBJMkMgRGF0YSAqLworLyogSTJDIHZhbHVlcyAqLworI2RlZmluZSBJMkNfQV9BRENfQUREX01BU0sJMHgwMDAwMDBmZQkvKlRoZSBhZGRyZXNzIGlzIGEgNyBiaXQgYWRkcmVzcyAqLworI2RlZmluZSBJMkNfQV9BRENfUldfTUFTSwkweDAwMDAwMDAxCS8qYml0IG1hc2sgZm9yIFIvVyAqLworI2RlZmluZSBJMkNfQV9BRENfVFJBTlNfTUFTSwkweDAwMDAwMDEwICAJLypCaXQgbWFzayBmb3IgSTJjIGFkZHJlc3MgREFDIHZhbHVlICAqLworI2RlZmluZSBJMkNfQV9BRENfQUJPUlRfTUFTSwkweDAwMDAwMDIwCS8qQml0IG1hc2sgZm9yIEkyQyB0cmFuc2FjdGlvbiBhYm9ydCBmbGFnICovCisjZGVmaW5lIEkyQ19BX0FEQ19MQVNUX01BU0sJMHgwMDAwMDA0MAkvKkJpdCBtYXNrIGZvciBMYXN0IHdvcmQgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgSTJDX0FfQURDX0JZVEVfTUFTSwkweDAwMDAwMDgwCS8qQml0IG1hc2sgZm9yIEJ5dGUgTW9kZSAqLworCisjZGVmaW5lIEkyQ19BX0FEQ19BREQJCTB4MDAwMDAwMzQJLypUaGlzIGlzIHRoZSBEZXZpY2UgYWRkcmVzcyBmb3IgQURDICAqLworI2RlZmluZSBJMkNfQV9BRENfUkVBRAkJMHgwMDAwMDAwMQkvKlRvIHBlcmZvcm0gYSByZWFkIG9wZXJhdGlvbiAqLworI2RlZmluZSBJMkNfQV9BRENfU1RBUlQJCTB4MDAwMDAxMDAJLypTdGFydCBJMkMgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgSTJDX0FfQURDX0FCT1JUCQkweDAwMDAwMjAwCS8qSTJDIHRyYW5zYWN0aW9uIGFib3J0ICovCisjZGVmaW5lIEkyQ19BX0FEQ19MQVNUCQkweDAwMDAwNDAwCS8qSTJDIGxhc3QgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgSTJDX0FfQURDX0JZVEUJCTB4MDAwMDA4MDAJLypJMkMgb25lIGJ5dGUgbW9kZSAqLworCisjZGVmaW5lIEkyQ19EX0FEQ19SRUdfTUFTSwkweGZlMDAwMDAwICAJLypBREMgYWRkcmVzcyByZWdpc3RlciAqLyAKKyNkZWZpbmUgSTJDX0RfQURDX0RBVF9NQVNLCTB4MDFmZjAwMDAgIAkvKkFEQyBkYXRhIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgQURDX1RJTUVPVVQJCTB4MDAwMDAwMDcJLypBREMgVGltZW91dCBDbG9jayBEaXNhYmxlICovCisjZGVmaW5lIEFEQ19JRkNfQ1RSTAkJMHgwMDAwMDAwYgkvKkFEQyBJbnRlcmZhY2UgQ29udHJvbCAqLworI2RlZmluZSBBRENfTUFTVEVSCQkweDAwMDAwMDBjCS8qQURDIE1hc3RlciBNb2RlIENvbnRyb2wgKi8KKyNkZWZpbmUgQURDX1BPV0VSCQkweDAwMDAwMDBkCS8qQURDIFBvd2VyRG93biBDb250cm9sICovCisjZGVmaW5lIEFEQ19BVFRFTl9BRENMCQkweDAwMDAwMDBlCS8qQURDIEF0dGVudWF0aW9uIEFEQ0wgKi8KKyNkZWZpbmUgQURDX0FUVEVOX0FEQ1IJCTB4MDAwMDAwMGYJLypBREMgQXR0ZW51YXRpb24gQURDUiAqLworI2RlZmluZSBBRENfQUxDX0NUUkwxCQkweDAwMDAwMDEwCS8qQURDIEFMQyBDb250cm9sIDEgKi8KKyNkZWZpbmUgQURDX0FMQ19DVFJMMgkJMHgwMDAwMDAxMQkvKkFEQyBBTEMgQ29udHJvbCAyICovCisjZGVmaW5lIEFEQ19BTENfQ1RSTDMJCTB4MDAwMDAwMTIJLypBREMgQUxDIENvbnRyb2wgMyAqLworI2RlZmluZSBBRENfTk9JU0VfQ1RSTAkJMHgwMDAwMDAxMwkvKkFEQyBOb2lzZSBHYXRlIENvbnRyb2wgKi8KKyNkZWZpbmUgQURDX0xJTUlUX0NUUkwJCTB4MDAwMDAwMTQJLypBREMgTGltaXRlciBDb250cm9sICovCisjZGVmaW5lIEFEQ19NVVgJCQkweDAwMDAwMDE1ICAJLypBREMgTXV4IG9mZnNldCAqLworI2lmIDAKKy8qIEZJWE1FOiBOb3QgdGVzdGVkIHlldC4gKi8KKyNkZWZpbmUgQURDX0dBSU5fTUFTSwkJMHgwMDAwMDBmZgkvL01hc2sgZm9yIEFEQyBHYWluCisjZGVmaW5lIEFEQ19aRVJPREIJCTB4MDAwMDAwY2YJLy9WYWx1ZSB0byBzZXQgQURDIHRvIDBkQgorI2RlZmluZSBBRENfTVVURV9NQVNLCQkweDAwMDAwMGMwCS8vTWFzayBmb3IgQURDIG11dGUKKyNkZWZpbmUgQURDX01VVEUJCTB4MDAwMDAwYzAJLy9WYWx1ZSB0byBtdXRlIEFEQworI2RlZmluZSBBRENfT1NSCQkJMHgwMDAwMDAwOAkvL01hc2sgZm9yIEFEQyBvdmVyc2FtcGxlIHJhdGUgc2VsZWN0CisjZGVmaW5lIEFEQ19USU1FT1VUX0RJU0FCTEUJMHgwMDAwMDAwOAkvL1ZhbHVlIGFuZCBtYXNrIHRvIGRpc2FibGUgVGltZW91dCBjbG9jaworI2RlZmluZSBBRENfSFBGX0RJU0FCTEUJCTB4MDAwMDAxMDAJLy9WYWx1ZSBhbmQgbWFzayB0byBkaXNhYmxlIEhpZ2ggcGFzcyBmaWx0ZXIKKyNkZWZpbmUgQURDX1RSQU5XSU5fTUFTSwkweDAwMDAwMDcwCS8vTWFzayBmb3IgTGVuZ3RoIG9mIFRyYW5zaWVudCBXaW5kb3cKKyNlbmRpZgorCisjZGVmaW5lIEFEQ19NVVhfTUFTSwkJMHgwMDAwMDAwZgkvL01hc2sgZm9yIEFEQyBNdXgKKyNkZWZpbmUgQURDX01VWF8wCQkweDAwMDAwMDAxCS8vVmFsdWUgdG8gc2VsZWN0IFVua25vd24gYXQgQURDIE11eCAoTm90IHVzZWQpCisjZGVmaW5lIEFEQ19NVVhfMQkJMHgwMDAwMDAwMgkvL1ZhbHVlIHRvIHNlbGVjdCBVbmtub3duIGF0IEFEQyBNdXggKE5vdCB1c2VkKQorI2RlZmluZSBBRENfTVVYXzIJCTB4MDAwMDAwMDQJLy9WYWx1ZSB0byBzZWxlY3QgTWljIGF0IEFEQyBNdXgKKyNkZWZpbmUgQURDX01VWF8zCQkweDAwMDAwMDA4CS8vVmFsdWUgdG8gc2VsZWN0IExpbmUtSW4gYXQgQURDIE11eAogCiAjZGVmaW5lIFAxN1ZfU1RBUlRfQVVESU8JMHg0MAkvKiBTdGFydCBBdWRpbyBiaXQgKi8KIC8qIDQxIC0gNDc6IFJlc2VydmVkICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jIGIvc291bmQvcGNpL2VtdTEwazEvdm9pY2UuYwppbmRleCA5NGVjYTgyLi4xZGI1MGZlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAlpZiAoZmlyc3Rfdm9pY2UgPT0gbGFzdF92b2ljZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJCi0JZm9yIChpPTA7IGkgPCBudW1iZXI7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewogCQl2b2ljZSA9ICZlbXUtPnZvaWNlc1soZmlyc3Rfdm9pY2UgKyBpKSAlIE5VTV9HXTsKIAkJLy8gcHJpbnRrKCJ2b2ljZSBhbGxvYyAtICVpLCAlaSBvZiAlaVxuIiwgdm9pY2UtPm51bWJlciwgaWR4LWZpcnN0X3ZvaWNlKzEsIG51bWJlcik7CiAJCXZvaWNlLT51c2UgPSAxOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VuczEzNzAuYyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKaW5kZXggYTg0ZjZiMi4uNDI1YjE2NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VuczEzNzAuYworKysgYi9zb3VuZC9wY2kvZW5zMTM3MC5jCkBAIC00MTMsOCArNDEzLDYgQEAKIAl9IHU7CiAKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpOwotCXVuc2lnbmVkIHNob3J0IHN1YnN5c3RlbV92ZW5kb3JfaWQ7Ci0JdW5zaWduZWQgc2hvcnQgc3Vic3lzdGVtX2RldmljZV9pZDsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9wY20gKnBjbTE7CS8qIERBQzEvQURDIFBDTSAqLwogCXN0cnVjdCBzbmRfcGNtICpwY20yOwkvKiBEQUMyIFBDTSAqLwpAQCAtMTYwNywxMSArMTYwNSwyNiBAQAogCWVuc29uaXEtPnUuZXMxMzcxLmFjOTcgPSBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IHsKK3N0cnVjdCBlczEzNzFfcXVpcmsgewogCXVuc2lnbmVkIHNob3J0IHZpZDsJCS8qIHZlbmRvciBJRCAqLwogCXVuc2lnbmVkIHNob3J0IGRpZDsJCS8qIGRldmljZSBJRCAqLwogCXVuc2lnbmVkIGNoYXIgcmV2OwkJLyogcmV2aXNpb24gKi8KLX0gZXMxMzcxX3NwZGlmX3ByZXNlbnRbXSBfX2RldmluaXRkYXRhID0geworfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZXMxMzcxX3F1aXJrX2xvb2t1cChzdHJ1Y3QgZW5zb25pcSAqZW5zb25pcSwKKwkJCQkJIHN0cnVjdCBlczEzNzFfcXVpcmsgKmxpc3QpCit7CisJd2hpbGUgKGxpc3QtPnZpZCAhPSAodW5zaWduZWQgc2hvcnQpUENJX0FOWV9JRCkgeworCQlpZiAoZW5zb25pcS0+cGNpLT52ZW5kb3IgPT0gbGlzdC0+dmlkICYmCisJCSAgICBlbnNvbmlxLT5wY2ktPmRldmljZSA9PSBsaXN0LT5kaWQgJiYKKwkJICAgIGVuc29uaXEtPnJldiA9PSBsaXN0LT5yZXYpCisJCQlyZXR1cm4gMTsKKwkJbGlzdCsrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlczEzNzFfcXVpcmsgZXMxMzcxX3NwZGlmX3ByZXNlbnRbXSBfX2RldmluaXRkYXRhID0gewogCXsgLnZpZCA9IFBDSV9WRU5ET1JfSURfRU5TT05JUSwgLmRpZCA9IFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAsIC5yZXYgPSBDVDU4ODBSRVZfQ1Q1ODgwX0MgfSwKIAl7IC52aWQgPSBQQ0lfVkVORE9SX0lEX0VOU09OSVEsIC5kaWQgPSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfQ1Q1ODgwLCAucmV2ID0gQ1Q1ODgwUkVWX0NUNTg4MF9EIH0sCiAJeyAudmlkID0gUENJX1ZFTkRPUl9JRF9FTlNPTklRLCAuZGlkID0gUENJX0RFVklDRV9JRF9FTlNPTklRX0NUNTg4MCwgLnJldiA9IENUNTg4MFJFVl9DVDU4ODBfRSB9LApAQCAtMTYyMCwxMiArMTYzMywxOSBAQAogCXsgLnZpZCA9IFBDSV9BTllfSUQsIC5kaWQgPSBQQ0lfQU5ZX0lEIH0KIH07CiAKLXN0YXRpYyBpbnQgc25kX2Vuc29uaXFfMTM3MV9taXhlcihzdHJ1Y3QgZW5zb25pcSAqIGVuc29uaXEsIGludCBoYXNfc3BkaWYsIGludCBoYXNfbGluZSkKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBlbnMxMzczX2xpbmVfcXVpcmtbXSBfX2RldmluaXRkYXRhID0geworCVNORF9QQ0lfUVVJUktfSUQoMHgxMjc0LCAweDIwMDApLCAvKiBHQS03RFhSICovCisJU05EX1BDSV9RVUlSS19JRCgweDE0NTgsIDB4YTAwMCksIC8qIEdBLThJRVhQICovCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2Vuc29uaXFfMTM3MV9taXhlcihzdHJ1Y3QgZW5zb25pcSAqZW5zb25pcSwKKwkJCQkJICAgIGludCBoYXNfc3BkaWYsIGludCBoYXNfbGluZSkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBlbnNvbmlxLT5jYXJkOwogCXN0cnVjdCBzbmRfYWM5N19idXMgKnBidXM7CiAJc3RydWN0IHNuZF9hYzk3X3RlbXBsYXRlIGFjOTc7Ci0JaW50IGVyciwgaWR4OworCWludCBlcnI7CiAJc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idXNfb3BzIG9wcyA9IHsKIAkJLndyaXRlID0gc25kX2VzMTM3MV9jb2RlY193cml0ZSwKIAkJLnJlYWQgPSBzbmRfZXMxMzcxX2NvZGVjX3JlYWQsCkBAIC0xNjQxLDMzICsxNjYxLDI4IEBACiAJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9BVURJTzsKIAlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmZW5zb25pcS0+dS5lczEzNzEuYWM5NykpIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlmb3IgKGlkeCA9IDA7IGVzMTM3MV9zcGRpZl9wcmVzZW50W2lkeF0udmlkICE9ICh1bnNpZ25lZCBzaG9ydClQQ0lfQU5ZX0lEOyBpZHgrKykKLQkJaWYgKChlbnNvbmlxLT5wY2ktPnZlbmRvciA9PSBlczEzNzFfc3BkaWZfcHJlc2VudFtpZHhdLnZpZCAmJgotCQkgICAgIGVuc29uaXEtPnBjaS0+ZGV2aWNlID09IGVzMTM3MV9zcGRpZl9wcmVzZW50W2lkeF0uZGlkICYmCi0JCSAgICAgZW5zb25pcS0+cmV2ID09IGVzMTM3MV9zcGRpZl9wcmVzZW50W2lkeF0ucmV2KSB8fCBoYXNfc3BkaWYgPiAwKSB7Ci0JCSAgICAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKLQkJCWludCBpLCBpbmRleCA9IDA7IAorCWlmIChoYXNfc3BkaWYgPiAwIHx8CisJICAgICghaGFzX3NwZGlmICYmIGVzMTM3MV9xdWlya19sb29rdXAoZW5zb25pcSwgZXMxMzcxX3NwZGlmX3ByZXNlbnQpKSkgeworCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOworCQlpbnQgaSwgaW5kZXggPSAwOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzX3NwZGlmIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCWVuc29uaXEtPnNwZGlmX2RlZmF1bHQgPSBlbnNvbmlxLT5zcGRpZl9zdHJlYW0gPQorCQkJU05EUlZfUENNX0RFRkFVTFRfQ09OX1NQRElGOworCQlvdXRsKGVuc29uaXEtPnNwZGlmX2RlZmF1bHQsIEVTX1JFRyhlbnNvbmlxLCBDSEFOTkVMX1NUQVRVUykpOwogCi0JCQllbnNvbmlxLT5zcGRpZl9kZWZhdWx0ID0gZW5zb25pcS0+c3BkaWZfc3RyZWFtID0KLQkJCQlTTkRSVl9QQ01fREVGQVVMVF9DT05fU1BESUY7Ci0JCQlvdXRsKGVuc29uaXEtPnNwZGlmX2RlZmF1bHQsIEVTX1JFRyhlbnNvbmlxLCBDSEFOTkVMX1NUQVRVUykpOworCQlpZiAoZW5zb25pcS0+dS5lczEzNzEuYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9TUERJRikKKwkJCWluZGV4Kys7CiAKLQkJICAgIAlpZiAoZW5zb25pcS0+dS5lczEzNzEuYWM5Ny0+ZXh0X2lkICYgQUM5N19FSV9TUERJRikKLQkJCSAgICAJaW5kZXgrKzsKLQotCQkJZm9yIChpID0gMDsgaSA8IChpbnQpQVJSQVlfU0laRShzbmRfZXMxMzcxX21peGVyX3NwZGlmKTsgaSsrKSB7Ci0JCQkJa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2VzMTM3MV9taXhlcl9zcGRpZltpXSwgZW5zb25pcSk7Ci0JCQkJaWYgKCEga2N0bCkKLQkJCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQkJa2N0bC0+aWQuaW5kZXggPSBpbmRleDsKLQkJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpKSA8IDApCi0JCQkJCXJldHVybiBlcnI7Ci0JCQl9Ci0JCQlicmVhazsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc25kX2VzMTM3MV9taXhlcl9zcGRpZik7IGkrKykgeworCQkJa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2VzMTM3MV9taXhlcl9zcGRpZltpXSwgZW5zb25pcSk7CisJCQlpZiAoIWtjdGwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlrY3RsLT5pZC5pbmRleCA9IGluZGV4OworCQkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOwogCQl9CisJfQogCWlmIChlbnNvbmlxLT51LmVzMTM3MS5hYzk3LT5leHRfaWQgJiBBQzk3X0VJX1NEQUMpIHsKIAkJLyogbWlycm9yIHJlYXIgdG8gZnJvbnQgc3BlYWtlcnMgKi8KIAkJZW5zb25pcS0+Y3NzciAmPSB+KEVTXzEzNzNfUkVBUl9CSVQyN3xFU18xMzczX1JFQVJfQklUMjQpOwpAQCAtMTY3NiwxMiArMTY5MSwxMCBAQAogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQotCWlmICgoKGVuc29uaXEtPnN1YnN5c3RlbV92ZW5kb3JfaWQgPT0gMHgxMjc0KSAmJgotCSAgICAoZW5zb25pcS0+c3Vic3lzdGVtX2RldmljZV9pZCA9PSAweDIwMDApKSB8fCAvKiBHQS03RFhSICovCi0JICAgICgoZW5zb25pcS0+c3Vic3lzdGVtX3ZlbmRvcl9pZCA9PSAweDE0NTgpICYmCi0JICAgIChlbnNvbmlxLT5zdWJzeXN0ZW1fZGV2aWNlX2lkID09IDB4YTAwMCkpIHx8IC8qIEdBLThJRVhQICovCi0JICAgIGhhc19saW5lID4gMCkgewotCQkgZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfZW5zMTM3M19saW5lLCBlbnNvbmlxKSk7CisJaWYgKGhhc19saW5lID4gMCB8fAorCSAgICBzbmRfcGNpX3F1aXJrX2xvb2t1cChlbnNvbmlxLT5wY2ksIGVuczEzNzNfbGluZV9xdWlyaykpIHsKKwkJIGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2VuczEzNzNfbGluZSwKKwkJCQkJCSAgICAgIGVuc29uaXEpKTsKIAkJIGlmIChlcnIgPCAwKQogCQkJIHJldHVybiBlcnI7CiAJfQpAQCAtMTk1NiwyMSArMTk2OSwxNSBAQAogfQogCiAjaWZkZWYgQ0hJUDEzNzEKLXN0YXRpYyBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0IHN2aWQ7CQkvKiBzdWJzeXN0ZW0gdmVuZG9yIElEICovCi0JdW5zaWduZWQgc2hvcnQgc2RpZDsJCS8qIHN1YnN5c3RlbSBkZXZpY2UgSUQgKi8KLX0gZXMxMzcxX2FtcGxpZmllcl9oYWNrW10gPSB7Ci0JeyAuc3ZpZCA9IDB4MTA3YiwgLnNkaWQgPSAweDIxNTAgfSwJLyogR2F0ZXdheSBTb2xvIDIxNTAgKi8KLQl7IC5zdmlkID0gMHgxM2JkLCAuc2RpZCA9IDB4MTAwYyB9LAkvKiBFVjE5Mzggb24gTWViaXVzIFBDLU1KMTAwViAqLwotCXsgLnN2aWQgPSAweDExMDIsIC5zZGlkID0gMHg1OTM4IH0sCS8qIFRhcmdhIFh0ZW5kZXIzMDAgKi8KLQl7IC5zdmlkID0gMHgxMTAyLCAuc2RpZCA9IDB4ODkzOCB9LAkvKiBJUEMgVG9wbm90ZSBHIG5vdGVib29rICovCi0JeyAuc3ZpZCA9IFBDSV9BTllfSUQsIC5zZGlkID0gUENJX0FOWV9JRCB9CitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgZXMxMzcxX2FtcGxpZmllcl9oYWNrW10gX19kZXZpbml0ZGF0YSA9IHsKKwlTTkRfUENJX1FVSVJLX0lEKDB4MTA3YiwgMHgyMTUwKSwJLyogR2F0ZXdheSBTb2xvIDIxNTAgKi8KKwlTTkRfUENJX1FVSVJLX0lEKDB4MTNiZCwgMHgxMDBjKSwJLyogRVYxOTM4IG9uIE1lYml1cyBQQy1NSjEwMFYgKi8KKwlTTkRfUENJX1FVSVJLX0lEKDB4MTEwMiwgMHg1OTM4KSwJLyogVGFyZ2EgWHRlbmRlcjMwMCAqLworCVNORF9QQ0lfUVVJUktfSUQoMHgxMTAyLCAweDg5MzgpLAkvKiBJUEMgVG9wbm90ZSBHIG5vdGVib29rICovCisJeyB9IC8qIGVuZCAqLwogfTsKLXN0YXRpYyBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0IHZpZDsJCS8qIHZlbmRvciBJRCAqLwotCXVuc2lnbmVkIHNob3J0IGRpZDsJCS8qIGRldmljZSBJRCAqLwotCXVuc2lnbmVkIGNoYXIgcmV2OwkJLyogcmV2aXNpb24gKi8KLX0gZXMxMzcxX2FjOTdfcmVzZXRfaGFja1tdID0geworCitzdGF0aWMgc3RydWN0IGVzMTM3MV9xdWlyayBlczEzNzFfYWM5N19yZXNldF9oYWNrW10gPSB7CiAJeyAudmlkID0gUENJX1ZFTkRPUl9JRF9FTlNPTklRLCAuZGlkID0gUENJX0RFVklDRV9JRF9FTlNPTklRX0NUNTg4MCwgLnJldiA9IENUNTg4MFJFVl9DVDU4ODBfQyB9LAogCXsgLnZpZCA9IFBDSV9WRU5ET1JfSURfRU5TT05JUSwgLmRpZCA9IFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAsIC5yZXYgPSBDVDU4ODBSRVZfQ1Q1ODgwX0QgfSwKIAl7IC52aWQgPSBQQ0lfVkVORE9SX0lEX0VOU09OSVEsIC5kaWQgPSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfQ1Q1ODgwLCAucmV2ID0gQ1Q1ODgwUkVWX0NUNTg4MF9FIH0sCkBAIC0xOTg0LDcgKzE5OTEsNiBAQAogewogI2lmZGVmIENISVAxMzcxCiAJaW50IGlkeDsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gZW5zb25pcS0+cGNpOwogI2VuZGlmCiAJLyogdGhpcyBjb2RlIHdhcyBwYXJ0IG9mIHNuZF9lbnNvbmlxX2NyZWF0ZSBiZWZvcmUgaW50cnVkdWN0aW9uCiAJICAqIG9mIHN1c3BlbmQvcmVzdW1lCkBAIC0xOTk5LDE2ICsyMDA1LDEyIEBACiAJb3V0bChlbnNvbmlxLT5jdHJsLCBFU19SRUcoZW5zb25pcSwgQ09OVFJPTCkpOwogCW91dGwoZW5zb25pcS0+c2N0cmwsIEVTX1JFRyhlbnNvbmlxLCBTRVJJQUwpKTsKIAlvdXRsKDAsIEVTX1JFRyhlbnNvbmlxLCAxMzcxX0xFR0FDWSkpOwotCWZvciAoaWR4ID0gMDsgZXMxMzcxX2FjOTdfcmVzZXRfaGFja1tpZHhdLnZpZCAhPSAodW5zaWduZWQgc2hvcnQpUENJX0FOWV9JRDsgaWR4KyspCi0JCWlmIChwY2ktPnZlbmRvciA9PSBlczEzNzFfYWM5N19yZXNldF9oYWNrW2lkeF0udmlkICYmCi0JCSAgICBwY2ktPmRldmljZSA9PSBlczEzNzFfYWM5N19yZXNldF9oYWNrW2lkeF0uZGlkICYmCi0JCSAgICBlbnNvbmlxLT5yZXYgPT0gZXMxMzcxX2FjOTdfcmVzZXRfaGFja1tpZHhdLnJldikgewotCQkJb3V0bChlbnNvbmlxLT5jc3NyLCBFU19SRUcoZW5zb25pcSwgU1RBVFVTKSk7Ci0JCQkvKiBuZWVkIHRvIGRlbGF5IGFyb3VuZCAyMG1zKGJsZWVjaCkgdG8gZ2l2ZQotCQkJc29tZSBDT0RFQ3MgZW5vdWdoIHRpbWUgdG8gd2FrZXVwICovCi0JCQltc2xlZXAoMjApOwotCQkJYnJlYWs7Ci0JCX0KKwlpZiAoZXMxMzcxX3F1aXJrX2xvb2t1cChlbnNvbmlxLCBlczEzNzFfYWM5N19yZXNldF9oYWNrKSkgeworCSAgICBvdXRsKGVuc29uaXEtPmNzc3IsIEVTX1JFRyhlbnNvbmlxLCBTVEFUVVMpKTsKKwkgICAgLyogbmVlZCB0byBkZWxheSBhcm91bmQgMjBtcyhibGVlY2gpIHRvIGdpdmUKKwkgICAgICAgc29tZSBDT0RFQ3MgZW5vdWdoIHRpbWUgdG8gd2FrZXVwICovCisJICAgIG1zbGVlcCgyMCk7CisJfQogCS8qIEFDJzk3IHdhcm0gcmVzZXQgdG8gc3RhcnQgdGhlIGJpdGNsayAqLwogCW91dGwoZW5zb25pcS0+Y3RybCB8IEVTXzEzNzFfU1lOQ19SRVMsIEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CiAJaW5sKEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CkBAIC0yMTEyLDExICsyMTE0LDcgQEAKIAkJCQkgICAgIHN0cnVjdCBlbnNvbmlxICoqIHJlbnNvbmlxKQogewogCXN0cnVjdCBlbnNvbmlxICplbnNvbmlxOwotCXVuc2lnbmVkIHNob3J0IGNtZHc7CiAJdW5zaWduZWQgY2hhciBjbWRiOwotI2lmZGVmIENISVAxMzcxCi0JaW50IGlkeDsKLSNlbmRpZgogCWludCBlcnI7CiAJc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlX29wcyBvcHMgPSB7CiAJCS5kZXZfZnJlZSA9CXNuZF9lbnNvbmlxX2Rldl9mcmVlLApAQCAtMjE1OSwxMCArMjE1Nyw2IEBACiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIFBDSV9SRVZJU0lPTl9JRCwgJmNtZGIpOwogCWVuc29uaXEtPnJldiA9IGNtZGI7Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJmNtZHcpOwotCWVuc29uaXEtPnN1YnN5c3RlbV92ZW5kb3JfaWQgPSBjbWR3OwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJmNtZHcpOwotCWVuc29uaXEtPnN1YnN5c3RlbV9kZXZpY2VfaWQgPSBjbWR3OwogI2lmZGVmIENISVAxMzcwCiAjaWYgMAogCWVuc29uaXEtPmN0cmwgPSBFU18xMzcwX0NEQ19FTiB8IEVTXzEzNzBfU0VSUl9ESVNBQkxFIHwKQEAgLTIxNzUsMTkgKzIxNjksMTEgQEAKIAllbnNvbmlxLT5jdHJsID0gMDsKIAllbnNvbmlxLT5zY3RybCA9IDA7CiAJZW5zb25pcS0+Y3NzciA9IDA7Ci0JZm9yIChpZHggPSAwOyBlczEzNzFfYW1wbGlmaWVyX2hhY2tbaWR4XS5zdmlkICE9ICh1bnNpZ25lZCBzaG9ydClQQ0lfQU5ZX0lEOyBpZHgrKykKLQkJaWYgKGVuc29uaXEtPnN1YnN5c3RlbV92ZW5kb3JfaWQgPT0gZXMxMzcxX2FtcGxpZmllcl9oYWNrW2lkeF0uc3ZpZCAmJgotCQkgICAgZW5zb25pcS0+c3Vic3lzdGVtX2RldmljZV9pZCA9PSBlczEzNzFfYW1wbGlmaWVyX2hhY2tbaWR4XS5zZGlkKSB7Ci0JCQllbnNvbmlxLT5jdHJsIHw9IEVTXzEzNzFfR1BJT19PVVQoMSk7CS8qIHR1cm4gYW1wbGlmaWVyIG9uICovCi0JCQlicmVhazsKLQkJfQotCWZvciAoaWR4ID0gMDsgZXMxMzcxX2FjOTdfcmVzZXRfaGFja1tpZHhdLnZpZCAhPSAodW5zaWduZWQgc2hvcnQpUENJX0FOWV9JRDsgaWR4KyspCi0JCWlmIChwY2ktPnZlbmRvciA9PSBlczEzNzFfYWM5N19yZXNldF9oYWNrW2lkeF0udmlkICYmCi0JCSAgICBwY2ktPmRldmljZSA9PSBlczEzNzFfYWM5N19yZXNldF9oYWNrW2lkeF0uZGlkICYmCi0JCSAgICBlbnNvbmlxLT5yZXYgPT0gZXMxMzcxX2FjOTdfcmVzZXRfaGFja1tpZHhdLnJldikgewotCQkJZW5zb25pcS0+Y3NzciB8PSBFU18xMzcxX1NUX0FDOTdfUlNUOwotCQkJYnJlYWs7Ci0JCX0KKwlpZiAoc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBlczEzNzFfYW1wbGlmaWVyX2hhY2spKQorCQllbnNvbmlxLT5jdHJsIHw9IEVTXzEzNzFfR1BJT19PVVQoMSk7CS8qIHR1cm4gYW1wbGlmaWVyIG9uICovCisKKwlpZiAoZXMxMzcxX3F1aXJrX2xvb2t1cChlbnNvbmlxLCBlczEzNzFfYWM5N19yZXNldF9oYWNrKSkKKwkJZW5zb25pcS0+Y3NzciB8PSBFU18xMzcxX1NUX0FDOTdfUlNUOwogI2VuZGlmCiAKIAlzbmRfZW5zb25pcV9jaGlwX2luaXQoZW5zb25pcSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTM4LmMgYi9zb3VuZC9wY2kvZXMxOTM4LmMKaW5kZXggNjZhYzI2Yy4uZmVjMjlhMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VzMTkzOC5jCisrKyBiL3NvdW5kL3BjaS9lczE5MzguYwpAQCAtMTM0NCw3ICsxMzQ0LDcgQEAKIAk4LCAxNSwgVExWX0RCX1NDQUxFX0lURU0oLTc1MCwgMTUwLCAwKSwKIH07CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9jYXB0dXJlLCAwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2NhcHR1cmUsIDAsIDE1MCwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfZXMxOTM4X2NvbnRyb2xzW10gPSB7CiBFUzE5MzhfRE9VQkxFX1RMVigiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDAsIDB4NjAsIDB4NjIsIDAsIDAsIDYzLCAwLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ZtODAxLmMgYi9zb3VuZC9wY2kvZm04MDEuYwppbmRleCBiN2IzNjFjLi42ZGM1NzhiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZm04MDEuYworKysgYi9zb3VuZC9wY2kvZm04MDEuYwpAQCAtMTE1Nyw3ICsxMTU3LDcgQEAKIAlyZXR1cm4gc25kX2ZtODAxX3VwZGF0ZV9iaXRzKGNoaXAsIEZNODAxX1JFQ19TUkMsIDcsIHZhbCk7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9kc3AsIC0zNDUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2RzcCwgLTM0NTAsIDE1MCwgMCk7CiAKICNkZWZpbmUgRk04MDFfQ09OVFJPTFMgQVJSQVlfU0laRShzbmRfZm04MDFfY29udHJvbHMpCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCmluZGV4IGRiYWNiYTYuLjYwZDdiMDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUKKysrIGIvc291bmQvcGNpL2hkYS9NYWtlZmlsZQpAQCAtMSw1ICsxLDE0IEBACiBzbmQtaGRhLWludGVsLW9ianMgOj0gaGRhX2ludGVsLm8KLXNuZC1oZGEtY29kZWMtb2JqcyA6PSBoZGFfY29kZWMubyBoZGFfZ2VuZXJpYy5vIHBhdGNoX3JlYWx0ZWsubyBwYXRjaF9jbWVkaWEubyBwYXRjaF9hbmFsb2cubyBwYXRjaF9zaWdtYXRlbC5vIHBhdGNoX3NpMzA1NC5vIHBhdGNoX2F0aWhkbWkubworc25kLWhkYS1jb2RlYy1vYmpzIDo9IGhkYV9jb2RlYy5vIFwKKwloZGFfZ2VuZXJpYy5vIFwKKwlwYXRjaF9yZWFsdGVrLm8gXAorCXBhdGNoX2NtZWRpYS5vIFwKKwlwYXRjaF9hbmFsb2cubyBcCisJcGF0Y2hfc2lnbWF0ZWwubyBcCisJcGF0Y2hfc2kzMDU0Lm8gXAorCXBhdGNoX2F0aWhkbWkubyBcCisJcGF0Y2hfY29uZXhhbnQubyBcCisJcGF0Y2hfdmlhLm8KIGlmZGVmIENPTkZJR19QUk9DX0ZTCiBzbmQtaGRhLWNvZGVjLW9ianMgKz0gaGRhX3Byb2MubwogZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCmluZGV4IDE4YmJjODcuLjhmMzRmYjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYwpAQCAtNTIsNiArNTIsNyBAQAogc3RhdGljIHN0cnVjdCBoZGFfdmVuZG9yX2lkIGhkYV92ZW5kb3JfaWRzW10gPSB7CiAJeyAweDEwZWMsICJSZWFsdGVrIiB9LAogCXsgMHgxMDU3LCAiTW90b3JvbGEiIH0sCisJeyAweDExMDYsICJWSUEiIH0sCiAJeyAweDExZDQsICJBbmFsb2cgRGV2aWNlcyIgfSwKIAl7IDB4MTNmNiwgIkMtTWVkaWEiIH0sCiAJeyAweDE0ZjEsICJDb25leGFudCIgfSwKQEAgLTI2Miw3ICsyNjMsNyBAQAogCXVuc29sLT5xdWV1ZVt3cF0gPSByZXM7CiAJdW5zb2wtPnF1ZXVlW3dwICsgMV0gPSByZXNfZXg7CiAKLQlxdWV1ZV93b3JrKHVuc29sLT53b3JrcSwgJnVuc29sLT53b3JrKTsKKwlzY2hlZHVsZV93b3JrKCZ1bnNvbC0+d29yayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMwOSwxMiArMzEwLDYgQEAKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW4ndCBhbGxvY2F0ZSB1bnNvbGljaXRlZCBxdWV1ZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQl1bnNvbC0+d29ya3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiaGRhX2NvZGVjIik7Ci0JaWYgKCEgdW5zb2wtPndvcmtxKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogY2FuJ3QgY3JlYXRlIHdvcmtxdWV1ZVxuIik7Ci0JCWtmcmVlKHVuc29sKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCUlOSVRfV09SSygmdW5zb2wtPndvcmssIHByb2Nlc3NfdW5zb2xfZXZlbnRzKTsKIAl1bnNvbC0+YnVzID0gYnVzOwogCWJ1cy0+dW5zb2wgPSB1bnNvbDsKQEAgLTMzMyw3ICszMjgsNyBAQAogCWlmICghIGJ1cykKIAkJcmV0dXJuIDA7CiAJaWYgKGJ1cy0+dW5zb2wpIHsKLQkJZGVzdHJveV93b3JrcXVldWUoYnVzLT51bnNvbC0+d29ya3EpOworCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCQlrZnJlZShidXMtPnVuc29sKTsKIAl9CiAJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZidXMtPmNvZGVjX2xpc3QpIHsKQEAgLTE3MTQsNiArMTcwOSw4IEBACiAvKioKICAqIHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnIC0gY29tcGFyZSB0aGUgY3VycmVudCBjb2RlYyB3aXRoIHRoZSBjb25maWcgdGFibGUKICAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYworICogQG51bV9jb25maWdzOiBudW1iZXIgb2YgY29uZmlnIGVudW1zCisgKiBAbW9kZWxzOiBhcnJheSBvZiBtb2RlbCBuYW1lIHN0cmluZ3MKICAqIEB0Ymw6IGNvbmZpZ3VyYXRpb24gdGFibGUsIHRlcm1pbmF0ZWQgYnkgbnVsbCBlbnRyaWVzCiAgKgogICogQ29tcGFyZXMgdGhlIG1vZGVsbmFtZSBvciBQQ0kgc3Vic3lzdGVtIGlkIG9mIHRoZSBjdXJyZW50IGNvZGVjIHdpdGggdGhlCkBAIC0xNzIyLDMzICsxNzE5LDQ0IEBACiAgKgogICogSWYgbm8gZW50cmllcyBhcmUgbWF0Y2hpbmcsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUuCiAgKi8KLWludCBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3Qgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgKnRibCkKK2ludCBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgICAgICBpbnQgbnVtX2NvbmZpZ3MsIGNvbnN0IGNoYXIgKiptb2RlbHMsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKnRibCkKIHsKLQljb25zdCBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyAqYzsKLQotCWlmIChjb2RlYy0+YnVzLT5tb2RlbG5hbWUpIHsKLQkJZm9yIChjID0gdGJsOyBjLT5tb2RlbG5hbWUgfHwgYy0+cGNpX3N1YnZlbmRvcjsgYysrKSB7Ci0JCQlpZiAoYy0+bW9kZWxuYW1lICYmCi0JCQkgICAgISBzdHJjbXAoY29kZWMtPmJ1cy0+bW9kZWxuYW1lLCBjLT5tb2RlbG5hbWUpKSB7Ci0JCQkJc25kX3ByaW50ZChLRVJOX0lORk8gImhkYV9jb2RlYzogbW9kZWwgJyVzJyBpcyBzZWxlY3RlZFxuIiwgYy0+bW9kZWxuYW1lKTsKLQkJCQlyZXR1cm4gYy0+Y29uZmlnOworCWlmIChjb2RlYy0+YnVzLT5tb2RlbG5hbWUgJiYgbW9kZWxzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbmZpZ3M7IGkrKykgeworCQkJaWYgKG1vZGVsc1tpXSAmJgorCQkJICAgICFzdHJjbXAoY29kZWMtPmJ1cy0+bW9kZWxuYW1lLCBtb2RlbHNbaV0pKSB7CisJCQkJc25kX3ByaW50ZChLRVJOX0lORk8gImhkYV9jb2RlYzogbW9kZWwgJyVzJyBpcyAiCisJCQkJCSAgICJzZWxlY3RlZFxuIiwgbW9kZWxzW2ldKTsKKwkJCQlyZXR1cm4gaTsKIAkJCX0KIAkJfQogCX0KIAotCWlmIChjb2RlYy0+YnVzLT5wY2kpIHsKLQkJdTE2IHN1YnN5c3RlbV92ZW5kb3IsIHN1YnN5c3RlbV9kZXZpY2U7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNvZGVjLT5idXMtPnBjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZzdWJzeXN0ZW1fdmVuZG9yKTsKLQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoY29kZWMtPmJ1cy0+cGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmc3Vic3lzdGVtX2RldmljZSk7Ci0JCWZvciAoYyA9IHRibDsgYy0+bW9kZWxuYW1lIHx8IGMtPnBjaV9zdWJ2ZW5kb3I7IGMrKykgewotCQkJaWYgKGMtPnBjaV9zdWJ2ZW5kb3IgPT0gc3Vic3lzdGVtX3ZlbmRvciAmJgotCQkJICAgICghIGMtPnBjaV9zdWJkZXZpY2UgLyogYWxsIG1hdGNoICovfHwKLQkJCSAgICAgKGMtPnBjaV9zdWJkZXZpY2UgPT0gc3Vic3lzdGVtX2RldmljZSkpKSB7Ci0JCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IFBDSSAleDoleCwgY29kZWMgY29uZmlnICVkIGlzIHNlbGVjdGVkXG4iLAotCQkJCQkgICAgc3Vic3lzdGVtX3ZlbmRvciwgc3Vic3lzdGVtX2RldmljZSwgYy0+Y29uZmlnKTsKLQkJCQlyZXR1cm4gYy0+Y29uZmlnOwotCQkJfQorCWlmICghY29kZWMtPmJ1cy0+cGNpIHx8ICF0YmwpCisJCXJldHVybiAtMTsKKworCXRibCA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKGNvZGVjLT5idXMtPnBjaSwgdGJsKTsKKwlpZiAoIXRibCkKKwkJcmV0dXJuIC0xOworCWlmICh0YmwtPnZhbHVlID49IDAgJiYgdGJsLT52YWx1ZSA8IG51bV9jb25maWdzKSB7CisjaWZkZWYgQ09ORklHX1NORF9ERUJVR19ERVRFQ1QKKwkJY2hhciB0bXBbMTBdOworCQljb25zdCBjaGFyICptb2RlbCA9IE5VTEw7CisJCWlmIChtb2RlbHMpCisJCQltb2RlbCA9IG1vZGVsc1t0YmwtPnZhbHVlXTsKKwkJaWYgKCFtb2RlbCkgeworCQkJc3ByaW50Zih0bXAsICIjJWQiLCB0YmwtPnZhbHVlKTsKKwkJCW1vZGVsID0gdG1wOwogCQl9CisJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBtb2RlbCAnJXMnIGlzIHNlbGVjdGVkICIKKwkJCSAgICAiZm9yIGNvbmZpZyAleDoleCAoJXMpXG4iLAorCQkJICAgIG1vZGVsLCB0YmwtPnN1YnZlbmRvciwgdGJsLT5zdWJkZXZpY2UsCisJCQkgICAgKHRibC0+bmFtZSA/IHRibC0+bmFtZSA6ICJVbmtub3duIGRldmljZSIpKTsKKyNlbmRpZgorCQlyZXR1cm4gdGJsLT52YWx1ZTsKIAl9CiAJcmV0dXJuIC0xOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKaW5kZXggMWE3ZTgyMS4uYjlhOGUyMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCkBAIC0xOTksNyArMTk5LDcgQEAKIAogLyogU1RBVEVTVFMgaW50IG1hc2s6IFNEMixTRDEsU0QwICovCiAjZGVmaW5lIFNUQVRFU1RTX0lOVF9NQVNLCTB4MDcKLSNkZWZpbmUgQVpYX01BWF9DT0RFQ1MJCTQKKyNkZWZpbmUgQVpYX01BWF9DT0RFQ1MJCTMKIAogLyogU0RfQ1RMIGJpdHMgKi8KICNkZWZpbmUgU0RfQ1RMX1NUUkVBTV9SRVNFVAkweDAxCS8qIHN0cmVhbSByZXNldCBiaXQgKi8KQEAgLTEyODUsNyArMTI4NSw3IEBACiAJCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJmF6eF9wY21fb3BzKTsKIAlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAogCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCi0JCQkJCSAgICAgIDEwMjQgKiA2NCwgMTAyNCAqIDEyOCk7CisJCQkJCSAgICAgIDEwMjQgKiA2NCwgMTAyNCAqIDEwMjQpOwogCWNoaXAtPnBjbVtwY21fZGV2XSA9IHBjbTsKIAlpZiAoY2hpcC0+cGNtX2RldnMgPCBwY21fZGV2ICsgMSkKIAkJY2hpcC0+cGNtX2RldnMgPSBwY21fZGV2ICsgMTsKQEAgLTEzOTEsNiArMTM5MSw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAJY2hpcC0+aXJxID0gY2hpcC0+cGNpLT5pcnE7CisJcGNpX2ludHgoY2hpcC0+cGNpLCAhY2hpcC0+bXNpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTUwMiw2ICsxNTAzLDMxIEBACiB9CiAKIC8qCisgKiB3aGl0ZS9ibGFjay1saXN0aW5nIGZvciBwb3NpdGlvbl9maXgKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIHBvc2l0aW9uX2ZpeF9saXN0W10gX19kZXZpbml0ZGF0YSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMWNjLCAiRGVsbCBEODIwIiwgUE9TX0ZJWF9OT05FKSwKKwl7fQorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgY2hlY2tfcG9zaXRpb25fZml4KHN0cnVjdCBhenggKmNoaXAsIGludCBmaXgpCit7CisJY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKnE7CisKKwlpZiAoZml4ID09IFBPU19GSVhfQVVUTykgeworCQlxID0gc25kX3BjaV9xdWlya19sb29rdXAoY2hpcC0+cGNpLCBwb3NpdGlvbl9maXhfbGlzdCk7CisJCWlmIChxKSB7CisJCQlzbmRfcHJpbnRkZChLRVJOX0lORk8KKwkJCQkgICAgImhkYV9pbnRlbDogcG9zaXRpb25fZml4IHNldCB0byAlZCAiCisJCQkJICAgICJmb3IgZGV2aWNlICUwNHg6JTA0eFxuIiwKKwkJCQkgICAgcS0+dmFsdWUsIHEtPnN1YnZlbmRvciwgcS0+c3ViZGV2aWNlKTsKKwkJCXJldHVybiBxLT52YWx1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZml4OworfQorCisvKgogICogY29uc3RydWN0b3IKICAqLwogc3RhdGljIGludCBfX2RldmluaXQgYXp4X2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBwY2lfZGV2ICpwY2ksCkBAIC0xNTM1LDcgKzE1NjEsOCBAQAogCWNoaXAtPmRyaXZlcl90eXBlID0gZHJpdmVyX3R5cGU7CiAJY2hpcC0+bXNpID0gZW5hYmxlX21zaTsKIAotCWNoaXAtPnBvc2l0aW9uX2ZpeCA9IHBvc2l0aW9uX2ZpeDsKKwljaGlwLT5wb3NpdGlvbl9maXggPSBjaGVja19wb3NpdGlvbl9maXgoY2hpcCwgcG9zaXRpb25fZml4KTsKKwogCWNoaXAtPnNpbmdsZV9jbWQgPSBzaW5nbGVfY21kOwogCiAjaWYgQklUU19QRVJfTE9ORyAhPSA2NApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKaW5kZXggOWNhMWJhZi4uMzk3MThkNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCkBAIC0xNzMsMTQgKzE3Myw5IEBACiAvKgogICogTWlzYwogICovCi1zdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyB7Ci0JY29uc3QgY2hhciAqbW9kZWxuYW1lOwotCWludCBjb25maWc7Ci0JdW5zaWduZWQgc2hvcnQgcGNpX3N1YnZlbmRvcjsKLQl1bnNpZ25lZCBzaG9ydCBwY2lfc3ViZGV2aWNlOwotfTsKLQotaW50IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyAqdGJsKTsKK2ludCBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG51bV9jb25maWdzLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKiptb2RlbG5hbWVzLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICpwY2lfbGlzdCk7CiBpbnQgc25kX2hkYV9hZGRfbmV3X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprbmV3KTsKIAogLyoKQEAgLTIwNCw3ICsxOTksNiBAQAogCXVuc2lnbmVkIGludCBycCwgd3A7CiAKIAkvKiB3b3JrcXVldWUgKi8KLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3E7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJc3RydWN0IGhkYV9idXMgKmJ1czsKIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9wYXRjaC5oIGIvc291bmQvcGNpL2hkYS9oZGFfcGF0Y2guaAppbmRleCAwYjY2ODc5Li45ZjllOWFlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9wYXRjaC5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX3BhdGNoLmgKQEAgLTE0LDYgKzE0LDEwIEBACiBleHRlcm4gc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgc25kX2hkYV9wcmVzZXRfc2kzMDU0W107CiAvKiBBVEkgSERNSSBjb2RlY3MgKi8KIGV4dGVybiBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF9hdGloZG1pW107CisvKiBDb25leGFudCBhdWRpbyBjb2RlYyAqLworZXh0ZXJuIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X2NvbmV4YW50W107CisvKiBWSUEgY29kZWNzICovCitleHRlcm4gc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgc25kX2hkYV9wcmVzZXRfdmlhW107CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCAqaGRhX3ByZXNldF90YWJsZXNbXSA9IHsKIAlzbmRfaGRhX3ByZXNldF9yZWFsdGVrLApAQCAtMjIsNSArMjYsNyBAQAogCXNuZF9oZGFfcHJlc2V0X3NpZ21hdGVsLAogCXNuZF9oZGFfcHJlc2V0X3NpMzA1NCwKIAlzbmRfaGRhX3ByZXNldF9hdGloZG1pLAorCXNuZF9oZGFfcHJlc2V0X2NvbmV4YW50LAorCXNuZF9oZGFfcHJlc2V0X3ZpYSwKIAlOVUxMCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKaW5kZXggMDc2MzY1Yi4uMzg5NzdiYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCkBAIC03ODIsNTQgKzc4Miw2MyBAQAogCiAvKiBlYXBkIGluaXRpYWxpemF0aW9uICovCiBzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFkMTk4NmFfZWFwZF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MWIsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAweDAwfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDB4MDAgfSwKIAl7fQogfTsKIAotLyogbW9kZWxzICovCi1lbnVtIHsgQUQxOTg2QV82U1RBQ0ssIEFEMTk4NkFfM1NUQUNLLCBBRDE5ODZBX0xBUFRPUCwgQUQxOTg2QV9MQVBUT1BfRUFQRCB9OworLyogVWx0cmEgaW5pdGlhbGl6YXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWQxOTg2YV91bHRyYV9pbml0W10gPSB7CisJLyogZWFwZCBpbml0aWFsaXphdGlvbiAqLworCXsgMHgxYiwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDB4MDAgfSwKKwkvKiBDTEZFIC0+IE1pYyBpbiAqLworCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MiB9LAorCXsgMHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCisJeyAweDFkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODAgfSwKKwl7IH0gLyogZW5kICovCit9OwogCi1zdGF0aWMgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgYWQxOTg2YV9jZmdfdGJsW10gPSB7Ci0JeyAubW9kZWxuYW1lID0gIjZzdGFjayIsCS5jb25maWcgPSBBRDE5ODZBXzZTVEFDSyB9LAotCXsgLm1vZGVsbmFtZSA9ICIzc3RhY2siLAkuY29uZmlnID0gQUQxOTg2QV8zU1RBQ0sgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMGRlLCAucGNpX3N1YmRldmljZSA9IDB4Y2I4NCwKLQkgIC5jb25maWcgPSBBRDE5ODZBXzNTVEFDSyB9LCAvKiBBU1VTIEE4Ti1WTSBDU00gKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4ODE3ZiwKLQkgIC5jb25maWcgPSBBRDE5ODZBXzNTVEFDSyB9LCAvKiBBU1VTIFA1UC1MMiAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHg4MWIzLAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfM1NUQUNLIH0sIC8qIEFTVVMgUDVSRDItVk0gLyBQNUdQTC1YIFNFICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDgxY2IsCi0JICAuY29uZmlnID0gQUQxOTg2QV8zU1RBQ0sgfSwgLyogQVNVUyBNMk5QVi1WTSAqLwotCXsgLm1vZGVsbmFtZSA9ICJsYXB0b3AiLAkuY29uZmlnID0gQUQxOTg2QV9MQVBUT1AgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNDRkLCAucGNpX3N1YmRldmljZSA9IDB4YzAxZSwKLQkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUCB9LCAvKiBGU0MgVjIwNjAgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxN2MwLCAucGNpX3N1YmRldmljZSA9IDB4MjAxNywKLQkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUCB9LCAvKiBTYW1zdW5nIE01MCAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHg4MThmLAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QIH0sIC8qIEFTVVMgUDVHVi1NWCAqLwotCXsgLm1vZGVsbmFtZSA9ICJsYXB0b3AtZWFwZCIsCS5jb25maWcgPSBBRDE5ODZBX0xBUFRPUF9FQVBEIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTQ0ZCwgLnBjaV9zdWJkZXZpY2UgPSAweGMwMjMsCi0JICAuY29uZmlnID0gQUQxOTg2QV9MQVBUT1BfRUFQRCB9LCAvKiBTYW1zdW5nIFg2MCBDaGFuZSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE0NGQsIC5wY2lfc3ViZGV2aWNlID0gMHhjMDI0LAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwgLyogU2Ftc3VuZyBSNjUtVDIzMDAgQ2hhcmlzICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTQ0ZCwgLnBjaV9zdWJkZXZpY2UgPSAweGMwMjYsCi0JICAuY29uZmlnID0gQUQxOTg2QV9MQVBUT1BfRUFQRCB9LCAvKiBTYW1zdW5nIFgxMS1UMjMwMCBDdWxlc2EgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTE1MywKLQkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUF9FQVBEIH0sIC8qIEFTVVMgTTkgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTIxMywKLQkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUF9FQVBEIH0sIC8qIEFTVVMgQTZKICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDExZjcsCi0JICAuY29uZmlnID0gQUQxOTg2QV9MQVBUT1BfRUFQRCB9LCAvKiBBU1VTIFU1QSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMjYzLAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwgLyogQVNVUyBVNUYgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTI5NywKLQkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUF9FQVBEIH0sIC8qIEFTVVMgWjYyRiAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMmIzLAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwgLyogQVNVUyBWMWogKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MzBhZiwKLQkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUF9FQVBEIH0sIC8qIEhQIENvbXBhcSBQcmVzYXJpbyBCMjgwMCAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE3YWEsIC5wY2lfc3ViZGV2aWNlID0gMHgyMDY2LAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwgLyogTGVub3ZvIDMwMDAgTjEwMC0wNzY4NEpVICovCisvKiBtb2RlbHMgKi8KK2VudW0geworCUFEMTk4NkFfNlNUQUNLLAorCUFEMTk4NkFfM1NUQUNLLAorCUFEMTk4NkFfTEFQVE9QLAorCUFEMTk4NkFfTEFQVE9QX0VBUEQsCisJQUQxOTg2QV9VTFRSQSwKKwlBRDE5ODZBX01PREVMUworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFkMTk4NmFfbW9kZWxzW0FEMTk4NkFfTU9ERUxTXSA9IHsKKwlbQUQxOTg2QV82U1RBQ0tdCT0gIjZzdGFjayIsCisJW0FEMTk4NkFfM1NUQUNLXQk9ICIzc3RhY2siLAorCVtBRDE5ODZBX0xBUFRPUF0JPSAibGFwdG9wIiwKKwlbQUQxOTg2QV9MQVBUT1BfRUFQRF0JPSAibGFwdG9wLWVhcGQiLAorCVtBRDE5ODZBX1VMVFJBXQkJPSAidWx0cmEiLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFkMTk4NmFfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwYWYsICJIUCBCMjgwMCIsIEFEMTk4NkFfTEFQVE9QX0VBUEQpLAorCVNORF9QQ0lfUVVJUksoMHgxMGRlLCAweGNiODQsICJBU1VTIEE4Ti1WTSIsIEFEMTk4NkFfM1NUQUNLKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTUzLCAiQVNVUyBNOSIsIEFEMTk4NkFfTEFQVE9QX0VBUEQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyMTMsICJBU1VTIEE2SiIsIEFEMTk4NkFfTEFQVE9QX0VBUEQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExZjcsICJBU1VTIFU1QSIsIEFEMTk4NkFfTEFQVE9QX0VBUEQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyNjMsICJBU1VTIFU1RiIsIEFEMTk4NkFfTEFQVE9QX0VBUEQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyOTcsICJBU1VTIFo2MkYiLCBBRDE5ODZBX0xBUFRPUF9FQVBEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMmIzLCAiQVNVUyBWMWoiLCBBRDE5ODZBX0xBUFRPUF9FQVBEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzAyLCAiQVNVUyBXM2oiLCBBRDE5ODZBX0xBUFRPUF9FQVBEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MTdmLCAiQVNVUyBQNSIsIEFEMTk4NkFfM1NUQUNLKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MThmLCAiQVNVUyBQNSIsIEFEMTk4NkFfTEFQVE9QKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MWIzLCAiQVNVUyBQNSIsIEFEMTk4NkFfM1NUQUNLKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MWNiLCAiQVNVUyBNMk4iLCBBRDE5ODZBXzNTVEFDSyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODIzNCwgIkFTVVMgTTJOIiwgQUQxOTg2QV8zU1RBQ0spLAorCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGMwMWUsICJGU0MgVjIwNjAiLCBBRDE5ODZBX0xBUFRPUCksCisJU05EX1BDSV9RVUlSSygweDE0NGQsIDB4YzAyMywgIlNhbXN1bmcgWDYwIiwgQUQxOTg2QV9MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDE0NGQsIDB4YzAyNCwgIlNhbXN1bmcgUjY1IiwgQUQxOTg2QV9MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDE0NGQsIDB4YzAyNiwgIlNhbXN1bmcgWDExIiwgQUQxOTg2QV9MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDE0NGQsIDB4YzUwNCwgIlNhbXN1bmcgUTM1IiwgQUQxOTg2QV8zU1RBQ0spLAorCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGMwMjcsICJTYW1zdW5nIFExIiwgQUQxOTg2QV9VTFRSQSksCisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MTAxNywgIkxlbm92byBBNjAiLCBBRDE5ODZBXzNTVEFDSyksCisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjA2NiwgIkxlbm92byBOMTAwIiwgQUQxOTg2QV9MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDE3YzAsIDB4MjAxNywgIlNhbXN1bmcgTTUwIiwgQUQxOTg2QV9MQVBUT1ApLAogCXt9CiB9OwogCkBAIC04NjEsNyArODcwLDkgQEAKIAljb2RlYy0+cGF0Y2hfb3BzID0gYWQxOTh4X3BhdGNoX29wczsKIAogCS8qIG92ZXJyaWRlIHNvbWUgcGFyYW1ldGVycyAqLwotCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBhZDE5ODZhX2NmZ190YmwpOworCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBBRDE5ODZBX01PREVMUywKKwkJCQkJCSAgYWQxOTg2YV9tb2RlbHMsCisJCQkJCQkgIGFkMTk4NmFfY2ZnX3RibCk7CiAJc3dpdGNoIChib2FyZF9jb25maWcpIHsKIAljYXNlIEFEMTk4NkFfM1NUQUNLOgogCQlzcGVjLT5udW1fbWl4ZXJzID0gMjsKQEAgLTg5MSw2ICs5MDIsMTUgQEAKIAkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSAwOwogCQlzcGVjLT5pbnB1dF9tdXggPSAmYWQxOTg2YV9sYXB0b3BfZWFwZF9jYXB0dXJlX3NvdXJjZTsKIAkJYnJlYWs7CisJY2FzZSBBRDE5ODZBX1VMVFJBOgorCQlzcGVjLT5taXhlcnNbMF0gPSBhZDE5ODZhX2xhcHRvcF9lYXBkX21peGVyczsKKwkJc3BlYy0+bnVtX2luaXRfdmVyYnMgPSAyOworCQlzcGVjLT5pbml0X3ZlcmJzWzFdID0gYWQxOTg2YV91bHRyYV9pbml0OworCQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSAyOworCQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IDE7CisJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gYWQxOTg2YV9sYXB0b3BfZGFjX25pZHM7CisJCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gMDsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMzkxLDIwICsxNDExLDI3IEBACiB9OwogCiAvKiBtb2RlbHMgKi8KLWVudW0geyBBRDE5ODFfQkFTSUMsIEFEMTk4MV9IUCwgQUQxOTgxX1RISU5LUEFEIH07CitlbnVtIHsKKwlBRDE5ODFfQkFTSUMsCisJQUQxOTgxX0hQLAorCUFEMTk4MV9USElOS1BBRCwKKwlBRDE5ODFfTU9ERUxTCit9OwogCi1zdGF0aWMgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgYWQxOTgxX2NmZ190YmxbXSA9IHsKLQl7IC5tb2RlbG5hbWUgPSAiaHAiLCAuY29uZmlnID0gQUQxOTgxX0hQIH0sCitzdGF0aWMgY29uc3QgY2hhciAqYWQxOTgxX21vZGVsc1tBRDE5ODFfTU9ERUxTXSA9IHsKKwlbQUQxOTgxX0hQXQkJPSAiaHAiLAorCVtBRDE5ODFfVEhJTktQQURdCT0gInRoaW5rcGFkIiwKKwlbQUQxOTgxX0JBU0lDXQkJPSAiYmFzaWMiLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFkMTk4MV9jZmdfdGJsW10gPSB7CiAJLyogQWxsIEhQIG1vZGVscyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5jb25maWcgPSBBRDE5ODFfSFAgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgzMGIwLCAucGNpX3N1YmRldmljZSA9IDB4MTAzYywKLQkgIC5jb25maWcgPSBBRDE5ODFfSFAgfSwgLyogSFAgbng2MzIwIChyZXZlcnNlZCBTU0lELCBIL1cgYnVnKSAqLwotCXsgLm1vZGVsbmFtZSA9ICJ0aGlua3BhZCIsIC5jb25maWcgPSBBRDE5ODFfVEhJTktQQUQgfSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMCwgIkhQIG54IiwgQUQxOTgxX0hQKSwKKwkvKiBIUCBueDYzMjAgKHJldmVyc2VkIFNTSUQsIEgvVyBidWcpICovCisJU05EX1BDSV9RVUlSSygweDMwYjAsIDB4MTAzYywgIkhQIG54NjMyMCIsIEFEMTk4MV9IUCksCiAJLyogTGVub3ZvIFRoaW5rcGFkIFQ2MC9YNjAvWjZ4eCAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE3YWEsIC5jb25maWcgPSBBRDE5ODFfVEhJTktQQUQgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDE0LCAucGNpX3N1YmRldmljZSA9IDB4MDU5NywKLQkgIC5jb25maWcgPSBBRDE5ODFfVEhJTktQQUQgfSwgLyogWjYwbS90ICovCi0JeyAubW9kZWxuYW1lID0gImJhc2ljIiwgLmNvbmZpZyA9IEFEMTk4MV9CQVNJQyB9LAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAwLCAiTGVub3ZvIFRoaW5rcGFkIiwgQUQxOTgxX1RISU5LUEFEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxNCwgMHgwNTk3LCAiTGVub3ZvIFo2MCIsIEFEMTk4MV9USElOS1BBRCksCiAJe30KIH07CiAKQEAgLTE0MzcsNyArMTQ2NCw5IEBACiAJY29kZWMtPnBhdGNoX29wcyA9IGFkMTk4eF9wYXRjaF9vcHM7CiAKIAkvKiBvdmVycmlkZSBzb21lIHBhcmFtZXRlcnMgKi8KLQlib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgYWQxOTgxX2NmZ190YmwpOworCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBBRDE5ODFfTU9ERUxTLAorCQkJCQkJICBhZDE5ODFfbW9kZWxzLAorCQkJCQkJICBhZDE5ODFfY2ZnX3RibCk7CiAJc3dpdGNoIChib2FyZF9jb25maWcpIHsKIAljYXNlIEFEMTk4MV9IUDoKIAkJc3BlYy0+bWl4ZXJzWzBdID0gYWQxOTgxX2hwX21peGVyczsKQEAgLTI1NjUsMTUgKzI1OTQsMTQgQEAKIC8qCiAgKi8KIAotc3RhdGljIHN0cnVjdCBoZGFfYm9hcmRfY29uZmlnIGFkMTk4OF9jZmdfdGJsW10gPSB7Ci0JeyAubW9kZWxuYW1lID0gIjZzdGFjayIsCS5jb25maWcgPSBBRDE5ODhfNlNUQUNLIH0sCi0JeyAubW9kZWxuYW1lID0gIjZzdGFjay1kaWciLAkuY29uZmlnID0gQUQxOTg4XzZTVEFDS19ESUcgfSwKLQl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrIiwJLmNvbmZpZyA9IEFEMTk4OF8zU1RBQ0sgfSwKLQl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrLWRpZyIsCS5jb25maWcgPSBBRDE5ODhfM1NUQUNLX0RJRyB9LAotCXsgLm1vZGVsbmFtZSA9ICJsYXB0b3AiLAkuY29uZmlnID0gQUQxOTg4X0xBUFRPUCB9LAotCXsgLm1vZGVsbmFtZSA9ICJsYXB0b3AtZGlnIiwJLmNvbmZpZyA9IEFEMTk4OF9MQVBUT1BfRElHIH0sCi0JeyAubW9kZWxuYW1lID0gImF1dG8iLAkJLmNvbmZpZyA9IEFEMTk4OF9BVVRPIH0sCi0Je30KK3N0YXRpYyBjb25zdCBjaGFyICphZDE5ODhfbW9kZWxzW0FEMTk4OF9NT0RFTF9MQVNUXSA9IHsKKwlbQUQxOTg4XzZTVEFDS10JCT0gIjZzdGFjayIsCisJW0FEMTk4OF82U1RBQ0tfRElHXQk9ICI2c3RhY2stZGlnIiwKKwlbQUQxOTg4XzNTVEFDS10JCT0gIjNzdGFjayIsCisJW0FEMTk4OF8zU1RBQ0tfRElHXQk9ICIzc3RhY2stZGlnIiwKKwlbQUQxOTg4X0xBUFRPUF0JCT0gImxhcHRvcCIsCisJW0FEMTk4OF9MQVBUT1BfRElHXQk9ICJsYXB0b3AtZGlnIiwKKwlbQUQxOTg4X0FVVE9dCQk9ICJhdXRvIiwKIH07CiAKIHN0YXRpYyBpbnQgcGF0Y2hfYWQxOTg4KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMjU5MSw4ICsyNjE5LDkgQEAKIAlpZiAoaXNfcmV2Mihjb2RlYykpCiAJCXNuZF9wcmludGsoS0VSTl9JTkZPICJwYXRjaF9hbmFsb2c6IEFEMTk4OEEgcmV2LjIgaXMgZGV0ZWN0ZWQsIGVuYWJsZSB3b3JrYXJvdW5kc1xuIik7CiAKLQlib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgYWQxOTg4X2NmZ190YmwpOwotCWlmIChib2FyZF9jb25maWcgPCAwIHx8IGJvYXJkX2NvbmZpZyA+PSBBRDE5ODhfTU9ERUxfTEFTVCkgeworCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBBRDE5ODhfTU9ERUxfTEFTVCwKKwkJCQkJCSAgYWQxOTg4X21vZGVscywgTlVMTCk7CisJaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBVbmtub3duIG1vZGVsIGZvciBBRDE5ODgsIHRyeWluZyBhdXRvLXByb2JlIGZyb20gQklPUy4uLlxuIik7CiAJCWJvYXJkX2NvbmZpZyA9IEFEMTk4OF9BVVRPOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jCmluZGV4IGQzOGNlMjIuLjViOWQzYTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYwpAQCAtNDAsNiArNDAsNyBAQAogCUNNSV9GVUxMX0RJRywJLyogYmFjayA2LWphY2sgKyBmcm9udC1wYW5lbCAyLWphY2sgKyBkaWdpdGFsIEkvTyAqLwogCUNNSV9BTExPVVQsCS8qIGJhY2sgNS1qYWNrICsgZnJvbnQtcGFuZWwgMi1qYWNrICsgZGlnaXRhbCBvdXQgKi8KIAlDTUlfQVVUTywJLyogbGV0IGRyaXZlciBndWVzcyBpdCAqLworCUNNSV9NT0RFTFMKIH07CiAKIHN0cnVjdCBjbWlfc3BlYyB7CkBAIC02MDMsMTQgKzYwNCwxNyBAQAogLyoKICAqLwogCi1zdGF0aWMgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgY21pOTg4MF9jZmdfdGJsW10gPSB7Ci0JeyAubW9kZWxuYW1lID0gIm1pbmltYWwiLCAuY29uZmlnID0gQ01JX01JTklNQUwgfSwKLQl7IC5tb2RlbG5hbWUgPSAibWluX2ZwIiwgLmNvbmZpZyA9IENNSV9NSU5fRlAgfSwKLQl7IC5tb2RlbG5hbWUgPSAiZnVsbCIsIC5jb25maWcgPSBDTUlfRlVMTCB9LAotCXsgLm1vZGVsbmFtZSA9ICJmdWxsX2RpZyIsIC5jb25maWcgPSBDTUlfRlVMTF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4ODEzZCwgLmNvbmZpZyA9IENNSV9GVUxMX0RJRyB9LCAvKiBBU1VTIFA1QUQyICovCi0JeyAubW9kZWxuYW1lID0gImFsbG91dCIsIC5jb25maWcgPSBDTUlfQUxMT1VUIH0sCi0JeyAubW9kZWxuYW1lID0gImF1dG8iLCAuY29uZmlnID0gQ01JX0FVVE8gfSwKK3N0YXRpYyBjb25zdCBjaGFyICpjbWk5ODgwX21vZGVsc1tDTUlfTU9ERUxTXSA9IHsKKwlbQ01JX01JTklNQUxdCT0gIm1pbmltYWwiLAorCVtDTUlfTUlOX0ZQXQk9ICJtaW5fZnAiLAorCVtDTUlfRlVMTF0JPSAiZnVsbCIsCisJW0NNSV9GVUxMX0RJR10JPSAiZnVsbF9kaWciLAorCVtDTUlfQUxMT1VUXQk9ICJhbGxvdXQiLAorCVtDTUlfQVVUT10JPSAiYXV0byIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgY21pOTg4MF9jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODEzZCwgIkFTVVMgUDVBRDIiLCBDTUlfRlVMTF9ESUcpLAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiAKQEAgLTYzMyw3ICs2MzcsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWNvZGVjLT5zcGVjID0gc3BlYzsKLQlzcGVjLT5ib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgY21pOTg4MF9jZmdfdGJsKTsKKwlzcGVjLT5ib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgQ01JX01PREVMUywKKwkJCQkJCQljbWk5ODgwX21vZGVscywKKwkJCQkJCQljbWk5ODgwX2NmZ190YmwpOwogCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBVbmtub3duIG1vZGVsIGZvciBDTUk5ODgwXG4iKTsKIAkJc3BlYy0+Ym9hcmRfY29uZmlnID0gQ01JX0FVVE87IC8qIHRyeSBldmVyeXRoaW5nICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmNDY2ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKQEAgLTAsMCArMSwxMzExIEBACisvKgorICogSEQgYXVkaW8gaW50ZXJmYWNlIHBhdGNoIGZvciBDb25leGFudCBIREEgYXVkaW8gY29kZWMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUG90b3Rza2l5IEFrZXggPGFsZXgucG90b3Rza2l5QGdtYWlsLmNvbT4KKyAqIAkJICAgICAgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogCQkgICAgICBUb2JpbiBEYXZpcyAgPHRkYXZpc0Bkc2wtb25seS5uZXQ+CisgKgorICogIFRoaXMgZHJpdmVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCisjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCisKKyNkZWZpbmUgQ1hUX1BJTl9ESVJfSU4gICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQ1hUX1BJTl9ESVJfT1VUICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ1hUX1BJTl9ESVJfSU5PVVQgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ1hUX1BJTl9ESVJfSU5fTk9NSUNCSUFTICAgIDB4MDMKKyNkZWZpbmUgQ1hUX1BJTl9ESVJfSU5PVVRfTk9NSUNCSUFTIDB4MDQKKworI2RlZmluZSBDT05FWEFOVF9IUF9FVkVOVAkweDM3CisjZGVmaW5lIENPTkVYQU5UX01JQ19FVkVOVAkweDM4CisKKworCitzdHJ1Y3QgY29uZXhhbnRfc3BlYyB7CisKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqbWl4ZXJzWzVdOworCWludCBudW1fbWl4ZXJzOworCisJY29uc3Qgc3RydWN0IGhkYV92ZXJiICppbml0X3ZlcmJzWzVdOwkvKiBpbml0aWFsaXphdGlvbiB2ZXJicworCQkJCQkJICogZG9uJ3QgZm9yZ2V0IE5VTEwKKwkJCQkJCSAqIHRlcm1pbmF0aW9uIQorCQkJCQkJICovCisJdW5zaWduZWQgaW50IG51bV9pbml0X3ZlcmJzOworCisJLyogcGxheWJhY2sgKi8KKwlzdHJ1Y3QgaGRhX211bHRpX291dCBtdWx0aW91dDsJLyogcGxheWJhY2sgc2V0LXVwCisJCQkJCSAqIG1heF9jaGFubmVscywgZGFjcyBtdXN0IGJlIHNldAorCQkJCQkgKiBkaWdfb3V0X25pZCBhbmQgaHBfbmlkIGFyZSBvcHRpb25hbAorCQkJCQkgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX2VhcGQ7CisJdW5zaWduZWQgaW50IG5lZWRfZGFjX2ZpeDsKKworCS8qIGNhcHR1cmUgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2FkY19uaWRzOworCWhkYV9uaWRfdCAqYWRjX25pZHM7CisJaGRhX25pZF90IGRpZ19pbl9uaWQ7CQkvKiBkaWdpdGFsLWluIE5JRDsgb3B0aW9uYWwgKi8KKworCS8qIGNhcHR1cmUgc291cmNlICovCisJY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmlucHV0X211eDsKKwloZGFfbmlkX3QgKmNhcHNyY19uaWRzOworCXVuc2lnbmVkIGludCBjdXJfbXV4WzNdOworCisJLyogY2hhbm5lbCBtb2RlbCAqLworCWNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlICpjaGFubmVsX21vZGU7CisJaW50IG51bV9jaGFubmVsX21vZGU7CisKKwkvKiBQQ00gaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgaGRhX3BjbSBwY21fcmVjWzJdOwkvKiB1c2VkIGluIGJ1aWxkX3BjbXMoKSAqLworCisJc3RydWN0IG11dGV4IGFtcF9tdXRleDsJLyogUENNIHZvbHVtZS9tdXRlIGNvbnRyb2wgbXV0ZXggKi8KKwl1bnNpZ25lZCBpbnQgc3BkaWZfcm91dGU7CisKKwkvKiBkeW5hbWljIGNvbnRyb2xzLCBpbml0X3ZlcmJzIGFuZCBpbnB1dF9tdXggKi8KKwlzdHJ1Y3QgYXV0b19waW5fY2ZnIGF1dG9jZmc7CisJdW5zaWduZWQgaW50IG51bV9rY3RsX2FsbG9jLCBudW1fa2N0bF91c2VkOworCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY3RsX2FsbG9jOworCXN0cnVjdCBoZGFfaW5wdXRfbXV4IHByaXZhdGVfaW11eDsKKwloZGFfbmlkX3QgcHJpdmF0ZV9kYWNfbmlkc1s0XTsKKworfTsKKworc3RhdGljIGludCBjb25leGFudF9wbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19vcGVuKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsIHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgY29uZXhhbnRfcGxheWJhY2tfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkJIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQkJCSB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCQkgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX3ByZXBhcmUoY29kZWMsICZzcGVjLT5tdWx0aW91dCwKKwkJCQkJCXN0cmVhbV90YWcsCisJCQkJCQlmb3JtYXQsIHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgY29uZXhhbnRfcGxheWJhY2tfcGNtX2NsZWFudXAoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkJIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX2NsZWFudXAoY29kZWMsICZzcGVjLT5tdWx0aW91dCk7Cit9CisKKy8qCisgKiBEaWdpdGFsIG91dAorICovCitzdGF0aWMgaW50IGNvbmV4YW50X2RpZ19wbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCQkgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19vcGVuKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOworfQorCitzdGF0aWMgaW50IGNvbmV4YW50X2RpZ19wbGF5YmFja19wY21fY2xvc2Uoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkJIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX2Nsb3NlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOworfQorCisvKgorICogQW5hbG9nIGNhcHR1cmUKKyAqLworc3RhdGljIGludCBjb25leGFudF9jYXB0dXJlX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZvcm1hdCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBzcGVjLT5hZGNfbmlkc1tzdWJzdHJlYW0tPm51bWJlcl0sCisJCQkJICAgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25leGFudF9jYXB0dXJlX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgc3BlYy0+YWRjX25pZHNbc3Vic3RyZWFtLT5udW1iZXJdLAorCQkJCSAgIDAsIDAsIDApOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjb25leGFudF9wY21fYW5hbG9nX3BsYXliYWNrID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkubmlkID0gMCwgLyogZmlsbCBsYXRlciAqLworCS5vcHMgPSB7CisJCS5vcGVuID0gY29uZXhhbnRfcGxheWJhY2tfcGNtX29wZW4sCisJCS5wcmVwYXJlID0gY29uZXhhbnRfcGxheWJhY2tfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gY29uZXhhbnRfcGxheWJhY2tfcGNtX2NsZWFudXAKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjb25leGFudF9wY21fYW5hbG9nX2NhcHR1cmUgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS5uaWQgPSAwLCAvKiBmaWxsIGxhdGVyICovCisJLm9wcyA9IHsKKwkJLnByZXBhcmUgPSBjb25leGFudF9jYXB0dXJlX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IGNvbmV4YW50X2NhcHR1cmVfcGNtX2NsZWFudXAKKwl9LAorfTsKKworCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNvbmV4YW50X3BjbV9kaWdpdGFsX3BsYXliYWNrID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkubmlkID0gMCwgLyogZmlsbCBsYXRlciAqLworCS5vcHMgPSB7CisJCS5vcGVuID0gY29uZXhhbnRfZGlnX3BsYXliYWNrX3BjbV9vcGVuLAorCQkuY2xvc2UgPSBjb25leGFudF9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY29uZXhhbnRfcGNtX2RpZ2l0YWxfY2FwdHVyZSA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLyogTklEIGlzIHNldCBpbiBhbGNfYnVpbGRfcGNtcyAqLworfTsKKworc3RhdGljIGludCBjb25leGFudF9idWlsZF9wY21zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGhkYV9wY20gKmluZm8gPSBzcGVjLT5wY21fcmVjOworCisJY29kZWMtPm51bV9wY21zID0gMTsKKwljb2RlYy0+cGNtX2luZm8gPSBpbmZvOworCisJaW5mby0+bmFtZSA9ICJDT05FWEFOVCBBbmFsb2ciOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IGNvbmV4YW50X3BjbV9hbmFsb2dfcGxheWJhY2s7CisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmNoYW5uZWxzX21heCA9CisJCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVsczsKKwlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10ubmlkID0KKwkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF07CisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPSBjb25leGFudF9wY21fYW5hbG9nX2NhcHR1cmU7CisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtcyA9IHNwZWMtPm51bV9hZGNfbmlkczsKKwlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPSBzcGVjLT5hZGNfbmlkc1swXTsKKworCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkgeworCQlpbmZvKys7CisJCWNvZGVjLT5udW1fcGNtcysrOworCQlpbmZvLT5uYW1lID0gIkNvbmV4YW50IERpZ2l0YWwiOworCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPQorCQkJY29uZXhhbnRfcGNtX2RpZ2l0YWxfcGxheWJhY2s7CisJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPQorCQkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQ7CisJCWlmIChzcGVjLT5kaWdfaW5fbmlkKSB7CisJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9CisJCQkJY29uZXhhbnRfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKKwkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLm5pZCA9CisJCQkJc3BlYy0+ZGlnX2luX25pZDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmV4YW50X211eF9lbnVtX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X2luZm8oc3BlYy0+aW5wdXRfbXV4LCB1aW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgY29uZXhhbnRfbXV4X2VudW1fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVuc2lnbmVkIGludCBhZGNfaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gc3BlYy0+Y3VyX211eFthZGNfaWR4XTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25leGFudF9tdXhfZW51bV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IGFkY19pZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKworCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9wdXQoY29kZWMsIHNwZWMtPmlucHV0X211eCwgdWNvbnRyb2wsCisJCQkJICAgICBzcGVjLT5jYXBzcmNfbmlkc1thZGNfaWR4XSwKKwkJCQkgICAgICZzcGVjLT5jdXJfbXV4W2FkY19pZHhdKTsKK30KKworc3RhdGljIGludCBjb25leGFudF9pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX2luaXRfdmVyYnM7IGkrKykKKwkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgc3BlYy0+aW5pdF92ZXJic1tpXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmV4YW50X2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisgICAgICAgIHN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICAgIGlmIChzcGVjLT5rY3RsX2FsbG9jKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9rY3RsX3VzZWQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKHNwZWMtPmtjdGxfYWxsb2NbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAga2ZyZWUoc3BlYy0+a2N0bF9hbGxvYyk7CisgICAgICAgIH0KKworCWtmcmVlKGNvZGVjLT5zcGVjKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBjb25leGFudF9yZXN1bWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgaTsKKworCWNvZGVjLT5wYXRjaF9vcHMuaW5pdChjb2RlYyk7CisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9taXhlcnM7IGkrKykKKwkJc25kX2hkYV9yZXN1bWVfY3Rscyhjb2RlYywgc3BlYy0+bWl4ZXJzW2ldKTsKKwlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpCisJCXNuZF9oZGFfcmVzdW1lX3NwZGlmX291dChjb2RlYyk7CisJaWYgKHNwZWMtPmRpZ19pbl9uaWQpCisJCXNuZF9oZGFfcmVzdW1lX3NwZGlmX2luKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGNvbmV4YW50X2J1aWxkX2NvbnRyb2xzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fbWl4ZXJzOyBpKyspIHsKKwkJZXJyID0gc25kX2hkYV9hZGRfbmV3X2N0bHMoY29kZWMsIHNwZWMtPm1peGVyc1tpXSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKSB7CisJCWVyciA9IHNuZF9oZGFfY3JlYXRlX3NwZGlmX291dF9jdGxzKGNvZGVjLAorCQkJCQkJICAgIHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0gCisJaWYgKHNwZWMtPmRpZ19pbl9uaWQpIHsKKwkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfaW5fY3Rscyhjb2RlYyxzcGVjLT5kaWdfaW5fbmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfb3BzIGNvbmV4YW50X3BhdGNoX29wcyA9IHsKKwkuYnVpbGRfY29udHJvbHMgPSBjb25leGFudF9idWlsZF9jb250cm9scywKKwkuYnVpbGRfcGNtcyA9IGNvbmV4YW50X2J1aWxkX3BjbXMsCisJLmluaXQgPSBjb25leGFudF9pbml0LAorCS5mcmVlID0gY29uZXhhbnRfZnJlZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkucmVzdW1lID0gY29uZXhhbnRfcmVzdW1lLAorI2VuZGlmCit9OworCisvKgorICogRUFQRCBjb250cm9sCisgKiB0aGUgcHJpdmF0ZSB2YWx1ZSA9IG5pZCB8IChpbnZlcnQgPDwgOCkKKyAqLworCitzdGF0aWMgaW50IGNvbmV4YW50X2VhcGRfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZXhhbnRfZWFwZF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDE7CisJaWYgKGludmVydCkKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAhc3BlYy0+Y3VyX2VhcGQ7CisJZWxzZQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNwZWMtPmN1cl9lYXBkOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmV4YW50X2VhcGRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAxOworCWhkYV9uaWRfdCBuaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJdW5zaWduZWQgaW50IGVhcGQ7CisJZWFwZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWlmIChpbnZlcnQpCisJCWVhcGQgPSAhZWFwZDsKKwlpZiAoZWFwZCA9PSBzcGVjLT5jdXJfZWFwZCAmJiAhY29kZWMtPmluX3Jlc3VtZSkKKwkJcmV0dXJuIDA7CisJc3BlYy0+Y3VyX2VhcGQgPSBlYXBkOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwKKwkJCSAgICAwLCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwKKwkJCSAgICBlYXBkID8gMHgwMiA6IDB4MDApOworCXJldHVybiAxOworfQorCisvKiBjb250cm9scyBmb3IgdGVzdCBtb2RlICovCisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworCitzdGF0aWMgaW50IGNvbmV4YW50X2NoX21vZGVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX2NoX21vZGVfaW5mbyhjb2RlYywgdWluZm8sIHNwZWMtPmNoYW5uZWxfbW9kZSwKKwkJCQkgICAgc3BlYy0+bnVtX2NoYW5uZWxfbW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgY29uZXhhbnRfY2hfbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9jaF9tb2RlX2dldChjb2RlYywgdWNvbnRyb2wsIHNwZWMtPmNoYW5uZWxfbW9kZSwKKwkJCQkgICBzcGVjLT5udW1fY2hhbm5lbF9tb2RlLAorCQkJCSAgIHNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyk7Cit9CisKK3N0YXRpYyBpbnQgY29uZXhhbnRfY2hfbW9kZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZXJyID0gc25kX2hkYV9jaF9tb2RlX3B1dChjb2RlYywgdWNvbnRyb2wsIHNwZWMtPmNoYW5uZWxfbW9kZSwKKwkJCQkgICAgICBzcGVjLT5udW1fY2hhbm5lbF9tb2RlLAorCQkJCSAgICAgICZzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMpOworCWlmIChlcnIgPj0gMCAmJiBzcGVjLT5uZWVkX2RhY19maXgpCisJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzIC8gMjsKKwlyZXR1cm4gZXJyOworfQorCisjZGVmaW5lIENYVF9QSU5fTU9ERSh4bmFtZSwgbmlkLCBkaXIpIFwKKwl7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSAwLCAgXAorCSAgLmluZm8gPSBjb25leGFudF9jaF9tb2RlX2luZm8sIFwKKwkgIC5nZXQgPSBjb25leGFudF9jaF9tb2RlX2dldCwgXAorCSAgLnB1dCA9IGNvbmV4YW50X2NoX21vZGVfcHV0LCBcCisJICAucHJpdmF0ZV92YWx1ZSA9IG5pZCB8IChkaXI8PDE2KSB9CisKK3N0YXRpYyBpbnQgY3h0X2dwaW9fZGF0YV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitzdGF0aWMgaW50IGN4dF9ncGlvX2RhdGFfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7CisJdW5zaWduZWQgY2hhciBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCXVuc2lnbmVkIGludCB2YWwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKKwkJCQkJICAgICAgQUNfVkVSQl9HRVRfR1BJT19EQVRBLCAweDAwKTsKKworCSp2YWxwID0gKHZhbCAmIG1hc2spICE9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3h0X2dwaW9fZGF0YV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWhkYV9uaWRfdCBuaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmZmZjsKKwl1bnNpZ25lZCBjaGFyIG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlsb25nIHZhbCA9ICp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKKwl1bnNpZ25lZCBpbnQgZ3Bpb19kYXRhID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCisJCQkJCQkgICAgQUNfVkVSQl9HRVRfR1BJT19EQVRBLAorCQkJCQkJICAgIDB4MDApOworCXVuc2lnbmVkIGludCBvbGRfZGF0YSA9IGdwaW9fZGF0YTsKKworCS8qIFNldC91bnNldCB0aGUgbWFza2VkIEdQSU8gYml0KHMpIGFzIG5lZWRlZCAqLworCWlmICh2YWwgPT0gMCkKKwkJZ3Bpb19kYXRhICY9IH5tYXNrOworCWVsc2UKKwkJZ3Bpb19kYXRhIHw9IG1hc2s7CisJaWYgKGdwaW9fZGF0YSA9PSBvbGRfZGF0YSAmJiAhY29kZWMtPmluX3Jlc3VtZSkKKwkJcmV0dXJuIDA7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIGdwaW9fZGF0YSk7CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgQ1hUX0dQSU9fREFUQV9TV0lUQ0goeG5hbWUsIG5pZCwgbWFzaykgXAorCXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IDAsICBcCisJICAuaW5mbyA9IGN4dF9ncGlvX2RhdGFfaW5mbywgXAorCSAgLmdldCA9IGN4dF9ncGlvX2RhdGFfZ2V0LCBcCisJICAucHV0ID0gY3h0X2dwaW9fZGF0YV9wdXQsIFwKKwkgIC5wcml2YXRlX3ZhbHVlID0gbmlkIHwgKG1hc2s8PDE2KSB9CisKK3N0YXRpYyBpbnQgY3h0X3NwZGlmX2N0cmxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKK3N0YXRpYyBpbnQgY3h0X3NwZGlmX2N0cmxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOworCXVuc2lnbmVkIGNoYXIgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCWxvbmcgKnZhbHAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCisJCQkJCSAgICAgIEFDX1ZFUkJfR0VUX0RJR0lfQ09OVkVSVCwgMHgwMCk7CisKKwkqdmFscCA9ICh2YWwgJiBtYXNrKSAhPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4dF9zcGRpZl9jdHJsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWhkYV9uaWRfdCBuaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmZmZjsKKwl1bnNpZ25lZCBjaGFyIG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlsb25nIHZhbCA9ICp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKKwl1bnNpZ25lZCBpbnQgY3RybF9kYXRhID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCisJCQkJCQkgICAgQUNfVkVSQl9HRVRfRElHSV9DT05WRVJULAorCQkJCQkJICAgIDB4MDApOworCXVuc2lnbmVkIGludCBvbGRfZGF0YSA9IGN0cmxfZGF0YTsKKworCS8qIFNldC91bnNldCB0aGUgbWFza2VkIGNvbnRyb2wgYml0KHMpIGFzIG5lZWRlZCAqLworCWlmICh2YWwgPT0gMCkKKwkJY3RybF9kYXRhICY9IH5tYXNrOworCWVsc2UKKwkJY3RybF9kYXRhIHw9IG1hc2s7CisJaWYgKGN0cmxfZGF0YSA9PSBvbGRfZGF0YSAmJiAhY29kZWMtPmluX3Jlc3VtZSkKKwkJcmV0dXJuIDA7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwKKwkJCSAgICBjdHJsX2RhdGEpOworCXJldHVybiAxOworfQorCisjZGVmaW5lIENYVF9TUERJRl9DVFJMX1NXSVRDSCh4bmFtZSwgbmlkLCBtYXNrKSBcCisJeyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0gMCwgIFwKKwkgIC5pbmZvID0gY3h0X3NwZGlmX2N0cmxfaW5mbywgXAorCSAgLmdldCA9IGN4dF9zcGRpZl9jdHJsX2dldCwgXAorCSAgLnB1dCA9IGN4dF9zcGRpZl9jdHJsX3B1dCwgXAorCSAgLnByaXZhdGVfdmFsdWUgPSBuaWQgfCAobWFzazw8MTYpIH0KKworI2VuZGlmIC8qIENPTkZJR19TTkRfREVCVUcgKi8KKworLyogQ29uZXhhbnQgNTA0NSBzcGVjaWZpYyAqLworCitzdGF0aWMgaGRhX25pZF90IGN4dDUwNDVfZGFjX25pZHNbMV0gPSB7IDB4MTkgfTsKK3N0YXRpYyBoZGFfbmlkX3QgY3h0NTA0NV9hZGNfbmlkc1sxXSA9IHsgMHgxYSB9Oworc3RhdGljIGhkYV9uaWRfdCBjeHQ1MDQ1X2NhcHNyY19uaWRzWzFdID0geyAweDFhIH07CisjZGVmaW5lIENYVDUwNDVfU1BESUZfT1VUCTB4MTMKKworc3RhdGljIHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGN4dDUwNDVfbW9kZXNbMV0gPSB7CisJeyAyLCBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9pbnB1dF9tdXggY3h0NTA0NV9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gMiwKKwkuaXRlbXMgPSB7CisJCXsgIkV4dE1pYyIsIDB4MSB9LAorCQl7ICJMaW5lSW4iLCAweDIgfSwKKwl9Cit9OworCisvKiB0dXJuIG9uL29mZiBFQVBEICgrIG11dGUgSFApIGFzIGEgbWFzdGVyIHN3aXRjaCAqLworc3RhdGljIGludCBjeHQ1MDQ1X2hwX21hc3Rlcl9zd19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlpZiAoIWNvbmV4YW50X2VhcGRfcHV0KGtjb250cm9sLCB1Y29udHJvbCkpCisJCXJldHVybiAwOworCisJLyogdG9nZ2xlIEhQIG11dGUgYXBwcm9wcmlhdGVseSAqLworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMSwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgc3BlYy0+Y3VyX2VhcGQgPyAwIDogMHg4MCk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDExLCAxLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDgwLCBzcGVjLT5jdXJfZWFwZCA/IDAgOiAweDgwKTsKKwlyZXR1cm4gMTsKK30KKworLyogYmluZCB2b2x1bWVzIG9mIGJvdGggTklEIDB4MTAgYW5kIDB4MTEgKi8KK3N0YXRpYyBpbnQgY3h0NTA0NV9ocF9tYXN0ZXJfdm9sX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWxvbmcgKnZhbHAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKKwlpbnQgY2hhbmdlOworCisJY2hhbmdlID0gc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDEwLCAwLCBIREFfT1VUUFVULCAwLAorCQkJCQkgIDB4N2YsIHZhbHBbMF0gJiAweDdmKTsKKwljaGFuZ2UgfD0gc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDEwLCAxLCBIREFfT1VUUFVULCAwLAorCQkJCQkgICAweDdmLCB2YWxwWzFdICYgMHg3Zik7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDExLCAwLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDdmLCB2YWxwWzBdICYgMHg3Zik7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDExLCAxLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDdmLCB2YWxwWzFdICYgMHg3Zik7CisJcmV0dXJuIGNoYW5nZTsKK30KKworCisvKiBtdXRlIGludGVybmFsIHNwZWFrZXIgaWYgSFAgaXMgcGx1Z2dlZCAqLworc3RhdGljIHZvaWQgY3h0NTA0NV9ocF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKworCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTEsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTAsIDAsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDEwLCAxLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDgwLCBwcmVzZW50ID8gMHg4MCA6IDApOworfQorCisvKiB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayBzZW5zaW5nICovCitzdGF0aWMgdm9pZCBjeHQ1MDQ1X2hwX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgIHVuc2lnbmVkIGludCByZXMpCit7CisJcmVzID4+PSAyNjsKKwlzd2l0Y2ggKHJlcykgeworCWNhc2UgQ09ORVhBTlRfSFBfRVZFTlQ6CisJCWN4dDUwNDVfaHBfYXV0b211dGUoY29kZWMpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjeHQ1MDQ1X21peGVyc1tdID0geworCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwKKwkJLmluZm8gPSBjb25leGFudF9tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gY29uZXhhbnRfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gY29uZXhhbnRfbXV4X2VudW1fcHV0CisJfSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQnlwYXNzIENhcHR1cmUgVm9sdW1lIiwgMHgxNywgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIEJ5cGFzcyBDYXB0dXJlIFN3aXRjaCIsIDB4MTcsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDFhLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MWEsIDB4MDIsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsCisJCS5pbmZvID0gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2luZm8sCisJCS5nZXQgPSBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfZ2V0LAorCQkucHV0ID0gY3h0NTA0NV9ocF9tYXN0ZXJfdm9sX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTEsIDMsIDAsIEhEQV9PVVRQVVQpLAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gY29uZXhhbnRfZWFwZF9pbmZvLAorCQkuZ2V0ID0gY29uZXhhbnRfZWFwZF9nZXQsCisJCS5wdXQgPSBjeHQ1MDQ1X2hwX21hc3Rlcl9zd19wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gMHgxMSwKKwl9LAorCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgY3h0NTA0NV9pbml0X3ZlcmJzW10gPSB7CisJLyogTGluZSBpbiwgTWljICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfEFDX1BJTkNUTF9WUkVGXzUwIH0sCisJLyogSFAsIEFtcCAgKi8KKwl7MHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJezB4MUEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLDB4MDF9LAorCXsweDFBLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCSBBQ19BTVBfU0VUX09VVFBVVHxBQ19BTVBfU0VUX1JJR0hUfEFDX0FNUF9TRVRfTEVGVHwweDAwfSwKKwl7MHgxQSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkgQUNfQU1QX1NFVF9PVVRQVVR8QUNfQU1QX1NFVF9SSUdIVHxBQ19BTVBfU0VUX0xFRlR8MHgwM30sCisJLyogUmVjb3JkIHNlbGVjdG9yOiBGcm9udCBtaWMgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsMHgwM30sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJIEFDX0FNUF9TRVRfSU5QVVR8QUNfQU1QX1NFVF9SSUdIVHxBQ19BTVBfU0VUX0xFRlR8MHgxN30sCisJLyogU1BESUYgcm91dGU6IFBDTSAqLworCXsgMHgxMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MCB9LAorCS8qIHBpbiBzZW5zaW5nIG9uIEhQIGFuZCBNaWMgamFja3MgKi8KKwl7MHgxMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IENPTkVYQU5UX0hQX0VWRU5UfSwKKwkvKiBFQVBEICovCisJezB4MTAsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAweDAgfSwgLyogZGVmYXVsdCBvbiAqLworCXsgfSAvKiBlbmQgKi8KK307CisKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisvKiBUZXN0IGNvbmZpZ3VyYXRpb24gZm9yIGRlYnVnZ2luZywgbW9kZWxsZWQgYWZ0ZXIgdGhlIEFMQzI2MCB0ZXN0CisgKiBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgc3RydWN0IGhkYV9pbnB1dF9tdXggY3h0NTA0NV90ZXN0X2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSA1LAorCS5pdGVtcyA9IHsKKwkJeyAiTUlYRVIiLCAweDAgfSwKKwkJeyAiTUlDMSBwaW4iLCAweDEgfSwKKwkJeyAiTElORTEgcGluIiwgMHgyIH0sCisJCXsgIkhQLU9VVCBwaW4iLCAweDMgfSwKKwkJeyAiQ0QgcGluIiwgMHg0IH0sCisgICAgICAgIH0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA0NV90ZXN0X21peGVyW10gPSB7CisKKwkvKiBPdXRwdXQgY29udHJvbHMgKi8KKwlIREFfQ09ERUNfVk9MVU1FKCJPdXRBbXAtMSBWb2x1bWUiLCAweDE5LCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiT3V0QW1wLTEgU3dpdGNoIiwgMHgxOSwweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MTAsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMHgwLCBIREFfT1VUUFVUKSwKKwkKKwkvKiBNb2RlcyBmb3IgcmV0YXNraW5nIHBpbiB3aWRnZXRzICovCisJQ1hUX1BJTl9NT0RFKCJIUC1PVVQgcGluIG1vZGUiLCAweDExLCBDWFRfUElOX0RJUl9JTk9VVCksCisJQ1hUX1BJTl9NT0RFKCJMSU5FMSBwaW4gbW9kZSIsIDB4MTIsIENYVF9QSU5fRElSX0lOT1VUKSwKKworCS8qIExvb3BiYWNrIG1peGVyIGNvbnRyb2xzICovCisJSERBX0NPREVDX1ZPTFVNRSgiTUlDMSBQbGF5YmFjayBWb2x1bWUiLCAweDE3LCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNSUMxIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTElORSBsb29wYmFjayBQbGF5YmFjayBWb2x1bWUiLCAweDE3LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMSU5FIGxvb3BiYWNrIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSFAtT1VUIGxvb3BiYWNrIFBsYXliYWNrIFZvbHVtZSIsIDB4MTcsIDB4MDMsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhQLU9VVCBsb29wYmFjayBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDAzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MTcsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4MDQsIEhEQV9JTlBVVCksCisKKwkvKiBDb250cm9scyBmb3IgR1BJTyBwaW5zLCBhc3N1bWluZyB0aGV5IGV4aXN0IGFuZCBhcmUgY29uZmlndXJlZCBhcyBvdXRwdXRzICovCisJQ1hUX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDAiLCAweDAxLCAweDAxKSwKKyNpZiAwICAgLyogbGltaXQgdGhpcyB0byBvbmUgR1BJTyBwaW4gZm9yIG5vdyAqLwkKKwlDWFRfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMSIsIDB4MDEsIDB4MDIpLAorCUNYVF9HUElPX0RBVEFfU1dJVENIKCJHUElPIHBpbiAyIiwgMHgwMSwgMHgwNCksCisJQ1hUX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDMiLCAweDAxLCAweDA4KSwKKyNlbmRpZgorCUNYVF9TUERJRl9DVFJMX1NXSVRDSCgiU1BESUYgUGxheWJhY2sgU3dpdGNoIiwgMHgxMywgMHgwMSksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MTcsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxNywgMHgwLCBIREFfT1VUUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAorCQkuaW5mbyA9IGNvbmV4YW50X211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBjb25leGFudF9tdXhfZW51bV9nZXQsCisJCS5wdXQgPSBjb25leGFudF9tdXhfZW51bV9wdXQsCisJfSwKKworCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgY3h0NTA0NV90ZXN0X2luaXRfdmVyYnNbXSA9IHsKKwkvKiBFbmFibGUgYWxsIEdQSU9zIGFzIG91dHB1dHMgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIDAgKi8KKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MGZ9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDB9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MGZ9LAorCisJLyogRW5hYmxlIHJldGFza2luZyBwaW5zIGFzIG91dHB1dCwgaW5pdGlhbGx5IHdpdGhvdXQgcG93ZXIgYW1wICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisKKwkvKiBEaXNhYmxlIGRpZ2l0YWwgKFNQRElGKSBwaW5zIGluaXRpYWxseSwgYnV0IHVzZXJzIGNhbiBlbmFibGUKKwkgKiB0aGVtIHZpYSBhIG1peGVyIHN3aXRjaC4gIEluIHRoZSBjYXNlIG9mIFNQRElGLW91dCwgdGhpcyBpbml0dmVyYgorCSAqIHBheWxvYWQgYWxzbyBzZXRzIHRoZSBnZW5lcmF0aW9uIHRvIDAsIG91dHB1dCB0byBiZSBpbiAiY29uc3VtZXIiCisJICogUENNIGZvcm1hdCwgY29weXJpZ2h0IGFzc2VydGVkLCBubyBwcmUtZW1waGFzaXMgYW5kIG5vIHZhbGlkaXR5CisJICogY29udHJvbC4KKwkgKi8KKwl7MHgxMywgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIDB9LAorCisJLyogU3RhcnQgd2l0aCBvdXRwdXQgc3VtIHdpZGdldHMgbXV0ZWQgYW5kIHRoZWlyIG91dHB1dCBnYWlucyBhdCBtaW4gKi8KKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisKKwkvKiBVbm11dGUgcmV0YXNraW5nIHBpbiB3aWRnZXQgb3V0cHV0IGJ1ZmZlcnMgc2luY2UgdGhlIGRlZmF1bHQKKwkgKiBzdGF0ZSBhcHBlYXJzIHRvIGJlIG91dHB1dC4gIEFzIHRoZSBwaW4gbW9kZSBpcyBjaGFuZ2VkIGJ5IHRoZQorCSAqIHVzZXIgdGhlIHBpbiBtb2RlIGNvbnRyb2wgd2lsbCB0YWtlIGNhcmUgb2YgZW5hYmxpbmcgdGhlIHBpbidzCisJICogaW5wdXQvb3V0cHV0IGJ1ZmZlcnMgYXMgbmVlZGVkLgorCSAqLworCXsweDEyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCS8qIE11dGUgY2FwdHVyZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCisJLyogU2V0IEFEQyBjb25uZWN0aW9uIHNlbGVjdCB0byBtYXRjaCBkZWZhdWx0IG1peGVyIHNldHRpbmcgKG1pYzEKKwkgKiBwaW4pCisJICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKworCS8qIE11dGUgYWxsIGlucHV0cyB0byBtaXhlciB3aWRnZXQgKGV2ZW4gdW5jb25uZWN0ZWQgb25lcykgKi8KKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LCAvKiBNaXhlciBwaW4gKi8KKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LCAvKiBNaWMxIHBpbiAqLworCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sIC8qIExpbmUgcGluICovCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwgLyogSFAgcGluICovCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwgLyogQ0QgcGluICovCisKKwl7IH0KK307CisjZW5kaWYKKworCisvKiBpbml0aWFsaXplIGphY2stc2Vuc2luZywgdG9vICovCitzdGF0aWMgaW50IGN4dDUwNDVfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwljb25leGFudF9pbml0KGNvZGVjKTsKKwljeHQ1MDQ1X2hwX2F1dG9tdXRlKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworCitlbnVtIHsKKwlDWFQ1MDQ1X0xBUFRPUCwJLyogTGFwdG9wcyB3LyBFQVBEIHN1cHBvcnQgKi8KKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJQ1hUNTA0NV9URVNULAorI2VuZGlmCisJQ1hUNTA0NV9NT0RFTFMKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjeHQ1MDQ1X21vZGVsc1tDWFQ1MDQ1X01PREVMU10gPSB7CisJW0NYVDUwNDVfTEFQVE9QXQk9ICJsYXB0b3AiLAorI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKwlbQ1hUNTA0NV9URVNUXQkJPSAidGVzdCIsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBjeHQ1MDQ1X2NmZ190YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGI3LCAiSFAgRFY2MDAwWiIsIENYVDUwNDVfTEFQVE9QKSwKKwl7fQorfTsKKworc3RhdGljIGludCBwYXRjaF9jeHQ1MDQ1KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjOworCWludCBib2FyZF9jb25maWc7CisKKwlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNwZWMpCisJCXJldHVybiAtRU5PTUVNOworCW11dGV4X2luaXQoJnNwZWMtPmFtcF9tdXRleCk7CisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gMjsKKwlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IEFSUkFZX1NJWkUoY3h0NTA0NV9kYWNfbmlkcyk7CisJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBjeHQ1MDQ1X2RhY19uaWRzOworCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gQ1hUNTA0NV9TUERJRl9PVVQ7CisJc3BlYy0+bnVtX2FkY19uaWRzID0gMTsKKwlzcGVjLT5hZGNfbmlkcyA9IGN4dDUwNDVfYWRjX25pZHM7CisJc3BlYy0+Y2Fwc3JjX25pZHMgPSBjeHQ1MDQ1X2NhcHNyY19uaWRzOworCXNwZWMtPmlucHV0X211eCA9ICZjeHQ1MDQ1X2NhcHR1cmVfc291cmNlOworCXNwZWMtPm51bV9taXhlcnMgPSAxOworCXNwZWMtPm1peGVyc1swXSA9IGN4dDUwNDVfbWl4ZXJzOworCXNwZWMtPm51bV9pbml0X3ZlcmJzID0gMTsKKwlzcGVjLT5pbml0X3ZlcmJzWzBdID0gY3h0NTA0NV9pbml0X3ZlcmJzOworCXNwZWMtPnNwZGlmX3JvdXRlID0gMDsKKwlzcGVjLT5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShjeHQ1MDQ1X21vZGVzKSwKKwlzcGVjLT5jaGFubmVsX21vZGUgPSBjeHQ1MDQ1X21vZGVzLAorCisKKwljb2RlYy0+cGF0Y2hfb3BzID0gY29uZXhhbnRfcGF0Y2hfb3BzOworCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSBjeHQ1MDQ1X2hwX3Vuc29sX2V2ZW50OworCisJYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIENYVDUwNDVfTU9ERUxTLAorCQkJCQkJICBjeHQ1MDQ1X21vZGVscywKKwkJCQkJCSAgY3h0NTA0NV9jZmdfdGJsKTsKKwlzd2l0Y2ggKGJvYXJkX2NvbmZpZykgeworCWNhc2UgQ1hUNTA0NV9MQVBUT1A6CisJCXNwZWMtPmlucHV0X211eCA9ICZjeHQ1MDQ1X2NhcHR1cmVfc291cmNlOworCQlzcGVjLT5udW1faW5pdF92ZXJicyA9IDI7CisJCXNwZWMtPmluaXRfdmVyYnNbMV0gPSBjeHQ1MDQ1X2luaXRfdmVyYnM7CisJCXNwZWMtPm1peGVyc1swXSA9IGN4dDUwNDVfbWl4ZXJzOworCQljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSBjeHQ1MDQ1X2luaXQ7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKwljYXNlIENYVDUwNDVfVEVTVDoKKwkJc3BlYy0+aW5wdXRfbXV4ID0gJmN4dDUwNDVfdGVzdF9jYXB0dXJlX3NvdXJjZTsKKwkJc3BlYy0+bWl4ZXJzWzBdID0gY3h0NTA0NV90ZXN0X21peGVyOworCQlzcGVjLT5pbml0X3ZlcmJzWzBdID0gY3h0NTA0NV90ZXN0X2luaXRfdmVyYnM7CisjZW5kaWYJCisJfQorCXJldHVybiAwOworfQorCisKKy8qIENvbmV4YW50IDUwNDcgc3BlY2lmaWMgKi8KKworc3RhdGljIGhkYV9uaWRfdCBjeHQ1MDQ3X2RhY19uaWRzWzFdID0geyAweDEwIH07CitzdGF0aWMgaGRhX25pZF90IGN4dDUwNDdfYWRjX25pZHNbMV0gPSB7IDB4MTIgfTsKK3N0YXRpYyBoZGFfbmlkX3QgY3h0NTA0N19jYXBzcmNfbmlkc1sxXSA9IHsgMHgxYSB9OworI2RlZmluZSBDWFQ1MDQ3X1NQRElGX09VVAkweDExCisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBjeHQ1MDQ3X21vZGVzWzFdID0geworCXsgMiwgTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGN4dDUwNDdfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDIsCisJLml0ZW1zID0geworCQl7ICJFeHRNaWMiLCAweDEgfSwKKwkJeyAiSW50TWljIiwgMHgyIH0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGN4dDUwNDdfaHBfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDEsCisJLml0ZW1zID0geworCQl7ICJFeHRNaWMiLCAweDEgfSwKKwl9Cit9OworCisvKiB0dXJuIG9uL29mZiBFQVBEICgrIG11dGUgSFApIGFzIGEgbWFzdGVyIHN3aXRjaCAqLworc3RhdGljIGludCBjeHQ1MDQ3X2hwX21hc3Rlcl9zd19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlpZiAoIWNvbmV4YW50X2VhcGRfcHV0KGtjb250cm9sLCB1Y29udHJvbCkpCisJCXJldHVybiAwOworCisJLyogdG9nZ2xlIEhQIG11dGUgYXBwcm9wcmlhdGVseSAqLworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMywgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgc3BlYy0+Y3VyX2VhcGQgPyAwIDogMHg4MCk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDEzLCAxLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDgwLCBzcGVjLT5jdXJfZWFwZCA/IDAgOiAweDgwKTsKKwlyZXR1cm4gMTsKK30KKworI2lmIDAKKy8qIGJpbmQgdm9sdW1lcyBvZiBib3RoIE5JRCAweDEzIGFuZCAweDFkICovCitzdGF0aWMgaW50IGN4dDUwNDdfaHBfbWFzdGVyX3ZvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlsb25nICp2YWxwID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWU7CisJaW50IGNoYW5nZTsKKworCWNoYW5nZSA9IHNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxYywgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkJICAweDdmLCB2YWxwWzBdICYgMHg3Zik7CisJY2hhbmdlIHw9IHNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxYywgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkJICAgMHg3ZiwgdmFscFsxXSAmIDB4N2YpOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMywgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg3ZiwgdmFscFswXSAmIDB4N2YpOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMywgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg3ZiwgdmFscFsxXSAmIDB4N2YpOworCXJldHVybiBjaGFuZ2U7Cit9CisjZW5kaWYKKworLyogbXV0ZSBpbnRlcm5hbCBzcGVha2VyIGlmIEhQIGlzIHBsdWdnZWQgKi8KK3N0YXRpYyB2b2lkIGN4dDUwNDdfaHBfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDEzLCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDFjLCAwLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDgwLCBwcmVzZW50ID8gMHg4MCA6IDApOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxYywgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgcHJlc2VudCA/IDB4ODAgOiAwKTsKK30KKworLyogdG9nZ2xlIGlucHV0IG9mIGJ1aWx0LWluIGFuZCBtaWMgamFjayBhcHByb3ByaWF0ZWx5ICovCitzdGF0aWMgdm9pZCBjeHQ1MDQ3X2hwX2F1dG9taWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBtaWNfamFja19vbltdID0geworCQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwfSwKKwkJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCisJCXt9CisJfTsKKwlzdGF0aWMgc3RydWN0IGhkYV92ZXJiIG1pY19qYWNrX29mZltdID0geworCQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwfSwKKwkJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCisJCXt9CisJfTsKKwl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKworCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MDgsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwlpZiAocHJlc2VudCkKKwkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgbWljX2phY2tfb24pOworCWVsc2UKKwkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgbWljX2phY2tfb2ZmKTsKK30KKworLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgc2Vuc2luZyAqLworc3RhdGljIHZvaWQgY3h0NTA0N19ocF91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgIHVuc2lnbmVkIGludCByZXMpCit7CisJcmVzID4+PSAyNjsKKwlzd2l0Y2ggKHJlcykgeworCWNhc2UgQ09ORVhBTlRfSFBfRVZFTlQ6CisJCWN4dDUwNDdfaHBfYXV0b211dGUoY29kZWMpOworCQlicmVhazsKKwljYXNlIENPTkVYQU5UX01JQ19FVkVOVDoKKwkJY3h0NTA0N19ocF9hdXRvbWljKGNvZGVjKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA0N19taXhlcnNbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsCisJCS5pbmZvID0gY29uZXhhbnRfbXV4X2VudW1faW5mbywKKwkJLmdldCA9IGNvbmV4YW50X211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGNvbmV4YW50X211eF9lbnVtX3B1dAorCX0sCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJ5cGFzcyBDYXB0dXJlIFZvbHVtZSIsIDB4MTksIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBCeXBhc3MgQ2FwdHVyZSBTd2l0Y2giLCAweDE5LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxMiwgMHgwMywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDEyLCAweDAzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlBDTSBWb2x1bWUiLCAweDEwLCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiUENNIFN3aXRjaCIsIDB4MTAsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAweDEzLCAweDAwLCBIREFfT1VUUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSBjb25leGFudF9lYXBkX2luZm8sCisJCS5nZXQgPSBjb25leGFudF9lYXBkX2dldCwKKwkJLnB1dCA9IGN4dDUwNDdfaHBfbWFzdGVyX3N3X3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSAweDEzLAorCX0sCisKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGN4dDUwNDdfaHBfbWl4ZXJzW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAorCQkuaW5mbyA9IGNvbmV4YW50X211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBjb25leGFudF9tdXhfZW51bV9nZXQsCisJCS5wdXQgPSBjb25leGFudF9tdXhfZW51bV9wdXQKKwl9LAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCeXBhc3MgQ2FwdHVyZSBWb2x1bWUiLCAweDE5LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgQnlwYXNzIENhcHR1cmUgU3dpdGNoIiwgMHgxOSwweDAyLEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDEyLCAweDAzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MTIsIDB4MDMsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiUENNIFZvbHVtZSIsIDB4MTAsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJQQ00gU3dpdGNoIiwgMHgxMCwgMHgwMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MTMsIDB4MDAsIEhEQV9PVVRQVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAorCQkuaW5mbyA9IGNvbmV4YW50X2VhcGRfaW5mbywKKwkJLmdldCA9IGNvbmV4YW50X2VhcGRfZ2V0LAorCQkucHV0ID0gY3h0NTA0N19ocF9tYXN0ZXJfc3dfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IDB4MTMsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGN4dDUwNDdfaW5pdF92ZXJic1tdID0geworCS8qIExpbmUgaW4sIE1pYywgQnVpbHQtaW4gTWljICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfEFDX1BJTkNUTF9WUkVGXzUwIH0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfEFDX1BJTkNUTF9WUkVGXzUwIH0sCisJLyogSFAsIEFtcCAgKi8KKwl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJezB4MUEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLDB4MDN9LAorCXsweDFBLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCSBBQ19BTVBfU0VUX09VVFBVVHxBQ19BTVBfU0VUX1JJR0hUfEFDX0FNUF9TRVRfTEVGVHwweDAwfSwKKwl7MHgxQSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkgQUNfQU1QX1NFVF9PVVRQVVR8QUNfQU1QX1NFVF9SSUdIVHxBQ19BTVBfU0VUX0xFRlR8MHgwM30sCisJLyogUmVjb3JkIHNlbGVjdG9yOiBGcm9udCBtaWMgKi8KKwl7MHgxMiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsMHgwM30sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJIEFDX0FNUF9TRVRfSU5QVVR8QUNfQU1QX1NFVF9SSUdIVHxBQ19BTVBfU0VUX0xFRlR8MHgxN30sCisJLyogU1BESUYgcm91dGU6IFBDTSAqLworCXsgMHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MCB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIGNvbmZpZ3VyYXRpb24gZm9yIFRvc2hpYmEgTGFwdG9wcyAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBjeHQ1MDQ3X3Rvc2hpYmFfaW5pdF92ZXJic1tdID0geworCXsweDEzLCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMHgwIH0sIC8qIGRlZmF1bHQgb24gKi8KKwkvKiBwaW4gc2Vuc2luZyBvbiBIUCBhbmQgTWljIGphY2tzICovCisJezB4MTMsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBDT05FWEFOVF9IUF9FVkVOVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBDT05FWEFOVF9NSUNfRVZFTlR9LAorCXt9Cit9OworCisvKiBjb25maWd1cmF0aW9uIGZvciBIUCBMYXB0b3BzICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGN4dDUwNDdfaHBfaW5pdF92ZXJic1tdID0geworCS8qIHBpbiBzZW5zaW5nIG9uIEhQIGFuZCBNaWMgamFja3MgKi8KKwl7MHgxMywgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IENPTkVYQU5UX0hQX0VWRU5UfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IENPTkVYQU5UX01JQ19FVkVOVH0sCisJe30KK307CisKKy8qIFRlc3QgY29uZmlndXJhdGlvbiBmb3IgZGVidWdnaW5nLCBtb2RlbGxlZCBhZnRlciB0aGUgQUxDMjYwIHRlc3QKKyAqIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCitzdGF0aWMgc3RydWN0IGhkYV9pbnB1dF9tdXggY3h0NTA0N190ZXN0X2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSA1LAorCS5pdGVtcyA9IHsKKwkJeyAiTUlYRVIiLCAweDAgfSwKKwkJeyAiTElORTEgcGluIiwgMHgxIH0sCisJCXsgIk1JQzEgcGluIiwgMHgyIH0sCisJCXsgIk1JQzIgcGluIiwgMHgzIH0sCisJCXsgIkNEIHBpbiIsIDB4NCB9LAorICAgICAgICB9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGN4dDUwNDdfdGVzdF9taXhlcltdID0geworCisJLyogT3V0cHV0IG9ubHkgY29udHJvbHMgKi8KKwlIREFfQ09ERUNfVk9MVU1FKCJPdXRBbXAtMSBWb2x1bWUiLCAweDEwLCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiT3V0QW1wLTEgU3dpdGNoIiwgMHgxMCwweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJPdXRBbXAtMiBWb2x1bWUiLCAweDFjLCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiT3V0QW1wLTIgU3dpdGNoIiwgMHgxYywgMHgwMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDFkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MWQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZFBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MTMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRQaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDEzLCAweDAsIEhEQV9PVVRQVVQpLAorCisJLyogTW9kZXMgZm9yIHJldGFza2luZyBwaW4gd2lkZ2V0cyAqLworCUNYVF9QSU5fTU9ERSgiTElORTEgcGluIG1vZGUiLCAweDE0LCBDWFRfUElOX0RJUl9JTk9VVCksCisJQ1hUX1BJTl9NT0RFKCJNSUMxIHBpbiBtb2RlIiwgMHgxNSwgQ1hUX1BJTl9ESVJfSU5PVVQpLAorCisJLyogTG9vcGJhY2sgbWl4ZXIgY29udHJvbHMgKi8KKwlIREFfQ09ERUNfVk9MVU1FKCJNSUMxIFBsYXliYWNrIFZvbHVtZSIsIDB4MTksIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1JQzEgUGxheWJhY2sgU3dpdGNoIiwgMHgxOSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNSUMyIFBsYXliYWNrIFZvbHVtZSIsIDB4MTksIDB4MDMsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1JQzIgUGxheWJhY2sgU3dpdGNoIiwgMHgxOSwgMHgwMywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMSU5FIFBsYXliYWNrIFZvbHVtZSIsIDB4MTksIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxJTkUgUGxheWJhY2sgU3dpdGNoIiwgMHgxOSwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDE5LCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDE5LCAweDA0LCBIREFfSU5QVVQpLAorCisjaWYgMCAgIAorCS8qIENvbnRyb2xzIGZvciBHUElPIHBpbnMsIGFzc3VtaW5nIHRoZXkgZXhpc3QgYW5kIGFyZSBjb25maWd1cmVkIGFzIG91dHB1dHMgKi8KKwlDWFRfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMCIsIDB4MDEsIDB4MDEpLAorCUNYVF9HUElPX0RBVEFfU1dJVENIKCJHUElPIHBpbiAxIiwgMHgwMSwgMHgwMiksCisJQ1hUX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDIiLCAweDAxLCAweDA0KSwKKwlDWFRfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMyIsIDB4MDEsIDB4MDgpLAorI2VuZGlmCisJQ1hUX1NQRElGX0NUUkxfU1dJVENIKCJTUERJRiBQbGF5YmFjayBTd2l0Y2giLCAweDE4LCAweDAxKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxOSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDE5LCAweDAsIEhEQV9PVVRQVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5pbmZvID0gY29uZXhhbnRfbXV4X2VudW1faW5mbywKKwkJLmdldCA9IGNvbmV4YW50X211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGNvbmV4YW50X211eF9lbnVtX3B1dCwKKwl9LAorCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBjeHQ1MDQ3X3Rlc3RfaW5pdF92ZXJic1tdID0geworCS8qIEVuYWJsZSBhbGwgR1BJT3MgYXMgb3V0cHV0cyB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgMCAqLworCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RJUkVDVElPTiwgMHgwZn0sCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwMH0sCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwZn0sCisKKwkvKiBFbmFibGUgcmV0YXNraW5nIHBpbnMgYXMgb3V0cHV0LCBpbml0aWFsbHkgd2l0aG91dCBwb3dlciBhbXAgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKworCS8qIERpc2FibGUgZGlnaXRhbCAoU1BESUYpIHBpbnMgaW5pdGlhbGx5LCBidXQgdXNlcnMgY2FuIGVuYWJsZQorCSAqIHRoZW0gdmlhIGEgbWl4ZXIgc3dpdGNoLiAgSW4gdGhlIGNhc2Ugb2YgU1BESUYtb3V0LCB0aGlzIGluaXR2ZXJiCisJICogcGF5bG9hZCBhbHNvIHNldHMgdGhlIGdlbmVyYXRpb24gdG8gMCwgb3V0cHV0IHRvIGJlIGluICJjb25zdW1lciIKKwkgKiBQQ00gZm9ybWF0LCBjb3B5cmlnaHQgYXNzZXJ0ZWQsIG5vIHByZS1lbXBoYXNpcyBhbmQgbm8gdmFsaWRpdHkKKwkgKiBjb250cm9sLgorCSAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwgMH0sCisKKwkvKiBFbnN1cmUgbWljMSwgbWljMiwgbGluZTEgcGluIHdpZGdldHMgdGFrZSBpbnB1dCBmcm9tIHRoZSAKKwkgKiBPVVQxIHN1bSBidXMgd2hlbiBhY3RpbmcgYXMgYW4gb3V0cHV0LgorCSAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwfSwKKworCS8qIFN0YXJ0IHdpdGggb3V0cHV0IHN1bSB3aWRnZXRzIG11dGVkIGFuZCB0aGVpciBvdXRwdXQgZ2FpbnMgYXQgbWluICovCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCisJLyogVW5tdXRlIHJldGFza2luZyBwaW4gd2lkZ2V0IG91dHB1dCBidWZmZXJzIHNpbmNlIHRoZSBkZWZhdWx0CisJICogc3RhdGUgYXBwZWFycyB0byBiZSBvdXRwdXQuICBBcyB0aGUgcGluIG1vZGUgaXMgY2hhbmdlZCBieSB0aGUKKwkgKiB1c2VyIHRoZSBwaW4gbW9kZSBjb250cm9sIHdpbGwgdGFrZSBjYXJlIG9mIGVuYWJsaW5nIHRoZSBwaW4ncworCSAqIGlucHV0L291dHB1dCBidWZmZXJzIGFzIG5lZWRlZC4KKwkgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCS8qIE11dGUgY2FwdHVyZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgxMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCisJLyogU2V0IEFEQyBjb25uZWN0aW9uIHNlbGVjdCB0byBtYXRjaCBkZWZhdWx0IG1peGVyIHNldHRpbmcgKG1pYzEKKwkgKiBwaW4pCisJICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKworCS8qIE11dGUgYWxsIGlucHV0cyB0byBtaXhlciB3aWRnZXQgKGV2ZW4gdW5jb25uZWN0ZWQgb25lcykgKi8KKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LCAvKiBtaWMxIHBpbiAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sIC8qIG1pYzIgcGluICovCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwgLyogbGluZTEgcGluICovCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwgLyogbGluZTIgcGluICovCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwgLyogQ0QgcGluICovCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwgLyogQmVlcC1nZW4gcGluICovCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDYpfSwgLyogTGluZS1vdXQgcGluICovCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDcpfSwgLyogSFAtcGluIHBpbiAqLworCisJeyB9Cit9OworI2VuZGlmCisKKworLyogaW5pdGlhbGl6ZSBqYWNrLXNlbnNpbmcsIHRvbyAqLworc3RhdGljIGludCBjeHQ1MDQ3X2hwX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJY29uZXhhbnRfaW5pdChjb2RlYyk7CisJY3h0NTA0N19ocF9hdXRvbXV0ZShjb2RlYyk7CisJY3h0NTA0N19ocF9hdXRvbWljKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworCitlbnVtIHsKKwlDWFQ1MDQ3X0xBUFRPUCwJCS8qIExhcHRvcHMgdy9vIEVBUEQgc3VwcG9ydCAqLworCUNYVDUwNDdfTEFQVE9QX0hQLAkvKiBTb21lIEhQIGxhcHRvcHMgKi8KKwlDWFQ1MDQ3X0xBUFRPUF9FQVBELAkvKiBMYXB0b3BzIHdpdGggRUFQRCBzdXBwb3J0ICovCisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworCUNYVDUwNDdfVEVTVCwKKyNlbmRpZgorCUNYVDUwNDdfTU9ERUxTCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY3h0NTA0N19tb2RlbHNbQ1hUNTA0N19NT0RFTFNdID0geworCVtDWFQ1MDQ3X0xBUFRPUF0JPSAibGFwdG9wIiwKKwlbQ1hUNTA0N19MQVBUT1BfSFBdCT0gImxhcHRvcC1ocCIsCisJW0NYVDUwNDdfTEFQVE9QX0VBUERdCT0gImxhcHRvcC1lYXBkIiwKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJW0NYVDUwNDdfVEVTVF0JCT0gInRlc3QiLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgY3h0NTA0N19jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzBhMCwgIkhQIERWMTAwMCIsIENYVDUwNDdfTEFQVE9QKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGIyLCAiSFAgRFYyMDAwVC9EVjMwMDBUIiwgQ1hUNTA0N19MQVBUT1ApLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwYTUsICJIUCBEVjUyMDBUL0RWODAwMFQiLCBDWFQ1MDQ3X0xBUFRPUF9IUCksCisJU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYzMSwgIlRvc2hpYmEgUDEwMCIsIENYVDUwNDdfTEFQVE9QX0VBUEQpLAorCXt9Cit9OworCitzdGF0aWMgaW50IHBhdGNoX2N4dDUwNDcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWM7CisJaW50IGJvYXJkX2NvbmZpZzsKKworCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmICghc3BlYykKKwkJcmV0dXJuIC1FTk9NRU07CisJbXV0ZXhfaW5pdCgmc3BlYy0+YW1wX211dGV4KTsKKwljb2RlYy0+c3BlYyA9IHNwZWM7CisKKwlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSAyOworCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gQVJSQVlfU0laRShjeHQ1MDQ3X2RhY19uaWRzKTsKKwlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IGN4dDUwNDdfZGFjX25pZHM7CisJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBDWFQ1MDQ3X1NQRElGX09VVDsKKwlzcGVjLT5udW1fYWRjX25pZHMgPSAxOworCXNwZWMtPmFkY19uaWRzID0gY3h0NTA0N19hZGNfbmlkczsKKwlzcGVjLT5jYXBzcmNfbmlkcyA9IGN4dDUwNDdfY2Fwc3JjX25pZHM7CisJc3BlYy0+aW5wdXRfbXV4ID0gJmN4dDUwNDdfY2FwdHVyZV9zb3VyY2U7CisJc3BlYy0+bnVtX21peGVycyA9IDE7CisJc3BlYy0+bWl4ZXJzWzBdID0gY3h0NTA0N19taXhlcnM7CisJc3BlYy0+bnVtX2luaXRfdmVyYnMgPSAxOworCXNwZWMtPmluaXRfdmVyYnNbMF0gPSBjeHQ1MDQ3X2luaXRfdmVyYnM7CisJc3BlYy0+c3BkaWZfcm91dGUgPSAwOworCXNwZWMtPm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGN4dDUwNDdfbW9kZXMpLAorCXNwZWMtPmNoYW5uZWxfbW9kZSA9IGN4dDUwNDdfbW9kZXMsCisKKwljb2RlYy0+cGF0Y2hfb3BzID0gY29uZXhhbnRfcGF0Y2hfb3BzOworCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSBjeHQ1MDQ3X2hwX3Vuc29sX2V2ZW50OworCisJYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIENYVDUwNDdfTU9ERUxTLAorCQkJCQkJICBjeHQ1MDQ3X21vZGVscywKKwkJCQkJCSAgY3h0NTA0N19jZmdfdGJsKTsKKwlzd2l0Y2ggKGJvYXJkX2NvbmZpZykgeworCWNhc2UgQ1hUNTA0N19MQVBUT1A6CisJCWJyZWFrOworCWNhc2UgQ1hUNTA0N19MQVBUT1BfSFA6CisJCXNwZWMtPmlucHV0X211eCA9ICZjeHQ1MDQ3X2hwX2NhcHR1cmVfc291cmNlOworCQlzcGVjLT5udW1faW5pdF92ZXJicyA9IDI7CisJCXNwZWMtPmluaXRfdmVyYnNbMV0gPSBjeHQ1MDQ3X2hwX2luaXRfdmVyYnM7CisJCXNwZWMtPm1peGVyc1swXSA9IGN4dDUwNDdfaHBfbWl4ZXJzOworCQljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSBjeHQ1MDQ3X2hwX2luaXQ7CisJCWJyZWFrOworCWNhc2UgQ1hUNTA0N19MQVBUT1BfRUFQRDoKKwkJc3BlYy0+bnVtX2luaXRfdmVyYnMgPSAyOworCQlzcGVjLT5pbml0X3ZlcmJzWzFdID0gY3h0NTA0N190b3NoaWJhX2luaXRfdmVyYnM7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKwljYXNlIENYVDUwNDdfVEVTVDoKKwkJc3BlYy0+aW5wdXRfbXV4ID0gJmN4dDUwNDdfdGVzdF9jYXB0dXJlX3NvdXJjZTsKKwkJc3BlYy0+bWl4ZXJzWzBdID0gY3h0NTA0N190ZXN0X21peGVyOworCQlzcGVjLT5pbml0X3ZlcmJzWzBdID0gY3h0NTA0N190ZXN0X2luaXRfdmVyYnM7CisjZW5kaWYJCisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF9jb25leGFudFtdID0geworCXsgLmlkID0gMHgxNGYxNTA0NSwgLm5hbWUgPSAiQ1hUNTA0NSIsIC5wYXRjaCA9IHBhdGNoX2N4dDUwNDUgfSwKKwl7IC5pZCA9IDB4MTRmMTUwNDcsIC5uYW1lID0gIkNYVDUwNDciLCAucGF0Y2ggPSBwYXRjaF9jeHQ1MDQ3IH0sCisJe30gLyogdGVybWluYXRvciAqLworfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggNGUwYzNjMS4uMTQ1NjgyYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTMyLDYgKzMyLDEwIEBACiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCiAKKyNkZWZpbmUgQUxDODgwX0ZST05UX0VWRU5UCQkweDAxCisjZGVmaW5lIEFMQzg4MF9EQ1ZPTF9FVkVOVAkJMHgwMgorI2RlZmluZSBBTEM4ODBfSFBfRVZFTlQJCQkweDA0CisjZGVmaW5lIEFMQzg4MF9NSUNfRVZFTlQJCTB4MDgKIAogLyogQUxDODgwIGJvYXJkIGNvbmZpZyB0eXBlICovCiBlbnVtIHsKQEAgLTQ4LDcgKzUyLDEwIEBACiAJQUxDODgwX0FTVVNfRElHLAogCUFMQzg4MF9BU1VTX1cxViwKIAlBTEM4ODBfQVNVU19ESUcyLAorCUFMQzg4MF9GVUpJVFNVLAogCUFMQzg4MF9VTklXSUxMX0RJRywKKwlBTEM4ODBfVU5JV0lMTCwKKwlBTEM4ODBfVU5JV0lMTF9QNTMsCiAJQUxDODgwX0NMRVZPLAogCUFMQzg4MF9UQ0xfUzcwMCwKIAlBTEM4ODBfTEcsCkBAIC03Nyw4ICs4NCwxMiBAQAogLyogQUxDMjYyIG1vZGVscyAqLwogZW51bSB7CiAJQUxDMjYyX0JBU0lDLAorCUFMQzI2Ml9ISVBQTywKKwlBTEMyNjJfSElQUE9fMSwKIAlBTEMyNjJfRlVKSVRTVSwKIAlBTEMyNjJfSFBfQlBDLAorCUFMQzI2Ml9IUF9CUENfRDcwMDBfV0wsCisJQUxDMjYyX0hQX0JQQ19ENzAwMF9XRiwKIAlBTEMyNjJfQkVOUV9FRDgsCiAJQUxDMjYyX0FVVE8sCiAJQUxDMjYyX01PREVMX0xBU1QgLyogbGFzdCB0YWcgKi8KQEAgLTkxLDE2ICsxMDIsMzAgQEAKIAlBTEM4NjFfM1NUX0RJRywKIAlBTEM4NjFfNlNUX0RJRywKIAlBTEM4NjFfVU5JV0lMTF9NMzEsCisJQUxDODYxX1RPU0hJQkEsCisJQUxDODYxX0FTVVMsCisJQUxDODYxX0FTVVNfTEFQVE9QLAogCUFMQzg2MV9BVVRPLAogCUFMQzg2MV9NT0RFTF9MQVNULAogfTsKIAorLyogQUxDODYxLVZEIG1vZGVscyAqLworZW51bSB7CisJQUxDNjYwVkRfM1NULAorCUFMQzg2MVZEXzNTVCwKKwlBTEM4NjFWRF8zU1RfRElHLAorCUFMQzg2MVZEXzZTVF9ESUcsCisJQUxDODYxVkRfQVVUTywKKwlBTEM4NjFWRF9NT0RFTF9MQVNULAorfTsKKwogLyogQUxDODgyIG1vZGVscyAqLwogZW51bSB7CiAJQUxDODgyXzNTVF9ESUcsCiAJQUxDODgyXzZTVF9ESUcsCiAJQUxDODgyX0FSSU1BLAogCUFMQzg4Ml9BVVRPLAorCUFMQzg4NV9NQUNQUk8sCiAJQUxDODgyX01PREVMX0xBU1QsCiB9OwogCkBAIC0xMTAsOCArMTM1LDEyIEBACiAJQUxDODgzXzNTVF82Y2hfRElHLAogCUFMQzg4M18zU1RfNmNoLAogCUFMQzg4M182U1RfRElHLAorCUFMQzg4M19UQVJHQV9ESUcsCisJQUxDODgzX1RBUkdBXzJjaF9ESUcsCiAJQUxDODg4X0RFTU9fQk9BUkQsCiAJQUxDODgzX0FDRVIsCisJQUxDODgzX01FRElPTiwKKwlBTEM4ODNfTEFQVE9QX0VBUEQsCiAJQUxDODgzX0FVVE8sCiAJQUxDODgzX01PREVMX0xBU1QsCiB9OwpAQCAtMTAxNSw2ICsxMDQ0LDYwIEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAorLyogVW5pd2lsbCAqLworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4MF91bml3aWxsX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiSFBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiSFBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiaVNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJpU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiUEMgU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJQQyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4MF9mdWppdHN1X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkV4dCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJFeHQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4MF91bml3aWxsX3A1M19taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkhQaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkhQaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoImlTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiaVNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKIC8qCiAgKiBidWlsZCBjb250cm9sIGVsZW1lbnRzCiAgKi8KQEAgLTEyNDgsNiArMTMzMSwxNTkgQEAKIAl7IH0KIH07CiAKKy8qCisgKiBVbml3aWxsIHBpbiBjb25maWd1cmF0aW9uOgorICogSFAgPSAweDE0LCBJbnRlcm5hbFNwZWFrZXIgPSAweDE1LCBtaWMgPSAweDE4LCBpbnRlcm5hbCBtaWMgPSAweDE5LAorICogbGluZSA9IDB4MWEKKyAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfdW5pd2lsbF9pbml0X3ZlcmJzW10gPSB7CisJezB4MTMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogSFAgKi8KKworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCisKKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIHsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sICovCisJLyogezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwgKi8KKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCisJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCisKKwl7IH0KK307CisKKy8qCisqIFVuaXdpbGwgUDUzCisqIEhQID0gMHgxNCwgSW50ZXJuYWxTcGVha2VyID0gMHgxNSwgbWljID0gMHgxOSwgCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3VuaXdpbGxfcDUzX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgxMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLworCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCisKKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCisJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0RDVk9MX0VWRU5UfSwKKworCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfYmVlcF9pbml0X3ZlcmJzW10gPSB7CisJeyAweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDUpIH0sCisJeyB9Cit9OworCisvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCitzdGF0aWMgdm9pZCBhbGM4ODBfdW5pd2lsbF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKyAJdW5zaWduZWQgaW50IHByZXNlbnQ7CisKKyAJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxNCwgMCwKKwkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNSwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgcHJlc2VudCA/IDB4ODAgOiAwKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTUsIDEsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE2LCAwLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDgwLCBwcmVzZW50ID8gMHg4MCA6IDApOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNiwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgcHJlc2VudCA/IDB4ODAgOiAwKTsKKworCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTgsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDBiLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJICAgIDB4NzAwMCB8ICgweDAxIDw8IDgpIHwgKHByZXNlbnQgPyAweDgwIDogMCkpOworfQorCitzdGF0aWMgdm9pZCBhbGM4ODBfdW5pd2lsbF91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwkvKiBMb29rcyBsaWtlIHRoZSB1bnNvbCBldmVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQKKwkgKiBkZWZpbml0aW9uLiAgNGJpdCB0YWcgaXMgcGxhY2VkIGF0IDI4IGJpdCEKKwkgKi8KKwlpZiAoKHJlcyA+PiAyOCkgPT0gQUxDODgwX0hQX0VWRU5UIHx8CisJICAgIChyZXMgPj4gMjgpID09IEFMQzg4MF9NSUNfRVZFTlQpCisJCWFsYzg4MF91bml3aWxsX2F1dG9tdXRlKGNvZGVjKTsKK30KKworc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfcDUzX2hwX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKworIAlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE0LCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTUsIDAsIEhEQV9JTlBVVCwgMCwKKwkJCQkgMHg4MCwgcHJlc2VudCA/IDB4ODAgOiAwKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTUsIDEsIEhEQV9JTlBVVCwgMCwKKwkJCQkgMHg4MCwgcHJlc2VudCA/IDB4ODAgOiAwKTsKK30KKworc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfcDUzX2Rjdm9sX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBwcmVzZW50OworCQorCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MjEsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9WT0xVTUVfS05PQl9DT05UUk9MLCAwKSAmIDB4N2Y7CisKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MGMsIDAsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4N2YsIHByZXNlbnQpOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgwYywgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg3ZiwgIHByZXNlbnQpOworCisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDBkLCAwLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDdmLCAgcHJlc2VudCk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDBkLCAxLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDdmLCBwcmVzZW50KTsKKworfQorc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfcDUzX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgcmVzKQoreworCS8qIExvb2tzIGxpa2UgdGhlIHVuc29sIGV2ZW50IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBzdGFuZGFyZAorCSAqIGRlZmluaXRpb24uICA0Yml0IHRhZyBpcyBwbGFjZWQgYXQgMjggYml0IQorCSAqLworCWlmICgocmVzID4+IDI4KSA9PSBBTEM4ODBfSFBfRVZFTlQpCisJCWFsYzg4MF91bml3aWxsX3A1M19ocF9hdXRvbXV0ZShjb2RlYyk7CisJaWYgKChyZXMgPj4gMjgpID09IEFMQzg4MF9EQ1ZPTF9FVkVOVCkgCisJCWFsYzg4MF91bml3aWxsX3A1M19kY3ZvbF9hdXRvbXV0ZShjb2RlYyk7Cit9CisKIC8qIEZJWE1FISAqLwogLyoKICAqIEYxNzM0IHBpbiBjb25maWd1cmF0aW9uOgpAQCAtMjEyNSwxNTkgKzIzNjEsMTEyIEBACiAvKgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBhbGM4ODBfY2ZnX3RibFtdID0gewotCS8qIEJhY2sgMyBqYWNrLCBmcm9udCAyIGphY2sgKi8KLQl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrIiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwMCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwMSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwMiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwMywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwNCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwNSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwNiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwNywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwOCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwOSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwYSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwYiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwYywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwZCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwZSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIwZiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIxMCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIxMSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIxMiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIxMywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIxNCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIzNCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTMwMiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTMwMywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTMwNCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTMwNiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTMwNywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTQwNCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4YTEwMSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDdiLCAucGNpX3N1YmRldmljZSA9IDB4MzAzMSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDdiLCAucGNpX3N1YmRldmljZSA9IDB4NDAzNiwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDdiLCAucGNpX3N1YmRldmljZSA9IDB4NDAzNywgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDdiLCAucGNpX3N1YmRldmljZSA9IDB4NDAzOCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDdiLCAucGNpX3N1YmRldmljZSA9IDB4NDA0MCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDdiLCAucGNpX3N1YmRldmljZSA9IDB4NDA0MSwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQkvKiBUQ0wgUzcwMCAqLwotCXsgLm1vZGVsbmFtZSA9ICJ0Y2wiLCAuY29uZmlnID0gQUxDODgwX1RDTF9TNzAwIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTlkYiwgLnBjaV9zdWJkZXZpY2UgPSAweDQxODgsIC5jb25maWcgPSBBTEM4ODBfVENMX1M3MDAgfSwKLQotCS8qIEJhY2sgMyBqYWNrLCBmcm9udCAyIGphY2sgKEludGVybmFsIGFkZCBBdXgtSW4pICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAyNSwgLnBjaV9zdWJkZXZpY2UgPSAweGUzMTAsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0ZCwgLnBjaV9zdWJkZXZpY2UgPSAweDgxZDYsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sIAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNGQsIC5wY2lfc3ViZGV2aWNlID0gMHg4MWEwLCAuY29uZmlnID0gQUxDODgwXzNTVCB9LAotCi0JLyogQmFjayAzIGphY2sgcGx1cyAxIFNQRElGIG91dCBqYWNrLCBmcm9udCAyIGphY2sgKi8KLQl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrLWRpZ291dCIsIC5jb25maWcgPSBBTEM4ODBfM1NUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDgwODYsIC5wY2lfc3ViZGV2aWNlID0gMHhlMzA4LCAuY29uZmlnID0gQUxDODgwXzNTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDI1LCAucGNpX3N1YmRldmljZSA9IDB4MDA3MCwgLmNvbmZpZyA9IEFMQzg4MF8zU1RfRElHIH0sCi0KLQkvKiBDbGV2byBsYXB0b3BzICovCi0JeyAubW9kZWxuYW1lID0gImNsZXZvIiwgLmNvbmZpZyA9IEFMQzg4MF9DTEVWTyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE1NTgsIC5wY2lfc3ViZGV2aWNlID0gMHgwNTIwLAotCSAgLmNvbmZpZyA9IEFMQzg4MF9DTEVWTyB9LCAvKiBDbGV2byBtNTIwRyBOQiAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE1NTgsIC5wY2lfc3ViZGV2aWNlID0gMHgwNjYwLAotCSAgLmNvbmZpZyA9IEFMQzg4MF9DTEVWTyB9LCAvKiBDbGV2byBtNjY1biAqLwotCi0JLyogQmFjayAzIGphY2sgcGx1cyAxIFNQRElGIG91dCBqYWNrLCBmcm9udCAyIGphY2sgKEludGVybmFsIGFkZCBBdXgtSW4pKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTMwNSwgLmNvbmZpZyA9IEFMQzg4MF8zU1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGQ0MDIsIC5jb25maWcgPSBBTEM4ODBfM1NUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMjUsIC5wY2lfc3ViZGV2aWNlID0gMHhlMzA5LCAuY29uZmlnID0gQUxDODgwXzNTVF9ESUcgfSwKLQotCS8qIEJhY2sgNSBqYWNrLCBmcm9udCAyIGphY2sgKi8KLQl7IC5tb2RlbG5hbWUgPSAiNXN0YWNrIiwgLmNvbmZpZyA9IEFMQzg4MF81U1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDdiLCAucGNpX3N1YmRldmljZSA9IDB4MzAzMywgLmNvbmZpZyA9IEFMQzg4MF81U1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDdiLCAucGNpX3N1YmRldmljZSA9IDB4NDAzOSwgLmNvbmZpZyA9IEFMQzg4MF81U1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDdiLCAucGNpX3N1YmRldmljZSA9IDB4MzAzMiwgLmNvbmZpZyA9IEFMQzg4MF81U1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MmEwOSwgLmNvbmZpZyA9IEFMQzg4MF81U1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4ODE0ZSwgLmNvbmZpZyA9IEFMQzg4MF81U1QgfSwKLQotCS8qIEJhY2sgNSBqYWNrIHBsdXMgMSBTUERJRiBvdXQgamFjaywgZnJvbnQgMiBqYWNrICovCi0JeyAubW9kZWxuYW1lID0gIjVzdGFjay1kaWdvdXQiLCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTIyNCwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGU0MDAsIC5jb25maWcgPSBBTEM4ODBfNVNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDgwODYsIC5wY2lfc3ViZGV2aWNlID0gMHhlNDAxLCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTQwMiwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGQ0MDAsIC5jb25maWcgPSBBTEM4ODBfNVNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDgwODYsIC5wY2lfc3ViZGV2aWNlID0gMHhkNDAxLCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4YTEwMCwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTU2NSwgLnBjaV9zdWJkZXZpY2UgPSAweDgyMDIsIC5jb25maWcgPSBBTEM4ODBfNVNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMTksIC5wY2lfc3ViZGV2aWNlID0gMHhhODgwLCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHhhMGEwLCAucGNpX3N1YmRldmljZSA9IDB4MDU2MCwKLQkgIC5jb25maWcgPSBBTEM4ODBfNVNUX0RJRyB9LCAvKiBBb3BlbiBpOTE1R01tLUhGUyAqLwotCS8qIHsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMTksIC5wY2lfc3ViZGV2aWNlID0gMHhhODg0LCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwgKi8gLyogY29uZmxpY3Qgd2l0aCA2c3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNjk1LCAucGNpX3N1YmRldmljZSA9IDB4NDAwZCwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sCi0JLyogbm90ZSBzdWJ2ZW5kb3IgPSAwIGJlbG93ICovCi0JLyogeyAucGNpX3N1YnZlbmRvciA9IDB4MDAwMCwgLnBjaV9zdWJkZXZpY2UgPSAweDgwODYsIC5jb25maWcgPSBBTEM4ODBfNVNUX0RJRyB9LCAqLwotCi0JeyAubW9kZWxuYW1lID0gInc4MTAiLCAuY29uZmlnID0gQUxDODgwX1c4MTAgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNjFmLCAucGNpX3N1YmRldmljZSA9IDB4MjAzZCwgLmNvbmZpZyA9IEFMQzg4MF9XODEwIH0sCi0KLQl7IC5tb2RlbG5hbWUgPSAiejcxdiIsIC5jb25maWcgPSBBTEM4ODBfWjcxViB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxOTY0LCAuY29uZmlnID0gQUxDODgwX1o3MVYgfSwKLQotCXsgLm1vZGVsbmFtZSA9ICI2c3RhY2siLCAuY29uZmlnID0gQUxDODgwXzZTVCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHg4MTk2LCAuY29uZmlnID0gQUxDODgwXzZTVCB9LCAvKiBBU1VTIFA1R0QxLUhWTSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHg4MWI0LCAuY29uZmlnID0gQUxDODgwXzZTVCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMTksIC5wY2lfc3ViZGV2aWNlID0gMHhhODg0LCAuY29uZmlnID0gQUxDODgwXzZTVCB9LCAvKiBBY2VyIEFQRlYgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNDU4LCAucGNpX3N1YmRldmljZSA9IDB4YTEwMiwgLmNvbmZpZyA9IEFMQzg4MF82U1QgfSwgLyogR2lnYWJ5dGUgSzhONTEgKi8KLQotCXsgLm1vZGVsbmFtZSA9ICI2c3RhY2stZGlnb3V0IiwgLmNvbmZpZyA9IEFMQzg4MF82U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MjY2OCwgLnBjaV9zdWJkZXZpY2UgPSAweDgwODYsIC5jb25maWcgPSBBTEM4ODBfNlNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDgwODYsIC5wY2lfc3ViZGV2aWNlID0gMHgyNjY4LCAuY29uZmlnID0gQUxDODgwXzZTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNDYyLCAucGNpX3N1YmRldmljZSA9IDB4MTE1MCwgLmNvbmZpZyA9IEFMQzg4MF82U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ZTgwMywgLnBjaV9zdWJkZXZpY2UgPSAweDEwMTksIC5jb25maWcgPSBBTEM4ODBfNlNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMzksIC5wY2lfc3ViZGV2aWNlID0gMHgxMjM0LCAuY29uZmlnID0gQUxDODgwXzZTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDI1LCAucGNpX3N1YmRldmljZSA9IDB4MDA3NywgLmNvbmZpZyA9IEFMQzg4MF82U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAyNSwgLnBjaV9zdWJkZXZpY2UgPSAweDAwNzgsIC5jb25maWcgPSBBTEM4ODBfNlNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMjUsIC5wY2lfc3ViZGV2aWNlID0gMHgwMDg3LCAuY29uZmlnID0gQUxDODgwXzZTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMjk3LCAucGNpX3N1YmRldmljZSA9IDB4Yzc5MCwgLmNvbmZpZyA9IEFMQzg4MF82U1RfRElHIH0sIC8qIFNodXR0bGUgU1QyMEc1ICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTUwOSwgLnBjaV9zdWJkZXZpY2UgPSAweDkyNWQsIC5jb25maWcgPSBBTEM4ODBfNlNUX0RJRyB9LCAvKiBGSUMgUDRNLTkxNUdEMSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE2OTUsIC5wY2lfc3ViZGV2aWNlID0gMHg0MDEyLCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwgLyogRXBveCBFUC01TERBKyBHTGkgKi8KLQotCXsgLm1vZGVsbmFtZSA9ICJhc3VzIiwgLmNvbmZpZyA9IEFMQzg4MF9BU1VTIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDE5NjQsIC5jb25maWcgPSBBTEM4ODBfQVNVU19ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTk3MywgLmNvbmZpZyA9IEFMQzg4MF9BU1VTX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxOWIzLCAuY29uZmlnID0gQUxDODgwX0FTVVNfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDExMTMsIC5jb25maWcgPSBBTEM4ODBfQVNVU19ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTE3MywgLmNvbmZpZyA9IEFMQzg4MF9BU1VTX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxOTkzLCAuY29uZmlnID0gQUxDODgwX0FTVVMgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTBjMiwgLmNvbmZpZyA9IEFMQzg4MF9BU1VTX0RJRyB9LCAvKiBBc3VzIFc2QSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMGMzLCAuY29uZmlnID0gQUxDODgwX0FTVVNfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDExMzMsIC5jb25maWcgPSBBTEM4ODBfQVNVUyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMTIzLCAuY29uZmlnID0gQUxDODgwX0FTVVNfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDExNDMsIC5jb25maWcgPSBBTEM4ODBfQVNVUyB9LAotCXsgLm1vZGVsbmFtZSA9ICJhc3VzLXcxdiIsIC5jb25maWcgPSBBTEM4ODBfQVNVU19XMVYgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTBiMywgLmNvbmZpZyA9IEFMQzg4MF9BU1VTX1cxViB9LAotCXsgLm1vZGVsbmFtZSA9ICJhc3VzLWRpZyIsIC5jb25maWcgPSBBTEM4ODBfQVNVU19ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4ODE4MSwgLmNvbmZpZyA9IEFMQzg4MF9BU1VTX0RJRyB9LCAvKiBBU1VTIFA0R1BMLVggKi8KLQl7IC5tb2RlbG5hbWUgPSAiYXN1cy1kaWcyIiwgLmNvbmZpZyA9IEFMQzg4MF9BU1VTX0RJRzIgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNTU4LCAucGNpX3N1YmRldmljZSA9IDB4NTQwMSwgLmNvbmZpZyA9IEFMQzg4MF9BU1VTX0RJRzIgfSwKLQotCXsgLm1vZGVsbmFtZSA9ICJ1bml3aWxsIiwgLmNvbmZpZyA9IEFMQzg4MF9VTklXSUxMX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE1ODQsIC5wY2lfc3ViZGV2aWNlID0gMHg5MDUwLCAuY29uZmlnID0gQUxDODgwX1VOSVdJTExfRElHIH0sCQotCi0JeyAubW9kZWxuYW1lID0gIkYxNzM0IiwgLmNvbmZpZyA9IEFMQzg4MF9GMTczNCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE3MzQsIC5wY2lfc3ViZGV2aWNlID0gMHgxMDdjLCAuY29uZmlnID0gQUxDODgwX0YxNzM0IH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTU4NCwgLnBjaV9zdWJkZXZpY2UgPSAweDkwNTQsIC5jb25maWcgPSBBTEM4ODBfRjE3MzQgfSwKLQotCXsgLm1vZGVsbmFtZSA9ICJsZyIsIC5jb25maWcgPSBBTEM4ODBfTEcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxODU0LCAucGNpX3N1YmRldmljZSA9IDB4MDAzYiwgLmNvbmZpZyA9IEFMQzg4MF9MRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE4NTQsIC5wY2lfc3ViZGV2aWNlID0gMHgwMDY4LCAuY29uZmlnID0gQUxDODgwX0xHIH0sCi0KLQl7IC5tb2RlbG5hbWUgPSAibGctbHciLCAuY29uZmlnID0gQUxDODgwX0xHX0xXIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTg1NCwgLnBjaV9zdWJkZXZpY2UgPSAweDAwMTgsIC5jb25maWcgPSBBTEM4ODBfTEdfTFcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxODU0LCAucGNpX3N1YmRldmljZSA9IDB4MDA3NywgLmNvbmZpZyA9IEFMQzg4MF9MR19MVyB9LAotCitzdGF0aWMgY29uc3QgY2hhciAqYWxjODgwX21vZGVsc1tBTEM4ODBfTU9ERUxfTEFTVF0gPSB7CisJW0FMQzg4MF8zU1RdCQk9ICIzc3RhY2siLAorCVtBTEM4ODBfVENMX1M3MDBdCT0gInRjbCIsCisJW0FMQzg4MF8zU1RfRElHXQk9ICIzc3RhY2stZGlnb3V0IiwKKwlbQUxDODgwX0NMRVZPXQkJPSAiY2xldm8iLAorCVtBTEM4ODBfNVNUXQkJPSAiNXN0YWNrIiwKKwlbQUxDODgwXzVTVF9ESUddCT0gIjVzdGFjay1kaWdvdXQiLAorCVtBTEM4ODBfVzgxMF0JCT0gInc4MTAiLAorCVtBTEM4ODBfWjcxVl0JCT0gIno3MXYiLAorCVtBTEM4ODBfNlNUXQkJPSAiNnN0YWNrIiwKKwlbQUxDODgwXzZTVF9ESUddCT0gIjZzdGFjay1kaWdvdXQiLAorCVtBTEM4ODBfQVNVU10JCT0gImFzdXMiLAorCVtBTEM4ODBfQVNVU19XMVZdCT0gImFzdXMtdzF2IiwKKwlbQUxDODgwX0FTVVNfRElHXQk9ICJhc3VzLWRpZyIsCisJW0FMQzg4MF9BU1VTX0RJRzJdCT0gImFzdXMtZGlnMiIsCisJW0FMQzg4MF9VTklXSUxMX0RJR10JPSAidW5pd2lsbCIsCisJW0FMQzg4MF9VTklXSUxMX1A1M10JPSAidW5pd2lsbC1wNTMiLAorCVtBTEM4ODBfRlVKSVRTVV0JPSAiZnVqaXRzdSIsCisJW0FMQzg4MF9GMTczNF0JCT0gIkYxNzM0IiwKKwlbQUxDODgwX0xHXQkJPSAibGciLAorCVtBTEM4ODBfTEdfTFddCQk9ICJsZy1sdyIsCiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwotCXsgLm1vZGVsbmFtZSA9ICJ0ZXN0IiwgLmNvbmZpZyA9IEFMQzg4MF9URVNUIH0sCisJW0FMQzg4MF9URVNUXQkJPSAidGVzdCIsCiAjZW5kaWYKLQl7IC5tb2RlbG5hbWUgPSAiYXV0byIsIC5jb25maWcgPSBBTEM4ODBfQVVUTyB9LAorCVtBTEM4ODBfQVVUT10JCT0gImF1dG8iLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzg4MF9jZmdfdGJsW10gPSB7CisJLyogQnJva2VuIEJJT1MgY29uZmlndXJhdGlvbiAqLworCVNORF9QQ0lfUVVJUksoMHgyNjY4LCAweDgwODYsIE5VTEwsIEFMQzg4MF82U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHgyNjY4LCBOVUxMLCBBTEM4ODBfNlNUX0RJRyksCisKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHhhODgwLCAiRUNTIiwgQUxDODgwXzVTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweGE4ODQsICJBY2VyIEFQRlYiLCBBTEM4ODBfNlNUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHgwZjY5LCAiQ29ldXMgRzYxMFAiLCBBTEM4ODBfVzgxMCksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA3MCwgIlVMSSIsIEFMQzg4MF8zU1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMDc3LCAiVUxJIiwgQUxDODgwXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwNzgsICJVTEkiLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA4NywgIlVMSSIsIEFMQzg4MF82U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHhlMzA5LCAiVUxJIiwgQUxDODgwXzNTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweGUzMTAsICJVTEkiLCBBTEM4ODBfM1NUKSwKKworCVNORF9QQ0lfUVVJUksoMHgxMDM5LCAweDEyMzQsIE5VTEwsIEFMQzg4MF82U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyYTA5LCAiSFAiLCBBTEM4ODBfNVNUKSwKKworCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwYjMsICJBU1VTIFcxViIsIEFMQzg4MF9BU1VTX1cxViksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTBjMiwgIkFTVVMgVzZBIiwgQUxDODgwX0FTVVNfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMGMzLCAiQVNVUyBXeHgiLCBBTEM4ODBfQVNVU19ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExMTMsICJBU1VTIiwgQUxDODgwX0FTVVNfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTIzLCAiQVNVUyIsIEFMQzg4MF9BU1VTX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTE3MywgIkFTVVMiLCBBTEM4ODBfQVNVU19ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5NjQsICJBU1VTIFo3MVYiLCBBTEM4ODBfWjcxViksCisJLyogU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk2NCwgIkFTVVMiLCBBTEM4ODBfQVNVU19ESUcpLCAqLworCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5NzMsICJBU1VTIiwgQUxDODgwX0FTVVNfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWIzLCAiQVNVUyIsIEFMQzg4MF9BU1VTX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODE0ZSwgIkFTVVMiLCBBTEM4ODBfQVNVUyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODE4MSwgIkFTVVMgUDRHUEwiLCBBTEM4ODBfQVNVU19ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxOTYsICJBU1VTIFA1R0QxIiwgQUxDODgwXzZTVCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODFiNCwgIkFTVVMiLCBBTEM4ODBfNlNUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMCwgIkFTVVMiLCBBTEM4ODBfQVNVUyksCisKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWQ2LCAiU29ueSIsIEFMQzg4MF8zU1QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgxYTAsICJTb255IiwgQUxDODgwXzNTVCksCisJU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MzAzMywgIkdhdGV3YXkiLCBBTEM4ODBfNVNUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA3YiwgMHg0MDM5LCAiR2F0ZXdheSIsIEFMQzg4MF81U1QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdiLCAweDMwMzIsICJHYXRld2F5IiwgQUxDODgwXzVTVCksCisJU05EX1BDSV9RVUlSSygweDE1NTgsIDB4MDUyMCwgIkNsZXZvIG01MjBHIiwgQUxDODgwX0NMRVZPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU1OCwgMHgwNjYwLCAiQ2xldm8gbTY1NW4iLCBBTEM4ODBfQ0xFVk8pLAorCVNORF9QQ0lfUVVJUksoMHgxNTY1LCAweDgyMDIsICJCaW9zdGFyIiwgQUxDODgwXzVTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNjFmLCAweDIwM2QsICJXODEwIiwgQUxDODgwX1c4MTApLAorCVNORF9QQ0lfUVVJUksoMHgxNjk1LCAweDQwMGQsICJFUG9YIiwgQUxDODgwXzVTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxOWRiLCAweDQxODgsICJUQ0wgUzcwMCIsIEFMQzg4MF9UQ0xfUzcwMCksCisJU05EX1BDSV9RVUlSSygweGEwYTAsIDB4MDU2MCwgIkFPcGVuIGk5MTVHTW0tSEZTIiwgQUxDODgwXzVTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHhlODAzLCAweDEwMTksIE5VTEwsIEFMQzg4MF82U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTI5NywgMHhjNzkwLCAiU2h1dHRsZSBTVDIwRzUiLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NTgsIDB4YTEwMiwgIkdpZ2FieXRlIEs4IiwgQUxDODgwXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDExNTAsICJNU0kiLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE1MDksIDB4OTI1ZCwgIkZJQyBQNE0iLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE1NTgsIDB4NTQwMSwgIkFTVVMiLCBBTEM4ODBfQVNVU19ESUcyKSwKKworCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNTAsICJVbml3aWxsIiwgQUxDODgwX1VOSVdJTExfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHg5MDcwLCAiVW5pd2lsbCIsIEFMQzg4MF9VTklXSUxMKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHg5MDc3LCAiVW5pd2lsbCBQNTMiLCBBTEM4ODBfVU5JV0lMTF9QNTMpLAorCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNTQsICJVbml3bGxsIiwgQUxDODgwX0YxNzM0KSwKKworCVNORF9QQ0lfUVVJUksoMHgxNjk1LCAweDQwMTIsICJFUG94IEVQLTVMREEiLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE3MzQsIDB4MTBhYywgIkZTQyIsIEFMQzg4MF9VTklXSUxMKSwKKwlTTkRfUENJX1FVSVJLKDB4MTczNCwgMHgxMDdjLCAiRlNDIEYxNzM0IiwgQUxDODgwX0YxNzM0KSwKKwlTTkRfUENJX1FVSVJLKDB4MTczNCwgMHgxMGIwLCAiRnVqaXRzdSIsIEFMQzg4MF9GVUpJVFNVKSwKKworCVNORF9QQ0lfUVVJUksoMHgxODU0LCAweDAwM2IsICJMRyIsIEFMQzg4MF9MRyksCisJU05EX1BDSV9RVUlSSygweDE4NTQsIDB4MDA2OCwgIkxHIHcxIiwgQUxDODgwX0xHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTg1NCwgMHgwMDE4LCAiTEcgTFcyMCIsIEFMQzg4MF9MR19MVyksCisJU05EX1BDSV9RVUlSSygweDE4NTQsIDB4MDA3NywgIkxHIExXMjUiLCBBTEM4ODBfTEdfTFcpLAorCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZTMwOCwgIkludGVsIG1vYm8iLCBBTEM4ODBfM1NUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZTMwNSwgIkludGVsIG1vYm8iLCBBTEM4ODBfM1NUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDQwMiwgIkludGVsIG1vYm8iLCBBTEM4ODBfM1NUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDQwMCwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDQwMSwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZTIyNCwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZTQwMCwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZTQwMSwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZTQwMiwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4YTEwMCwgIkludGVsIG1vYm8iLCBBTEM4ODBfNVNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDAsICJJbnRlbCBtb2JvIiwgQUxDODgwXzNTVCksCiAKIAl7fQogfTsKQEAgLTI0MzgsNyArMjYyNyw4IEBACiAJfSwKIAlbQUxDODgwX1VOSVdJTExfRElHXSA9IHsKIAkJLm1peGVycyA9IHsgYWxjODgwX2FzdXNfbWl4ZXIsIGFsYzg4MF9wY2JlZXBfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywgYWxjODgwX3Bpbl9hc3VzX2luaXRfdmVyYnMgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfcGluX2FzdXNfaW5pdF92ZXJicyB9LAogCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9hc3VzX2RhY19uaWRzKSwKIAkJLmRhY19uaWRzID0gYWxjODgwX2FzdXNfZGFjX25pZHMsCiAJCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELApAQCAtMjQ0Nyw2ICsyNjM3LDQ2IEBACiAJCS5uZWVkX2RhY19maXggPSAxLAogCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKIAl9LAorCVtBTEM4ODBfVU5JV0lMTF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4MF91bml3aWxsX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3VuaXdpbGxfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9hc3VzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgwX2FzdXNfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3RocmVlc3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX3RocmVlc3RhY2tfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjODgwX3VuaXdpbGxfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGM4ODBfdW5pd2lsbF9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODBfVU5JV0lMTF9QNTNdID0geworCQkubWl4ZXJzID0geyBhbGM4ODBfdW5pd2lsbF9wNTNfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfdW5pd2lsbF9wNTNfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9hc3VzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgwX2FzdXNfZGFjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODBfdzgxMF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfdGhyZWVzdGFja19tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzg4MF91bml3aWxsX3A1M191bnNvbF9ldmVudCwKKwkJLmluaXRfaG9vayA9IGFsYzg4MF91bml3aWxsX3A1M19ocF9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODBfRlVKSVRTVV0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4MF9mdWppdHN1X21peGVyLCAKKwkJCSAgICBhbGM4ODBfcGNiZWVwX21peGVyLCB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF91bml3aWxsX3A1M19pbml0X3ZlcmJzLAorCSAgICAgICAJCQlhbGM4ODBfYmVlcF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgwX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwXzJfamFja19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODBfMl9qYWNrX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4MF9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjODgwX3VuaXdpbGxfcDUzX3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjODgwX3VuaXdpbGxfcDUzX2hwX2F1dG9tdXRlLAorCX0sCiAJW0FMQzg4MF9DTEVWT10gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzg4MF90aHJlZV9zdGFja19taXhlciB9LAogCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLApAQCAtMjg0MSw4ICszMDcxLDEwIEBACiAKIAljb2RlYy0+c3BlYyA9IHNwZWM7CiAKLQlib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgYWxjODgwX2NmZ190YmwpOwotCWlmIChib2FyZF9jb25maWcgPCAwIHx8IGJvYXJkX2NvbmZpZyA+PSBBTEM4ODBfTU9ERUxfTEFTVCkgeworCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBBTEM4ODBfTU9ERUxfTEFTVCwKKwkJCQkJCSAgYWxjODgwX21vZGVscywKKwkJCQkJCSAgYWxjODgwX2NmZ190YmwpOworCWlmIChib2FyZF9jb25maWcgPCAwKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogVW5rbm93biBtb2RlbCBmb3IgQUxDODgwLCAiCiAJCSAgICAgICAidHJ5aW5nIGF1dG8tcHJvYmUgZnJvbSBCSU9TLi4uXG4iKTsKIAkJYm9hcmRfY29uZmlnID0gQUxDODgwX0FVVE87CkBAIC0zMDkwLDExICszMzIyLDIwIEBACiAgKiBhbmQgdGhlIG91dHB1dCBqYWNrLiAgSWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgdGhlIGNhc2UgZm9yIGFsbCBzdWNoCiAgKiBtb2RlbHMgdGhlICJMaW5lIEphY2sgTW9kZSIgbW9kZSBjb3VsZCBiZSBjaGFuZ2VkIGZyb20gQUxDX1BJTl9ESVJfSU5PVVQKICAqIHRvIEFMQ19QSU5fRElSX0lOT1VUX05PTUlDQklBUy4KKyAqCisgKiBUaGUgQzIweCBUYWJsZXQgc2VyaWVzIGhhdmUgYSBtb25vIGludGVybmFsIHNwZWFrZXIgd2hpY2ggaXMgY29udHJvbGxlZAorICogdmlhIHRoZSBjaGlwJ3MgTW9ubyBzdW0gd2lkZ2V0IGFuZCBwaW4gY29tcGxleCwgc28gaW5jbHVkZSB0aGUgbmVjZXNzYXJ5CisgKiBjb250cm9scyBmb3Igc3VjaCBtb2RlbHMuICBPbiBtb2RlbHMgd2l0aG91dCBhICJtb25vIHNwZWFrZXIiIHRoZSBjb250cm9sCisgKiB3b24ndCBkbyBhbnl0aGluZy4KICAqLwogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9hY2VyX21peGVyW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0JJTkRfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDIsIEhEQV9JTlBVVCksCiAJQUxDX1BJTl9NT0RFKCJIZWFkcGhvbmUgSmFjayBNb2RlIiwgMHgwZiwgQUxDX1BJTl9ESVJfSU5PVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTW9ubyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGEsIDEsIDB4MCwKKwkJCSAgICAgIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiTW9ubyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGEsIDEsIDIsCisJCQkgICBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKQEAgLTM0MDksMTEgKzM2NTAsMTEgQEAKIAl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjUwfSwKIAkvKiBMaW5lIEluIGphY2sgaXMgY29ubmVjdGVkIHRvIExpbmUxIHBpbiAqLwogCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJLyogU29tZSBBY2VycyAoZWc6IEMyMHggVGFibGV0cykgdXNlIE1vbm8gcGluIGZvciBpbnRlcm5hbCBzcGVha2VyICovCisJezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKIAkvKiBFbnN1cmUgYWxsIG90aGVyIHVudXNlZCBwaW5zIGFyZSBkaXNhYmxlZCBhbmQgbXV0ZWQuICovCiAJezB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCiAJezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKLQl7MHgxMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAogCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAogCXsweDEzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCiAJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCkBAIC0zNDQxLDYgKzM2ODIsOCBAQAogCiAJLyogVW5tdXRlIExpbmUtb3V0IHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBlcXVpdiBtaXhlciBjdHJsKSAqLwogCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJLyogVW5tdXRlIG1vbm8gcGluIHdpZGdldCBhbXAgb3V0cHV0IChubyBlcXVpdiBtaXhlciBjdHJsKSAqLworCXsweDExLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCiAJLyogVW5tdXRlIE1pYzEgYW5kIExpbmUxIHBpbiB3aWRnZXQgaW5wdXQgYnVmZmVycyBzaW5jZSB0aGV5IHN0YXJ0IGFzCiAJICogaW5wdXRzLiBJZiB0aGUgcGluIG1vZGUgaXMgY2hhbmdlZCBieSB0aGUgdXNlciB0aGUgcGluIG1vZGUgY29udHJvbAogCSAqIHdpbGwgdGFrZSBjYXJlIG9mIGVuYWJsaW5nIHRoZSBwaW4ncyBpbnB1dC9vdXRwdXQgYnVmZmVycyBhcyBuZWVkZWQuCkBAIC0zOTI4LDMzICs0MTcxLDMzIEBACiAvKgogICogQUxDMjYwIGNvbmZpZ3VyYXRpb25zCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBhbGMyNjBfY2ZnX3RibFtdID0gewotCXsgLm1vZGVsbmFtZSA9ICJiYXNpYyIsIC5jb25maWcgPSBBTEMyNjBfQkFTSUMgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDRkLCAucGNpX3N1YmRldmljZSA9IDB4ODFiYiwKLQkgIC5jb25maWcgPSBBTEMyNjBfQkFTSUMgfSwgLyogU29ueSBWQUlPICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0ZCwgLnBjaV9zdWJkZXZpY2UgPSAweDgxY2MsCi0JICAuY29uZmlnID0gQUxDMjYwX0JBU0lDIH0sIC8qIFNvbnkgVkFJTyBWR04tUzNIUCAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNGQsIC5wY2lfc3ViZGV2aWNlID0gMHg4MWNkLAotCSAgLmNvbmZpZyA9IEFMQzI2MF9CQVNJQyB9LCAvKiBTb255IFZBSU8gKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNTJkLCAucGNpX3N1YmRldmljZSA9IDB4MDcyOSwKLQkgIC5jb25maWcgPSBBTEMyNjBfQkFTSUMgfSwgLyogQ1RMIFRyYXZlbCBNYXN0ZXIgVTU1M1cgKi8KLQl7IC5tb2RlbG5hbWUgPSAiaHAiLCAuY29uZmlnID0gQUxDMjYwX0hQIH0sCi0JeyAubW9kZWxuYW1lID0gImhwLTMwMTMiLCAuY29uZmlnID0gQUxDMjYwX0hQXzMwMTMgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MzAxMCwgLmNvbmZpZyA9IEFMQzI2MF9IUF8zMDEzIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwMTEsIC5jb25maWcgPSBBTEMyNjBfSFAgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MzAxMiwgLmNvbmZpZyA9IEFMQzI2MF9IUF8zMDEzIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwMTMsIC5jb25maWcgPSBBTEMyNjBfSFBfMzAxMyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgzMDE0LCAuY29uZmlnID0gQUxDMjYwX0hQIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwMTUsIC5jb25maWcgPSBBTEMyNjBfSFAgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MzAxNiwgLmNvbmZpZyA9IEFMQzI2MF9IUCB9LAotCXsgLm1vZGVsbmFtZSA9ICJmdWppdHN1IiwgLmNvbmZpZyA9IEFMQzI2MF9GVUpJVFNVX1M3MDJYIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTBjZiwgLnBjaV9zdWJkZXZpY2UgPSAweDEzMjYsIC5jb25maWcgPSBBTEMyNjBfRlVKSVRTVV9TNzAyWCB9LAotCXsgLm1vZGVsbmFtZSA9ICJhY2VyIiwgLmNvbmZpZyA9IEFMQzI2MF9BQ0VSIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAyNSwgLnBjaV9zdWJkZXZpY2UgPSAweDAwOGYsIC5jb25maWcgPSBBTEMyNjBfQUNFUiB9LAorc3RhdGljIGNvbnN0IGNoYXIgKmFsYzI2MF9tb2RlbHNbQUxDMjYwX01PREVMX0xBU1RdID0geworCVtBTEMyNjBfQkFTSUNdCQk9ICJiYXNpYyIsCisJW0FMQzI2MF9IUF0JCT0gImhwIiwKKwlbQUxDMjYwX0hQXzMwMTNdCT0gImhwLTMwMTMiLAorCVtBTEMyNjBfRlVKSVRTVV9TNzAyWF0JPSAiZnVqaXRzdSIsCisJW0FMQzI2MF9BQ0VSXQkJPSAiYWNlciIsCiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwotCXsgLm1vZGVsbmFtZSA9ICJ0ZXN0IiwgLmNvbmZpZyA9IEFMQzI2MF9URVNUIH0sCisJW0FMQzI2MF9URVNUXQkJPSAidGVzdCIsCiAjZW5kaWYKLQl7IC5tb2RlbG5hbWUgPSAiYXV0byIsIC5jb25maWcgPSBBTEMyNjBfQVVUTyB9LAorCVtBTEMyNjBfQVVUT10JCT0gImF1dG8iLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2MF9jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA3YiwgIkFjZXIgQzIweCIsIEFMQzI2MF9BQ0VSKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMDhmLCAiQWNlciIsIEFMQzI2MF9BQ0VSKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDEwLCAiSFAiLCBBTEMyNjBfSFBfMzAxMyksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxMSwgIkhQIiwgQUxDMjYwX0hQKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDEyLCAiSFAiLCBBTEMyNjBfSFBfMzAxMyksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxMywgIkhQIiwgQUxDMjYwX0hQXzMwMTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTQsICJIUCIsIEFMQzI2MF9IUCksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxNSwgIkhQIiwgQUxDMjYwX0hQKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDE2LCAiSFAiLCBBTEMyNjBfSFApLAorCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgxYmIsICJTb255IFZBSU8iLCBBTEMyNjBfQkFTSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgxY2MsICJTb255IFZBSU8iLCBBTEMyNjBfQkFTSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgxY2QsICJTb255IFZBSU8iLCBBTEMyNjBfQkFTSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMGNmLCAweDEzMjYsICJGdWppdHN1IFM3MDJYIiwgQUxDMjYwX0ZVSklUU1VfUzcwMlgpLAorCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDA3MjksICJDVEwgVTU1M1ciLCBBTEMyNjBfQkFTSUMpLAogCXt9CiB9OwogCkBAIC00MDUzLDggKzQyOTYsMTAgQEAKIAogCWNvZGVjLT5zcGVjID0gc3BlYzsKIAotCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBhbGMyNjBfY2ZnX3RibCk7Ci0JaWYgKGJvYXJkX2NvbmZpZyA8IDAgfHwgYm9hcmRfY29uZmlnID49IEFMQzI2MF9NT0RFTF9MQVNUKSB7CisJYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFMQzI2MF9NT0RFTF9MQVNULAorCQkJCQkJICBhbGMyNjBfbW9kZWxzLAorCQkJCQkJICBhbGMyNjBfY2ZnX3RibCk7CisJaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKIAkJc25kX3ByaW50ZChLRVJOX0lORk8gImhkYV9jb2RlYzogVW5rbm93biBtb2RlbCBmb3IgQUxDMjYwLCAiCiAJCQkgICAidHJ5aW5nIGF1dG8tcHJvYmUgZnJvbSBCSU9TLi4uXG4iKTsKIAkJYm9hcmRfY29uZmlnID0gQUxDMjYwX0FVVE87CkBAIC00MjA3LDggKzQ0NTIsMTAgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIlBDIFNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLApAQCAtNDMxMyw2ICs0NTYwLDEwMCBAQAogCXsgfSAKIH07CiAKKy8qIE1hYyBQcm8gdGVzdCAqLworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4Ml9tYWNwcm9fbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE4LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlBDIFNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgyX21hY3Byb19pbml0X3ZlcmJzW10gPSB7CisJLyogRnJvbnQgbWl4ZXI6IHVubXV0ZSBpbnB1dC9vdXRwdXQgYW1wIGxlZnQgYW5kIHJpZ2h0ICh2b2x1bWUgPSAwKSAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwkvKiBGcm9udCBQaW46IG91dHB1dCAwICgweDBjKSAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIFNwZWFrZXI6ICBvdXRwdXQgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwNH0sCisJLyogSGVhZHBob25lIG91dHB1dCAob3V0cHV0IDAgLSAweDBjKSAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCisJLyogRklYTUU6IHVzZSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCisJLyogTWl4ZXIgZWxlbWVudHM6IDB4MTgsIDE5LCAxYSwgMWIsIDFjLCAxZCwgMTQsIDE1LCAxNiwgMTcsIDBiICovCisJLyogSW5wdXQgbWl4ZXIxOiB1bm11dGUgTWljLCBGLU1pYywgTGluZSwgQ0QgaW5wdXRzICovCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAorCS8qIElucHV0IG1peGVyMiAqLworCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKwkvKiBJbnB1dCBtaXhlcjMgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCisJLyogQURDMTogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogQURDMjogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogQURDMzogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwl7IH0KK307CitzdGF0aWMgdm9pZCBhbGM4ODJfZ3Bpb19tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgcGluLCBpbnQgbXV0ZWQpCit7CisJdW5zaWduZWQgaW50IGdwaW9zdGF0ZSwgZ3Bpb21hc2ssIGdwaW9kaXI7CisKKwlncGlvc3RhdGUgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJCQkJICAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fREFUQSwgMCk7CisKKwlpZiAoIW11dGVkKQorCQlncGlvc3RhdGUgfD0gKDEgPDwgcGluKTsKKwllbHNlCisJCWdwaW9zdGF0ZSAmPSB+KDEgPDwgcGluKTsKKworCWdwaW9tYXNrID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJCSAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fTUFTSywgMCk7CisJZ3Bpb21hc2sgfD0gKDEgPDwgcGluKTsKKworCWdwaW9kaXIgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9HUElPX0RJUkVDVElPTiwgMCk7CisJZ3Bpb2RpciB8PSAoMSA8PCBwaW4pOworCisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgZ3Bpb21hc2spOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJCQkgICAgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIGdwaW9kaXIpOworCisJbXNsZWVwKDEpOworCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwKKwkJCSAgICBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIGdwaW9zdGF0ZSk7Cit9CisKIC8qCiAgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCiAgKi8KQEAgLTQ0MzUsMTkgKzQ3NzYsMjAgQEAKIC8qCiAgKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKICAqLwotc3RhdGljIHN0cnVjdCBoZGFfYm9hcmRfY29uZmlnIGFsYzg4Ml9jZmdfdGJsW10gPSB7Ci0JeyAubW9kZWxuYW1lID0gIjNzdGFjay1kaWciLCAuY29uZmlnID0gQUxDODgyXzNTVF9ESUcgfSwKLQl7IC5tb2RlbG5hbWUgPSAiNnN0YWNrLWRpZyIsIC5jb25maWcgPSBBTEM4ODJfNlNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE0NjIsIC5wY2lfc3ViZGV2aWNlID0gMHg2NjY4LAotCSAgLmNvbmZpZyA9IEFMQzg4Ml82U1RfRElHIH0sIC8qIE1TSSAgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDViLCAucGNpX3N1YmRldmljZSA9IDB4NjY2OCwKLQkgIC5jb25maWcgPSBBTEM4ODJfNlNUX0RJRyB9LCAvKiBGb3hjb25uICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAxOSwgLnBjaV9zdWJkZXZpY2UgPSAweDY2NjgsCi0JICAuY29uZmlnID0gQUxDODgyXzZTVF9ESUcgfSwgLyogRUNTIHRvIEludGVsKi8KLQl7IC5tb2RlbG5hbWUgPSAiYXJpbWEiLCAuY29uZmlnID0gQUxDODgyX0FSSU1BIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTYxZiwgLnBjaV9zdWJkZXZpY2UgPSAweDIwNTQsCi0JICAuY29uZmlnID0gQUxDODgyX0FSSU1BIH0sIC8qIEFyaW1hIFc4MjBEaTEgKi8KLQl7IC5tb2RlbG5hbWUgPSAiYXV0byIsIC5jb25maWcgPSBBTEM4ODJfQVVUTyB9LAorc3RhdGljIGNvbnN0IGNoYXIgKmFsYzg4Ml9tb2RlbHNbQUxDODgyX01PREVMX0xBU1RdID0geworCVtBTEM4ODJfM1NUX0RJR10JPSAiM3N0YWNrLWRpZyIsCisJW0FMQzg4Ml82U1RfRElHXQk9ICI2c3RhY2stZGlnIiwKKwlbQUxDODgyX0FSSU1BXQkJPSAiYXJpbWEiLAorCVtBTEM4ODVfTUFDUFJPXQkJPSAibWFjcHJvIiwKKwlbQUxDODgyX0FVVE9dCQk9ICJhdXRvIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4ODJfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweDY2NjgsICJFQ1MiLCBBTEM4ODJfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNWIsIDB4NjY2OCwgIkZveGNvbm4iLCBBTEM4ODJfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NjY2OCwgIk1TSSIsIEFMQzg4Ml82U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTYxZiwgMHgyMDU0LCAiQXJpbWEgVzgyMCIsIEFMQzg4Ml9BUklNQSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODFkOCwgIkFzdXMgUDVXRCIsIEFMQzg4Ml82U1RfRElHKSwKIAl7fQogfTsKIApAQCAtNDQ4NCw2ICs0ODI2LDE3IEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGM4ODJfc2l4c3RhY2tfbW9kZXMsCiAJCS5pbnB1dF9tdXggPSAmYWxjODgyX2NhcHR1cmVfc291cmNlLAogCX0sCisJW0FMQzg4NV9NQUNQUk9dID0geworCQkubWl4ZXJzID0geyBhbGM4ODJfbWFjcHJvX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODJfbWFjcHJvX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODJfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4Ml9ESUdPVVRfTklELAorCQkuZGlnX2luX25pZCA9IEFMQzg4Ml9ESUdJTl9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODJfY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgyX2NoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKKwl9LAogfTsKIAogCkBAIC00NTg0LDcgKzQ5MzcsOSBAQAogCiAJY29kZWMtPnNwZWMgPSBzcGVjOwogCi0JYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIGFsYzg4Ml9jZmdfdGJsKTsKKwlib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODgyX01PREVMX0xBU1QsCisJCQkJCQkgIGFsYzg4Ml9tb2RlbHMsCisJCQkJCQkgIGFsYzg4Ml9jZmdfdGJsKTsKIAogCWlmIChib2FyZF9jb25maWcgPCAwIHx8IGJvYXJkX2NvbmZpZyA+PSBBTEM4ODJfTU9ERUxfTEFTVCkgewogCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6IFVua25vd24gbW9kZWwgZm9yIEFMQzg4MiwgIgpAQCAtNDYwOSw2ICs0OTY0LDExIEBACiAJaWYgKGJvYXJkX2NvbmZpZyAhPSBBTEM4ODJfQVVUTykKIAkJc2V0dXBfcHJlc2V0KHNwZWMsICZhbGM4ODJfcHJlc2V0c1tib2FyZF9jb25maWddKTsKIAorCWlmIChib2FyZF9jb25maWcgPT0gQUxDODg1X01BQ1BSTykgeworCQlhbGM4ODJfZ3Bpb19tdXRlKGNvZGVjLCAwLCAwKTsKKwkJYWxjODgyX2dwaW9fbXV0ZShjb2RlYywgMSwgMCk7CisJfQorCiAJc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nID0gIkFMQzg4MiBBbmFsb2ciOwogCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmYWxjODgyX3BjbV9hbmFsb2dfcGxheWJhY2s7CiAJc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlID0gJmFsYzg4Ml9wY21fYW5hbG9nX2NhcHR1cmU7CkBAIC00NzY3LDYgKzUxMjcsMTMgQEAKIAl7IDgsIGFsYzg4M19zaXhzdGFja19jaDhfaW5pdCB9LAogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfbWVkaW9uX2VhcGRfdmVyYnNbXSA9IHsKKyAgICAgICAgLyogZWFuYWJsZSBFQVBEIG9uIG1lZGlvbiBsYXB0b3AgKi8KKwl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwN30sCisJezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHgzMDcwfSwKKwl7IH0KK307CisKIC8qIFBpbiBhc3NpZ25tZW50OiBGcm9udD0weDE0LCBSZWFyPTB4MTUsIENMRkU9MHgxNiwgU2lkZT0weDE3CiAgKiAgICAgICAgICAgICAgICAgTWljPTB4MTgsIEZyb250IE1pYz0weDE5LCBMaW5lLUluPTB4MWEsIEhQPTB4MWIKICAqLwpAQCAtNDc4OCw4ICs1MTU1LDEwIEBACiAJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKQEAgLTQ4MTgsOCArNTE4NywxMCBAQAogCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiUEMgU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJQQyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCkBAIC00ODU0LDggKzUyMjUsMTAgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIlBDIFNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLApAQCAtNDg3NSw2ICs1MjQ4LDEwMSBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfZml2ZXN0YWNrX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlBDIFNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKworCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS8qIC5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwgKi8KKwkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKKwkJLmNvdW50ID0gMSwKKwkJLmluZm8gPSBhbGM4ODNfbXV4X2VudW1faW5mbywKKwkJLmdldCA9IGFsYzg4M19tdXhfZW51bV9nZXQsCisJCS5wdXQgPSBhbGM4ODNfbXV4X2VudW1fcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M190YWdyYV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDIsCisJCS5pbmZvID0gYWxjODgzX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhbGM4ODNfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gYWxjODgzX211eF9lbnVtX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX3RhZ3JhXzJjaF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDIsCisJCS5pbmZvID0gYWxjODgzX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhbGM4ODNfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gYWxjODgzX211eF9lbnVtX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CQorCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX2NobW9kZV9taXhlcltdID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCkBAIC00OTYzLDYgKzU0MzEsNDUgQEAKIAl7IH0KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX3RhZ3JhX3ZlcmJzW10gPSB7CisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJCisJezB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyfSwgLyogbWljL2NsZmUgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LCAvKiBsaW5lL3N1cnJvdW5kICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogSFAgKi8KKworCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19NQVNLLCAweDAzfSwgCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDAzfSwgCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwM30sIAorCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLworc3RhdGljIHZvaWQgYWxjODgzX3RhZ3JhX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKworIAlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE0LCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDFiLCAwLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDgwLCBwcmVzZW50ID8gMHg4MCA6IDApOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxYiwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgcHJlc2VudCA/IDB4ODAgOiAwKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAxLCAwLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIHByZXNlbnQgPyAxIDogMyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4M190YWdyYV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlcykKK3sKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX0hQX0VWRU5UKQorCQlhbGM4ODNfdGFncmFfYXV0b211dGUoY29kZWMpOworfQorCiAvKgogICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwogICovCkBAIC01MDU3LDMyICs1NTY0LDQyIEBACiAvKgogICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0CiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBhbGM4ODNfY2ZnX3RibFtdID0gewotCXsgLm1vZGVsbmFtZSA9ICIzc3RhY2stZGlnIiwgLmNvbmZpZyA9IEFMQzg4M18zU1RfMmNoX0RJRyB9LAotCXsgLm1vZGVsbmFtZSA9ICIzc3RhY2stNmNoLWRpZyIsIC5jb25maWcgPSBBTEM4ODNfM1NUXzZjaF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDE5LCAucGNpX3N1YmRldmljZSA9IDB4NjY2OCwKLQkgIC5jb25maWcgPSBBTEM4ODNfM1NUXzZjaF9ESUcgfSwgLyogRUNTIHRvIEludGVsKi8KLQl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrLTZjaCIsIC5jb25maWcgPSBBTEM4ODNfM1NUXzZjaCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwOGUsIC5wY2lfc3ViZGV2aWNlID0gMHg1MzRkLAotCSAgLmNvbmZpZyA9IEFMQzg4M18zU1RfNmNoIH0sCi0gICAgICAgIHsgLnBjaV9zdWJ2ZW5kb3IgPSAweDgwODYsIC5wY2lfc3ViZGV2aWNlID0gMHhkNjAxLAotICAgICAgICAgIC5jb25maWcgPSBBTEM4ODNfM1NUXzZjaCB9LCAvKiBEMTAyR0dDICovCi0JeyAubW9kZWxuYW1lID0gIjZzdGFjay1kaWciLCAuY29uZmlnID0gQUxDODgzXzZTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNDYyLCAucGNpX3N1YmRldmljZSA9IDB4NjY2OCwKLQkgIC5jb25maWcgPSBBTEM4ODNfNlNUX0RJRyB9LCAvKiBNU0kgICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTQ2MiwgLnBjaV9zdWJkZXZpY2UgPSAweDcyODAsCi0JICAuY29uZmlnID0gQUxDODgzXzZTVF9ESUcgfSwgLyogTVNJIEs5QSBQbGF0aW51bSAoTVMtNzI4MCkgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDViLCAucGNpX3N1YmRldmljZSA9IDB4NjY2OCwKLQkgIC5jb25maWcgPSBBTEM4ODNfNlNUX0RJRyB9LCAvKiBGb3hjb25uICovCi0JeyAubW9kZWxuYW1lID0gIjZzdGFjay1kaWctZGVtbyIsIC5jb25maWcgPSBBTEM4ODhfREVNT19CT0FSRCB9LAotCXsgLm1vZGVsbmFtZSA9ICJhY2VyIiwgLmNvbmZpZyA9IEFMQzg4M19BQ0VSIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAyNSwgLnBjaV9zdWJkZXZpY2UgPSAwLyoweDAxMDIqLywKLQkgIC5jb25maWcgPSBBTEM4ODNfQUNFUiB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMjUsIC5wY2lfc3ViZGV2aWNlID0gMHgwMTAyLAotCSAgLmNvbmZpZyA9IEFMQzg4M19BQ0VSIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAyNSwgLnBjaV9zdWJkZXZpY2UgPSAweDAwOWYsCi0JICAuY29uZmlnID0gQUxDODgzX0FDRVIgfSwKLQl7IC5tb2RlbG5hbWUgPSAiYXV0byIsIC5jb25maWcgPSBBTEM4ODNfQVVUTyB9LAorc3RhdGljIGNvbnN0IGNoYXIgKmFsYzg4M19tb2RlbHNbQUxDODgzX01PREVMX0xBU1RdID0geworCVtBTEM4ODNfM1NUXzJjaF9ESUddCT0gIjNzdGFjay1kaWciLAorCVtBTEM4ODNfM1NUXzZjaF9ESUddCT0gIjNzdGFjay02Y2gtZGlnIiwKKwlbQUxDODgzXzNTVF82Y2hdCT0gIjNzdGFjay02Y2giLAorCVtBTEM4ODNfNlNUX0RJR10JPSAiNnN0YWNrLWRpZyIsCisJW0FMQzg4M19UQVJHQV9ESUddCT0gInRhcmdhLWRpZyIsCisJW0FMQzg4M19UQVJHQV8yY2hfRElHXQk9ICJ0YXJnYS0yY2gtZGlnIiwKKwlbQUxDODg4X0RFTU9fQk9BUkRdCT0gIjZzdGFjay1kaWctZGVtbyIsCisJW0FMQzg4M19BQ0VSXQkJPSAiYWNlciIsCisJW0FMQzg4M19NRURJT05dCQk9ICJtZWRpb24iLAorCVtBTEM4ODNfTEFQVE9QX0VBUERdCT0gImxhcHRvcC1lYXBkIiwKKwlbQUxDODgzX0FVVE9dCQk9ICJhdXRvIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4ODNfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweDY2NjgsICJFQ1MiLCBBTEM4ODNfM1NUXzZjaF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDhlLCAweDUzNGQsIE5VTEwsIEFMQzg4M18zU1RfNmNoKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU1OCwgMCwgIkNsZXZvIGxhcHRvcCIsIEFMQzg4M19MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDEwNWIsIDB4NjY2OCwgIkZveGNvbm4iLCBBTEM4ODNfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NjY2OCwgIk1TSSIsIEFMQzg4M182U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3MTg3LCAiTVNJIiwgQUxDODgzXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDcyODAsICJNU0kiLCBBTEM4ODNfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4MDU3OSwgIk1TSSIsIEFMQzg4M19UQVJHQV8yY2hfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgzZWY5LCAiTVNJIiwgQUxDODgzX1RBUkdBX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4M2I3ZiwgIk1TSSIsIEFMQzg4M19UQVJHQV8yY2hfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgzZmNjLCAiTVNJIiwgQUxDODgzX1RBUkdBX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4M2ZjMSwgIk1TSSIsIEFMQzg4M19UQVJHQV9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDNmYzMsICJNU0kiLCBBTEM4ODNfVEFSR0FfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg0MzE0LCAiTVNJIiwgQUxDODgzX1RBUkdBX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NDMxOSwgIk1TSSIsIEFMQzg4M19UQVJHQV9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDQzMjQsICJNU0kiLCBBTEM4ODNfVEFSR0FfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHhhNDIyLCAiTVNJIiwgQUxDODgzX1RBUkdBXzJjaF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAwLCAiQWNlciBsYXB0b3AiLCBBTEM4ODNfQUNFUiksCisJU05EX1BDSV9RVUlSSygweDE2MWYsIDB4MjA1NCwgIk1lZGlvbiBsYXB0b3AiLCBBTEM4ODNfTUVESU9OKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA3MSwgMHg4MjU4LCAiRXZlc2hhbSBWb3lhZWdlciIsIEFMQzg4M19MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDYwMSwgIkQxMDJHR0MiLCBBTEM4ODNfM1NUXzZjaCksCiAJe30KIH07CiAKQEAgLTUxMzksNiArNTY1NiwzNSBAQAogCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzX3NpeHN0YWNrX21vZGVzLAogCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKIAl9LAorCVtBTEM4ODNfVEFSR0FfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzX3RhZ3JhX21peGVyLCBhbGM4ODNfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgzX3RhZ3JhX3ZlcmJzfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODNfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4ODNfYWRjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzZjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzZjaF9tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGM4ODNfdGFncmFfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGM4ODNfdGFncmFfYXV0b211dGUsCisJfSwKKwlbQUxDODgzX1RBUkdBXzJjaF9ESUddID0geworCQkubWl4ZXJzID0geyBhbGM4ODNfdGFncmFfMmNoX21peGVyfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODNfdGFncmFfdmVyYnN9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg4M19hZGNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjODgzX3RhZ3JhX3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjODgzX3RhZ3JhX2F1dG9tdXRlLAorCX0sCiAJW0FMQzg4OF9ERU1PX0JPQVJEXSA9IHsKIAkJLm1peGVycyA9IHsgYWxjODgzX2Jhc2VfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKIAkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzIH0sCkBAIC01MTY5LDYgKzU3MTUsMzEgQEAKIAkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAogCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKIAl9LAorCVtBTEM4ODNfTUVESU9OXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzX2ZpdmVzdGFja19taXhlciwKKwkJCSAgICBhbGM4ODNfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywKKwkJCQlhbGM4ODNfbWVkaW9uX2VhcGRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg4M19hZGNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M19zaXhzdGFja19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfc2l4c3RhY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg4M19MQVBUT1BfRUFQRF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4M19iYXNlX21peGVyLAorCQkJICAgIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODJfZWFwZF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODgzX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjODgzX2FkY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAorCX0sCiB9OwogCiAKQEAgLTUyNzcsOCArNTg0OCwxMCBAQAogCiAJY29kZWMtPnNwZWMgPSBzcGVjOwogCi0JYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIGFsYzg4M19jZmdfdGJsKTsKLQlpZiAoYm9hcmRfY29uZmlnIDwgMCB8fCBib2FyZF9jb25maWcgPj0gQUxDODgzX01PREVMX0xBU1QpIHsKKwlib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODgzX01PREVMX0xBU1QsCisJCQkJCQkgIGFsYzg4M19tb2RlbHMsCisJCQkJCQkgIGFsYzg4M19jZmdfdGJsKTsKKwlpZiAoYm9hcmRfY29uZmlnIDwgMCkgewogCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6IFVua25vd24gbW9kZWwgZm9yIEFMQzg4MywgIgogCQkgICAgICAgInRyeWluZyBhdXRvLXByb2JlIGZyb20gQklPUy4uLlxuIik7CiAJCWJvYXJkX2NvbmZpZyA9IEFMQzg4M19BVVRPOwpAQCAtNTM1NSw2ICs1OTI4LDI0IEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9oaXBwbzFfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJLyogSERBX0NPREVDX1ZPTFVNRSgiUEMgQmVlcCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAorCSAgIEhEQV9DT0RFQ19NVVRFKCJQQyBCZWVscCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLCAqLworCS8qSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MEQsIDB4MCwgSERBX09VVFBVVCksKi8KKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKwogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9IUF9CUENfbWl4ZXJbXSA9IHsKIAlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLApAQCAtNTM3Nyw2ICs1OTY4LDMwIEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIk1vbm8gUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURV9NT05PKCJNb25vIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiUEMgQmVlcCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJQQyBCZWVwIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3Rfb3B0aW9uX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiUmVhciBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJSZWFyIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKwogI2RlZmluZSBhbGMyNjJfY2FwdHVyZV9taXhlcgkJYWxjODgyX2NhcHR1cmVfbWl4ZXIKICNkZWZpbmUgYWxjMjYyX2NhcHR1cmVfYWx0X21peGVyCWFsYzg4Ml9jYXB0dXJlX2FsdF9taXhlcgogCkBAIC01NDU5LDYgKzYwNzQsMTAzIEBACiAJeyB9CiB9OwogCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9oaXBwb191bnNvbF92ZXJic1tdID0geworCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9oaXBwbzFfdW5zb2xfdmVyYnNbXSA9IHsKKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAorCisJezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJe30KK307CisKKy8qIG11dGUvdW5tdXRlIGludGVybmFsIHNwZWFrZXIgYWNjb3JkaW5nIHRvIHRoZSBocCBqYWNrIGFuZCBtdXRlIHN0YXRlICovCitzdGF0aWMgdm9pZCBhbGMyNjJfaGlwcG9fYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1bnNpZ25lZCBpbnQgbXV0ZTsKKworCWlmIChmb3JjZSB8fCAhIHNwZWMtPnNlbnNlX3VwZGF0ZWQpIHsKKwkJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJCS8qIG5lZWQgdG8gZXhlY3V0ZSBhbmQgc3luYyBhdCBmaXJzdCAqLworCQlzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTUsIDAsIEFDX1ZFUkJfU0VUX1BJTl9TRU5TRSwgMCk7CisJCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTUsIDAsCisJCQkJICAgIAkgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKTsKKwkJc3BlYy0+amFja19wcmVzZW50ID0gKHByZXNlbnQgJiAweDgwMDAwMDAwKSAhPSAwOworCQlzcGVjLT5zZW5zZV91cGRhdGVkID0gMTsKKwl9CisJaWYgKHNwZWMtPmphY2tfcHJlc2VudCkgeworCQkvKiBtdXRlIGludGVybmFsIHNwZWFrZXIgKi8KKwkJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE0LCAwLCBIREFfT1VUUFVULCAwLAorCQkJCQkgMHg4MCwgMHg4MCk7CisJCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNCwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkJIDB4ODAsIDB4ODApOworCX0gZWxzZSB7CisJCS8qIHVubXV0ZSBpbnRlcm5hbCBzcGVha2VyIGlmIG5lY2Vzc2FyeSAqLworCQltdXRlID0gc25kX2hkYV9jb2RlY19hbXBfcmVhZChjb2RlYywgMHgxNSwgMCwgSERBX09VVFBVVCwgMCk7CisJCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNCwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkJIDB4ODAsIG11dGUgJiAweDgwKTsKKwkJbXV0ZSA9IHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoY29kZWMsIDB4MTUsIDEsIEhEQV9PVVRQVVQsIDApOworCQlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTQsIDEsIEhEQV9PVVRQVVQsIDAsCisJCQkJCSAweDgwLCBtdXRlICYgMHg4MCk7CisJfQorfQorCisvKiB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayBzZW5zaW5nICovCitzdGF0aWMgdm9pZCBhbGMyNjJfaGlwcG9fdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCByZXMpCit7CisJaWYgKChyZXMgPj4gMjYpICE9IEFMQzg4MF9IUF9FVkVOVCkKKwkJcmV0dXJuOworCWFsYzI2Ml9oaXBwb19hdXRvbXV0ZShjb2RlYywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzI2Ml9oaXBwbzFfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1bnNpZ25lZCBpbnQgbXV0ZTsKKworCWlmIChmb3JjZSB8fCAhIHNwZWMtPnNlbnNlX3VwZGF0ZWQpIHsKKwkJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJCS8qIG5lZWQgdG8gZXhlY3V0ZSBhbmQgc3luYyBhdCBmaXJzdCAqLworCQlzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MWIsIDAsIEFDX1ZFUkJfU0VUX1BJTl9TRU5TRSwgMCk7CisJCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MWIsIDAsCisJCQkJICAgIAkgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKTsKKwkJc3BlYy0+amFja19wcmVzZW50ID0gKHByZXNlbnQgJiAweDgwMDAwMDAwKSAhPSAwOworCQlzcGVjLT5zZW5zZV91cGRhdGVkID0gMTsKKwl9CisJaWYgKHNwZWMtPmphY2tfcHJlc2VudCkgeworCQkvKiBtdXRlIGludGVybmFsIHNwZWFrZXIgKi8KKwkJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE0LCAwLCBIREFfT1VUUFVULCAwLAorCQkJCQkgMHg4MCwgMHg4MCk7CisJCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNCwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkJIDB4ODAsIDB4ODApOworCX0gZWxzZSB7CisJCS8qIHVubXV0ZSBpbnRlcm5hbCBzcGVha2VyIGlmIG5lY2Vzc2FyeSAqLworCQltdXRlID0gc25kX2hkYV9jb2RlY19hbXBfcmVhZChjb2RlYywgMHgxYiwgMCwgSERBX09VVFBVVCwgMCk7CisJCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNCwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkJIDB4ODAsIG11dGUgJiAweDgwKTsKKwkJbXV0ZSA9IHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoY29kZWMsIDB4MWIsIDEsIEhEQV9PVVRQVVQsIDApOworCQlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTQsIDEsIEhEQV9PVVRQVVQsIDAsCisJCQkJCSAweDgwLCBtdXRlICYgMHg4MCk7CisJfQorfQorCisvKiB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayBzZW5zaW5nICovCitzdGF0aWMgdm9pZCBhbGMyNjJfaGlwcG8xX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVzKQoreworCWlmICgocmVzID4+IDI2KSAhPSBBTEM4ODBfSFBfRVZFTlQpCisJCXJldHVybjsKKwlhbGMyNjJfaGlwcG8xX2F1dG9tdXRlKGNvZGVjLCAxKTsKK30KKwogLyoKICAqIGZ1aml0c3UgbW9kZWwKICAqICAweDE0ID0gaGVhZHBob25lL3NwZGlmLW91dCwgMHgxNSA9IGludGVybmFsIHNwZWFrZXIKQEAgLTU4MDksNiArNjUyMSwxMDAgQEAKIAl7IH0KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBVbm11dGUgQURDMC0yIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCisJICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisKKwkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZSBhbmFsb2ctbG9vcGJhY2sKKwkgKiBtaXhlciB3aWRnZXQKKwkgKiBOb3RlOiBQQVNEIG1vdGhlcmJvYXJkcyB1c2VzIHRoZSBMaW5lIEluIDIgYXMgdGhlIGlucHV0IGZvciBmcm9udAorCSAqIHBhbmVsIG1pYyAobWljIDIpCisJICovCisJLyogQW1wIEluZGljZXM6IE1pYzEgPSAwLCBNaWMyID0gMSwgTGluZTEgPSAyLCBMaW5lMiA9IDMsIENEID0gNCAqLworCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNSl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDYpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg3KX0sCisJLyoKKwkgKiBTZXQgdXAgb3V0cHV0IG1peGVycyAoMHgwYyAtIDB4MGUpCisJICovCisJLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKworCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KKwkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisKKworCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUCB9LAkvKiBIUCAqLworCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwJLyogTW9ubyAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwJLyogcmVhciBNSUMgKi8KKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwJLyogTGluZSBpbiAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwJLyogRnJvbnQgTUlDICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAkvKiBMaW5lIG91dCAqLworCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAkvKiBDRCBpbiAqLworCisJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCisKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisKKwkvKiB7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDIzIH0sICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDIzIH0sCisJezB4MWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAorCXsweDFkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKKworCS8qIEZJWE1FOiB1c2UgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLworCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxYywgMWQsIDE0LCAxNSwgMTYsIDE3LCAwYiAqLworCS8qIElucHV0IG1peGVyMTogdW5tdXRlIE1pYywgRi1NaWMsIExpbmUsIENEIGlucHV0cyAqLworCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwgLypyZWFyIE1JQyovCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LCAvKkxpbmUgaW4qLworCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpfSwgLypGIE1JQyovCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMyA8PCA4KSl9LCAvKkZyb250Ki8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA0IDw8IDgpKX0sIC8qQ0QqLworICAgICAgICAvKiB7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA2IDw8IDgpKX0sICAqLworCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDcgPDwgOCkpfSwgLypIUCovCisJLyogSW5wdXQgbWl4ZXIyICovCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAyIDw8IDgpKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMyA8PCA4KSl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDQgPDwgOCkpfSwKKyAgICAgICAgLyogezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNiA8PCA4KSl9LCAqLworCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDcgPDwgOCkpfSwKKwkvKiBJbnB1dCBtaXhlcjMgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAzIDw8IDgpKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNCA8PCA4KSl9LAorICAgICAgICAvKiB7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA2IDw8IDgpKX0sICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNyA8PCA4KSl9LAorCisJeyB9Cit9OworCiAvKiBwY20gY29uZmlndXJhdGlvbjogaWRlbnRpYWNhbCB3aXRoIEFMQzg4MCAqLwogI2RlZmluZSBhbGMyNjJfcGNtX2FuYWxvZ19wbGF5YmFjawlhbGM4ODBfcGNtX2FuYWxvZ19wbGF5YmFjawogI2RlZmluZSBhbGMyNjJfcGNtX2FuYWxvZ19jYXB0dXJlCWFsYzg4MF9wY21fYW5hbG9nX2NhcHR1cmUKQEAgLTU4NjYsMjYgKzY2NzIsMzUgQEAKIC8qCiAgKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKICAqLwotc3RhdGljIHN0cnVjdCBoZGFfYm9hcmRfY29uZmlnIGFsYzI2Ml9jZmdfdGJsW10gPSB7Ci0JeyAubW9kZWxuYW1lID0gImJhc2ljIiwgLmNvbmZpZyA9IEFMQzI2Ml9CQVNJQyB9LAotCXsgLm1vZGVsbmFtZSA9ICJmdWppdHN1IiwgLmNvbmZpZyA9IEFMQzI2Ml9GVUpJVFNVIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTBjZiwgLnBjaV9zdWJkZXZpY2UgPSAweDEzOTcsCi0JICAuY29uZmlnID0gQUxDMjYyX0ZVSklUU1UgfSwKLQl7IC5tb2RlbG5hbWUgPSAiaHAtYnBjIiwgLmNvbmZpZyA9IEFMQzI2Ml9IUF9CUEMgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MjgwYywKLQkgIC5jb25maWcgPSBBTEMyNjJfSFBfQlBDIH0sIC8qIHh3NDQwMCAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgyODAxLAotCSAgLmNvbmZpZyA9IEFMQzI2Ml9IUF9CUEMgfSwgLyogcTk2NSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgzMDE0LAotCSAgLmNvbmZpZyA9IEFMQzI2Ml9IUF9CUEMgfSwgLyogeHc2NDAwICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwMTUsCi0JICAuY29uZmlnID0gQUxDMjYyX0hQX0JQQyB9LCAvKiB4dzg0MDAgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MTJmZSwKLQkgIC5jb25maWcgPSBBTEMyNjJfSFBfQlBDIH0sIC8qIHh3OTQwMCAqLwotCXsgLm1vZGVsbmFtZSA9ICJiZW5xIiwgLmNvbmZpZyA9IEFMQzI2Ml9CRU5RX0VEOCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE3ZmYsIC5wY2lfc3ViZGV2aWNlID0gMHgwNTYwLAotCSAgLmNvbmZpZyA9IEFMQzI2Ml9CRU5RX0VEOCB9LAotCXsgLm1vZGVsbmFtZSA9ICJhdXRvIiwgLmNvbmZpZyA9IEFMQzI2Ml9BVVRPIH0sCitzdGF0aWMgY29uc3QgY2hhciAqYWxjMjYyX21vZGVsc1tBTEMyNjJfTU9ERUxfTEFTVF0gPSB7CisJW0FMQzI2Ml9CQVNJQ10JCT0gImJhc2ljIiwKKwlbQUxDMjYyX0hJUFBPXQkJPSAiaGlwcG8iLAorCVtBTEMyNjJfSElQUE9fMV0JPSAiaGlwcG9fMSIsCisJW0FMQzI2Ml9GVUpJVFNVXQk9ICJmdWppdHN1IiwKKwlbQUxDMjYyX0hQX0JQQ10JCT0gImhwLWJwYyIsCisJW0FMQzI2Ml9IUF9CUENfRDcwMDBfV0xdPSAiaHAtYnBjLWQ3MDAwIiwKKwlbQUxDMjYyX0JFTlFfRUQ4XQk9ICJiZW5xIiwKKwlbQUxDMjYyX0FVVE9dCQk9ICJhdXRvIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjJfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDAyLCAweDQzN2IsICJIaXBwbyIsIEFMQzI2Ml9ISVBQTyksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MTJmZSwgIkhQIHh3OTQwMCIsIEFMQzI2Ml9IUF9CUEMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MGMsICJIUCB4dzQ0MDAiLCBBTEMyNjJfSFBfQlBDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDE0LCAiSFAgeHc2NDAwIiwgQUxDMjYyX0hQX0JQQyksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxNSwgIkhQIHh3ODQwMCIsIEFMQzI2Ml9IUF9CUEMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MDAsICJIUCBENzAwMCIsIEFMQzI2Ml9IUF9CUENfRDcwMDBfV0wpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MDIsICJIUCBENzAwMCIsIEFMQzI2Ml9IUF9CUENfRDcwMDBfV0wpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MDQsICJIUCBENzAwMCIsIEFMQzI2Ml9IUF9CUENfRDcwMDBfV0wpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MDYsICJIUCBENzAwMCIsIEFMQzI2Ml9IUF9CUENfRDcwMDBfV0wpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MDEsICJIUCBENzAwMCIsIEFMQzI2Ml9IUF9CUENfRDcwMDBfV0YpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MDMsICJIUCBENzAwMCIsIEFMQzI2Ml9IUF9CUENfRDcwMDBfV0YpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MDUsICJIUCBENzAwMCIsIEFMQzI2Ml9IUF9CUENfRDcwMDBfV0YpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MDcsICJIUCBENzAwMCIsIEFMQzI2Ml9IUF9CUENfRDcwMDBfV0YpLAorCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgyMDMsICJTb255IFVYLTkwIiwgQUxDMjYyX0hJUFBPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTBjZiwgMHgxMzk3LCAiRnVqaXRzdSIsIEFMQzI2Ml9GVUpJVFNVKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdmZiwgMHgwNThmLCAiQmVucSBIaXBwbyIsIEFMQzI2Ml9ISVBQT18xKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdmZiwgMHgwNTYwLCAiQmVucSBFRDgiLCBBTEMyNjJfQkVOUV9FRDgpLAogCXt9CiB9OwogCkBAIC01OTAwLDYgKzY3MTUsMzAgQEAKIAkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKIAkJLmlucHV0X211eCA9ICZhbGMyNjJfY2FwdHVyZV9zb3VyY2UsCiAJfSwKKwlbQUxDMjYyX0hJUFBPXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYyX2Jhc2VfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGMyNjJfaGlwcG9fdW5zb2xfdmVyYnN9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzI2Ml9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjJfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzI2Ml9oaXBwb191bnNvbF9ldmVudCwKKwl9LAorCVtBTEMyNjJfSElQUE9fMV0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2Ml9oaXBwbzFfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGMyNjJfaGlwcG8xX3Vuc29sX3ZlcmJzfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCisJCS5ocF9uaWQgPSAweDAyLAorCQkuZGlnX291dF9uaWQgPSBBTEMyNjJfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGMyNjJfaGlwcG8xX3Vuc29sX2V2ZW50LAorCX0sCiAJW0FMQzI2Ml9GVUpJVFNVXSA9IHsKIAkJLm1peGVycyA9IHsgYWxjMjYyX2Z1aml0c3VfbWl4ZXIgfSwKIAkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGMyNjJfZnVqaXRzdV91bnNvbF92ZXJicyB9LApAQCAtNTkyMiw2ICs2NzYxLDI3IEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCiAJCS5pbnB1dF9tdXggPSAmYWxjMjYyX0hQX2NhcHR1cmVfc291cmNlLAogCX0sCQorCVtBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYyX0hQX2NhcHR1cmVfc291cmNlLAorCX0sCQorCVtBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9taXhlciwKKwkJCSAgICBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X29wdGlvbl9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYyX0hQX2NhcHR1cmVfc291cmNlLAorCX0sCQogCVtBTEMyNjJfQkVOUV9FRDhdID0gewogCQkubWl4ZXJzID0geyBhbGMyNjJfYmFzZV9taXhlciB9LAogCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsYzI2Ml9FQVBEX3ZlcmJzIH0sCkBAIC01OTQwLDcgKzY4MDAsNyBAQAogCWludCBib2FyZF9jb25maWc7CiAJaW50IGVycjsKIAotCXNwZWMgPSBrY2FsbG9jKDEsIHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwogCWlmIChzcGVjID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC01OTU2LDkgKzY4MTYsMTEgQEAKIAl9CiAjZW5kaWYKIAotCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBhbGMyNjJfY2ZnX3RibCk7Ci0JCi0JaWYgKGJvYXJkX2NvbmZpZyA8IDAgfHwgYm9hcmRfY29uZmlnID49IEFMQzI2Ml9NT0RFTF9MQVNUKSB7CisJYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFMQzI2Ml9NT0RFTF9MQVNULAorCQkJCQkJICBhbGMyNjJfbW9kZWxzLAorCQkJCQkJICBhbGMyNjJfY2ZnX3RibCk7CisKKwlpZiAoYm9hcmRfY29uZmlnIDwgMCkgewogCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6IFVua25vd24gbW9kZWwgZm9yIEFMQzI2MiwgIgogCQkgICAgICAgInRyeWluZyBhdXRvLXByb2JlIGZyb20gQklPUy4uLlxuIik7CiAJCWJvYXJkX2NvbmZpZyA9IEFMQzI2Ml9BVVRPOwpAQCAtNjA3OCw2ICs2OTQwLDQ0IEBACiAJeyA0LCBhbGM4NjFfdW5pd2lsbF9tMzFfY2g0X2luaXQgfSwKIH07CiAKKy8qIFNldCBtaWMxIGFuZCBsaW5lLWluIGFzIGlucHV0IGFuZCB1bm11dGUgdGhlIG1peGVyICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV9hc3VzX2NoMl9pbml0W10gPSB7CisJLyogc2V0IHBpbiB3aWRnZXQgMUFoIChsaW5lIGluKSBmb3IgaW5wdXQgKi8KKwl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAorCS8qIHNldCBwaW4gd2lkZ2V0IDE4aCAobWljMS8yKSBmb3IgaW5wdXQsIGZvciBtaWMgYWxzbyBlbmFibGUgdGhlIHZyZWYgKi8KKwl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAorCisJeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGMgfSwKKyNpZiAwCisJeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpIH0sIC8qbWljKi8KKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMiA8PCA4KSkgfSwgLypsaW5lLWluKi8KKyNlbmRpZgorCXsgfSAvKiBlbmQgKi8KK307CisvKiBTZXQgbWljMSBuYWQgbGluZS1pbiBhcyBvdXRwdXQgYW5kIG11dGUgbWl4ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX2FzdXNfY2g2X2luaXRbXSA9IHsKKwkvKiBzZXQgcGluIHdpZGdldCAxQWggKGxpbmUgaW4pIGZvciBvdXRwdXQgKEJhY2sgU3Vycm91bmQpKi8KKwl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAorCS8qIHsgMHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwgKi8KKwkvKiBzZXQgcGluIHdpZGdldCAxOGggKG1pYzEpIGZvciBvdXRwdXQgKENMRkUpKi8KKwl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAorCS8qIHsgMHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwgKi8KKwl7IDB4MGMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCisJeyAweDBkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAorCisJeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODAgfSwKKyNpZiAwCisJeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpIH0sIC8qbWljKi8KKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMiA8PCA4KSkgfSwgLypsaW5lIGluKi8KKyNlbmRpZgorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4NjFfYXN1c19tb2Rlc1syXSA9IHsKKwl7IDIsIGFsYzg2MV9hc3VzX2NoMl9pbml0IH0sCisJeyA2LCBhbGM4NjFfYXN1c19jaDZfaW5pdCB9LAorfTsKKwogLyogcGF0Y2gtQUxDODYxICovCiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjFfYmFzZV9taXhlcltdID0gewpAQCAtNjE1NCw3ICs3MDU0LDI5IEBACiAgICAgICAgICAgICAgICAgLnByaXZhdGVfdmFsdWUgPSBBUlJBWV9TSVpFKGFsYzg2MV90aHJlZXN0YWNrX21vZGVzKSwKIAl9LAogCXsgfSAvKiBlbmQgKi8KLX07CQkJCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxX3Rvc2hpYmFfbWl4ZXJbXSA9IHsKKyAgICAgICAgLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KKwlIREFfQ09ERUNfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAorCQorICAgICAgICAvKkNhcHR1cmUgbWl4ZXIgY29udHJvbCAqLworCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsCisJCS5jb3VudCA9IDEsCisJCS5pbmZvID0gYWxjX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhbGNfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gYWxjX211eF9lbnVtX3B1dCwKKwl9LAorCisJeyB9IC8qIGVuZCAqLworfTsJCisKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjFfdW5pd2lsbF9tMzFfbWl4ZXJbXSA9IHsKICAgICAgICAgLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKQEAgLTYxOTYsNyArNzExOCw1OCBAQAogCX0sCiAJeyB9IC8qIGVuZCAqLwogfTsJCQkKLQkKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MV9hc3VzX21peGVyW10gPSB7CisgICAgICAgIC8qIG91dHB1dCBtaXhlciBjb250cm9sICovCisJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MDYsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlNpZGUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNCwgMHgwLCBIREFfT1VUUFVUKSwKKworCS8qIElucHV0IG1peGVyIGNvbnRyb2wgKi8KKwlIREFfQ09ERUNfVk9MVU1FKCJJbnB1dCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJJbnB1dCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MDEsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYSwgMHgwMywgSERBX09VVFBVVCksIC8qIHdhcyBIREFfSU5QVVQgKHdoeT8pICovCisgCisJLyogQ2FwdHVyZSBtaXhlciBjb250cm9sICovCisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwKKwkJLmNvdW50ID0gMSwKKwkJLmluZm8gPSBhbGNfbXV4X2VudW1faW5mbywKKwkJLmdldCA9IGFsY19tdXhfZW51bV9nZXQsCisJCS5wdXQgPSBhbGNfbXV4X2VudW1fcHV0LAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAorICAgICAgICAgICAgICAgIC5wcml2YXRlX3ZhbHVlID0gQVJSQVlfU0laRShhbGM4NjFfYXN1c19tb2RlcyksCisJfSwKKwl7IH0KK307CisKKy8qIGFkZGl0aW9uYWwgbWl4ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjFfYXN1c19sYXB0b3BfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJQQyBCZWVwIFBsYXliYWNrIFZvbHVtZSIsIDB4MjMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlBDIEJlZXAgUGxheWJhY2sgU3dpdGNoIiwgMHgyMywgMHgwLCBIREFfT1VUUFVUKSwKKwl7IH0KK307CisKIC8qCiAgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCiAgKi8KQEAgLTYyMTcsNyArNzE5MCw3IEBACiAJLyogcG9ydC1FIGZvciBIUCBvdXQgKGZyb250IHBhbmVsKSAqLwogCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwIH0sCiAJLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAorCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKIAkvKiBwb3J0LUYgZm9yIG1pYy1pbiAoZnJvbnQgcGFuZWwpIHdpdGggdnJlZiAqLwogCXsgMHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCiAJLyogcG9ydC1HIGZvciBDTEZFIChyZWFyIHBhbmVsKSAqLwpAQCAtNjI4MSw3ICs3MjU0LDcgQEAKIAkvKiBwb3J0LUUgZm9yIEhQIG91dCAoZnJvbnQgcGFuZWwpICovCiAJeyAweDBmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4YzAgfSwKIAkvKiByb3V0ZSBmcm9udCBQQ00gdG8gSFAgKi8KLQl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCisJeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAogCS8qIHBvcnQtRiBmb3IgbWljLWluIChmcm9udCBwYW5lbCkgd2l0aCB2cmVmICovCiAJeyAweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKIAkvKiBwb3J0LUcgZm9yIENMRkUgKHJlYXIgcGFuZWwpICovCkBAIC02MzQxLDcgKzczMTQsNyBAQAogCS8qIHBvcnQtRSBmb3IgSFAgb3V0IChmcm9udCBwYW5lbCkgKi8KIAl7IDB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LCAvLyB0aGlzIGhhcyB0byBiZSBzZXQgdG8gVlJFRjgwCiAJLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAorCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKIAkvKiBwb3J0LUYgZm9yIG1pYy1pbiAoZnJvbnQgcGFuZWwpIHdpdGggdnJlZiAqLwogCXsgMHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCiAJLyogcG9ydC1HIGZvciBDTEZFIChyZWFyIHBhbmVsKSAqLwpAQCAtNjM4NSw2ICs3MzU4LDc0IEBACiAJeyB9CiB9OwogCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV9hc3VzX2luaXRfdmVyYnNbXSA9IHsKKwkvKgorCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCisJICovCisJLyogcG9ydC1BIGZvciBzdXJyb3VuZCAocmVhciBwYW5lbCkgfCBhY2NvcmRpbmcgdG8gY29kZWMjMCB0aGlzIGlzIHRoZSBIUCBqYWNrKi8KKwl7IDB4MGUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMCB9LCAvKiB3YXMgMHgwMCAqLworCS8qIHJvdXRlIGZyb250IFBDTSB0byBIUCAqLworCXsgMHgwZSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKKwkvKiBwb3J0LUIgZm9yIG1pYy1pbiAocmVhciBwYW5lbCkgd2l0aCB2cmVmICovCisJeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKKwkvKiBwb3J0LUMgZm9yIGxpbmUtaW4gKHJlYXIgcGFuZWwpICovCisJeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKKwkvKiBwb3J0LUQgZm9yIEZyb250ICovCisJeyAweDBiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKKwl7IDB4MGIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCisJLyogcG9ydC1FIGZvciBIUCBvdXQgKGZyb250IHBhbmVsKSAqLworCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sIC8qIHRoaXMgaGFzIHRvIGJlIHNldCB0byBWUkVGODAgKi8KKwkvKiByb3V0ZSBmcm9udCBQQ00gdG8gSFAgKi8KKwl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCisJLyogcG9ydC1GIGZvciBtaWMtaW4gKGZyb250IHBhbmVsKSB3aXRoIHZyZWYgKi8KKwl7IDB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAorCS8qIHBvcnQtRyBmb3IgQ0xGRSAocmVhciBwYW5lbCkgKi8KKwl7IDB4MWYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAorCS8qIHBvcnQtSCBmb3Igc2lkZSAocmVhciBwYW5lbCkgKi8KKwl7IDB4MjAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAorCS8qIENELWluICovCisJeyAweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKKwkvKiByb3V0ZSBmcm9udCBtaWMgdG8gQURDMSovCisJezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJLyogVW5tdXRlIERBQzB+MyAmIHNwZGlmIG91dCovCisJezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MDYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIFVubXV0ZSBNaXhlciAxNCAobWljKSAxYyAoTGluZSBpbikqLworCXsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisgICAgICAgIHsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKyAgICAgICAgezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwkKKwkvKiBVbm11dGUgU3RlcmVvIE1peGVyIDE1ICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwYyAgICAgICAgICB9LCAvKiBPdXRwdXQgMH4xMiBzdGVwICovCisKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwgLyogaHAgdXNlZCBEQUMgMyAoRnJvbnQpICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAorCXsgfQorfTsKKworLyogYWRkaXRpb25hbCBpbml0IHZlcmJzIGZvciBBU1VTIGxhcHRvcHMgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX2FzdXNfbGFwdG9wX2luaXRfdmVyYnNbXSA9IHsKKwl7IDB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0NSB9LCAvKiBIUC1vdXQgKi8KKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpIH0sIC8qIG11dGUgbGluZS1pbiAqLworCXsgfQorfTsKKwogLyoKICAqIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24gb2YgQURDLCBpbnB1dCBtaXhlcnMgYW5kIG91dHB1dCBtaXhlcnMKICAqLwpAQCAtNjQzNyw2ICs3NDc4LDM5IEBACiAJeyB9CiB9OwogCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV90b3NoaWJhX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgwZiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCisgICAgICAgIAorCXsgfQorfTsKKworLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLworc3RhdGljIHZvaWQgYWxjODYxX3Rvc2hpYmFfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDBmLCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE2LCAwLCBIREFfSU5QVVQsIDAsCisJCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE2LCAxLCBIREFfSU5QVVQsIDAsCisJCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDFhLCAwLCBIREFfSU5QVVQsIDMsCisJCQkJIDB4ODAsIHByZXNlbnQgPyAwIDogMHg4MCk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDFhLCAxLCBIREFfSU5QVVQsIDMsCisJCQkJIDB4ODAsIHByZXNlbnQgPyAwIDogMHg4MCk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg2MV90b3NoaWJhX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVzKQoreworCS8qIExvb2tzIGxpa2UgdGhlIHVuc29sIGV2ZW50IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBzdGFuZGFyZAorCSAqIGRlZmluaXRpb24uICA2Yml0IHRhZyBpcyBwbGFjZWQgYXQgMjYgYml0IQorCSAqLworCWlmICgocmVzID4+IDI2KSA9PSBBTEM4ODBfSFBfRVZFTlQpCisJCWFsYzg2MV90b3NoaWJhX2F1dG9tdXRlKGNvZGVjKTsKK30KKwogLyogcGNtIGNvbmZpZ3VyYXRpb246IGlkZW50aWFjYWwgd2l0aCBBTEM4ODAgKi8KICNkZWZpbmUgYWxjODYxX3BjbV9hbmFsb2dfcGxheWJhY2sJYWxjODgwX3BjbV9hbmFsb2dfcGxheWJhY2sKICNkZWZpbmUgYWxjODYxX3BjbV9hbmFsb2dfY2FwdHVyZQlhbGM4ODBfcGNtX2FuYWxvZ19jYXB0dXJlCkBAIC02NzEwLDE5ICs3Nzg0LDI5IEBACiAvKgogICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0CiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBhbGM4NjFfY2ZnX3RibFtdID0gewotCXsgLm1vZGVsbmFtZSA9ICIzc3RhY2siLCAuY29uZmlnID0gQUxDODYxXzNTVCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDgwODYsIC5wY2lfc3ViZGV2aWNlID0gMHhkNjAwLAotCSAgLmNvbmZpZyA9IEFMQzg2MV8zU1QgfSwKLQl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrLTY2MCIsIC5jb25maWcgPSBBTEM2NjBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDgxZTcsCi0JICAuY29uZmlnID0gQUxDNjYwXzNTVCB9LAotCXsgLm1vZGVsbmFtZSA9ICIzc3RhY2stZGlnIiwgLmNvbmZpZyA9IEFMQzg2MV8zU1RfRElHIH0sCi0JeyAubW9kZWxuYW1lID0gIjZzdGFjay1kaWciLCAuY29uZmlnID0gQUxDODYxXzZTVF9ESUcgfSwKLQl7IC5tb2RlbG5hbWUgPSAidW5pd2lsbC1tMzEiLCAuY29uZmlnID0gQUxDODYxX1VOSVdJTExfTTMxfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNTg0LCAucGNpX3N1YmRldmljZSA9IDB4OTA3MiwKLQkgIC5jb25maWcgPSBBTEM4NjFfVU5JV0lMTF9NMzEgfSwKLQl7IC5tb2RlbG5hbWUgPSAiYXV0byIsIC5jb25maWcgPSBBTEM4NjFfQVVUTyB9LAorc3RhdGljIGNvbnN0IGNoYXIgKmFsYzg2MV9tb2RlbHNbQUxDODYxX01PREVMX0xBU1RdID0geworCVtBTEM4NjFfM1NUXQkJPSAiM3N0YWNrIiwKKwlbQUxDNjYwXzNTVF0JCT0gIjNzdGFjay02NjAiLAorCVtBTEM4NjFfM1NUX0RJR10JPSAiM3N0YWNrLWRpZyIsCisJW0FMQzg2MV82U1RfRElHXQk9ICI2c3RhY2stZGlnIiwKKwlbQUxDODYxX1VOSVdJTExfTTMxXQk9ICJ1bml3aWxsLW0zMSIsCisJW0FMQzg2MV9UT1NISUJBXQk9ICJ0b3NoaWJhIiwKKwlbQUxDODYxX0FTVVNdCQk9ICJhc3VzIiwKKwlbQUxDODYxX0FTVVNfTEFQVE9QXQk9ICJhc3VzLWxhcHRvcCIsCisJW0FMQzg2MV9BVVRPXQkJPSAiYXV0byIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODYxX2NmZ190YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMjA1LCAiQVNVUyBXN0oiLCBBTEM4NjFfM1NUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzM1LCAiQVNVUyBGMi8zIiwgQUxDODYxX0FTVVNfTEFQVE9QKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzM4LCAiQVNVUyBGMi8zIiwgQUxDODYxX0FTVVNfTEFQVE9QKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzkzLCAiQVNVUyIsIEFMQzg2MV9BU1VTKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MWU3LCAiQVNVUyIsIEFMQzY2MF8zU1QpLAorCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMDAsICJUb3NoaWJhIiwgQUxDODYxX1RPU0hJQkEpLAorCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMTAsICJUb3NoaWJhIiwgQUxDODYxX1RPU0hJQkEpLAorCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNzIsICJVbml3aWxsIG0zMSIsIEFMQzg2MV9VTklXSUxMX00zMSksCisJU05EX1BDSV9RVUlSSygweDE1ODQsIDB4MmIwMSwgIlVuaXdpbGwgWDQwQUl4IiwgQUxDODYxX1VOSVdJTExfTTMxKSwKKwlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHhkNjAwLCAiSW50ZWwiLCBBTEM4NjFfM1NUKSwKIAl7fQogfTsKIApAQCAtNjc4OSw4ICs3ODczLDQ4IEBACiAJCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKIAkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCiAJfSwKLQotfTsJCisJW0FMQzg2MV9UT1NISUJBXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODYxX3Rvc2hpYmFfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV9iYXNlX2luaXRfdmVyYnMsIGFsYzg2MV90b3NoaWJhX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjFfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4NjFfZGFjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODYxX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjODYxX2FkY19uaWRzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg2MV9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjODYxX3Rvc2hpYmFfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGM4NjFfdG9zaGliYV9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4NjFfQVNVU10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MV9hc3VzX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfYXN1c19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODYxX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4NjFfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MV9hc3VzX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MV9hc3VzX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmhwX25pZCA9IDB4MDYsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKKwkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODYxX0FTVVNfTEFQVE9QXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODYxX3Rvc2hpYmFfbWl4ZXIsIGFsYzg2MV9hc3VzX2xhcHRvcF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX2FzdXNfaW5pdF92ZXJicywKKwkJCQlhbGM4NjFfYXN1c19sYXB0b3BfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKKwkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCisJfSwKK307CiAKIAogc3RhdGljIGludCBwYXRjaF9hbGM4NjEoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC02Nzk5LDE1ICs3OTIzLDE3IEBACiAJaW50IGJvYXJkX2NvbmZpZzsKIAlpbnQgZXJyOwogCi0Jc3BlYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CisJc3BlYyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNwZWMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAljb2RlYy0+c3BlYyA9IHNwZWM7CQogCi0gICAgICAgIGJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBhbGM4NjFfY2ZnX3RibCk7CisgICAgICAgIGJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBBTEM4NjFfTU9ERUxfTEFTVCwKKwkJCQkJCSAgYWxjODYxX21vZGVscywKKwkJCQkJCSAgYWxjODYxX2NmZ190YmwpOwogCi0JaWYgKGJvYXJkX2NvbmZpZyA8IDAgfHwgYm9hcmRfY29uZmlnID49IEFMQzg2MV9NT0RFTF9MQVNUKSB7CisJaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBVbmtub3duIG1vZGVsIGZvciBBTEM4NjEsICIKIAkJICAgICAgICJ0cnlpbmcgYXV0by1wcm9iZSBmcm9tIEJJT1MuLi5cbiIpOwogCQlib2FyZF9jb25maWcgPSBBTEM4NjFfQVVUTzsKQEAgLTY4NDYsMTkgKzc5NzIsNzA2IEBACiB9CiAKIC8qCisgKiBBTEM4NjEtVkQgc3VwcG9ydAorICoKKyAqIEJhc2VkIG9uIEFMQzg4MgorICoKKyAqIEluIGFkZGl0aW9uLCBhbiBpbmRlcGVuZGVudCBEQUMKKyAqLworI2RlZmluZSBBTEM4NjFWRF9ESUdPVVRfTklECTB4MDYKKworc3RhdGljIGhkYV9uaWRfdCBhbGM4NjF2ZF9kYWNfbmlkc1s0XSA9IHsKKwkvKiBmcm9udCwgc3VyciwgY2xmZSwgc2lkZSBzdXJyICovCisJMHgwMiwgMHgwMywgMHgwNCwgMHgwNQorfTsKKworLyogZGFjX25pZHMgZm9yIEFMQzY2MHZkIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlciAtIGFjY29yZGluZyB0bworICogUmVhbHRlaydzIGRyaXZlci4KKyAqIFRoaXMgc2hvdWxkIHByb2JhYmx5IHRlc3VsdCBpbiBhIGRpZmZlcmVudCBtaXhlciBmb3IgNnN0YWNrIG1vZGVscworICogb2YgQUxDNjYwdmQgY29kZWNzLCBidXQgZm9yIG5vdyB0aGVyZSBpcyBvbmx5IDNzdGFjayBtaXhlcgorICogLSBhbmQgaXQgaXMgdGhlIHNhbWUgYXMgaW4gODYxdmQuCisgKiBhZGNfbmlkcyBpbiBBTEM2NjB2ZCBhcmUgKGlzKSB0aGUgc2FtZSBhcyBpbiA4NjF2ZAorICovCitzdGF0aWMgaGRhX25pZF90IGFsYzY2MHZkX2RhY19uaWRzWzNdID0geworCS8qIGZyb250LCByZWFyLCBjbGZlLCByZWFyX3N1cnIgKi8KKwkweDAyLCAweDA0LCAweDAzCit9OworCitzdGF0aWMgaGRhX25pZF90IGFsYzg2MXZkX2FkY19uaWRzWzFdID0geworCS8qIEFEQzAgKi8KKwkweDA5LAorfTsKKworLyogaW5wdXQgTVVYICovCisvKiBGSVhNRTogc2hvdWxkIGJlIGEgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLworc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg2MXZkX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSA0LAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgwIH0sCisJCXsgIkZyb250IE1pYyIsIDB4MSB9LAorCQl7ICJMaW5lIiwgMHgyIH0sCisJCXsgIkNEIiwgMHg0IH0sCisJfSwKK307CisKKyNkZWZpbmUgYWxjODYxdmRfbXV4X2VudW1faW5mbyBhbGNfbXV4X2VudW1faW5mbworI2RlZmluZSBhbGM4NjF2ZF9tdXhfZW51bV9nZXQgYWxjX211eF9lbnVtX2dldAorCitzdGF0aWMgaW50IGFsYzg2MXZkX211eF9lbnVtX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwljb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCA9IHNwZWMtPmlucHV0X211eDsKKwl1bnNpZ25lZCBpbnQgYWRjX2lkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCXN0YXRpYyBoZGFfbmlkX3QgY2FwdHVyZV9taXhlcnNbMV0gPSB7IDB4MjIgfTsKKwloZGFfbmlkX3QgbmlkID0gY2FwdHVyZV9taXhlcnNbYWRjX2lkeF07CisJdW5zaWduZWQgaW50ICpjdXJfdmFsID0gJnNwZWMtPmN1cl9tdXhbYWRjX2lkeF07CisJdW5zaWduZWQgaW50IGksIGlkeDsKKworCWlkeCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaWYgKGlkeCA+PSBpbXV4LT5udW1faXRlbXMpCisJCWlkeCA9IGltdXgtPm51bV9pdGVtcyAtIDE7CisJaWYgKCpjdXJfdmFsID09IGlkeCAmJiAhIGNvZGVjLT5pbl9yZXN1bWUpCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBpbXV4LT5udW1faXRlbXM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgdiA9IChpID09IGlkeCkgPyAweDcwMDAgOiAweDcwODA7CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCQkgICAgdiB8IChpbXV4LT5pdGVtc1tpXS5pbmRleCA8PCA4KSk7CisJfQorCSpjdXJfdmFsID0gaWR4OworCXJldHVybiAxOworfQorCisvKgorICogMmNoIG1vZGUKKyAqLworc3RhdGljIHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXNbMV0gPSB7CisJeyAyLCBOVUxMIH0KK307CisKKy8qCisgKiA2Y2ggbW9kZQorICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkXzZzdGFja19jaDZfaW5pdFtdID0geworCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCisJeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDhjaCBtb2RlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfNnN0YWNrX2NoOF9pbml0W10gPSB7CisJeyAweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODYxdmRfNnN0YWNrX21vZGVzWzJdID0geworCXsgNiwgYWxjODYxdmRfNnN0YWNrX2NoNl9pbml0IH0sCisJeyA4LCBhbGM4NjF2ZF82c3RhY2tfY2g4X2luaXQgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9jaG1vZGVfbWl4ZXJbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAorCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCisJCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCisJCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxdmRfY2FwdHVyZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKKworCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS8qIFRoZSBtdWx0aXBsZSAiQ2FwdHVyZSBTb3VyY2UiIGNvbnRyb2xzIGNvbmZ1c2UgYWxzYW1peGVyCisJCSAqIFNvIGNhbGwgc29tZXdoYXQgZGlmZmVyZW50Li4KKwkJICpGSVhNRTogdGhlIGNvbnRyb2xzIGFwcGVhciBpbiB0aGUgInBsYXliYWNrIiB2aWV3IQorCQkgKi8KKwkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLworCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAorCQkuY291bnQgPSAxLAorCQkuaW5mbyA9IGFsYzg2MXZkX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhbGM4NjF2ZF9tdXhfZW51bV9nZXQsCisJCS5wdXQgPSBhbGM4NjF2ZF9tdXhfZW51bV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCisvKiBQaW4gYXNzaWdubWVudDogRnJvbnQ9MHgxNCwgUmVhcj0weDE1LCBDTEZFPTB4MTYsIFNpZGU9MHgxNworICogICAgICAgICAgICAgICAgIE1pYz0weDE4LCBGcm9udCBNaWM9MHgxOSwgTGluZS1Jbj0weDFhLCBIUD0weDFiCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF82c3RfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAxLCAweDAsCisJCQkJSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMiwgMHgwLAorCQkJCUhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMiwgSERBX0lOUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKKworCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF8zc3RfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKKworCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnNbXSA9IHsKKwkvKgorCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCisJICovCisJezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisKKwkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mCisJICogdGhlIGFuYWxvZy1sb29wYmFjayBtaXhlciB3aWRnZXQKKwkgKi8KKwkvKiBBbXAgSW5kaWNlczogTWljMSA9IDAsIE1pYzIgPSAxLCBMaW5lMSA9IDIsIExpbmUyID0gMywgQ0QgPSA0ICovCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDQpfSwKKworCS8qIENhcHR1cmUgbWl4ZXI6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNSl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDYpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg4KX0sCisKKwkvKgorCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDAyIC0gMHgwNSkKKwkgKi8KKwkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLworCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCisJLyogc2V0IHVwIGlucHV0IGFtcHMgZm9yIGFuYWxvZyBsb29wYmFjayAqLworCS8qIEFtcCBJbmRpY2VzOiBEQUMgPSAwLCBtaXhlciA9IDEgKi8KKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisKKwl7IH0KK307CisKKy8qCisgKiAzLXN0YWNrIHBpbiBjb25maWd1cmF0aW9uOgorICogZnJvbnQgPSAweDE0LCBtaWMvY2xmZSA9IDB4MTgsIEhQID0gMHgxOSwgbGluZS9zdXJyID0gMHgxYSwgZi1taWMgPSAweDFiCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfM3N0YWNrX2luaXRfdmVyYnNbXSA9IHsKKwkvKgorCSAqIFNldCBwaW4gbW9kZSBhbmQgbXV0aW5nCisJICovCisJLyogc2V0IGZyb250IHBpbiB3aWRnZXRzIDB4MTQgZm9yIG91dHB1dCAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKworCS8qIE1pYyAocmVhcikgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogTGluZSBJbiBwaW46IGlucHV0ICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBMaW5lLTIgSW46IEhlYWRwaG9uZSBvdXRwdXQgKG91dHB1dCAwIC0gMHgwYykgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisKKwl7IH0KK307CisKKy8qCisgKiA2LXN0YWNrIHBpbiBjb25maWd1cmF0aW9uOgorICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkXzZzdGFja19pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBTZXQgcGluIG1vZGUgYW5kIG11dGluZworCSAqLworCS8qIHNldCBmcm9udCBwaW4gd2lkZ2V0cyAweDE0IGZvciBvdXRwdXQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwkvKiBSZWFyIFBpbjogb3V0cHV0IDEgKDB4MGQpICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCS8qIENMRkUgUGluOiBvdXRwdXQgMiAoMHgwZSkgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCisJLyogU2lkZSBQaW46IG91dHB1dCAzICgweDBmKSAqLworCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKKworCS8qIE1pYyAocmVhcikgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogTGluZSBJbiBwaW46IGlucHV0ICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBMaW5lLTIgSW46IEhlYWRwaG9uZSBvdXRwdXQgKG91dHB1dCAwIC0gMHgwYykgKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLworCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisKKwl7IH0KK307CisKKy8qIHBjbSBjb25maWd1cmF0aW9uOiBpZGVudGlhY2FsIHdpdGggQUxDODgwICovCisjZGVmaW5lIGFsYzg2MXZkX3BjbV9hbmFsb2dfcGxheWJhY2sJYWxjODgwX3BjbV9hbmFsb2dfcGxheWJhY2sKKyNkZWZpbmUgYWxjODYxdmRfcGNtX2FuYWxvZ19jYXB0dXJlCWFsYzg4MF9wY21fYW5hbG9nX2NhcHR1cmUKKyNkZWZpbmUgYWxjODYxdmRfcGNtX2RpZ2l0YWxfcGxheWJhY2sJYWxjODgwX3BjbV9kaWdpdGFsX3BsYXliYWNrCisjZGVmaW5lIGFsYzg2MXZkX3BjbV9kaWdpdGFsX2NhcHR1cmUJYWxjODgwX3BjbV9kaWdpdGFsX2NhcHR1cmUKKworLyoKKyAqIGNvbmZpZ3VyYXRpb24gYW5kIHByZXNldAorICovCitzdGF0aWMgY29uc3QgY2hhciAqYWxjODYxdmRfbW9kZWxzW0FMQzg2MVZEX01PREVMX0xBU1RdID0geworCVtBTEM2NjBWRF8zU1RdCQk9ICIzc3RhY2stNjYwIiwKKwlbQUxDODYxVkRfM1NUXQkJPSAiM3N0YWNrIiwKKwlbQUxDODYxVkRfM1NUX0RJR10JPSAiM3N0YWNrLWRpZ291dCIsCisJW0FMQzg2MVZEXzZTVF9ESUddCT0gIjZzdGFjay1kaWdvdXQiLAorCVtBTEM4NjFWRF9BVVRPXQkJPSAiYXV0byIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODYxdmRfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMzksICJBc3VzIEcxIiwgQUxDNjYwVkRfM1NUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTBkZSwgMHgwM2YwLCAiUmVhbHRlayBBTEM2NjAgZGVtbyIsIEFMQzY2MFZEXzNTVCksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4YTg4ZCwgIlJlYWx0ZWsgQUxDNjYwIGRlbW8iLCBBTEM2NjBWRF8zU1QpLAorCisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MzgwMiwgIkxlbm92byAzMDAwIEMyMDAiLCBBTEM4NjFWRF8zU1QpLAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzg2MXZkX3ByZXNldHNbXSA9IHsKKwlbQUxDNjYwVkRfM1NUXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODYxdmRfM3N0X21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQkgYWxjODYxdmRfM3N0YWNrX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjB2ZF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzY2MHZkX2RhY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4NjF2ZF9hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg2MXZkX2FkY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg2MVZEXzNTVF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MXZkXzNzdF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJIGFsYzg2MXZkXzNzdGFja19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxdmRfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4NjF2ZF9kYWNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4NjF2ZF9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4NjFWRF8zU1RfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODYxdmRfM3N0X21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJicywKKwkJIAkJIGFsYzg2MXZkXzNzdGFja19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxdmRfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4NjF2ZF9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODYxVkRfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4NjF2ZF9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4NjFWRF82U1RfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODYxdmRfNnN0X21peGVyLCBhbGM4NjF2ZF9jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg2MXZkXzZzdGFja19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxdmRfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4NjF2ZF9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODYxVkRfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MXZkXzZzdGFja19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF82c3RhY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCisJfSwKK307CisKKy8qCisgKiBCSU9TIGF1dG8gY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgdm9pZCBhbGM4NjF2ZF9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQloZGFfbmlkX3QgbmlkLCBpbnQgcGluX3R5cGUsIGludCBkYWNfaWR4KQoreworCS8qIHNldCBhcyBvdXRwdXQgKi8KKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCisJCQkJQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBwaW5fdHlwZSk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCQkJCUFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFKTsKK30KKworc3RhdGljIHZvaWQgYWxjODYxdmRfYXV0b19pbml0X211bHRpX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gSERBX1NJREU7IGkrKykgeworCQloZGFfbmlkX3QgbmlkID0gc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zW2ldOworCQlpZiAobmlkKQorCQkJYWxjODYxdmRfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwKKwkJCQkJCQkJUElOX09VVCwgaSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGFsYzg2MXZkX2F1dG9faW5pdF9ocF9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaGRhX25pZF90IHBpbjsKKworCXBpbiA9IHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXTsKKwlpZiAocGluKSAvKiBjb25uZWN0IHRvIGZyb250IGFuZCAgdXNlIGRhYyAwICovCisJCWFsYzg2MXZkX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9IUCwgMCk7Cit9CisKKyNkZWZpbmUgYWxjODYxdmRfaXNfaW5wdXRfcGluKG5pZCkJYWxjODgwX2lzX2lucHV0X3BpbihuaWQpCisjZGVmaW5lIEFMQzg2MVZEX1BJTl9DRF9OSUQJCUFMQzg4MF9QSU5fQ0RfTklECisKK3N0YXRpYyB2b2lkIGFsYzg2MXZkX2F1dG9faW5pdF9hbmFsb2dfaW5wdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVVUT19QSU5fTEFTVDsgaSsrKSB7CisJCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmlucHV0X3BpbnNbaV07CisJCWlmIChhbGM4NjF2ZF9pc19pbnB1dF9waW4obmlkKSkgeworCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCQkJCQlBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCisJCQkJCWkgPD0gQVVUT19QSU5fRlJPTlRfTUlDID8KKwkJCQkJCQlQSU5fVlJFRjgwIDogUElOX0lOKTsKKwkJCWlmIChuaWQgIT0gQUxDODYxVkRfUElOX0NEX05JRCkKKwkJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCisJCQkJCQlBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJCQkJQU1QX09VVF9NVVRFKTsKKwkJfQorCX0KK30KKworI2RlZmluZSBhbGM4NjF2ZF9pZHhfdG9fbWl4ZXJfdm9sKG5pZCkJCSgobmlkKSArIDB4MDIpCisjZGVmaW5lIGFsYzg2MXZkX2lkeF90b19taXhlcl9zd2l0Y2gobmlkKQkoKG5pZCkgKyAweDBjKQorCisvKiBhZGQgcGxheWJhY2sgY29udHJvbHMgZnJvbSB0aGUgcGFyc2VkIERBQyB0YWJsZSAqLworLyogQmFzZWQgb24gQUxDODgwIHZlcnNpb24uIEJ1dCBBTEM4NjFWRCBoYXMgc2VwYXJhdGUsCisgKiBkaWZmZXJlbnQgTklEcyBmb3IgbXV0ZS91bm11dGUgc3dpdGNoIGFuZCB2b2x1bWUgY29udHJvbCAqLworc3RhdGljIGludCBhbGM4NjF2ZF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQoreworCWNoYXIgbmFtZVszMl07CisJc3RhdGljIGNvbnN0IGNoYXIgKmNobmFtZVs0XSA9IHsiRnJvbnQiLCAiU3Vycm91bmQiLCAiQ0xGRSIsICJTaWRlIn07CisJaGRhX25pZF90IG5pZF92LCBuaWRfczsKKwlpbnQgaSwgZXJyOworCisJZm9yIChpID0gMDsgaSA8IGNmZy0+bGluZV9vdXRzOyBpKyspIHsKKwkJaWYgKCEgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0pCisJCQljb250aW51ZTsKKwkJbmlkX3YgPSBhbGM4NjF2ZF9pZHhfdG9fbWl4ZXJfdm9sKAorCQkJCWFsYzg4MF9kYWNfdG9faWR4KAorCQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSkpOworCQluaWRfcyA9IGFsYzg2MXZkX2lkeF90b19taXhlcl9zd2l0Y2goCisJCQkJYWxjODgwX2RhY190b19pZHgoCisJCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldKSk7CisKKwkJaWYgKGkgPT0gMikgeworCQkJLyogQ2VudGVyL0xGRSAqLworCQkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsCisJCQkJCQkiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92LCAxLAorCQkJCQkJCTAsIEhEQV9PVVRQVVQpKSkgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwKKwkJCQkJCSJMRkUgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3YsIDIsCisJCQkJCQkJMCwgSERBX09VVFBVVCkpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsCisJCQkJCQkiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsCisJCQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9zLCAxLAorCQkJCQkJMiwgSERBX0lOUFVUKSkpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwKKwkJCQkJCSJMRkUgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3MsIDIsCisJCQkJCQkyLCBIREFfSU5QVVQpKSkgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0gZWxzZSB7CisJCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOworCQkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92LCAzLAorCQkJCQkJCTAsIEhEQV9PVVRQVVQpKSkgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBjaG5hbWVbaV0pOworCQkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwgbmFtZSwKKwkJCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3YsIDMsCisJCQkJCQkJMiwgSERBX0lOUFVUKSkpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBhZGQgcGxheWJhY2sgY29udHJvbHMgZm9yIHNwZWFrZXIgYW5kIEhQIG91dHB1dHMgKi8KKy8qIEJhc2VkIG9uIEFMQzg4MCB2ZXJzaW9uLiBCdXQgQUxDODYxVkQgaGFzIHNlcGFyYXRlLAorICogZGlmZmVyZW50IE5JRHMgZm9yIG11dGUvdW5tdXRlIHN3aXRjaCBhbmQgdm9sdW1lIGNvbnRyb2wgKi8KK3N0YXRpYyBpbnQgYWxjODYxdmRfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHN0cnVjdCBhbGNfc3BlYyAqc3BlYywKKwkJCQkJaGRhX25pZF90IHBpbiwgY29uc3QgY2hhciAqcGZ4KQoreworCWhkYV9uaWRfdCBuaWRfdiwgbmlkX3M7CisJaW50IGVycjsKKwljaGFyIG5hbWVbMzJdOworCisJaWYgKCEgcGluKQorCQlyZXR1cm4gMDsKKworCWlmIChhbGM4ODBfaXNfZml4ZWRfcGluKHBpbikpIHsKKwkJbmlkX3YgPSBhbGM4ODBfaWR4X3RvX2RhYyhhbGM4ODBfZml4ZWRfcGluX2lkeChwaW4pKTsKKwkJLyogc3BlY2lmeSB0aGUgREFDIGFzIHRoZSBleHRyYSBvdXRwdXQgKi8KKwkJaWYgKCEgc3BlYy0+bXVsdGlvdXQuaHBfbmlkKQorCQkJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gbmlkX3Y7CisJCWVsc2UKKwkJCXNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWRbMF0gPSBuaWRfdjsKKwkJLyogY29udHJvbCBIUCB2b2x1bWUvc3dpdGNoIG9uIHRoZSBvdXRwdXQgbWl4ZXIgYW1wICovCisJCW5pZF92ID0gYWxjODYxdmRfaWR4X3RvX21peGVyX3ZvbCgKKwkJCQlhbGM4ODBfZml4ZWRfcGluX2lkeChwaW4pKTsKKwkJbmlkX3MgPSBhbGM4NjF2ZF9pZHhfdG9fbWl4ZXJfc3dpdGNoKAorCQkJCWFsYzg4MF9maXhlZF9waW5faWR4KHBpbikpOworCisJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIHBmeCk7CisJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCBuYW1lLAorCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3YsIDMsIDAsCisJCQkJCQkJSERBX09VVFBVVCkpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBwZngpOworCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLCBuYW1lLAorCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3MsIDMsIDIsCisJCQkJCQkJSERBX0lOUFVUKSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIGlmIChhbGM4ODBfaXNfbXVsdGlfcGluKHBpbikpIHsKKwkJLyogc2V0IG1hbnVhbCBjb25uZWN0aW9uICovCisJCS8qIHdlIGhhdmUgb25seSBhIHN3aXRjaCBvbiBIUC1vdXQgUElOICovCisJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIHBmeCk7CisJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKKwkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKHBpbiwgMywgMCwKKwkJCQkJCQlIREFfT1VUUFVUKSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCisvKiBwYXJzZSB0aGUgQklPUyBjb25maWd1cmF0aW9uIGFuZCBzZXQgdXAgdGhlIGFsY19zcGVjCisgKiByZXR1cm4gMSBpZiBzdWNjZXNzZnVsLCAwIGlmIHRoZSBwcm9wZXIgY29uZmlnIGlzIG5vdCBmb3VuZCwKKyAqIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICogQmFzZWQgb24gQUxDODgwIHZlcnNpb24gLSBoYWQgdG8gY2hhbmdlIGl0IHRvIG92ZXJyaWRlCisgKiBhbGM4ODBfYXV0b19jcmVhdGVfZXh0cmFfb3V0IGFuZCBhbGM4ODBfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMgKi8KK3N0YXRpYyBpbnQgYWxjODYxdmRfcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGVycjsKKwlzdGF0aWMgaGRhX25pZF90IGFsYzg2MXZkX2lnbm9yZVtdID0geyAweDFkLCAwIH07CisKKwlpZiAoKGVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAorCQkJCQkJYWxjODYxdmRfaWdub3JlKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmICghIHNwZWMtPmF1dG9jZmcubGluZV9vdXRzKQorCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KKworCWlmICgoZXJyID0gYWxjODgwX2F1dG9fZmlsbF9kYWNfbmlkcyhzcGVjLCAmc3BlYy0+YXV0b2NmZykpIDwgMCB8fAorCQkoZXJyID0gYWxjODYxdmRfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3BlYywKKwkJCSZzcGVjLT5hdXRvY2ZnKSkgPCAwIHx8CisJCShlcnIgPSBhbGM4NjF2ZF9hdXRvX2NyZWF0ZV9leHRyYV9vdXQoc3BlYywKKwkJCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdLCAiU3BlYWtlciIpKSA8IDAgfHwKKwkJKGVyciA9IGFsYzg2MXZkX2F1dG9fY3JlYXRlX2V4dHJhX291dChzcGVjLAorCQkJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdLCAiSGVhZHBob25lIikpIDwgMCB8fAorCQkoZXJyID0gYWxjODgwX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHNwZWMsCisJCQkmc3BlYy0+YXV0b2NmZykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzICogMjsKKworCWlmIChzcGVjLT5hdXRvY2ZnLmRpZ19vdXRfcGluKQorCQlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQ7CisKKwlpZiAoc3BlYy0+a2N0bF9hbGxvYykKKwkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBzcGVjLT5rY3RsX2FsbG9jOworCisJc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faW5pdF92ZXJicysrXQorCQk9IGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzOworCisJc3BlYy0+bnVtX211eF9kZWZzID0gMTsKKwlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4OworCisJcmV0dXJuIDE7Cit9CisKKy8qIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gZm9yIGF1dG8tY29uZmlndXJhdGlvbiBtb2RlbCAqLworc3RhdGljIHZvaWQgYWxjODYxdmRfYXV0b19pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWFsYzg2MXZkX2F1dG9faW5pdF9tdWx0aV9vdXQoY29kZWMpOworCWFsYzg2MXZkX2F1dG9faW5pdF9ocF9vdXQoY29kZWMpOworCWFsYzg2MXZkX2F1dG9faW5pdF9hbmFsb2dfaW5wdXQoY29kZWMpOworfQorCitzdGF0aWMgaW50IHBhdGNoX2FsYzg2MXZkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKKwlpbnQgZXJyLCBib2FyZF9jb25maWc7CisKKwlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3BlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvZGVjLT5zcGVjID0gc3BlYzsKKworCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBBTEM4NjFWRF9NT0RFTF9MQVNULAorCQkJCQkJICBhbGM4NjF2ZF9tb2RlbHMsCisJCQkJCQkgIGFsYzg2MXZkX2NmZ190YmwpOworCisJaWYgKGJvYXJkX2NvbmZpZyA8IDAgfHwgYm9hcmRfY29uZmlnID49IEFMQzg2MVZEX01PREVMX0xBU1QpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBVbmtub3duIG1vZGVsIGZvciBBTEM2NjBWRC8iCisJCQkiQUxDODYxVkQsIHRyeWluZyBhdXRvLXByb2JlIGZyb20gQklPUy4uLlxuIik7CisJCWJvYXJkX2NvbmZpZyA9IEFMQzg2MVZEX0FVVE87CisJfQorCisJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEM4NjFWRF9BVVRPKSB7CisJCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLworCQllcnIgPSBhbGM4NjF2ZF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlhbGNfZnJlZShjb2RlYyk7CisJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UgaWYgKCEgZXJyKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKKwkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKKwkJCWJvYXJkX2NvbmZpZyA9IEFMQzg2MVZEXzNTVDsKKwkJfQorCX0KKworCWlmIChib2FyZF9jb25maWcgIT0gQUxDODYxVkRfQVVUTykKKwkJc2V0dXBfcHJlc2V0KHNwZWMsICZhbGM4NjF2ZF9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOworCisJc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nID0gIkFMQzg2MVZEIEFuYWxvZyI7CisJc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZhbGM4NjF2ZF9wY21fYW5hbG9nX3BsYXliYWNrOworCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZhbGM4NjF2ZF9wY21fYW5hbG9nX2NhcHR1cmU7CisKKwlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIkFMQzg2MVZEIERpZ2l0YWwiOworCXNwZWMtPnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrID0gJmFsYzg2MXZkX3BjbV9kaWdpdGFsX3BsYXliYWNrOworCXNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUgPSAmYWxjODYxdmRfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKKworCXNwZWMtPmFkY19uaWRzID0gYWxjODYxdmRfYWRjX25pZHM7CisJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4NjF2ZF9hZGNfbmlkcyk7CisKKwlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVyc10gPSBhbGM4NjF2ZF9jYXB0dXJlX21peGVyOworCXNwZWMtPm51bV9taXhlcnMrKzsKKworCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOworCisJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEM4NjFWRF9BVVRPKQorCQlzcGVjLT5pbml0X2hvb2sgPSBhbGM4NjF2ZF9hdXRvX2luaXQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKICAqIHBhdGNoIGVudHJpZXMKICAqLwogc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgc25kX2hkYV9wcmVzZXRfcmVhbHRla1tdID0gewogCXsgLmlkID0gMHgxMGVjMDI2MCwgLm5hbWUgPSAiQUxDMjYwIiwgLnBhdGNoID0gcGF0Y2hfYWxjMjYwIH0sCiAJeyAuaWQgPSAweDEwZWMwMjYyLCAubmFtZSA9ICJBTEMyNjIiLCAucGF0Y2ggPSBwYXRjaF9hbGMyNjIgfSwKLSAJeyAuaWQgPSAweDEwZWMwODgwLCAubmFtZSA9ICJBTEM4ODAiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODAgfSwKKwl7IC5pZCA9IDB4MTBlYzA4NjEsIC5yZXYgPSAweDEwMDM0MCwgLm5hbWUgPSAiQUxDNjYwIiwKKwkJLnBhdGNoID0gcGF0Y2hfYWxjODYxIH0sCisJeyAuaWQgPSAweDEwZWMwNjYwLCAubmFtZSA9ICJBTEM2NjAtVkQiLCAucGF0Y2ggPSBwYXRjaF9hbGM4NjF2ZCB9LAorCXsgLmlkID0gMHgxMGVjMDg2MSwgLm5hbWUgPSAiQUxDODYxIiwgLnBhdGNoID0gcGF0Y2hfYWxjODYxIH0sCisJeyAuaWQgPSAweDEwZWMwODYyLCAubmFtZSA9ICJBTEM4NjEtVkQiLCAucGF0Y2ggPSBwYXRjaF9hbGM4NjF2ZCB9LAorCXsgLmlkID0gMHgxMGVjMDg4MCwgLm5hbWUgPSAiQUxDODgwIiwgLnBhdGNoID0gcGF0Y2hfYWxjODgwIH0sCiAJeyAuaWQgPSAweDEwZWMwODgyLCAubmFtZSA9ICJBTEM4ODIiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwKIAl7IC5pZCA9IDB4MTBlYzA4ODMsIC5uYW1lID0gIkFMQzg4MyIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4MyB9LAogCXsgLmlkID0gMHgxMGVjMDg4NSwgLm5hbWUgPSAiQUxDODg1IiwgLnBhdGNoID0gcGF0Y2hfYWxjODgyIH0sCiAJeyAuaWQgPSAweDEwZWMwODg4LCAubmFtZSA9ICJBTEM4ODgiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODMgfSwKLQl7IC5pZCA9IDB4MTBlYzA4NjEsIC5yZXYgPSAweDEwMDMwMCwgLm5hbWUgPSAiQUxDODYxIiwKLQkgIC5wYXRjaCA9IHBhdGNoX2FsYzg2MSB9LAotICAgICAgICB7IC5pZCA9IDB4MTBlYzA4NjEsIC5yZXYgPSAweDEwMDM0MCwgLm5hbWUgPSAiQUxDNjYwIiwKLQkgIC5wYXRjaCA9IHBhdGNoX2FsYzg2MSB9LAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKaW5kZXggZmU1MWVmMy4uNmY0YTM5MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYwpAQCAtMzcsMTQgKzM3LDM3IEBACiAjZGVmaW5lIE5VTV9DT05UUk9MX0FMTE9DCTMyCiAjZGVmaW5lIFNUQUNfSFBfRVZFTlQJCTB4MzcKIAotI2RlZmluZSBTVEFDX1JFRgkJMAotI2RlZmluZSBTVEFDX0Q5NDVHVFAzCQkxCi0jZGVmaW5lIFNUQUNfRDk0NUdUUDUJCTIKLSNkZWZpbmUgU1RBQ19NQUNNSU5JCQkzCi0jZGVmaW5lIFNUQUNfOTIyWF9NT0RFTFMJNAkvKiBudW1iZXIgb2YgOTIyeCBtb2RlbHMgKi8KLSNkZWZpbmUgU1RBQ19EOTY1XzNTVAkJNAotI2RlZmluZSBTVEFDX0Q5NjVfNVNUCQk1Ci0jZGVmaW5lIFNUQUNfOTI3WF9NT0RFTFMJNgkvKiBudW1iZXIgb2YgOTIyeCBtb2RlbHMgKi8KK2VudW0geworCVNUQUNfUkVGLAorCVNUQUNfOTIwMF9NT0RFTFMKK307CisKK2VudW0geworCVNUQUNfOTIwNV9SRUYsCisJU1RBQ185MjA1X01PREVMUworfTsKKworZW51bSB7CisJU1RBQ185MjV4X1JFRiwKKwlTVEFDX00yXzIsCisJU1RBQ19NQTYsCisJU1RBQ185MjV4X01PREVMUworfTsKKworZW51bSB7CisJU1RBQ19EOTQ1X1JFRiwKKwlTVEFDX0Q5NDVHVFAzLAorCVNUQUNfRDk0NUdUUDUsCisJU1RBQ19NQUNNSU5JLAorCVNUQUNfOTIyWF9NT0RFTFMKK307CisKK2VudW0geworCVNUQUNfRDk2NV9SRUYsCisJU1RBQ19EOTY1XzNTVCwKKwlTVEFDX0Q5NjVfNVNULAorCVNUQUNfOTI3WF9NT0RFTFMKK307CiAKIHN0cnVjdCBzaWdtYXRlbF9zcGVjIHsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqbWl4ZXJzWzRdOwpAQCAtNjcsNiArOTAsOSBAQAogCXVuc2lnbmVkIGludCBudW1fYWRjczsKIAloZGFfbmlkX3QgKm11eF9uaWRzOwogCXVuc2lnbmVkIGludCBudW1fbXV4ZXM7CisJaGRhX25pZF90ICpkbWljX25pZHM7CisJdW5zaWduZWQgaW50IG51bV9kbWljczsKKwloZGFfbmlkX3QgZG11eF9uaWQ7CiAJaGRhX25pZF90IGRpZ19pbl9uaWQ7CiAKIAkvKiBwaW4gd2lkZ2V0cyAqLwpAQCAtODAsNiArMTA2LDggQEAKIAlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqbWl4ZXI7CiAKIAkvKiBjYXB0dXJlIHNvdXJjZSAqLworCXN0cnVjdCBoZGFfaW5wdXRfbXV4ICpkaW5wdXRfbXV4OworCXVuc2lnbmVkIGludCBjdXJfZG11eDsKIAlzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW5wdXRfbXV4OwogCXVuc2lnbmVkIGludCBjdXJfbXV4WzNdOwogCkBAIC05Miw2ICsxMjAsNyBAQAogCXN0cnVjdCBhdXRvX3Bpbl9jZmcgYXV0b2NmZzsKIAl1bnNpZ25lZCBpbnQgbnVtX2tjdGxfYWxsb2MsIG51bV9rY3RsX3VzZWQ7CiAJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjdGxfYWxsb2M7CisJc3RydWN0IGhkYV9pbnB1dF9tdXggcHJpdmF0ZV9kaW11eDsKIAlzdHJ1Y3QgaGRhX2lucHV0X211eCBwcml2YXRlX2ltdXg7CiB9OwogCkBAIC0xMDcsNiArMTM2LDE4IEBACiAgICAgICAgIDB4MDIsCiB9OwogCitzdGF0aWMgaGRhX25pZF90IHN0YWM5MjV4X2FkY19uaWRzWzFdID0geworICAgICAgICAweDAzLAorfTsKKworc3RhdGljIGhkYV9uaWRfdCBzdGFjOTI1eF9tdXhfbmlkc1sxXSA9IHsKKyAgICAgICAgMHgwZiwKK307CisKK3N0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyNXhfZGFjX25pZHNbMV0gPSB7CisgICAgICAgIDB4MDIsCit9OworCiBzdGF0aWMgaGRhX25pZF90IHN0YWM5MjJ4X2FkY19uaWRzWzJdID0gewogICAgICAgICAweDA2LCAweDA3LAogfTsKQEAgLTEzMSwxMSArMTcyLDIwIEBACiAgICAgICAgIDB4MTksIDB4MWEKIH07CiAKK3N0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyMDVfZG1pY19uaWRzWzNdID0geworICAgICAgICAweDE3LCAweDE4LCAwCit9OworCiBzdGF0aWMgaGRhX25pZF90IHN0YWM5MjAwX3Bpbl9uaWRzWzhdID0gewogCTB4MDgsIDB4MDksIDB4MGQsIDB4MGUsIAogCTB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsCiB9OwogCitzdGF0aWMgaGRhX25pZF90IHN0YWM5MjV4X3Bpbl9uaWRzWzhdID0geworCTB4MDcsIDB4MDgsIDB4MGEsIDB4MGIsIAorCTB4MGMsIDB4MGQsIDB4MTAsIDB4MTEsCit9OworCiBzdGF0aWMgaGRhX25pZF90IHN0YWM5MjJ4X3Bpbl9uaWRzWzEwXSA9IHsKIAkweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLAogCTB4MGYsIDB4MTAsIDB4MTEsIDB4MTUsIDB4MWIsCkBAIC0xNTQsNiArMjA0LDM0IEBACiAJCiB9OwogCitzdGF0aWMgaW50IHN0YWM5Mnh4X2RtdXhfZW51bV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9pbnB1dF9tdXhfaW5mbyhzcGVjLT5kaW5wdXRfbXV4LCB1aW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzkyeHhfZG11eF9lbnVtX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gc3BlYy0+Y3VyX2RtdXg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzkyeHhfZG11eF9lbnVtX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlyZXR1cm4gc25kX2hkYV9pbnB1dF9tdXhfcHV0KGNvZGVjLCBzcGVjLT5kaW5wdXRfbXV4LCB1Y29udHJvbCwKKwkJCQkgICAgIHNwZWMtPmRtdXhfbmlkLCAmc3BlYy0+Y3VyX2RtdXgpOworfQorCiBzdGF0aWMgaW50IHN0YWM5Mnh4X211eF9lbnVtX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CkBAIC0xODcsNiArMjY1LDEyIEBACiAJe30KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgc3RhYzkyNXhfY29yZV9pbml0W10gPSB7CisJLyogc2V0IGRhYzBtdXggZm9yIGRhYyBjb252ZXJ0ZXIgKi8KKwl7IDB4MDYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7fQorfTsKKwogc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBzdGFjOTIyeF9jb3JlX2luaXRbXSA9IHsKIAkvKiBzZXQgbWFzdGVyIHZvbHVtZSBhbmQgZGlyZWN0IGNvbnRyb2wgKi8JCiAJeyAweDE2LCBBQ19WRVJCX1NFVF9WT0xVTUVfS05PQl9DT05UUk9MLCAweGZmfSwKQEAgLTIzMiw2ICszMTYsMjMgQEAKIAl7IH0gLyogZW5kICovCiB9OwogCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3RhYzkyNXhfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHhlLCAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4ZSwgMCwgSERBX09VVFBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKKwkJLmNvdW50ID0gMSwKKwkJLmluZm8gPSBzdGFjOTJ4eF9tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gc3RhYzkyeHhfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gc3RhYzkyeHhfbXV4X2VudW1fcHV0LAorCX0sCisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA5LCAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA5LCAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIE11eCBWb2x1bWUiLCAweDBmLCAwLCBIREFfT1VUUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCiAvKiBUaGlzIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSBiYXNlZCBvbiBzZXF1ZW5jZSAqLwogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN0YWM5MjJ4X21peGVyW10gPSB7CiAJewpAQCAtMjYzLDcgKzM2NCw3IEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAotc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzdGFjOTI3eF9taXhlcltdID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN0YWM5Mjd4X21peGVyW10gPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKQEAgLTI3OCw3ICszNzksMTUgQEAKIAl7IH0gLyogZW5kICovCiB9OwogCi1zdGF0aWMgc25kX2tjb250cm9sX25ld190IHN0YWM5MjA1X21peGVyW10gPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3RhYzkyMDVfbWl4ZXJbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJEaWdpdGFsIElucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDEsCisJCS5pbmZvID0gc3RhYzkyeHhfZG11eF9lbnVtX2luZm8sCisJCS5nZXQgPSBzdGFjOTJ4eF9kbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gc3RhYzkyeHhfZG11eF9lbnVtX3B1dCwKKwl9LAogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCkBAIC0zMjcsMjIgKzQzNiw2NCBAQAogCTB4MDJhMTkwMjAsIDB4MDFhMTkwMjEsIDB4OTAxMDAxNDAsIDB4MDE4MTMxMjIsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50ICpzdGFjOTIwMF9icmRfdGJsW10gPSB7Ci0JcmVmOTIwMF9waW5fY29uZmlncywKK3N0YXRpYyB1bnNpZ25lZCBpbnQgKnN0YWM5MjAwX2JyZF90YmxbU1RBQ185MjAwX01PREVMU10gPSB7CisJW1NUQUNfUkVGXSA9IHJlZjkyMDBfcGluX2NvbmZpZ3MsCiB9OwogCi1zdGF0aWMgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgc3RhYzkyMDBfY2ZnX3RibFtdID0gewotCXsgLm1vZGVsbmFtZSA9ICJyZWYiLAotCSAgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDI2NjgsCS8qIERGSSBMYW5QYXJ0eSAqLwotCSAgLmNvbmZpZyA9IFNUQUNfUkVGIH0sCitzdGF0aWMgY29uc3QgY2hhciAqc3RhYzkyMDBfbW9kZWxzW1NUQUNfOTIwMF9NT0RFTFNdID0geworCVtTVEFDX1JFRl0gPSAicmVmIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBzdGFjOTIwMF9jZmdfdGJsW10gPSB7CisJLyogU2lnbWFUZWwgcmVmZXJlbmNlIGJvYXJkICovCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI2NjgsCisJCSAgICAgICJERkkgTGFuUGFydHkiLCBTVEFDX1JFRiksCiAJLyogRGVsbCBsYXB0b3BzIGhhdmUgQklPUyBwcm9ibGVtICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfREVMTCwgLnBjaV9zdWJkZXZpY2UgPSAweDAxYjUsCi0JICAuY29uZmlnID0gU1RBQ19SRUYgfSwJLyogRGVsbCBJbnNwaXJvbiA2MzBtICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfREVMTCwgLnBjaV9zdWJkZXZpY2UgPSAweDAxYzIsCi0JICAuY29uZmlnID0gU1RBQ19SRUYgfSwJLyogRGVsbCBMYXRpdHVkZSBENjIwICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfREVMTCwgLnBjaV9zdWJkZXZpY2UgPSAweDAxY2IsCi0JICAuY29uZmlnID0gU1RBQ19SRUYgfSwJLyogRGVsbCBMYXRpdHVkZSAxMjBMICovCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDFiNSwKKwkJICAgICAgIkRlbGwgSW5zcGlyb24gNjMwbSIsIFNUQUNfUkVGKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMWMyLAorCQkgICAgICAiRGVsbCBMYXRpdHVkZSBENjIwIiwgU1RBQ19SRUYpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAxY2IsCisJCSAgICAgICJEZWxsIExhdGl0dWRlIDEyMEwiLCBTVEFDX1JFRiksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDFjYywKKwkJICAgICAgIkRlbGwgTGF0aXR1ZGUgRDgyMCIsIFNUQUNfUkVGKSwKKwl7fSAvKiB0ZXJtaW5hdG9yICovCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHJlZjkyNXhfcGluX2NvbmZpZ3NbOF0gPSB7CisJMHg0MGMwMDNmMCwgMHg0MjQ1MDNmMiwgMHgwMTgxMzAyMiwgMHgwMmExOTAyMSwKKwkweDkwYTcwMzIwLCAweDAyMjE0MjEwLCAweDQwMDAwM2YxLCAweDkwMzMwMzJlLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBzdGFjOTI1eF9NQTZfcGluX2NvbmZpZ3NbOF0gPSB7CisJMHg0MGMwMDNmMCwgMHg0MjQ1MDNmMiwgMHgwMTgxMzAyMiwgMHgwMmExOTAyMSwKKwkweDkwYTcwMzIwLCAweDkwMTAwMjExLCAweDQwMDAwM2YxLCAweDkwMzMwMzJlLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBzdGFjOTI1eE0yXzJfcGluX2NvbmZpZ3NbOF0gPSB7CisJMHg0MGMwMDNmMywgMHg0MjQ1MDNmMiwgMHgwNDE4MDBmNCwgMHgwMmExOTAyMCwKKwkweDUwYTEwM0YwLCAweDkwMTAwMjEwLCAweDQwMDAwM2YxLCAweDkwMzMwMzJlLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCAqc3RhYzkyNXhfYnJkX3RibFtTVEFDXzkyNXhfTU9ERUxTXSA9IHsKKwlbU1RBQ19SRUZdID0gcmVmOTI1eF9waW5fY29uZmlncywKKwlbU1RBQ19NMl8yXSA9IHN0YWM5MjV4TTJfMl9waW5fY29uZmlncywKKwlbU1RBQ19NQTZdID0gc3RhYzkyNXhfTUE2X3Bpbl9jb25maWdzLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnN0YWM5MjV4X21vZGVsc1tTVEFDXzkyNXhfTU9ERUxTXSA9IHsKKwlbU1RBQ19SRUZdID0gInJlZiIsCisJW1NUQUNfTTJfMl0gPSAibTItMiIsCisJW1NUQUNfTUE2XSA9ICJtNiIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgc3RhYzkyNXhfY2ZnX3RibFtdID0geworCS8qIFNpZ21hVGVsIHJlZmVyZW5jZSBib2FyZCAqLworCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNjY4LCAiREZJIExhblBhcnR5IiwgU1RBQ19SRUYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdiLCAweDAzMTYsICJHYXRld2F5IE0yNTUiLCBTVEFDX1JFRiksCisJU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDM2NiwgIkdhdGV3YXkgTVA2OTU0IiwgU1RBQ19SRUYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdiLCAweDA0NjEsICJHYXRld2F5IE5YNTYwWEwiLCBTVEFDX01BNiksCisJU05EX1BDSV9RVUlSSygweDEwMDIsIDB4NDM3YiwgIkdhdGV3YXkgTVg2NDUzIiwgU1RBQ19NMl8yKSwKIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCkBAIC0zNjUsMTAwICs1MTYsODAgQEAKIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgKnN0YWM5MjJ4X2JyZF90YmxbU1RBQ185MjJYX01PREVMU10gPSB7Ci0JW1NUQUNfUkVGXSA9CXJlZjkyMnhfcGluX2NvbmZpZ3MsCisJW1NUQUNfRDk0NV9SRUZdID0gcmVmOTIyeF9waW5fY29uZmlncywKIAlbU1RBQ19EOTQ1R1RQM10gPSBkOTQ1Z3RwM19waW5fY29uZmlncywKIAlbU1RBQ19EOTQ1R1RQNV0gPSBkOTQ1Z3RwNV9waW5fY29uZmlncywKIAlbU1RBQ19NQUNNSU5JXSA9IGQ5NDVndHA1X3Bpbl9jb25maWdzLAogfTsKIAotc3RhdGljIHN0cnVjdCBoZGFfYm9hcmRfY29uZmlnIHN0YWM5MjJ4X2NmZ190YmxbXSA9IHsKLQl7IC5tb2RlbG5hbWUgPSAiNXN0YWNrIiwgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDUgfSwKLQl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrIiwgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwKLQl7IC5tb2RlbG5hbWUgPSAicmVmIiwKLQkgIC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyNjY4LAkvKiBERkkgTGFuUGFydHkgKi8KLQkgIC5jb25maWcgPSBTVEFDX1JFRiB9LAkJLyogU2lnbWFUZWwgcmVmZXJlbmNlIGJvYXJkICovCi0gICAgICAgICAvKiBJbnRlbCA5NDVHIGJhc2VkIHN5c3RlbXMgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwMTAxLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdUUCAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwMjAyLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdOVCAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwNjA2LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdUUCAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwNjAxLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdUUCAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwMTExLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdaUCAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgxMTE1LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdQTSAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgxMTE2LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdCTyAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgxMTE3LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdQTSAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgxMTE4LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdQTSAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgxMTE5LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdQTSAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHg4ODI2LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdQTSAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHg1MDQ5LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdDWiAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHg1MDU1LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdDWiAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHg1MDQ4LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdQQiAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwMTEwLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NUdMUiAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwNDA0LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDUgfSwJLyogSW50ZWwgRDk0NUdUUCAtIDUgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwMzAzLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDUgfSwJLyogSW50ZWwgRDk0NUdOVCAtIDUgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwMDEzLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDUgfSwJLyogSW50ZWwgRDk1NVhCSyAtIDUgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwNDE3LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDUgfSwJLyogSW50ZWwgRDk3NVhCSyAtIDUgU3RhY2sgKi8KLQkgIC8qIEludGVsIDk0NVAgYmFzZWQgc3lzdGVtcyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDBiMGIsCi0JICAuY29uZmlnID0gU1RBQ19EOTQ1R1RQMyB9LAkvKiBJbnRlbCBEOTQ1UFNOIC0gMyBTdGFjayAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDAxMTIsCi0JICAuY29uZmlnID0gU1RBQ19EOTQ1R1RQMyB9LAkvKiBJbnRlbCBEOTQ1UExOIC0gMyBTdGFjayAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDBkMGQsCi0JICAuY29uZmlnID0gU1RBQ19EOTQ1R1RQMyB9LAkvKiBJbnRlbCBEOTQ1UExNIC0gMyBTdGFjayAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDA5MDksCi0JICAuY29uZmlnID0gU1RBQ19EOTQ1R1RQMyB9LAkvKiBJbnRlbCBEOTQ1UEFXIC0gMyBTdGFjayAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDA1MDUsCi0JICAuY29uZmlnID0gU1RBQ19EOTQ1R1RQMyB9LAkvKiBJbnRlbCBEOTQ1UExNIC0gMyBTdGFjayAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDA3MDcsCi0JICAuY29uZmlnID0gU1RBQ19EOTQ1R1RQNSB9LAkvKiBJbnRlbCBEOTQ1UFNWIC0gNSBTdGFjayAqLwotCSAgLyogb3RoZXIgc3lzdGVtcyAgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4Mzg0LAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDc2ODAsCi0JICAuY29uZmlnID0gU1RBQ19NQUNNSU5JIH0sCS8qIEFwcGxlIE1hYyBNaW5pIChlYXJseSAyMDA2KSAqLworc3RhdGljIGNvbnN0IGNoYXIgKnN0YWM5MjJ4X21vZGVsc1tTVEFDXzkyMlhfTU9ERUxTXSA9IHsKKwlbU1RBQ19EOTQ1X1JFRl0JPSAicmVmIiwKKwlbU1RBQ19EOTQ1R1RQNV0JPSAiNXN0YWNrIiwKKwlbU1RBQ19EOTQ1R1RQM10JPSAiM3N0YWNrIiwKKwlbU1RBQ19NQUNNSU5JXQk9ICJtYWNtaW5pIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBzdGFjOTIyeF9jZmdfdGJsW10gPSB7CisJLyogU2lnbWFUZWwgcmVmZXJlbmNlIGJvYXJkICovCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI2NjgsCisJCSAgICAgICJERkkgTGFuUGFydHkiLCBTVEFDX0Q5NDVfUkVGKSwKKwkvKiBJbnRlbCA5NDVHIGJhc2VkIHN5c3RlbXMgKi8KKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDEwMSwKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQMyksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDAyMDIsCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwNjA2LAorCQkgICAgICAiSW50ZWwgRDk0NUciLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDYwMSwKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQMyksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDAxMTEsCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMTE1LAorCQkgICAgICAiSW50ZWwgRDk0NUciLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTExNiwKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQMyksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDExMTcsCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMTE4LAorCQkgICAgICAiSW50ZWwgRDk0NUciLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTExOSwKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQMyksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDg4MjYsCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg1MDQ5LAorCQkgICAgICAiSW50ZWwgRDk0NUciLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NTA1NSwKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQMyksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDUwNDgsCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwMTEwLAorCQkgICAgICAiSW50ZWwgRDk0NUciLCBTVEFDX0Q5NDVHVFAzKSwKKwkvKiBJbnRlbCBEOTQ1RyA1LXN0YWNrIHN5c3RlbXMgKi8KKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDQwNCwKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQNSksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDAzMDMsCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDUpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwMDEzLAorCQkgICAgICAiSW50ZWwgRDk0NUciLCBTVEFDX0Q5NDVHVFA1KSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDQxNywKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQNSksCisJLyogSW50ZWwgOTQ1UCBiYXNlZCBzeXN0ZW1zICovCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDBiMGIsCisJCSAgICAgICJJbnRlbCBEOTQ1UCIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwMTEyLAorCQkgICAgICAiSW50ZWwgRDk0NVAiLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MGQwZCwKKwkJICAgICAgIkludGVsIEQ5NDVQIiwgU1RBQ19EOTQ1R1RQMyksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDA5MDksCisJCSAgICAgICJJbnRlbCBEOTQ1UCIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwNTA1LAorCQkgICAgICAiSW50ZWwgRDk0NVAiLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDcwNywKKwkJICAgICAgIkludGVsIEQ5NDVQIiwgU1RBQ19EOTQ1R1RQNSksCisJLyogb3RoZXIgc3lzdGVtcyAgKi8KKwkvKiBBcHBsZSBNYWMgTWluaSAoZWFybHkgMjAwNikgKi8KKwlTTkRfUENJX1FVSVJLKDB4ODM4NCwgMHg3NjgwLAorCQkgICAgICAiTWFjIE1pbmkiLCBTVEFDX01BQ01JTkkpLAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiAKQEAgLTQ4NCwxMjAgKzYxNSw3MiBAQAogfTsKIAogc3RhdGljIHVuc2lnbmVkIGludCAqc3RhYzkyN3hfYnJkX3RibFtTVEFDXzkyN1hfTU9ERUxTXSA9IHsKLQlbU1RBQ19SRUZdID0JcmVmOTI3eF9waW5fY29uZmlncywKKwlbU1RBQ19EOTY1X1JFRl0gPSByZWY5Mjd4X3Bpbl9jb25maWdzLAogCVtTVEFDX0Q5NjVfM1NUXSA9IGQ5NjVfM3N0X3Bpbl9jb25maWdzLAogCVtTVEFDX0Q5NjVfNVNUXSA9IGQ5NjVfNXN0X3Bpbl9jb25maWdzLAogfTsKIAotc3RhdGljIHN0cnVjdCBoZGFfYm9hcmRfY29uZmlnIHN0YWM5Mjd4X2NmZ190YmxbXSA9IHsKLQl7IC5tb2RlbG5hbWUgPSAiNXN0YWNrIiwgLmNvbmZpZyA9IFNUQUNfRDk2NV81U1QgfSwKLQl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrIiwgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwKLQl7IC5tb2RlbG5hbWUgPSAicmVmIiwKLQkgIC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyNjY4LAkvKiBERkkgTGFuUGFydHkgKi8KLQkgIC5jb25maWcgPSBTVEFDX1JFRiB9LAkJLyogU2lnbWFUZWwgcmVmZXJlbmNlIGJvYXJkICovCitzdGF0aWMgY29uc3QgY2hhciAqc3RhYzkyN3hfbW9kZWxzW1NUQUNfOTI3WF9NT0RFTFNdID0geworCVtTVEFDX0Q5NjVfUkVGXQk9ICJyZWYiLAorCVtTVEFDX0Q5NjVfM1NUXQk9ICIzc3RhY2siLAorCVtTVEFDX0Q5NjVfNVNUXSA9ICI1c3RhY2siLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIHN0YWM5Mjd4X2NmZ190YmxbXSA9IHsKKwkvKiBTaWdtYVRlbCByZWZlcmVuY2UgYm9hcmQgKi8KKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjY2OCwKKwkJICAgICAgIkRGSSBMYW5QYXJ0eSIsIFNUQUNfRDk2NV9SRUYpLAogCSAvKiBJbnRlbCA5NDYgYmFzZWQgc3lzdGVtcyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDNkMDEsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzNTVCB9LCAvKiBEOTQ2ICBjb25maWd1cmF0aW9uICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4YTMwMSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sIC8qIEludGVsIEQ5NDZHWlQgLSAzIHN0YWNrICAqLworCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgzZDAxLCAiSW50ZWwgRDk0NiIsIFNUQUNfRDk2NV8zU1QpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHhhMzAxLCAiSW50ZWwgRDk0NiIsIFNUQUNfRDk2NV8zU1QpLAogCS8qIDk2NSBiYXNlZCAzIHN0YWNrIHN5c3RlbXMgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMTE2LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwgLyogSW50ZWwgRDk2NSAzU3RhY2sgY29uZmlnICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjExNSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sIC8qIEludGVsIERROTY1V0MgLSAzIFN0YWNrICAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIxMTQsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzNTVCB9LCAvKiBJbnRlbCBEOTY1IDNTdGFjayBjb25maWcgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMTEzLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwgLyogSW50ZWwgRDk2NSAzU3RhY2sgY29uZmlnICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjExMiwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sIC8qIEludGVsIERHOTY1TVMgLSAzIFN0YWNrICAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIxMTEsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzNTVCB9LCAvKiBJbnRlbCBEOTY1IDNTdGFjayBjb25maWcgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMTEwLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwgLyogSW50ZWwgRDk2NSAzU3RhY2sgY29uZmlnICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjAwOSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sIC8qIEludGVsIEQ5NjUgM1N0YWNrIGNvbmZpZyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIwMDgsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzNTVCB9LCAvKiBJbnRlbCBEUTk2NUdGIC0gMyBTdGFjayAgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMDA3LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwgLyogSW50ZWwgRDk2NSAzU3RhY2sgY29uZmlnICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjAwNiwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sIC8qIEludGVsIEQ5NjUgM1N0YWNrIGNvbmZpZyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIwMDUsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzNTVCB9LCAvKiBJbnRlbCBEOTY1IDNTdGFjayBjb25maWcgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMDA0LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwgLyogSW50ZWwgRDk2NSAzU3RhY2sgY29uZmlnICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjAwMywKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sIC8qIEludGVsIEQ5NjUgM1N0YWNrIGNvbmZpZyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIwMDIsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzNTVCB9LCAvKiBJbnRlbCBEOTY1IDNTdGFjayBjb25maWcgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMDAxLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwgLyogSW50ZWwgRFE5NjVHRiAtIDMgU3RhY2sgKi8KKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjExNiwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjExNSwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjExNCwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjExMywgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjExMiwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjExMSwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjExMCwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAwOSwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAwOCwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAwNywgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAwNiwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAwNSwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAwNCwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAwMywgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAwMiwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAwMSwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfM1NUKSwKIAkvKiA5NjUgYmFzZWQgNSBzdGFjayBzeXN0ZW1zICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjMwMSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfNVNUIH0sIC8qIEludGVsIERHOTY1IC0gNSBTdGFjayAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIzMDIsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzVTVCB9LCAvKiBJbnRlbCBERzk2NSAtIDUgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMzAzLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV81U1QgfSwgLyogSW50ZWwgREc5NjUgLSA1IFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjMwNCwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfNVNUIH0sIC8qIEludGVsIERHOTY1IC0gNSBTdGFjayAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIzMDUsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzVTVCB9LCAvKiBJbnRlbCBERzk2NSAtIDUgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyNTAxLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV81U1QgfSwgLyogSW50ZWwgREc5NjVNUSAtIDUgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyNTAyLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV81U1QgfSwgLyogSW50ZWwgREc5NjUgLSA1IFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjUwMywKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfNVNUIH0sIC8qIEludGVsIERHOTY1IC0gNSBTdGFjayAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDI1MDQsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzVTVCB9LCAvKiBJbnRlbCBEUTk2NUdGIC0gNSBTdGFjayAqLworCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMzAxLCAiSW50ZWwgRDk2NSIsIFNUQUNfRDk2NV81U1QpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMzAyLCAiSW50ZWwgRDk2NSIsIFNUQUNfRDk2NV81U1QpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMzAzLCAiSW50ZWwgRDk2NSIsIFNUQUNfRDk2NV81U1QpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMzA0LCAiSW50ZWwgRDk2NSIsIFNUQUNfRDk2NV81U1QpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMzA1LCAiSW50ZWwgRDk2NSIsIFNUQUNfRDk2NV81U1QpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNTAxLCAiSW50ZWwgRDk2NSIsIFNUQUNfRDk2NV81U1QpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNTAyLCAiSW50ZWwgRDk2NSIsIFNUQUNfRDk2NV81U1QpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNTAzLCAiSW50ZWwgRDk2NSIsIFNUQUNfRDk2NV81U1QpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNTA0LCAiSW50ZWwgRDk2NSIsIFNUQUNfRDk2NV81U1QpLAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcmVmOTIwNV9waW5fY29uZmlnc1sxMl0gPSB7CiAJMHg0MDAwMDEwMCwgMHg0MDAwMDEwMCwgMHgwMTAxNjAxMSwgMHgwMTAxNDAxMCwKLQkweDAxODEzMTIyLCAweDAxYTE5MDIxLCAweDQwMDAwMTAwLCAweDQwMDAwMTAwLCAKLQkweDQwMDAwMTAwLCAweDQwMDAwMTAwLCAweDAxNDQxMDMwLCAweDAxYzQxMDMwCisJMHgwMTgxMzEyMiwgMHgwMWExOTAyMSwgMHg0MDAwMDEwMCwgMHg0MDAwMDEwMCwKKwkweDkwYTAwMGYwLCAweDkwYTAwMGYwLCAweDAxNDQxMDMwLCAweDAxYzQxMDMwCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50ICpzdGFjOTIwNV9icmRfdGJsW10gPSB7CitzdGF0aWMgdW5zaWduZWQgaW50ICpzdGFjOTIwNV9icmRfdGJsW1NUQUNfOTIwNV9NT0RFTFNdID0gewogCXJlZjkyMDVfcGluX2NvbmZpZ3MsCiB9OwogCi1zdGF0aWMgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgc3RhYzkyMDVfY2ZnX3RibFtdID0gewotCXsgLm1vZGVsbmFtZSA9ICJyZWYiLAotCSAgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDI2NjgsCS8qIERGSSBMYW5QYXJ0eSAqLwotCSAgLmNvbmZpZyA9IFNUQUNfUkVGIH0sCQkvKiBTaWdtYVRlbCByZWZlcmVuY2UgYm9hcmQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpzdGFjOTIwNV9tb2RlbHNbU1RBQ185MjA1X01PREVMU10gPSB7CisJW1NUQUNfOTIwNV9SRUZdID0gInJlZiIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgc3RhYzkyMDVfY2ZnX3RibFtdID0geworCS8qIFNpZ21hVGVsIHJlZmVyZW5jZSBib2FyZCAqLworCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNjY4LAorCQkgICAgICAiREZJIExhblBhcnR5IiwgU1RBQ185MjA1X1JFRiksCiAJe30gLyogdGVybWluYXRvciAqLwogfTsKIApAQCAtMTE1NCw2ICsxMjM3LDU4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIGxhYmVscyBmb3IgZG1pYyBtdXggaW5wdXRzICovCitzdGF0aWMgY29uc3QgY2hhciAqc3RhYzkyeHhfZG1pY19sYWJlbHNbNV0gPSB7CisJIkFuYWxvZyBJbnB1dHMiLCAiRGlnaXRhbCBNaWMgMSIsICJEaWdpdGFsIE1pYyAyIiwKKwkiRGlnaXRhbCBNaWMgMyIsICJEaWdpdGFsIE1pYyA0IgorfTsKKworLyogY3JlYXRlIHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIGlucHV0IHBpbnMgb24gZG1pYyBjYXBhYmxlIGNvZGVjcyAqLworc3RhdGljIGludCBzdGFjOTJ4eF9hdXRvX2NyZWF0ZV9kbWljX2lucHV0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCQljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCit7CisJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgaGRhX2lucHV0X211eCAqZGltdXggPSAmc3BlYy0+cHJpdmF0ZV9kaW11eDsKKwloZGFfbmlkX3QgY29uX2xzdFtIREFfTUFYX05VTV9JTlBVVFNdOworCWludCBpLCBqOworCisJZGltdXgtPml0ZW1zW2RpbXV4LT5udW1faXRlbXNdLmxhYmVsID0gc3RhYzkyeHhfZG1pY19sYWJlbHNbMF07CisJZGltdXgtPml0ZW1zW2RpbXV4LT5udW1faXRlbXNdLmluZGV4ID0gMDsKKwlkaW11eC0+bnVtX2l0ZW1zKys7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX2RtaWNzOyBpKyspIHsKKwkJaW50IGluZGV4OworCQlpbnQgbnVtX2NvbnM7CisJCXVuc2lnbmVkIGludCBkZWZfY29uZjsKKworCQlkZWZfY29uZiA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywKKwkJCQkJICAgICAgc3BlYy0+ZG1pY19uaWRzW2ldLAorCQkJCQkgICAgICAwLAorCQkJCQkgICAgICBBQ19WRVJCX0dFVF9DT05GSUdfREVGQVVMVCwKKwkJCQkJICAgICAgMCk7CisJCWlmIChnZXRfZGVmY2ZnX2Nvbm5lY3QoZGVmX2NvbmYpID09IEFDX0pBQ0tfUE9SVF9OT05FKQorCQkJY29udGludWU7CisKKwkJbnVtX2NvbnMgPSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyhjb2RlYywKKwkJCQlzcGVjLT5kbXV4X25pZCwKKwkJCQljb25fbHN0LAorCQkJCUhEQV9NQVhfTlVNX0lOUFVUUyk7CisJCWZvciAoaiA9IDA7IGogPCBudW1fY29uczsgaisrKQorCQkJaWYgKGNvbl9sc3Rbal0gPT0gc3BlYy0+ZG1pY19uaWRzW2ldKSB7CisJCQkJaW5kZXggPSBqOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCWNvbnRpbnVlOworZm91bmQ6CisJCWRpbXV4LT5pdGVtc1tkaW11eC0+bnVtX2l0ZW1zXS5sYWJlbCA9CisJCQlzdGFjOTJ4eF9kbWljX2xhYmVsc1tkaW11eC0+bnVtX2l0ZW1zXTsKKwkJZGltdXgtPml0ZW1zW2RpbXV4LT5udW1faXRlbXNdLmluZGV4ID0gaW5kZXg7CisJCWRpbXV4LT5udW1faXRlbXMrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyogY3JlYXRlIHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIGlucHV0IHBpbnMgKi8KIHN0YXRpYyBpbnQgc3RhYzkyeHhfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKIHsKQEAgLTEyMzgsNyArMTM3Myw5IEBACiAJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywgTlVMTCkpIDwgMCkKKwlpZiAoKGVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsCisJCQkJCQkmc3BlYy0+YXV0b2NmZywKKwkJCQkJCXNwZWMtPmRtaWNfbmlkcykpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlpZiAoISBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cykKIAkJcmV0dXJuIDA7IC8qIGNhbid0IGZpbmQgdmFsaWQgcGluIGNvbmZpZyAqLwpAQCAtMTI1NCw2ICsxMzkxLDExIEBACiAJICAgIChlcnIgPSBzdGFjOTJ4eF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3Rscyhjb2RlYywgJnNwZWMtPmF1dG9jZmcpKSA8IDApCiAJCXJldHVybiBlcnI7CiAKKwlpZiAoc3BlYy0+bnVtX2RtaWNzID4gMCkKKwkJaWYgKChlcnIgPSBzdGFjOTJ4eF9hdXRvX2NyZWF0ZV9kbWljX2lucHV0X2N0bHMoY29kZWMsCisJCQkJCQkmc3BlYy0+YXV0b2NmZykpIDwgMCkKKwkJCXJldHVybiBlcnI7CisKIAlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7CiAJaWYgKHNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA+IDIpCiAJCXNwZWMtPnN1cnJfc3dpdGNoID0gMTsKQEAgLTEyNjcsNiArMTQwOSw3IEBACiAJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gc3BlYy0+a2N0bF9hbGxvYzsKIAogCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXg7CisJc3BlYy0+ZGlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2RpbXV4OwogCiAJcmV0dXJuIDE7CiB9CkBAIC0xMzY2LDYgKzE1MDksNyBAQAogCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxfYWxsb2M7CiAKIAlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4OworCXNwZWMtPmRpbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9kaW11eDsKIAogCXJldHVybiAxOwogfQpAQCAtMTQ0OCw2ICsxNTkyLDExIEBACiAJCQlzdGFjOTJ4eF9hdXRvX3NldF9waW5jdGwoY29kZWMsIG5pZCwgcGluY3RsKTsKIAkJfQogCX0KKwlpZiAoc3BlYy0+bnVtX2RtaWNzID4gMCkKKwkJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9kbWljczsgaSsrKQorCQkJc3RhYzkyeHhfYXV0b19zZXRfcGluY3RsKGNvZGVjLCBzcGVjLT5kbWljX25pZHNbaV0sCisJCQkJCQkgQUNfUElOQ1RMX0lOX0VOKTsKKwogCWlmIChjZmctPmRpZ19vdXRfcGluKQogCQlzdGFjOTJ4eF9hdXRvX3NldF9waW5jdGwoY29kZWMsIGNmZy0+ZGlnX291dF9waW4sCiAJCQkJCSBBQ19QSU5DVExfT1VUX0VOKTsKQEAgLTE1OTgsNyArMTc0Nyw5IEBACiAJY29kZWMtPnNwZWMgPSBzcGVjOwogCXNwZWMtPm51bV9waW5zID0gODsKIAlzcGVjLT5waW5fbmlkcyA9IHN0YWM5MjAwX3Bpbl9uaWRzOwotCXNwZWMtPmJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBzdGFjOTIwMF9jZmdfdGJsKTsKKwlzcGVjLT5ib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgU1RBQ185MjAwX01PREVMUywKKwkJCQkJCQlzdGFjOTIwMF9tb2RlbHMsCisJCQkJCQkJc3RhYzkyMDBfY2ZnX3RibCk7CiAJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA8IDApIHsKIAkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IFVua25vd24gbW9kZWwgZm9yIFNUQUM5MjAwLCB1c2luZyBCSU9TIGRlZmF1bHRzXG4iKTsKIAkJZXJyID0gc3RhYzkyeHhfc2F2ZV9iaW9zX2NvbmZpZ19yZWdzKGNvZGVjKTsKQEAgLTE2MTgsNiArMTc2OSw3IEBACiAJc3BlYy0+YWRjX25pZHMgPSBzdGFjOTIwMF9hZGNfbmlkczsKIAlzcGVjLT5tdXhfbmlkcyA9IHN0YWM5MjAwX211eF9uaWRzOwogCXNwZWMtPm51bV9tdXhlcyA9IDE7CisJc3BlYy0+bnVtX2RtaWNzID0gMDsKIAogCXNwZWMtPmluaXQgPSBzdGFjOTIwMF9jb3JlX2luaXQ7CiAJc3BlYy0+bWl4ZXIgPSBzdGFjOTIwMF9taXhlcjsKQEAgLTE2MzMsNiArMTc4NSw1NiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBhdGNoX3N0YWM5MjV4KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjOworCWludCBlcnI7CisKKwlzcGVjICA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNwZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb2RlYy0+c3BlYyA9IHNwZWM7CisJc3BlYy0+bnVtX3BpbnMgPSA4OworCXNwZWMtPnBpbl9uaWRzID0gc3RhYzkyNXhfcGluX25pZHM7CisJc3BlYy0+Ym9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIFNUQUNfOTI1eF9NT0RFTFMsCisJCQkJCQkJc3RhYzkyNXhfbW9kZWxzLAorCQkJCQkJCXN0YWM5MjV4X2NmZ190YmwpOworCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CisJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBVbmtub3duIG1vZGVsIGZvciBTVEFDOTI1eCwgdXNpbmcgQklPUyBkZWZhdWx0c1xuIik7CisJCWVyciA9IHN0YWM5Mnh4X3NhdmVfYmlvc19jb25maWdfcmVncyhjb2RlYyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlzdGFjOTJ4eF9mcmVlKGNvZGVjKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJc3BlYy0+cGluX2NvbmZpZ3MgPSBzcGVjLT5iaW9zX3Bpbl9jb25maWdzOworCX0gZWxzZSBpZiAoc3RhYzkyNXhfYnJkX3RibFtzcGVjLT5ib2FyZF9jb25maWddICE9IE5VTEwpeworCQlzcGVjLT5waW5fY29uZmlncyA9IHN0YWM5MjV4X2JyZF90Ymxbc3BlYy0+Ym9hcmRfY29uZmlnXTsKKwkJc3RhYzkyeHhfc2V0X2NvbmZpZ19yZWdzKGNvZGVjKTsKKwl9CisKKwlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSAyOworCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gMTsKKwlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHN0YWM5MjV4X2RhY19uaWRzOworCXNwZWMtPmFkY19uaWRzID0gc3RhYzkyNXhfYWRjX25pZHM7CisJc3BlYy0+bXV4X25pZHMgPSBzdGFjOTI1eF9tdXhfbmlkczsKKwlzcGVjLT5udW1fbXV4ZXMgPSAxOworCXNwZWMtPm51bV9kbWljcyA9IDA7CisKKwlzcGVjLT5pbml0ID0gc3RhYzkyNXhfY29yZV9pbml0OworCXNwZWMtPm1peGVyID0gc3RhYzkyNXhfbWl4ZXI7CisKKwllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHg4LCAweDcpOworCWlmIChlcnIgPCAwKSB7CisJCXN0YWM5Mnh4X2ZyZWUoY29kZWMpOworCQlyZXR1cm4gZXJyOworCX0KKworCWNvZGVjLT5wYXRjaF9vcHMgPSBzdGFjOTJ4eF9wYXRjaF9vcHM7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBwYXRjaF9zdGFjOTIyeChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYzsKQEAgLTE2NDUsNyArMTg0Nyw5IEBACiAJY29kZWMtPnNwZWMgPSBzcGVjOwogCXNwZWMtPm51bV9waW5zID0gMTA7CiAJc3BlYy0+cGluX25pZHMgPSBzdGFjOTIyeF9waW5fbmlkczsKLQlzcGVjLT5ib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgc3RhYzkyMnhfY2ZnX3RibCk7CisJc3BlYy0+Ym9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIFNUQUNfOTIyWF9NT0RFTFMsCisJCQkJCQkJc3RhYzkyMnhfbW9kZWxzLAorCQkJCQkJCXN0YWM5MjJ4X2NmZ190YmwpOwogCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBVbmtub3duIG1vZGVsIGZvciBTVEFDOTIyeCwgIgogCQkJInVzaW5nIEJJT1MgZGVmYXVsdHNcbiIpOwpAQCAtMTY2Myw2ICsxODY3LDcgQEAKIAlzcGVjLT5hZGNfbmlkcyA9IHN0YWM5MjJ4X2FkY19uaWRzOwogCXNwZWMtPm11eF9uaWRzID0gc3RhYzkyMnhfbXV4X25pZHM7CiAJc3BlYy0+bnVtX211eGVzID0gMjsKKwlzcGVjLT5udW1fZG1pY3MgPSAwOwogCiAJc3BlYy0+aW5pdCA9IHN0YWM5MjJ4X2NvcmVfaW5pdDsKIAlzcGVjLT5taXhlciA9IHN0YWM5MjJ4X21peGVyOwpAQCAtMTY5NSw3ICsxOTAwLDkgQEAKIAljb2RlYy0+c3BlYyA9IHNwZWM7CiAJc3BlYy0+bnVtX3BpbnMgPSAxNDsKIAlzcGVjLT5waW5fbmlkcyA9IHN0YWM5Mjd4X3Bpbl9uaWRzOwotCXNwZWMtPmJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBzdGFjOTI3eF9jZmdfdGJsKTsKKwlzcGVjLT5ib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgU1RBQ185MjdYX01PREVMUywKKwkJCQkJCQlzdGFjOTI3eF9tb2RlbHMsCisJCQkJCQkJc3RhYzkyN3hfY2ZnX3RibCk7CiAJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA8IDApIHsKICAgICAgICAgICAgICAgICBzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogVW5rbm93biBtb2RlbCBmb3IgU1RBQzkyN3gsIHVzaW5nIEJJT1MgZGVmYXVsdHNcbiIpOwogCQllcnIgPSBzdGFjOTJ4eF9zYXZlX2Jpb3NfY29uZmlnX3JlZ3MoY29kZWMpOwpAQCAtMTcxNCw2ICsxOTIxLDcgQEAKIAkJc3BlYy0+YWRjX25pZHMgPSBzdGFjOTI3eF9hZGNfbmlkczsKIAkJc3BlYy0+bXV4X25pZHMgPSBzdGFjOTI3eF9tdXhfbmlkczsKIAkJc3BlYy0+bnVtX211eGVzID0gMzsKKwkJc3BlYy0+bnVtX2RtaWNzID0gMDsKIAkJc3BlYy0+aW5pdCA9IGQ5NjVfY29yZV9pbml0OwogCQlzcGVjLT5taXhlciA9IHN0YWM5MjI3X21peGVyOwogCQlicmVhazsKQEAgLTE3MjEsNiArMTkyOSw3IEBACiAJCXNwZWMtPmFkY19uaWRzID0gc3RhYzkyN3hfYWRjX25pZHM7CiAJCXNwZWMtPm11eF9uaWRzID0gc3RhYzkyN3hfbXV4X25pZHM7CiAJCXNwZWMtPm51bV9tdXhlcyA9IDM7CisJCXNwZWMtPm51bV9kbWljcyA9IDA7CiAJCXNwZWMtPmluaXQgPSBkOTY1X2NvcmVfaW5pdDsKIAkJc3BlYy0+bWl4ZXIgPSBzdGFjOTIyN19taXhlcjsKIAkJYnJlYWs7CkBAIC0xNzI4LDYgKzE5MzcsNyBAQAogCQlzcGVjLT5hZGNfbmlkcyA9IHN0YWM5Mjd4X2FkY19uaWRzOwogCQlzcGVjLT5tdXhfbmlkcyA9IHN0YWM5Mjd4X211eF9uaWRzOwogCQlzcGVjLT5udW1fbXV4ZXMgPSAzOworCQlzcGVjLT5udW1fZG1pY3MgPSAwOwogCQlzcGVjLT5pbml0ID0gc3RhYzkyN3hfY29yZV9pbml0OwogCQlzcGVjLT5taXhlciA9IHN0YWM5Mjd4X21peGVyOwogCX0KQEAgLTE3NTcsNyArMTk2Nyw5IEBACiAJY29kZWMtPnNwZWMgPSBzcGVjOwogCXNwZWMtPm51bV9waW5zID0gMTQ7CiAJc3BlYy0+cGluX25pZHMgPSBzdGFjOTIwNV9waW5fbmlkczsKLQlzcGVjLT5ib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgc3RhYzkyMDVfY2ZnX3RibCk7CisJc3BlYy0+Ym9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIFNUQUNfOTIwNV9NT0RFTFMsCisJCQkJCQkJc3RhYzkyMDVfbW9kZWxzLAorCQkJCQkJCXN0YWM5MjA1X2NmZ190YmwpOwogCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBVbmtub3duIG1vZGVsIGZvciBTVEFDOTIwNSwgdXNpbmcgQklPUyBkZWZhdWx0c1xuIik7CiAJCWVyciA9IHN0YWM5Mnh4X3NhdmVfYmlvc19jb25maWdfcmVncyhjb2RlYyk7CkBAIC0xNzczLDEzICsxOTg1LDI4IEBACiAKIAlzcGVjLT5hZGNfbmlkcyA9IHN0YWM5MjA1X2FkY19uaWRzOwogCXNwZWMtPm11eF9uaWRzID0gc3RhYzkyMDVfbXV4X25pZHM7Ci0Jc3BlYy0+bnVtX211eGVzID0gMzsKKwlzcGVjLT5udW1fbXV4ZXMgPSAyOworCXNwZWMtPmRtaWNfbmlkcyA9IHN0YWM5MjA1X2RtaWNfbmlkczsKKwlzcGVjLT5udW1fZG1pY3MgPSAyOworCXNwZWMtPmRtdXhfbmlkID0gMHgxZDsKIAogCXNwZWMtPmluaXQgPSBzdGFjOTIwNV9jb3JlX2luaXQ7CiAJc3BlYy0+bWl4ZXIgPSBzdGFjOTIwNV9taXhlcjsKIAogCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gc3BlYy0+ZGFjX25pZHM7CiAKKwkvKiBDb25maWd1cmUgR1BJTzAgYXMgRUFQRCBvdXRwdXQgKi8KKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDAwMDAwMDAxKTsKKwkvKiBDb25maWd1cmUgR1BJTzAgYXMgQ01PUyAqLworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGNvZGVjLT5hZmcsIDAsIDB4N2U3LCAweDAwMDAwMDAwKTsKKwkvKiBBc3NlcnQgR1BJTzAgaGlnaCAqLworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJCQkgICAgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAweDAwMDAwMDAxKTsKKwkvKiBFbmFibGUgR1BJTzAgKi8KKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwMDAwMDAwMSk7CisKIAllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHgxZiwgMHgyMCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc3RhYzkyeHhfZnJlZShjb2RlYyk7CkBAIC0xOTYzLDE4ICsyMTkwLDE5IEBACiAgICAgICAgLyogVW5rbm93bi4gaWQ9MHg4Mzg0NzY2MSBhbmQgc3Vic3lzPTB4MTA0RDEyMDAuICovCiAgICAgICAgU1RBQzk4NzJLX1ZBSU8sCiAgICAgICAgLyogQVIgU2VyaWVzLiBpZD0weDgzODQ3NjY0IGFuZCBzdWJzeXM9MTA0RDEzMDAgKi8KLSAgICAgICBDWEQ5ODcyQUtEX1ZBSU8gCi0gICAgIH07CisgICAgICAgQ1hEOTg3MkFLRF9WQUlPLAorICAgICAgIFNUQUNfOTg3Ml9NT0RFTFMsCit9OwogCi1zdGF0aWMgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgc3RhYzk4NzJfY2ZnX3RibFtdID0gewotCXsgLm1vZGVsbmFtZSA9ICJ2YWlvIiwgLmNvbmZpZyA9IENYRDk4NzJSRF9WQUlPIH0sCi0JeyAubW9kZWxuYW1lID0gInZhaW8tYXIiLCAuY29uZmlnID0gQ1hEOTg3MkFLRF9WQUlPIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0ZCwgLnBjaV9zdWJkZXZpY2UgPSAweDgxZTYsCi0JICAuY29uZmlnID0gQ1hEOTg3MlJEX1ZBSU8gfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDRkLCAucGNpX3N1YmRldmljZSA9IDB4ODFlZiwKLQkgIC5jb25maWcgPSBDWEQ5ODcyUkRfVkFJTyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNGQsIC5wY2lfc3ViZGV2aWNlID0gMHg4MWZkLAotCSAgLmNvbmZpZyA9IENYRDk4NzJBS0RfVkFJTyB9LAorc3RhdGljIGNvbnN0IGNoYXIgKnN0YWM5ODcyX21vZGVsc1tTVEFDXzk4NzJfTU9ERUxTXSA9IHsKKwlbQ1hEOTg3MlJEX1ZBSU9dCT0gInZhaW8iLAorCVtDWEQ5ODcyQUtEX1ZBSU9dCT0gInZhaW8tYXIiLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIHN0YWM5ODcyX2NmZ190YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWU2LCAiU29ueSBWQUlPIEYvUyIsIENYRDk4NzJSRF9WQUlPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWVmLCAiU29ueSBWQUlPIEYvUyIsIENYRDk4NzJSRF9WQUlPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWZkLCAiU29ueSBWQUlPIEFSIiwgQ1hEOTg3MkFLRF9WQUlPKSwKIAl7fQogfTsKIApAQCAtMTk4Myw3ICsyMjExLDkgQEAKIAlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYzsKIAlpbnQgYm9hcmRfY29uZmlnOwogCi0JYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIHN0YWM5ODcyX2NmZ190YmwpOworCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBTVEFDXzk4NzJfTU9ERUxTLAorCQkJCQkJICBzdGFjOTg3Ml9tb2RlbHMsCisJCQkJCQkgIHN0YWM5ODcyX2NmZ190YmwpOwogCWlmIChib2FyZF9jb25maWcgPCAwKQogCQkvKiB1bmtub3duIGNvbmZpZywgbGV0IGdlbmVyaWMtcGFyc2VyIGRvIGl0cyBqb2IuLi4gKi8KIAkJcmV0dXJuIHNuZF9oZGFfcGFyc2VfZ2VuZXJpY19jb2RlYyhjb2RlYyk7CkBAIC0yMDU1LDYgKzIyODUsMTIgQEAKICAJeyAuaWQgPSAweDgzODQ3NjI3LCAubmFtZSA9ICJTVEFDOTI3MUQiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTI3eCB9LAogIAl7IC5pZCA9IDB4ODM4NDc2MjgsIC5uYW1lID0gIlNUQUM5Mjc0WDVOSCIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5Mjd4IH0sCiAgCXsgLmlkID0gMHg4Mzg0NzYyOSwgLm5hbWUgPSAiU1RBQzkyNzRENU5IIiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyN3ggfSwKKwl7IC5pZCA9IDB4ODM4NDc2MzIsIC5uYW1lID0gIlNUQUM5MjAyIiwgIC5wYXRjaCA9IHBhdGNoX3N0YWM5MjV4IH0sCisJeyAuaWQgPSAweDgzODQ3NjMzLCAubmFtZSA9ICJTVEFDOTIwMkQiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTI1eCB9LAorCXsgLmlkID0gMHg4Mzg0NzYzNCwgLm5hbWUgPSAiU1RBQzkyNTAiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTI1eCB9LAorCXsgLmlkID0gMHg4Mzg0NzYzNSwgLm5hbWUgPSAiU1RBQzkyNTBEIiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyNXggfSwKKwl7IC5pZCA9IDB4ODM4NDc2MzYsIC5uYW1lID0gIlNUQUM5MjUxIiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyNXggfSwKKwl7IC5pZCA9IDB4ODM4NDc2MzcsIC5uYW1lID0gIlNUQUM5MjUwRCIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MjV4IH0sCiAgCS8qIFRoZSBmb2xsb3dpbmcgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgLmlkPTB4ODM4NDc2NjEgd2hlbiBzdWJzeXMgPQogIAkgKiAxMDREMEMwMCB3aGljaCBpcyBTVEFDOTIyNXMuIEJlY2F1c2Ugb2YgdGhpcywgc29tZSBTWiBOb3RlYm9va3MgYXJlCiAgCSAqIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkLgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4MzliMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKQEAgLTAsMCArMSwxMzk2IEBACisvKgorICogVW5pdmVyc2FsIEludGVyZmFjZSBmb3IgSW50ZWwgSGlnaCBEZWZpbml0aW9uIEF1ZGlvIENvZGVjCisgKgorICogSEQgYXVkaW8gaW50ZXJmYWNlIHBhdGNoIGZvciBWSUEgVlQxNzA4IGNvZGVjCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEx5ZGlhIFdhbmcgPGx5ZGlhd2FuZ0B2aWF0ZWNoLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogIFRoaXMgZHJpdmVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogKiAqICogKiAqICogKiAqICogKiAqICogKiBSZWxlYXNlIEhpc3RvcnkgKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogMjAwNi0wMy0wMyAgTHlkaWEgV2FuZyAgQ3JlYXRlIHRoZSBiYXNpYyBwYXRjaCB0byBzdXBwb3J0IFZUMTcwOCBjb2RlYyAgICAqLworLyogMjAwNi0wMy0xNCAgTHlkaWEgV2FuZyAgTW9kaWZ5IGhhcmQgY29kZSBmb3Igc29tZSBwaW4gd2lkZ2V0IG5pZCAgICAgICAgICAqLworLyogMjAwNi0wOC0wMiAgTHlkaWEgV2FuZyAgQWRkIHN1cHBvcnQgdG8gVlQxNzA5IGNvZGVjICAgICAgICAgICAgICAgICAgICAgICAqLworLyogMjAwNi0wOS0wOCAgTHlkaWEgV2FuZyAgRml4IGludGVybmFsIGxvb3BiYWNrIHJlY29yZGluZyBzb3VyY2Ugc2VsZWN0IGJ1ZyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLworCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgImhkYV9jb2RlYy5oIgorI2luY2x1ZGUgImhkYV9sb2NhbC5oIgorCisKKy8qIGFtcCB2YWx1ZXMgKi8KKyNkZWZpbmUgQU1QX1ZBTF9JRFhfU0hJRlQJMTkKKyNkZWZpbmUgQU1QX1ZBTF9JRFhfTUFTSwkoMHgwZjw8MTkpCisKKyNkZWZpbmUgTlVNX0NPTlRST0xfQUxMT0MJMzIKKyNkZWZpbmUgTlVNX1ZFUkJfQUxMT0MJCTMyCisKKy8qIFBpbiBXaWRnZXQgTklEICovCisjZGVmaW5lIFZUMTcwOF9IUF9OSUQJCTB4MTMKKyNkZWZpbmUgVlQxNzA4X0RJR09VVF9OSUQJMHgxNAorI2RlZmluZSBWVDE3MDhfRElHSU5fTklECTB4MTYKKworI2RlZmluZSBWVDE3MDlfSFBfREFDX05JRAkweDI4CisjZGVmaW5lIFZUMTcwOV9ESUdPVVRfTklECTB4MTMKKyNkZWZpbmUgVlQxNzA5X0RJR0lOX05JRAkweDE3CisKKyNkZWZpbmUgSVNfVlQxNzA4X1ZFTkRPUklEKHgpCQkoKHgpID49IDB4MTEwNjE3MDggJiYgKHgpIDw9IDB4MTEwNjE3MGIpCisjZGVmaW5lIElTX1ZUMTcwOV8xMENIX1ZFTkRPUklEKHgpCSgoeCkgPj0gMHgxMTA2ZTcxMCAmJiAoeCkgPD0gMHgxMTA2ZTcxMykKKyNkZWZpbmUgSVNfVlQxNzA5XzZDSF9WRU5ET1JJRCh4KQkoKHgpID49IDB4MTEwNmU3MTQgJiYgKHgpIDw9IDB4MTEwNmU3MTcpCisKKworZW51bSB7CisJVklBX0NUTF9XSURHRVRfVk9MLAorCVZJQV9DVExfV0lER0VUX01VVEUsCit9OworCitlbnVtIHsKKwlBVVRPX1NFUV9GUk9OVCwKKwlBVVRPX1NFUV9TVVJST1VORCwKKwlBVVRPX1NFUV9DRU5MRkUsCisJQVVUT19TRVFfU0lERQorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZ0MTcwOF9jb250cm9sX3RlbXBsYXRlc1tdID0geworCUhEQV9DT0RFQ19WT0xVTUUoTlVMTCwgMCwgMCwgMCksCisJSERBX0NPREVDX01VVEUoTlVMTCwgMCwgMCwgMCksCit9OworCisKK3N0cnVjdCB2aWFfc3BlYyB7CisJLyogY29kZWMgcGFyYW1ldGVyaXphdGlvbiAqLworCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICptaXhlcnNbM107CisJdW5zaWduZWQgaW50IG51bV9taXhlcnM7CisKKwlzdHJ1Y3QgaGRhX3ZlcmIgKmluaXRfdmVyYnM7CisKKwljaGFyICpzdHJlYW1fbmFtZV9hbmFsb2c7CisJc3RydWN0IGhkYV9wY21fc3RyZWFtICpzdHJlYW1fYW5hbG9nX3BsYXliYWNrOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqc3RyZWFtX2FuYWxvZ19jYXB0dXJlOworCisJY2hhciAqc3RyZWFtX25hbWVfZGlnaXRhbDsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqc3RyZWFtX2RpZ2l0YWxfY2FwdHVyZTsKKworCS8qIHBsYXliYWNrICovCisJc3RydWN0IGhkYV9tdWx0aV9vdXQgbXVsdGlvdXQ7CisKKwkvKiBjYXB0dXJlICovCisJdW5zaWduZWQgaW50IG51bV9hZGNfbmlkczsKKwloZGFfbmlkX3QgKmFkY19uaWRzOworCWhkYV9uaWRfdCBkaWdfaW5fbmlkOworCisJLyogY2FwdHVyZSBzb3VyY2UgKi8KKwljb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW5wdXRfbXV4OworCXVuc2lnbmVkIGludCBjdXJfbXV4WzNdOworCisJLyogUENNIGluZm9ybWF0aW9uICovCisJc3RydWN0IGhkYV9wY20gcGNtX3JlY1syXTsKKworCS8qIGR5bmFtaWMgY29udHJvbHMsIGluaXRfdmVyYnMgYW5kIGlucHV0X211eCAqLworCXN0cnVjdCBhdXRvX3Bpbl9jZmcgYXV0b2NmZzsKKwl1bnNpZ25lZCBpbnQgbnVtX2tjdGxfYWxsb2MsIG51bV9rY3RsX3VzZWQ7CisJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjdGxfYWxsb2M7CisJc3RydWN0IGhkYV9pbnB1dF9tdXggcHJpdmF0ZV9pbXV4OworCWhkYV9uaWRfdCBwcml2YXRlX2RhY19uaWRzWzRdOwkKK307CisKK3N0YXRpYyBoZGFfbmlkX3QgdnQxNzA4X2FkY19uaWRzWzJdID0geworCS8qIEFEQzEtMiAqLworCTB4MTUsIDB4MjcKK307CisKK3N0YXRpYyBoZGFfbmlkX3QgdnQxNzA5X2FkY19uaWRzWzNdID0geworCS8qIEFEQzEtMiAqLworCTB4MTQsIDB4MTUsIDB4MTYKK307CisKKy8qIGFkZCBkeW5hbWljIGNvbnRyb2xzICovCitzdGF0aWMgaW50IHZpYV9hZGRfY29udHJvbChzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtuZXc7CisKKwlpZiAoc3BlYy0+bnVtX2tjdGxfdXNlZCA+PSBzcGVjLT5udW1fa2N0bF9hbGxvYykgeworCQlpbnQgbnVtID0gc3BlYy0+bnVtX2tjdGxfYWxsb2MgKyBOVU1fQ09OVFJPTF9BTExPQzsKKworCQkvKiBhcnJheSArIHRlcm1pbmF0b3IgKi8KKwkJa25ldyA9IGtjYWxsb2MobnVtICsgMSwgc2l6ZW9mKCprbmV3KSwgR0ZQX0tFUk5FTCk7CisJCWlmICgha25ldykKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoc3BlYy0+a2N0bF9hbGxvYykgeworCQkJbWVtY3B5KGtuZXcsIHNwZWMtPmtjdGxfYWxsb2MsCisJCQkgICAgICAgc2l6ZW9mKCprbmV3KSAqIHNwZWMtPm51bV9rY3RsX2FsbG9jKTsKKwkJCWtmcmVlKHNwZWMtPmtjdGxfYWxsb2MpOworCQl9CisJCXNwZWMtPmtjdGxfYWxsb2MgPSBrbmV3OworCQlzcGVjLT5udW1fa2N0bF9hbGxvYyA9IG51bTsKKwl9CisKKwlrbmV3ID0gJnNwZWMtPmtjdGxfYWxsb2Nbc3BlYy0+bnVtX2tjdGxfdXNlZF07CisJKmtuZXcgPSB2dDE3MDhfY29udHJvbF90ZW1wbGF0ZXNbdHlwZV07CisJa25ldy0+bmFtZSA9IGtzdHJkdXAobmFtZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWtuZXctPm5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCWtuZXctPnByaXZhdGVfdmFsdWUgPSB2YWw7CisJc3BlYy0+bnVtX2tjdGxfdXNlZCsrOworCXJldHVybiAwOworfQorCisvKiBjcmVhdGUgaW5wdXQgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgdGhlIGdpdmVuIHBpbiAqLworc3RhdGljIGludCB2aWFfbmV3X2FuYWxvZ19pbnB1dChzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW4sCisJCQkJY29uc3QgY2hhciAqY3RsbmFtZSwgaW50IGlkeCwgaW50IG1peF9uaWQpCit7CisJY2hhciBuYW1lWzMyXTsKKwlpbnQgZXJyOworCisJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY3RsbmFtZSk7CisJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKKwkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobWl4X25pZCwgMywgaWR4LCBIREFfSU5QVVQpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBjdGxuYW1lKTsKKwllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKKwkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobWl4X25pZCwgMywgaWR4LCBIREFfSU5QVVQpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmlhX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICBoZGFfbmlkX3QgbmlkLCBpbnQgcGluX3R5cGUsCisJCQkJCSAgIGludCBkYWNfaWR4KQoreworCS8qIHNldCBhcyBvdXRwdXQgKi8KKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKKwkJCSAgICBwaW5fdHlwZSk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJICAgIEFNUF9PVVRfVU5NVVRFKTsKK30KKworCitzdGF0aWMgdm9pZCB2aWFfYXV0b19pbml0X211bHRpX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gQVVUT19TRVFfU0lERTsgaSsrKSB7CisJCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbaV07CisJCWlmIChuaWQpCisJCQl2aWFfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwgUElOX09VVCwgaSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB2aWFfYXV0b19pbml0X2hwX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwloZGFfbmlkX3QgcGluOworCisJcGluID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOworCWlmIChwaW4pIC8qIGNvbm5lY3QgdG8gZnJvbnQgKi8KKwkJdmlhX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9IUCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHZpYV9hdXRvX2luaXRfYW5hbG9nX2lucHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFVVE9fUElOX0xBU1Q7IGkrKykgeworCQloZGFfbmlkX3QgbmlkID0gc3BlYy0+YXV0b2NmZy5pbnB1dF9waW5zW2ldOworCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJCSAgICAoaSA8PSBBVVRPX1BJTl9GUk9OVF9NSUMgPworCQkJCSAgICAgUElOX1ZSRUY1MCA6IFBJTl9JTikpOworCisJfQorfQorLyoKKyAqIGlucHV0IE1VWCBoYW5kbGluZworICovCitzdGF0aWMgaW50IHZpYV9tdXhfZW51bV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9pbmZvKHNwZWMtPmlucHV0X211eCwgdWluZm8pOworfQorCitzdGF0aWMgaW50IHZpYV9tdXhfZW51bV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IGFkY19pZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzcGVjLT5jdXJfbXV4W2FkY19pZHhdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpYV9tdXhfZW51bV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IGFkY19pZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwl1bnNpZ25lZCBpbnQgdmVuZG9yX2lkID0gY29kZWMtPnZlbmRvcl9pZDsKKworCS8qIEFJVzAgIGx5ZGlhIDA2MDgwMSBhZGQgZm9yIGNvcnJlY3Qgc3cwIGlucHV0IHNlbGVjdCAqLworCWlmIChJU19WVDE3MDhfVkVORE9SSUQodmVuZG9yX2lkKSAmJiAoYWRjX2lkeCA9PSAwKSkKKwkJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X3B1dChjb2RlYywgc3BlYy0+aW5wdXRfbXV4LCB1Y29udHJvbCwKKwkJCQkJICAgICAweDE4LCAmc3BlYy0+Y3VyX211eFthZGNfaWR4XSk7CisJZWxzZSBpZiAoKElTX1ZUMTcwOV8xMENIX1ZFTkRPUklEKHZlbmRvcl9pZCkgfHwKKwkJICBJU19WVDE3MDlfNkNIX1ZFTkRPUklEKHZlbmRvcl9pZCkpICYmIChhZGNfaWR4ID09IDApICkKKwkJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X3B1dChjb2RlYywgc3BlYy0+aW5wdXRfbXV4LCB1Y29udHJvbCwKKwkJCQkJICAgICAweDE5LCAmc3BlYy0+Y3VyX211eFthZGNfaWR4XSk7CisJZWxzZQorCQlyZXR1cm4gc25kX2hkYV9pbnB1dF9tdXhfcHV0KGNvZGVjLCBzcGVjLT5pbnB1dF9tdXgsIHVjb250cm9sLAorCQkJCQkgICAgIHNwZWMtPmFkY19uaWRzW2FkY19pZHhdLAorCQkJCQkgICAgICZzcGVjLT5jdXJfbXV4W2FkY19pZHhdKTsKK30KKworLyogY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZ0MTcwOF9jYXB0dXJlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDEsIDB4MjcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMSwgMHgyNywgMHgwLCBIREFfSU5QVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS8qIFRoZSBtdWx0aXBsZSAiQ2FwdHVyZSBTb3VyY2UiIGNvbnRyb2xzIGNvbmZ1c2UgYWxzYW1peGVyCisJCSAqIFNvIGNhbGwgc29tZXdoYXQgZGlmZmVyZW50Li4KKwkJICogRklYTUU6IHRoZSBjb250cm9scyBhcHBlYXIgaW4gdGhlICJwbGF5YmFjayIgdmlldyEKKwkJICovCisJCS8qIC5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwgKi8KKwkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKKwkJLmNvdW50ID0gMSwKKwkJLmluZm8gPSB2aWFfbXV4X2VudW1faW5mbywKKwkJLmdldCA9IHZpYV9tdXhfZW51bV9nZXQsCisJCS5wdXQgPSB2aWFfbXV4X2VudW1fcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKy8qCisgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgdnQxNzA4X3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBVbm11dGUgQURDMC0xIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCisJICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDI3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKworCisJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCisJICogbWl4ZXIgd2lkZ2V0CisJICovCisJLyogQW1wIEluZGljZXM6IENEID0gMSwgTWljMSA9IDIsIExpbmUgPSAzLCBNaWMyID0gNCAqLworCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCisKKwkvKgorCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDE5IC0gMHgxYikKKwkgKi8KKwkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCQorCS8qIFNldHVwIGRlZmF1bHQgaW5wdXQgdG8gUFc0ICovCisJezB4MjAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDF9LAorCS8qIFNldCBtaWMgYXMgZGVmYXVsdCBpbnB1dCBvZiBzdzAgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4Mn0sCisJLyogUFc5IE91dHB1dCBlbmFibGUgKi8KKwl7MHgyNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKK307CisKK3N0YXRpYyBpbnQgdmlhX3BsYXliYWNrX3BjbV9vcGVuKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX29wZW4oY29kZWMsICZzcGVjLT5tdWx0aW91dCwgc3Vic3RyZWFtKTsKK30KKworc3RhdGljIGludCB2aWFfcGxheWJhY2tfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX3ByZXBhcmUoY29kZWMsICZzcGVjLT5tdWx0aW91dCwKKwkJCQkJCXN0cmVhbV90YWcsIGZvcm1hdCwgc3Vic3RyZWFtKTsKK30KKworc3RhdGljIGludCB2aWFfcGxheWJhY2tfcGNtX2NsZWFudXAoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfY2xlYW51cChjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKK30KKworLyoKKyAqIERpZ2l0YWwgb3V0CisgKi8KK3N0YXRpYyBpbnQgdmlhX2RpZ19wbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX29wZW4oY29kZWMsICZzcGVjLT5tdWx0aW91dCk7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2RpZ19wbGF5YmFja19wY21fY2xvc2Uoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICAgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX2Nsb3NlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOworfQorCisvKgorICogQW5hbG9nIGNhcHR1cmUKKyAqLworc3RhdGljIGludCB2aWFfY2FwdHVyZV9wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAorCQkJCSAgIHVuc2lnbmVkIGludCBmb3JtYXQsCisJCQkJICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgc3BlYy0+YWRjX25pZHNbc3Vic3RyZWFtLT5udW1iZXJdLAorCQkJCSAgIHN0cmVhbV90YWcsIDAsIGZvcm1hdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2NhcHR1cmVfcGNtX2NsZWFudXAoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgc3BlYy0+YWRjX25pZHNbc3Vic3RyZWFtLT5udW1iZXJdLAorCQkJCSAgIDAsIDAsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOF9wY21fYW5hbG9nX3BsYXliYWNrID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gOCwKKwkubmlkID0gMHgxMCwgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCisJLm9wcyA9IHsKKwkJLm9wZW4gPSB2aWFfcGxheWJhY2tfcGNtX29wZW4sCisJCS5wcmVwYXJlID0gdmlhX3BsYXliYWNrX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IHZpYV9wbGF5YmFja19wY21fY2xlYW51cAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOF9wY21fYW5hbG9nX2NhcHR1cmUgPSB7CisJLnN1YnN0cmVhbXMgPSAyLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS5uaWQgPSAweDE1LCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KKwkub3BzID0geworCQkucHJlcGFyZSA9IHZpYV9jYXB0dXJlX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IHZpYV9jYXB0dXJlX3BjbV9jbGVhbnVwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA4X3BjbV9kaWdpdGFsX3BsYXliYWNrID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkvKiBOSUQgaXMgc2V0IGluIHZpYV9idWlsZF9wY21zICovCisJLm9wcyA9IHsKKwkJLm9wZW4gPSB2aWFfZGlnX3BsYXliYWNrX3BjbV9vcGVuLAorCQkuY2xvc2UgPSB2aWFfZGlnX3BsYXliYWNrX3BjbV9jbG9zZQorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOF9wY21fZGlnaXRhbF9jYXB0dXJlID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKK307CisKK3N0YXRpYyBpbnQgdmlhX2J1aWxkX2NvbnRyb2xzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBlcnI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX21peGVyczsgaSsrKSB7CisJCWVyciA9IHNuZF9oZGFfYWRkX25ld19jdGxzKGNvZGVjLCBzcGVjLT5taXhlcnNbaV0pOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKSB7CisJCWVyciA9IHNuZF9oZGFfY3JlYXRlX3NwZGlmX291dF9jdGxzKGNvZGVjLAorCQkJCQkJICAgIHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoc3BlYy0+ZGlnX2luX25pZCkgeworCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9pbl9jdGxzKGNvZGVjLCBzcGVjLT5kaWdfaW5fbmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFfYnVpbGRfcGNtcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgaGRhX3BjbSAqaW5mbyA9IHNwZWMtPnBjbV9yZWM7CisKKwljb2RlYy0+bnVtX3BjbXMgPSAxOworCWNvZGVjLT5wY21faW5mbyA9IGluZm87CisKKwlpbmZvLT5uYW1lID0gc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9ICooc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayk7CisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLm5pZCA9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gKihzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUpOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLm5pZCA9IHNwZWMtPmFkY19uaWRzWzBdOworCisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmNoYW5uZWxzX21heCA9CisJCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVsczsKKworCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCB8fCBzcGVjLT5kaWdfaW5fbmlkKSB7CisJCWNvZGVjLT5udW1fcGNtcysrOworCQlpbmZvKys7CisJCWluZm8tPm5hbWUgPSBzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsOworCQlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpIHsKKwkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9CisJCQkJKihzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayk7CisJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10ubmlkID0KKwkJCQlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZDsKKwkJfQorCQlpZiAoc3BlYy0+ZGlnX2luX25pZCkgeworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPQorCQkJCSooc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSk7CisJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPQorCQkJCXNwZWMtPmRpZ19pbl9uaWQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmlhX2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIXNwZWMpCisJCXJldHVybjsKKworCWlmIChzcGVjLT5rY3RsX2FsbG9jKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fa2N0bF91c2VkOyBpKyspCisJCQlrZnJlZShzcGVjLT5rY3RsX2FsbG9jW2ldLm5hbWUpOworCQlrZnJlZShzcGVjLT5rY3RsX2FsbG9jKTsKKwl9CisKKwlrZnJlZShjb2RlYy0+c3BlYyk7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgc3BlYy0+aW5pdF92ZXJicyk7CisgCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisvKgorICogcmVzdW1lCisgKi8KK3N0YXRpYyBpbnQgdmlhX3Jlc3VtZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgaTsKKworCXZpYV9pbml0KGNvZGVjKTsKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX21peGVyczsgaSsrKQorCQlzbmRfaGRhX3Jlc3VtZV9jdGxzKGNvZGVjLCBzcGVjLT5taXhlcnNbaV0pOworCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkKKwkJc25kX2hkYV9yZXN1bWVfc3BkaWZfb3V0KGNvZGVjKTsKKwlpZiAoc3BlYy0+ZGlnX2luX25pZCkKKwkJc25kX2hkYV9yZXN1bWVfc3BkaWZfaW4oY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqLworc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfb3BzIHZpYV9wYXRjaF9vcHMgPSB7CisJLmJ1aWxkX2NvbnRyb2xzID0gdmlhX2J1aWxkX2NvbnRyb2xzLAorCS5idWlsZF9wY21zID0gdmlhX2J1aWxkX3BjbXMsCisJLmluaXQgPSB2aWFfaW5pdCwKKwkuZnJlZSA9IHZpYV9mcmVlLAorI2lmZGVmIENPTkZJR19QTQorCS5yZXN1bWUgPSB2aWFfcmVzdW1lLAorI2VuZGlmCit9OworCisvKiBmaWxsIGluIHRoZSBkYWNfbmlkcyB0YWJsZSBmcm9tIHRoZSBwYXJzZWQgcGluIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBpbnQgdnQxNzA4X2F1dG9fZmlsbF9kYWNfbmlkcyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCit7CisJaW50IGk7CisJaGRhX25pZF90IG5pZDsKKworCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gY2ZnLT5saW5lX291dHM7CisKKwlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPnByaXZhdGVfZGFjX25pZHM7CisgCQorCWZvcihpID0gMDsgaSA8IDQ7IGkrKykgeworCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07CisJCWlmIChuaWQpIHsKKwkJCS8qIGNvbmZpZyBkYWMgbGlzdCAqLworCQkJc3dpdGNoIChpKSB7CisJCQljYXNlIEFVVE9fU0VRX0ZST05UOgorCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID0gMHgxMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVVUT19TRVFfQ0VOTEZFOgorCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID0gMHgxMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVVUT19TRVFfU1VSUk9VTkQ6CisJCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPSAweDEzOworCQkJCWJyZWFrOworCQkJY2FzZSBBVVRPX1NFUV9TSURFOgorCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID0gMHgxMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBhZGQgcGxheWJhY2sgY29udHJvbHMgZnJvbSB0aGUgcGFyc2VkIERBQyB0YWJsZSAqLworc3RhdGljIGludCB2dDE3MDhfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKK3sKKwljaGFyIG5hbWVbMzJdOworCXN0YXRpYyBjb25zdCBjaGFyICpjaG5hbWVbNF0gPSB7ICJGcm9udCIsICJTdXJyb3VuZCIsICJDL0xGRSIsICJTaWRlIiB9OworCWhkYV9uaWRfdCBuaWQsIG5pZF92b2wgPSAwOworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDw9IEFVVE9fU0VRX1NJREU7IGkrKykgeworCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07CisKKwkJaWYgKCFuaWQpCisJCQljb250aW51ZTsKKwkJCisJCWlmIChpICE9IEFVVE9fU0VRX0ZST05UKQorCQkJbmlkX3ZvbCA9IDB4MWIgLSBpICsgMTsKKworCQlpZiAoaSA9PSBBVVRPX1NFUV9DRU5MRkUpIHsKKwkJCS8qIENlbnRlci9MRkUgKi8KKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCisJCQkJCSAgICAgICJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAxLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKKwkJCQkJICAgICAgIkxGRSBQbGF5YmFjayBWb2x1bWUiLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDIsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKKwkJCQkJICAgICAgIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDEsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKKwkJCQkJICAgICAgIkxGRSBQbGF5YmFjayBTd2l0Y2giLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDIsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0gZWxzZSBpZiAoaSA9PSBBVVRPX1NFUV9GUk9OVCl7CisJCQkvKiBhZGQgY29udHJvbCB0byBtaXhlciBpbmRleCAwICovCisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAorCQkJCQkgICAgICAiTWFzdGVyIEZyb250IFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNywgMywgMCwgSERBX0lOUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCisJCQkJCSAgICAgICJNYXN0ZXIgRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE3LCAzLCAwLCBIREFfSU5QVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQkKKwkJCS8qIGFkZCBjb250cm9sIHRvIFBXMyAqLworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfSBlbHNlIHsKKwkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIGNobmFtZVtpXSk7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLCBuYW1lLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBjaG5hbWVbaV0pOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsIG5hbWUsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMywgMCwgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZ0MTcwOF9hdXRvX2NyZWF0ZV9ocF9jdGxzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywgaGRhX25pZF90IHBpbikKK3sKKwlpbnQgZXJyOworCisJaWYgKCFwaW4pCisJCXJldHVybiAwOworCisJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gVlQxNzA4X0hQX05JRDsgLyogQU9XMyAqLworCisJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKKwkJCSAgICAgICJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwKKwkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLCBIREFfT1VUUFVUKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCisJCQkgICAgICAiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsCisJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKHBpbiwgMywgMCwgSERBX09VVFBVVCkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNyZWF0ZSBwbGF5YmFjay9jYXB0dXJlIGNvbnRyb2xzIGZvciBpbnB1dCBwaW5zICovCitzdGF0aWMgaW50IHZ0MTcwOF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsCisJCQkJCQljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCit7CisJc3RhdGljIGNoYXIgKmxhYmVsc1tdID0geworCQkiTWljIiwgIkZyb250IE1pYyIsICJMaW5lIiwgIkZyb250IExpbmUiLCAiQ0QiLCAiQXV4IiwgTlVMTAorCX07CisJc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4OworCWludCBpLCBlcnIsIGlkeCA9IDA7CisKKwkvKiBmb3IgaW50ZXJuYWwgbG9vcGJhY2sgcmVjb3JkaW5nIHNlbGVjdCAqLworCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10ubGFiZWwgPSAiU3RlcmVvIE1peGVyIjsKKwlpbXV4LT5pdGVtc1tpbXV4LT5udW1faXRlbXNdLmluZGV4ID0gaWR4OworCWltdXgtPm51bV9pdGVtcysrOworCisJZm9yIChpID0gMDsgaSA8IEFVVE9fUElOX0xBU1Q7IGkrKykgeworCQlpZiAoIWNmZy0+aW5wdXRfcGluc1tpXSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoY2ZnLT5pbnB1dF9waW5zW2ldKSB7CisJCWNhc2UgMHgxZDogLyogTWljICovCisJCQlpZHggPSAyOworCQkJYnJlYWs7CisJCQkJCisJCWNhc2UgMHgxZTogLyogTGluZSBJbiAqLworCQkJaWR4ID0gMzsKKwkJCWJyZWFrOworCisJCWNhc2UgMHgyMTogLyogRnJvbnQgTWljICovCisJCQlpZHggPSA0OworCQkJYnJlYWs7CisKKwkJY2FzZSAweDI0OiAvKiBDRCAqLworCQkJaWR4ID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWVyciA9IHZpYV9uZXdfYW5hbG9nX2lucHV0KHNwZWMsIGNmZy0+aW5wdXRfcGluc1tpXSwgbGFiZWxzW2ldLAorCQkJCQkgICBpZHgsIDB4MTcpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10ubGFiZWwgPSBsYWJlbHNbaV07CisJCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10uaW5kZXggPSBpZHg7CisJCWltdXgtPm51bV9pdGVtcysrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2dDE3MDhfcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGVycjsKKworCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB2dDE3MDhfYXV0b19maWxsX2RhY19uaWRzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoIXNwZWMtPmF1dG9jZmcubGluZV9vdXRzICYmICFzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0pCisJCXJldHVybiAwOyAvKiBjYW4ndCBmaW5kIHZhbGlkIEJJT1MgcGluIGNvbmZpZyAqLworCisJZXJyID0gdnQxNzA4X2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB2dDE3MDhfYXV0b19jcmVhdGVfaHBfY3RscyhzcGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHZ0MTcwOF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7CisKKwlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfb3V0X3BpbikKKwkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBWVDE3MDhfRElHT1VUX05JRDsKKwlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfaW5fcGluKQorCQlzcGVjLT5kaWdfaW5fbmlkID0gVlQxNzA4X0RJR0lOX05JRDsKKworCWlmIChzcGVjLT5rY3RsX2FsbG9jKQorCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxfYWxsb2M7CisKKwlzcGVjLT5pbml0X3ZlcmJzID0gdnQxNzA4X3ZvbHVtZV9pbml0X3ZlcmJzOwkKKworCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXg7CisKKwlyZXR1cm4gMTsKK30KKworLyogaW5pdCBjYWxsYmFjayBmb3IgYXV0by1jb25maWd1cmF0aW9uIG1vZGVsIC0tIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgaW5pdCAqLworc3RhdGljIGludCB2aWFfYXV0b19pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXZpYV9pbml0KGNvZGVjKTsKKwl2aWFfYXV0b19pbml0X211bHRpX291dChjb2RlYyk7CisJdmlhX2F1dG9faW5pdF9ocF9vdXQoY29kZWMpOworCXZpYV9hdXRvX2luaXRfYW5hbG9nX2lucHV0KGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXRjaF92dDE3MDgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjOworCWludCBlcnI7CisKKwkvKiBjcmVhdGUgYSBjb2RlYyBzcGVjaWZpYyByZWNvcmQgKi8KKwlzcGVjID0ga2NhbGxvYygxLCBzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3BlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvZGVjLT5zcGVjID0gc3BlYzsKKworCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLworCWVyciA9IHZ0MTcwOF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJaWYgKGVyciA8IDApIHsKKwkJdmlhX2ZyZWUoY29kZWMpOworCQlyZXR1cm4gZXJyOworCX0gZWxzZSBpZiAoIWVycikgeworCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCisJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgZ2VuZW5pYyBtb2RlLi4uXG4iKTsKKwl9CisKKwkKKwlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQxNzA4IEFuYWxvZyI7CisJc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZ2dDE3MDhfcGNtX2FuYWxvZ19wbGF5YmFjazsKKwlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmdnQxNzA4X3BjbV9hbmFsb2dfY2FwdHVyZTsKKworCXNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWwgPSAiVlQxNzA4IERpZ2l0YWwiOworCXNwZWMtPnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrID0gJnZ0MTcwOF9wY21fZGlnaXRhbF9wbGF5YmFjazsKKwlzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlID0gJnZ0MTcwOF9wY21fZGlnaXRhbF9jYXB0dXJlOworCisJCisJaWYgKCFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKKwkJc3BlYy0+YWRjX25pZHMgPSB2dDE3MDhfYWRjX25pZHM7CisJCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUodnQxNzA4X2FkY19uaWRzKTsKKwkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0gdnQxNzA4X2NhcHR1cmVfbWl4ZXI7CisJCXNwZWMtPm51bV9taXhlcnMrKzsKKwl9CisKKwljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKKworCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IHZpYV9hdXRvX2luaXQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZ0MTcwOV9jYXB0dXJlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDE0LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDEsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMSwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDIsIDB4MTYsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMiwgMHgxNiwgMHgwLCBIREFfSU5QVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS8qIFRoZSBtdWx0aXBsZSAiQ2FwdHVyZSBTb3VyY2UiIGNvbnRyb2xzIGNvbmZ1c2UgYWxzYW1peGVyCisJCSAqIFNvIGNhbGwgc29tZXdoYXQgZGlmZmVyZW50Li4KKwkJICogRklYTUU6IHRoZSBjb250cm9scyBhcHBlYXIgaW4gdGhlICJwbGF5YmFjayIgdmlldyEKKwkJICovCisJCS8qIC5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwgKi8KKwkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKKwkJLmNvdW50ID0gMSwKKwkJLmluZm8gPSB2aWFfbXV4X2VudW1faW5mbywKKwkJLmdldCA9IHZpYV9tdXhfZW51bV9nZXQsCisJCS5wdXQgPSB2aWFfbXV4X2VudW1fcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24gb2YgQURDLCBpbnB1dCBtaXhlcnMgYW5kIG91dHB1dCBtaXhlcnMKKyAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiB2dDE3MDlfMTBjaF92b2x1bWVfaW5pdF92ZXJic1tdID0geworCS8qCisJICogVW5tdXRlIEFEQzAtMiBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgorCSAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCisKKwkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZSBhbmFsb2ctbG9vcGJhY2sKKwkgKiBtaXhlciB3aWRnZXQKKwkgKi8KKwkvKiBBbXAgSW5kaWNlczogQU9XMD0wLCBDRCA9IDEsIE1pYzEgPSAyLCBMaW5lID0gMywgTWljMiA9IDQgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNCl9LAorCisJLyoKKwkgKiBTZXQgdXAgb3V0cHV0IHNlbGVjdG9yICgweDFhLCAweDFiLCAweDI5KQorCSAqLworCS8qIHNldCB2b2w9MCB0byBvdXRwdXQgbWl4ZXJzICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MjksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisKKwkvKgorCSAqICBVbm11dGUgUFczIGFuZCBQVzQKKwkgKi8KKwl7MHgxZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgyMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKworCS8qIFNldCBpbnB1dCBvZiBQVzQgYXMgQU9XNCAqLworCXsweDIwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgxfSwKKwkvKiBTZXQgbWljIGFzIGRlZmF1bHQgaW5wdXQgb2Ygc3cwICovCisJezB4MTksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDJ9LAorCS8qIFBXOSBPdXRwdXQgZW5hYmxlICovCisJezB4MjQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOV8xMGNoX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAxMCwKKwkubmlkID0gMHgxMCwgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCisJLm9wcyA9IHsKKwkJLm9wZW4gPSB2aWFfcGxheWJhY2tfcGNtX29wZW4sCisJCS5wcmVwYXJlID0gdmlhX3BsYXliYWNrX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IHZpYV9wbGF5YmFja19wY21fY2xlYW51cAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOV82Y2hfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDYsCisJLm5pZCA9IDB4MTAsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLworCS5vcHMgPSB7CisJCS5vcGVuID0gdmlhX3BsYXliYWNrX3BjbV9vcGVuLAorCQkucHJlcGFyZSA9IHZpYV9wbGF5YmFja19wY21fcHJlcGFyZSwKKwkJLmNsZWFudXAgPSB2aWFfcGxheWJhY2tfcGNtX2NsZWFudXAKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDlfcGNtX2FuYWxvZ19jYXB0dXJlID0geworCS5zdWJzdHJlYW1zID0gMiwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkubmlkID0gMHgxNCwgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCisJLm9wcyA9IHsKKwkJLnByZXBhcmUgPSB2aWFfY2FwdHVyZV9wY21fcHJlcGFyZSwKKwkJLmNsZWFudXAgPSB2aWFfY2FwdHVyZV9wY21fY2xlYW51cAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOV9wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLyogTklEIGlzIHNldCBpbiB2aWFfYnVpbGRfcGNtcyAqLworCS5vcHMgPSB7CisJCS5vcGVuID0gdmlhX2RpZ19wbGF5YmFja19wY21fb3BlbiwKKwkJLmNsb3NlID0gdmlhX2RpZ19wbGF5YmFja19wY21fY2xvc2UKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDlfcGNtX2RpZ2l0YWxfY2FwdHVyZSA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCit9OworCitzdGF0aWMgaW50IHZ0MTcwOV9hdXRvX2ZpbGxfZGFjX25pZHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQoreworCWludCBpOworCWhkYV9uaWRfdCBuaWQ7CisKKwlpZiAoY2ZnLT5saW5lX291dHMgPT0gNCkgIC8qIDEwIGNoYW5uZWxzICovCisJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gY2ZnLT5saW5lX291dHMrMTsgLyogQU9XMH5BT1c0ICovCisJZWxzZSBpZiAoY2ZnLT5saW5lX291dHMgPT0gMykgLyogNiBjaGFubmVscyAqLworCQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IGNmZy0+bGluZV9vdXRzOyAvKiBBT1cwfkFPVzIgKi8KKworCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gc3BlYy0+cHJpdmF0ZV9kYWNfbmlkczsKKworCWlmIChjZmctPmxpbmVfb3V0cyA9PSA0KSB7IC8qIDEwIGNoYW5uZWxzICovCisJCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7CisJCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07CisJCQlpZiAobmlkKSB7CisJCQkJLyogY29uZmlnIGRhYyBsaXN0ICovCisJCQkJc3dpdGNoIChpKSB7CisJCQkJY2FzZSBBVVRPX1NFUV9GUk9OVDoKKwkJCQkJLyogQU9XMCAqLworCQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVVUT19TRVFfQ0VOTEZFOgorCQkJCQkvKiBBT1cyICovCisJCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID0gMHgxMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVVRPX1NFUV9TVVJST1VORDoKKwkJCQkJLyogQU9XMyAqLworCQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4Mjc7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVVUT19TRVFfU0lERToKKwkJCQkJLyogQU9XMSAqLworCQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTE7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tjZmctPmxpbmVfb3V0c10gPSAweDI4OyAvKiBBT1c0ICovCisKKwl9IGVsc2UgaWYgKGNmZy0+bGluZV9vdXRzID09IDMpIHsgLyogNiBjaGFubmVscyAqLworCQlmb3IoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7CisJCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07CisJCQlpZiAobmlkKSB7CisJCQkJLyogY29uZmlnIGRhYyBsaXN0ICovCisJCQkJc3dpdGNoKGkpIHsKKwkJCQljYXNlIEFVVE9fU0VRX0ZST05UOgorCQkJCQkvKiBBT1cwICovCisJCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID0gMHgxMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVVRPX1NFUV9DRU5MRkU6CisJCQkJCS8qIEFPVzIgKi8KKwkJCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPSAweDEyOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFVVE9fU0VRX1NVUlJPVU5EOgorCQkJCQkvKiBBT1cxICovCisJCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID0gMHgxMTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmcm9tIHRoZSBwYXJzZWQgREFDIHRhYmxlICovCitzdGF0aWMgaW50IHZ0MTcwOV9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQoreworCWNoYXIgbmFtZVszMl07CisJc3RhdGljIGNvbnN0IGNoYXIgKmNobmFtZVs0XSA9IHsgIkZyb250IiwgIlN1cnJvdW5kIiwgIkMvTEZFIiwgIlNpZGUiIH07CisJaGRhX25pZF90IG5pZCA9IDA7CisJaW50IGksIGVycjsKKworCWZvciAoaSA9IDA7IGkgPD0gQVVUT19TRVFfU0lERTsgaSsrKSB7CisJCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKKworCQlpZiAoIW5pZCkJCisJCQljb250aW51ZTsKKworCQlpZiAoaSA9PSBBVVRPX1NFUV9DRU5MRkUpIHsKKwkJCS8qIENlbnRlci9MRkUgKi8KKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCisJCQkJCSAgICAgICJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAxLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKKwkJCQkJICAgICAgIkxGRSBQbGF5YmFjayBWb2x1bWUiLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MWIsIDIsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKKwkJCQkJICAgICAgIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MWIsIDEsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKKwkJCQkJICAgICAgIkxGRSBQbGF5YmFjayBTd2l0Y2giLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MWIsIDIsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0gZWxzZSBpZiAoaSA9PSBBVVRPX1NFUV9GUk9OVCl7CisJCQkvKiBhZGQgY29udHJvbCB0byBtaXhlciBpbmRleCAwICovCisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAorCQkJCQkgICAgICAiTWFzdGVyIEZyb250IFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxOCwgMywgMCwgSERBX0lOUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCisJCQkJCSAgICAgICJNYXN0ZXIgRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE4LCAzLCAwLCBIREFfSU5QVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQkKKwkJCS8qIGFkZCBjb250cm9sIHRvIFBXMyAqLworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfSBlbHNlIGlmIChpID09IEFVVE9fU0VRX1NVUlJPVU5EKSB7CisJCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDI5LCAzLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MjksIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0gZWxzZSBpZiAoaSA9PSBBVVRPX1NFUV9TSURFKSB7CisJCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFhLCAzLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MWEsIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2dDE3MDlfYXV0b19jcmVhdGVfaHBfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW4pCit7CisJaW50IGVycjsKKworCWlmICghcGluKQorCQlyZXR1cm4gMDsKKworCWlmIChzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9PSA1KSAvKiAxMCBjaGFubmVscyAqLworCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSBWVDE3MDlfSFBfREFDX05JRDsKKwllbHNlIGlmIChzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9PSAzKSAvKiA2IGNoYW5uZWxzICovCisJCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IDA7CisKKwllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAorCQkJICAgICAgIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLAorCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKKwkJCSAgICAgICJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwKKwkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLCBIREFfT1VUUFVUKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworLyogY3JlYXRlIHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIGlucHV0IHBpbnMgKi8KK3N0YXRpYyBpbnQgdnQxNzA5X2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywKKwkJCQkJCWNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKK3sKKwlzdGF0aWMgY2hhciAqbGFiZWxzW10gPSB7CisJCSJNaWMiLCAiRnJvbnQgTWljIiwgIkxpbmUiLCAiRnJvbnQgTGluZSIsICJDRCIsICJBdXgiLCBOVUxMCisJfTsKKwlzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCA9ICZzcGVjLT5wcml2YXRlX2ltdXg7CisJaW50IGksIGVyciwgaWR4ID0gMDsKKworCS8qIGZvciBpbnRlcm5hbCBsb29wYmFjayByZWNvcmRpbmcgc2VsZWN0ICovCisJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5sYWJlbCA9ICJTdGVyZW8gTWl4ZXIiOworCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10uaW5kZXggPSBpZHg7CisJaW11eC0+bnVtX2l0ZW1zKys7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVVUT19QSU5fTEFTVDsgaSsrKSB7CisJCWlmICghY2ZnLT5pbnB1dF9waW5zW2ldKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChjZmctPmlucHV0X3BpbnNbaV0pIHsKKwkJY2FzZSAweDFkOiAvKiBNaWMgKi8KKwkJCWlkeCA9IDI7CisJCQlicmVhazsKKwkJCQkKKwkJY2FzZSAweDFlOiAvKiBMaW5lIEluICovCisJCQlpZHggPSAzOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDIxOiAvKiBGcm9udCBNaWMgKi8KKwkJCWlkeCA9IDQ7CisJCQlicmVhazsKKworCQljYXNlIDB4MjM6IC8qIENEICovCisJCQlpZHggPSAxOworCQkJYnJlYWs7CisJCX0KKwkJZXJyID0gdmlhX25ld19hbmFsb2dfaW5wdXQoc3BlYywgY2ZnLT5pbnB1dF9waW5zW2ldLCBsYWJlbHNbaV0sCisJCQkJCSAgIGlkeCwgMHgxOCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5sYWJlbCA9IGxhYmVsc1tpXTsKKwkJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5pbmRleCA9IGlkeDsKKwkJaW11eC0+bnVtX2l0ZW1zKys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZ0MTcwOV9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZXJyOworCisJZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsIE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHZ0MTcwOV9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmICghc3BlYy0+YXV0b2NmZy5saW5lX291dHMgJiYgIXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSkKKwkJcmV0dXJuIDA7IC8qIGNhbid0IGZpbmQgdmFsaWQgQklPUyBwaW4gY29uZmlnICovCisKKwllcnIgPSB2dDE3MDlfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHZ0MTcwOV9hdXRvX2NyZWF0ZV9ocF9jdGxzKHNwZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gdnQxNzA5X2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzICogMjsKKworCWlmIChzcGVjLT5hdXRvY2ZnLmRpZ19vdXRfcGluKQorCQlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IFZUMTcwOV9ESUdPVVRfTklEOworCWlmIChzcGVjLT5hdXRvY2ZnLmRpZ19pbl9waW4pCisJCXNwZWMtPmRpZ19pbl9uaWQgPSBWVDE3MDlfRElHSU5fTklEOworCisJaWYgKHNwZWMtPmtjdGxfYWxsb2MpCisJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gc3BlYy0+a2N0bF9hbGxvYzsKKworCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXg7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXRjaF92dDE3MDlfMTBjaChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWM7CisJaW50IGVycjsKKworCS8qIGNyZWF0ZSBhIGNvZGVjIHNwZWNpZmljIHJlY29yZCAqLworCXNwZWMgPSBrY2FsbG9jKDEsIHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmIChzcGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJZXJyID0gdnQxNzA5X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkgeworCQl2aWFfZnJlZShjb2RlYyk7CisJCXJldHVybiBlcnI7CisJfSBlbHNlIGlmICghZXJyKSB7CisJCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uLiAgIgorCQkgICAgICAgIlVzaW5nIGdlbmVuaWMgbW9kZS4uLlxuIik7CisJfQorCisJc3BlYy0+aW5pdF92ZXJicyA9IHZ0MTcwOV8xMGNoX3ZvbHVtZV9pbml0X3ZlcmJzOwkKKworCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJWVDE3MDkgQW5hbG9nIjsKKwlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJnZ0MTcwOV8xMGNoX3BjbV9hbmFsb2dfcGxheWJhY2s7CisJc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlID0gJnZ0MTcwOV9wY21fYW5hbG9nX2NhcHR1cmU7CisKKwlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIlZUMTcwOSBEaWdpdGFsIjsKKwlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZ2dDE3MDlfcGNtX2RpZ2l0YWxfcGxheWJhY2s7CisJc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSA9ICZ2dDE3MDlfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKKworCQorCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7CisJCXNwZWMtPmFkY19uaWRzID0gdnQxNzA5X2FkY19uaWRzOworCQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKHZ0MTcwOV9hZGNfbmlkcyk7CisJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzXSA9IHZ0MTcwOV9jYXB0dXJlX21peGVyOworCQlzcGVjLT5udW1fbWl4ZXJzKys7CisJfQorCisJY29kZWMtPnBhdGNoX29wcyA9IHZpYV9wYXRjaF9vcHM7CisKKwljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSB2aWFfYXV0b19pbml0OworCisJcmV0dXJuIDA7Cit9CisvKgorICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycworICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIHZ0MTcwOV82Y2hfdm9sdW1lX2luaXRfdmVyYnNbXSA9IHsKKwkvKgorCSAqIFVubXV0ZSBBREMwLTIgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KKwkgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKworCisJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCisJICogbWl4ZXIgd2lkZ2V0CisJICovCisJLyogQW1wIEluZGljZXM6IEFPVzA9MCwgQ0QgPSAxLCBNaWMxID0gMiwgTGluZSA9IDMsIE1pYzIgPSA0ICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDQpfSwKKworCS8qCisJICogU2V0IHVwIG91dHB1dCBzZWxlY3RvciAoMHgxYSwgMHgxYiwgMHgyOSkKKwkgKi8KKwkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDI5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCisJLyoKKwkgKiAgVW5tdXRlIFBXMyBhbmQgUFc0CisJICovCisJezB4MWYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MjAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisKKwkvKiBTZXQgaW5wdXQgb2YgUFc0IGFzIE1XMCAqLworCXsweDIwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCisJLyogU2V0IG1pYyBhcyBkZWZhdWx0IGlucHV0IG9mIHN3MCAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgyfSwKKwkvKiBQVzkgT3V0cHV0IGVuYWJsZSAqLworCXsweDI0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorCXsgfQorfTsKKworc3RhdGljIGludCBwYXRjaF92dDE3MDlfNmNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYzsKKwlpbnQgZXJyOworCisJLyogY3JlYXRlIGEgY29kZWMgc3BlY2lmaWMgcmVjb3JkICovCisJc3BlYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNwZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb2RlYy0+c3BlYyA9IHNwZWM7CisKKwllcnIgPSB2dDE3MDlfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOworCWlmIChlcnIgPCAwKSB7CisJCXZpYV9mcmVlKGNvZGVjKTsKKwkJcmV0dXJuIGVycjsKKwl9IGVsc2UgaWYgKCFlcnIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24uICAiCisJCSAgICAgICAiVXNpbmcgZ2VuZW5pYyBtb2RlLi4uXG4iKTsKKwl9CisKKwlzcGVjLT5pbml0X3ZlcmJzID0gdnQxNzA5XzZjaF92b2x1bWVfaW5pdF92ZXJiczsJCisKKwlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQxNzA5IEFuYWxvZyI7CisJc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZ2dDE3MDlfNmNoX3BjbV9hbmFsb2dfcGxheWJhY2s7CisJc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlID0gJnZ0MTcwOV9wY21fYW5hbG9nX2NhcHR1cmU7CisKKwlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIlZUMTcwOSBEaWdpdGFsIjsKKwlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZ2dDE3MDlfcGNtX2RpZ2l0YWxfcGxheWJhY2s7CisJc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSA9ICZ2dDE3MDlfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKKworCQorCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7CisJCXNwZWMtPmFkY19uaWRzID0gdnQxNzA5X2FkY19uaWRzOworCQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKHZ0MTcwOV9hZGNfbmlkcyk7CisJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzXSA9IHZ0MTcwOV9jYXB0dXJlX21peGVyOworCQlzcGVjLT5udW1fbWl4ZXJzKys7CisJfQorCisJY29kZWMtPnBhdGNoX29wcyA9IHZpYV9wYXRjaF9vcHM7CisKKwljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSB2aWFfYXV0b19pbml0OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwYXRjaCBlbnRyaWVzCisgKi8KK3N0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X3ZpYVtdID0geworCXsgLmlkID0gMHgxMTA2MTcwOCwgLm5hbWUgPSAiVklBIFZUMTcwOCIsIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOH0sCisJeyAuaWQgPSAweDExMDYxNzA5LCAubmFtZSA9ICJWSUEgVlQxNzA4IiwgLnBhdGNoID0gcGF0Y2hfdnQxNzA4fSwKKwl7IC5pZCA9IDB4MTEwNjE3MEEsIC5uYW1lID0gIlZJQSBWVDE3MDgiLCAucGF0Y2ggPSBwYXRjaF92dDE3MDh9LAorCXsgLmlkID0gMHgxMTA2MTcwQiwgLm5hbWUgPSAiVklBIFZUMTcwOCIsIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOH0sCisJeyAuaWQgPSAweDExMDZFNzEwLCAubmFtZSA9ICJWSUEgVlQxNzA5IDEwLUNoIiwgLnBhdGNoID0gcGF0Y2hfdnQxNzA5XzEwY2h9LAorCXsgLmlkID0gMHgxMTA2RTcxMSwgLm5hbWUgPSAiVklBIFZUMTcwOSAxMC1DaCIsIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOV8xMGNofSwKKwl7IC5pZCA9IDB4MTEwNkU3MTIsIC5uYW1lID0gIlZJQSBWVDE3MDkgMTAtQ2giLCAucGF0Y2ggPSBwYXRjaF92dDE3MDlfMTBjaH0sCisJeyAuaWQgPSAweDExMDZFNzEzLCAubmFtZSA9ICJWSUEgVlQxNzA5IDEwLUNoIiwgLnBhdGNoID0gcGF0Y2hfdnQxNzA5XzEwY2h9LAorCXsgLmlkID0gMHgxMTA2RTcxNCwgLm5hbWUgPSAiVklBIFZUMTcwOSA2LUNoIiwgLnBhdGNoID0gcGF0Y2hfdnQxNzA5XzZjaH0sCisJeyAuaWQgPSAweDExMDZFNzE1LCAubmFtZSA9ICJWSUEgVlQxNzA5IDYtQ2giLCAucGF0Y2ggPSBwYXRjaF92dDE3MDlfNmNofSwKKwl7IC5pZCA9IDB4MTEwNkU3MTYsIC5uYW1lID0gIlZJQSBWVDE3MDkgNi1DaCIsIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOV82Y2h9LAorCXsgLmlkID0gMHgxMTA2RTcxNywgLm5hbWUgPSAiVklBIFZUMTcwOSA2LUNoIiwgLnBhdGNoID0gcGF0Y2hfdnQxNzA5XzZjaH0sCisJe30gLyogdGVybWluYXRvciAqLworfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL01ha2VmaWxlIGIvc291bmQvcGNpL2ljZTE3MTIvTWFrZWZpbGUKaW5kZXggNzgzN2NlZi4uNmVmZGQ2MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvTWFrZWZpbGUKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvTWFrZWZpbGUKQEAgLTUsNyArNSw3IEBACiAKIHNuZC1pY2UxN3h4LWFrNHh4eC1vYmpzIDo9IGFrNHh4eC5vCiBzbmQtaWNlMTcxMi1vYmpzIDo9IGljZTE3MTIubyBkZWx0YS5vIGhvb250ZWNoLm8gZXdzLm8KLXNuZC1pY2UxNzI0LW9ianMgOj0gaWNlMTcyNC5vIGFtcC5vIHJldm8ubyBhdXJlb24ubyB2dDE3MjBfbW9iby5vIHBvbnRpcy5vIHByb2RpZ3kxOTIubyBqdWxpLm8gcGhhc2Uubworc25kLWljZTE3MjQtb2JqcyA6PSBpY2UxNzI0Lm8gYW1wLm8gcmV2by5vIGF1cmVvbi5vIHZ0MTcyMF9tb2JvLm8gcG9udGlzLm8gcHJvZGlneTE5Mi5vIGp1bGkubyBwaGFzZS5vIHd0bS5vCiAKICMgVG9wbGV2ZWwgTW9kdWxlIERlcGVuZGVuY3kKIG9iai0kKENPTkZJR19TTkRfSUNFMTcxMikgKz0gc25kLWljZTE3MTIubyBzbmQtaWNlMTd4eC1hazR4eHgubwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvYW1wLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9hbXAuYwppbmRleCA1OWM0MDc4Li42ZTIyZDMyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9hbXAuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9hbXAuYwpAQCAtNDIsNyArNDIsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdnQxNzI0X2FtcF9pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB3bV9pbml0c1tdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB3bV9pbml0c1tdID0gewogCQlXTV9BVFRFTl9MLAkweDAwMDAsCS8qIDAgZGIgKi8KIAkJV01fQVRURU5fUiwJMHgwMDAwLAkvKiAwIGRiICovCiAJCVdNX0RBQ19DVFJMLAkweDAwMDgsCS8qIDI0Yml0IEkyUyAqLwpAQCAtNzUsNyArNzUsNyBAQAogCiAKIC8qIGVudHJ5IHBvaW50ICovCi1zdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfYW1wX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK2NvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9hbXBfY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfQVY3MTAsCiAJCS5uYW1lID0gIkNoYWludGVjaCBBVi03MTAiLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvYW1wLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9hbXAuaAppbmRleCBhMGZjODliLi43YjY2N2JhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9hbXAuaAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9hbXAuaApAQCAtNDIsNyArNDIsNyBAQAogI2RlZmluZSBXTV9EQUNfQ1RSTAkweDAyCiAjZGVmaW5lIFdNX0lOVF9DVFJMCTB4MDMKIAotZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjRfYW1wX2NhcmRzW107CitleHRlcm4gY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyNF9hbXBfY2FyZHNbXTsKIAogCiAjZW5kaWYgLyogX19TT1VORF9BTVBfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uYwppbmRleCA5ZTc2Y2ViLi42OTQxZDg1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uYwpAQCAtMjk0LDcgKzI5NCw3IEBACiBzdGF0aWMgaW50IGF1cmVvbl9hYzk3X2luaXQgKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCWludCBpOwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBhYzk3X2RlZmF1bHRzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGFjOTdfZGVmYXVsdHNbXSA9IHsKIAkJMHgwMCwgMHg5NjQwLAogCQkweDAyLCAweDgwMDAsCiAJCTB4MDQsIDB4ODAwMCwKQEAgLTQ3NCw3ICs0NzQsOCBAQAogCiAJdG1wID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSk7CiAKLQlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yID09IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxTFQpIHsKKwlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yID09IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxTFQgfHwKKwkgICAgaWNlLT5lZXByb20uc3VidmVuZG9yID09IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxWFQpIHsKIAkJc25kX2ljZTE3MTJfZ3Bpb19zZXRfbWFzayhpY2UsIH4oUFJPRElHWV9TUElfTU9TSXxQUk9ESUdZX1NQSV9DTEt8UFJPRElHWV9XTV9DUykpOwogCQltb3NpID0gUFJPRElHWV9TUElfTU9TSTsKIAkJY2xrID0gUFJPRElHWV9TUElfQ0xLOwpAQCAtNjAxLDcgKzYwMiw5IEBACiBzdGF0aWMgdm9pZCB3bV9wdXRfbm9jYWNoZShzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgaW50IHJlZywgdW5zaWduZWQgc2hvcnQgdmFsKQogewogCWF1cmVvbl9zcGlfd3JpdGUoaWNlLAotCQkJKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUID8gUFJPRElHWV9XTV9DUyA6IEFVUkVPTl9XTV9DUyksCisJCQkgKChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCB8fAorCQkJICAgaWNlLT5lZXByb20uc3VidmVuZG9yID09IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxWFQpID8KKwkJCSBQUk9ESUdZX1dNX0NTIDogQVVSRU9OX1dNX0NTKSwKIAkJCShyZWcgPDwgOSkgfCAodmFsICYgMHgxZmYpLCAxNik7CiB9CiAKQEAgLTY2MSwxNyArNjY0LDE3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3dtX2RhYywgLTEyNzAwLCAxMDAsIDEpOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3dtX3BjbSwgLTY0MDAsIDUwLCAxKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV93bV9hZGMsIC0xMjAwLCAxMDAsIDApOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2FjOTdfbWFzdGVyLCAtNDY1MCwgMTUwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9hYzk3X2dhaW4sIC0zNDUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3dtX2RhYywgLTEyNzAwLCAxMDAsIDEpOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3dtX3BjbSwgLTY0MDAsIDUwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV93bV9hZGMsIC0xMjAwLCAxMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2FjOTdfbWFzdGVyLCAtNDY1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9hYzk3X2dhaW4sIC0zNDUwLCAxNTAsIDApOwogCiAvKgogICogTG9nYXJpdGhtaWMgdm9sdW1lIHZhbHVlcyBmb3IgV004NzcwCiAgKiBDb21wdXRlZCBhcyAyMCAqIExvZzEwKDI1NSAvIHgpCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHdtX3ZvbFsyNTZdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgd21fdm9sWzI1Nl0gPSB7CiAJMTI3LCA0OCwgNDIsIDM5LCAzNiwgMzQsIDMzLCAzMSwgMzAsIDI5LCAyOCwgMjcsIDI3LCAyNiwgMjUsIDI1LCAyNCwgMjQsIDIzLAogCTIzLCAyMiwgMjIsIDIxLCAyMSwgMjEsIDIwLCAyMCwgMjAsIDE5LCAxOSwgMTksIDE4LCAxOCwgMTgsIDE4LCAxNywgMTcsIDE3LAogCTE3LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLApAQCAtMTA2NCwxNCArMTA2NywxNCBAQAogICovCiBzdGF0aWMgaW50IHdtX2FkY19tdXhfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKLQlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRzW10gPSB7CiAJCSJDRCIsCQkvL0FJTjEKIAkJIkF1eCIsCQkvL0FJTjIKIAkJIkxpbmUiLAkJLy9BSU4zCiAJCSJNaWMiLAkJLy9BSU40CiAJCSJBQzk3IgkJLy9BSU41CiAJfTsKLQlzdGF0aWMgY2hhciAqdW5pdmVyc2VfdGV4dHNbXSA9IHsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVuaXZlcnNlX3RleHRzW10gPSB7CiAJCSJBdXgxIiwJCS8vQUlOMQogCQkiQ0QiLAkJLy9BSU4yCiAJCSJQaG9ubyIsCS8vQUlOMwpAQCAtMTEzNywxMSArMTE0MCwxMSBAQAogc3RhdGljIGludCBhdXJlb25fY3M4NDE1X211eF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0YXRpYyBjaGFyICphdXJlb25fdGV4dHNbXSA9IHsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF1cmVvbl90ZXh0c1tdID0gewogCQkiQ0QiLAkJLy9SWFAwCiAJCSJPcHRpY2FsIgkvL1JYUDEKIAl9OwotCXN0YXRpYyBjaGFyICpwcm9kaWd5X3RleHRzW10gPSB7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcm9kaWd5X3RleHRzW10gPSB7CiAJCSJDRCIsCiAJCSJDb2F4IgogCX07CkBAIC0xMjg4LDEyICsxMjkxLDE0IEBACiAKIAl0bXAyID0gdG1wID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSk7CiAJaWYgKGVuYWJsZSkKLQkJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUKQorCQlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yICE9IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxTFQgJiYKKwkJICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MVhUKQogCQkJdG1wIHw9IEFVUkVPTl9IUF9TRUw7CiAJCWVsc2UKIAkJCXRtcCB8PSBQUk9ESUdZX0hQX1NFTDsKIAllbHNlCi0JCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCkKKwkJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUICYmCisJCSAgICBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFYVCkKIAkJCXRtcCAmPSB+IEFVUkVPTl9IUF9TRUw7CiAJCWVsc2UKIAkJCXRtcCAmPSB+IFBST0RJR1lfSFBfU0VMOwpAQCAtMTM2Myw3ICsxMzY4LDcgQEAKICAqLwogc3RhdGljIGludCBhdXJlb25fb3ZlcnNhbXBsaW5nX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqaywgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKLQlzdGF0aWMgY2hhciAqdGV4dHNbMl0gPSB7ICIxMjh4IiwgIjY0eCIJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRzWzJdID0geyAiMTI4eCIsICI2NHgiCX07CiAKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKIAl1aW5mby0+Y291bnQgPSAxOwpAQCAtMTQwNiw3ICsxNDExLDcgQEAKICAqIG1peGVycwogICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhdXJlb25fZGFjX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhdXJlb25fZGFjX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKQEAgLTE1MjEsNyArMTUyNiw3IEBACiAJfQogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAgCXsKICAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkubmFtZSA9ICJQQ00gUGxheWJhY2sgU3dpdGNoIiwKQEAgLTE1ODcsNyArMTU5Miw3IEBACiAJfQogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFjOTdfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFjOTdfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogIAl7CiAgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiQUM5NyBQbGF5YmFjayBTd2l0Y2giLApAQCAtMTY5Miw3ICsxNjk3LDcgQEAKICAJfQogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHVuaXZlcnNlX2FjOTdfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHVuaXZlcnNlX2FjOTdfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogIAl7CiAgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiQUM5NyBQbGF5YmFjayBTd2l0Y2giLApAQCAtMTgyNCw4ICsxODI5LDcgQEAKIAogfTsKIAotCQotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNzODQxNV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3M4NDE1X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixDQVBUVVJFLFNXSVRDSCksCkBAIC0xODcwLDcgKzE4NzQsNiBAQAogCX0KIH07CiAKLSAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGF1cmVvbl9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9pY2UxNzEyICppY2UpCiB7CiAJdW5zaWduZWQgaW50IGksIGNvdW50czsKQEAgLTE4OTgsNyArMTkwMSw4IEBACiAJCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KLQllbHNlIGlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCkgeworCWVsc2UgaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUICYmCisJCSBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFYVCkgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhYzk3X2NvbnRyb2xzKTsgaSsrKSB7CiAJCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmYWM5N19jb250cm9sc1tpXSwgaWNlKSk7CiAJCQlpZiAoZXJyIDwgMCkKQEAgLTE5MDYsNyArMTkxMCw4IEBACiAJCX0KIAl9CiAKLQlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yICE9IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxTFQpIHsKKwlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yICE9IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxTFQgJiYKKwkgICAgaWNlLT5lZXByb20uc3VidmVuZG9yICE9IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxWFQpIHsKIAkJdW5zaWduZWQgY2hhciBpZDsKIAkJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOwogCQlpZCA9IGF1cmVvbl9jczg0MTVfZ2V0KGljZSwgQ1M4NDE1X0lEKTsKQEAgLTE5MzYsNyArMTk0MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IGF1cmVvbl9pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB3bV9pbml0c19hdXJlb25bXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgd21faW5pdHNfYXVyZW9uW10gPSB7CiAJCS8qIFRoZXNlIGNvbWUgZmlyc3QgdG8gcmVkdWNlIGluaXQgcG9wIG5vaXNlICovCiAJCTB4MWIsIDB4MDQ0LAkJLyogQURDIE11eCAoQUMnOTcgc291cmNlKSAqLwogCQkweDFjLCAweDAwQiwJCS8qIE91dCBNdXgxIChWT1VUMSA9IERBQytBVVgsIFZPVVQyID0gREFDKSAqLwpAQCAtMTk3Miw3ICsxOTc3LDcgQEAKIAkJMHgxYSwgMHgwMDAsCQkvKiAtMTJkQiBBREMvUiAqLwogCQkodW5zaWduZWQgc2hvcnQpLTEKIAl9OwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB3bV9pbml0c19wcm9kaWd5W10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdtX2luaXRzX3Byb2RpZ3lbXSA9IHsKIAogCQkvKiBUaGVzZSBjb21lIGZpcnN0IHRvIHJlZHVjZSBpbml0IHBvcCBub2lzZSAqLwogCQkweDFiLCAweDAwMCwJCS8qIEFEQyBNdXggKi8KQEAgLTIwMTQsNyArMjAxOSw3IEBACiAJCSh1bnNpZ25lZCBzaG9ydCktMQogCiAJfTsKLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQgY3NfaW5pdHNbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgY3NfaW5pdHNbXSA9IHsKIAkJMHgwNDQxLCAvKiBSVU4gKi8KIAkJMHgwMTgwLCAvKiBubyBtdXRlLCBPTUNLIG91dHB1dCBvbiBSTUNLIHBpbiAqLwogCQkweDAyMDEsIC8qIFMvUERJRiBzb3VyY2Ugb24gUlhQMSAqLwpAQCAtMjAyMiw3ICsyMDI3LDcgQEAKIAkJKHVuc2lnbmVkIHNob3J0KS0xCiAJfTsKIAl1bnNpZ25lZCBpbnQgdG1wOwotCXVuc2lnbmVkIHNob3J0ICpwOworCWNvbnN0IHVuc2lnbmVkIHNob3J0ICpwOwogCWludCBlcnIsIGk7CiAKIAlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yID09IFZUMTcyNF9TVUJERVZJQ0VfQVVSRU9ONTFfU0tZKSB7CkBAIC0yMDYyLDcgKzIwNjcsOCBAQAogCiAJLyogaW5pdGlhbGl6ZSBXTTg3NzAgY29kZWMgKi8KIAlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yID09IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxIHx8Ci0JCWljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUKQorCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCB8fAorCSAgICAgICAgaWNlLT5lZXByb20uc3VidmVuZG9yID09IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxWFQpCiAJCXAgPSB3bV9pbml0c19wcm9kaWd5OwogCWVsc2UKIAkJcCA9IHdtX2luaXRzX2F1cmVvbjsKQEAgLTIwNzAsNyArMjA3Niw4IEBACiAJCXdtX3B1dChpY2UsIHBbMF0sIHBbMV0pOwogCiAJLyogaW5pdGlhbGl6ZSBDUzg0MTVBIGNvZGVjICovCi0JaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUKSB7CisJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUICYmCisJICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MVhUKSB7CiAJCWZvciAocCA9IGNzX2luaXRzOyAqcCAhPSAodW5zaWduZWQgc2hvcnQpLTE7IHArKykKIAkJCWF1cmVvbl9zcGlfd3JpdGUoaWNlLCBBVVJFT05fQ1M4NDE1X0NTLCAqcCB8IDB4MjAwMDAwLCAyNCk7CiAJCWljZS0+c3BlYy5hdXJlb24uY3M4NDE1X211eCA9IDE7CkBAIC0yMTAwLDczICsyMTA3LDU4IEBACiAgKiBoZW5jZSB0aGUgZHJpdmVyIG5lZWRzIHRvIHNldHMgdXAgaXQgcHJvcGVybHkuCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXVyZW9uNTFfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKLQkweDBhLAkvKiBTWVNDT05GOiBjbG9jayA1MTIsIHNwZGlmLWluL0FEQywgM0RBQ3MgKi8KLQkweDgwLAkvKiBBQ0xJTks6IEkyUyAqLwotCTB4ZmMsCS8qIEkyUzogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCi0JMHhjMywJLyogU1BESUY6IG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KLQkweGZmLAkvKiBHUElPX0RJUiAqLwotCTB4ZmYsCS8qIEdQSU9fRElSMSAqLwotCTB4NWYsCS8qIEdQSU9fRElSMiAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSyAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSzEgKi8KLQkweDAwLAkvKiBHUElPX01BU0syICovCi0JMHgwMCwJLyogR1BJT19TVEFURSAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUxICovCi0JMHgwMCwJLyogR1BJT19TVEFURTIgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGF1cmVvbjUxX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJW0lDRV9FRVAyX1NZU0NPTkZdICAgICA9IDB4MGEsCS8qIGNsb2NrIDUxMiwgc3BkaWYtaW4vQURDLCAzREFDcyAqLworCVtJQ0VfRUVQMl9BQ0xJTktdICAgICAgPSAweDgwLAkvKiBJMlMgKi8KKwlbSUNFX0VFUDJfSTJTXSAgICAgICAgID0gMHhmYywJLyogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCisJW0lDRV9FRVAyX1NQRElGXSAgICAgICA9IDB4YzMsCS8qIG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KKwlbSUNFX0VFUDJfR1BJT19ESVJdICAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIxXSAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIyXSAgID0gMHg1ZiwKKwlbSUNFX0VFUDJfR1BJT19NQVNLXSAgID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMV0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMl0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURV0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTFdID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTJdID0gMHgwMCwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGF1cmVvbjcxX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JMHgwYiwJLyogU1lTQ09ORjogY2xvY2sgNTEyLCBzcGRpZi1pbi9BREMsIDREQUNzICovCi0JMHg4MCwJLyogQUNMSU5LOiBJMlMgKi8KLQkweGZjLAkvKiBJMlM6IHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLwotCTB4YzMsCS8qIFNQRElGOiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCi0JMHhmZiwJLyogR1BJT19ESVIgKi8KLQkweGZmLAkvKiBHUElPX0RJUjEgKi8KLQkweDVmLAkvKiBHUElPX0RJUjIgKi8KLQkweDAwLAkvKiBHUElPX01BU0sgKi8KLQkweDAwLAkvKiBHUElPX01BU0sxICovCi0JMHgwMCwJLyogR1BJT19NQVNLMiAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMSAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUyICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhdXJlb243MV9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDBiLAkvKiBjbG9jayA1MTIsIHNwZGlmLWluL0FEQywgNERBQ3MgKi8KKwlbSUNFX0VFUDJfQUNMSU5LXSAgICAgID0gMHg4MCwJLyogSTJTICovCisJW0lDRV9FRVAyX0kyU10gICAgICAgICA9IDB4ZmMsCS8qIHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLworCVtJQ0VfRUVQMl9TUERJRl0gICAgICAgPSAweGMzLAkvKiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCisJW0lDRV9FRVAyX0dQSU9fRElSXSAgICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fRElSMV0gICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fRElSMl0gICA9IDB4NWYsCisJW0lDRV9FRVAyX0dQSU9fTUFTS10gICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzFdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzJdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEVdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUxXSA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUyXSA9IDB4MDAsCiB9OworI2RlZmluZSBwcm9kaWd5NzFfZWVwcm9tIGF1cmVvbjcxX2VlcHJvbQogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwcm9kaWd5NzFfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKLQkweDBiLAkvKiBTWVNDT05GOiBjbG9jayA1MTIsIHNwZGlmLWluL0FEQywgNERBQ3MgKi8KLQkweDgwLAkvKiBBQ0xJTks6IEkyUyAqLwotCTB4ZmMsCS8qIEkyUzogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCi0JMHhjMywJLyogU1BESUY6IG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KLQkweGZmLAkvKiBHUElPX0RJUiAqLwotCTB4ZmYsCS8qIEdQSU9fRElSMSAqLwotCTB4NWYsCS8qIEdQSU9fRElSMiAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSyAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSzEgKi8KLQkweDAwLAkvKiBHUElPX01BU0syICovCi0JMHgwMCwJLyogR1BJT19TVEFURSAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUxICovCi0JMHgwMCwJLyogR1BJT19TVEFURTIgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHByb2RpZ3k3MWx0X2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJW0lDRV9FRVAyX1NZU0NPTkZdICAgICA9IDB4NGIsCS8qIGNsb2NrIDM4NCwgc3BkaWYtaW4vQURDLCA0REFDcyAqLworCVtJQ0VfRUVQMl9BQ0xJTktdICAgICAgPSAweDgwLAkvKiBJMlMgKi8KKwlbSUNFX0VFUDJfSTJTXSAgICAgICAgID0gMHhmYywJLyogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCisJW0lDRV9FRVAyX1NQRElGXSAgICAgICA9IDB4YzMsCS8qIG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KKwlbSUNFX0VFUDJfR1BJT19ESVJdICAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIxXSAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIyXSAgID0gMHg1ZiwKKwlbSUNFX0VFUDJfR1BJT19NQVNLXSAgID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMV0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMl0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURV0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTFdID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTJdID0gMHgwMCwKIH07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHByb2RpZ3k3MWx0X2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JMHg0YiwJLyogU1lTQ0lORjogY2xvY2sgNTEyLCBzcGRpZi1pbi9BREMsIDREQUNzICovCi0JMHg4MCwJLyogQUNMSU5LOiBJMlMgKi8KLQkweGZjLAkvKiBJMlM6IHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLwotCTB4YzMsCS8qIFNQRElGOiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCi0JMHhmZiwJLyogR1BJT19ESVIgKi8KLQkweGZmLAkvKiBHUElPX0RJUjEgKi8KLQkweDVmLAkvKiBHUElPX0RJUjIgKi8KLQkweDAwLAkvKiBHUElPX01BU0sgKi8KLQkweDAwLAkvKiBHUElPX01BU0sxICovCi0JMHgwMCwJLyogR1BJT19NQVNLMiAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMSAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUyICovCi19OwotCQorI2RlZmluZSBwcm9kaWd5NzF4dF9lZXByb20gcHJvZGlneTcxbHRfZWVwcm9tCiAKIC8qIGVudHJ5IHBvaW50ICovCi1zdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfYXVyZW9uX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK2NvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9hdXJlb25fY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfQVVSRU9ONTFfU0tZLAogCQkubmFtZSA9ICJUZXJyYXRlYyBBdXJlb24gNS4xLVNreSIsCkBAIC0yMjE3LDUgKzIyMDksMTUgQEAKIAkJLmVlcHJvbV9kYXRhID0gcHJvZGlneTcxbHRfZWVwcm9tLAogCQkuZHJpdmVyID0gIlByb2RpZ3k3MUxUIiwKIAl9LAorCXsKKwkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxWFQsCisJCS5uYW1lID0gIkF1ZGlvdHJhayBQcm9kaWd5IDcuMSBYVCIsCisJCS5tb2RlbCA9ICJwcm9kaWd5NzF4dCIsCisJCS5jaGlwX2luaXQgPSBhdXJlb25faW5pdCwKKwkJLmJ1aWxkX2NvbnRyb2xzID0gYXVyZW9uX2FkZF9jb250cm9scywKKwkJLmVlcHJvbV9zaXplID0gc2l6ZW9mKHByb2RpZ3k3MXh0X2VlcHJvbSksCisJCS5lZXByb21fZGF0YSA9IHByb2RpZ3k3MXh0X2VlcHJvbSwKKwkJLmRyaXZlciA9ICJQcm9kaWd5NzFMVCIsCisJfSwKIAl7IH0gLyogdGVybWluYXRvciAqLwogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5oIGIvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmgKaW5kZXggM2I3YmVhNi4uNzllNThlOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmgKQEAgLTI4LDE1ICsyOCwxNyBAQAogCQkJCSAgICAgICAie1RlcnJhdGVjLEF1cmVvbiA3LjEgU3BhY2V9LCJcCiAJCQkJICAgICAgICJ7VGVycmF0ZWMsQXVyZW9uIDcuMSBVbml2ZXJzZX0sIiBcCiAJCQkJCSJ7QXVkaW9UcmFrLFByb2RpZ3kgNy4xfSwiIFwKLQkJCQkJIntBdWRpb1RyYWssUHJvZGlneSA3LjEgTFR9LCIKKwkJCQkJIntBdWRpb1RyYWssUHJvZGlneSA3LjEgTFR9LCJcCisJCQkJCSJ7QXVkaW9UcmFrLFByb2RpZ3kgNy4xIFhUfSwiCiAKICNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9BVVJFT041MV9TS1kJMHgzYjE1NDcxMQkvKiBBdXJlb24gNS4xIFNreSAqLwogI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX0FVUkVPTjcxX1NQQUNFCTB4M2IxNTQ1MTEJLyogQXVyZW9uIDcuMSBTcGFjZSAqLwogI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX0FVUkVPTjcxX1VOSVZFUlNFCTB4M2IxNTUzMTEJLyogQXVyZW9uIDcuMSBVbml2ZXJzZSAqLwogI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MQkweDMzNDk1MzQ1CS8qIFBST0RJR1kgNy4xICovCiAjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxTFQJMHgzMjMxNTQ0MQkvKiBQUk9ESUdZIDcuMSBMVCAqLworI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MVhUCTB4MzYzMTU0NDEJLyogUFJPRElHWSA3LjEgWFQqLwogCi1leHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyNF9hdXJlb25fY2FyZHNbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICBzbmRfdnQxNzI0X2F1cmVvbl9jYXJkc1tdOwogCiAvKiBHUElPIGJpdHMgKi8KICNkZWZpbmUgQVVSRU9OX0NTODQxNV9DUwkoMSA8PCAyMikKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5jCmluZGV4IGFmNjU5ODAuLjNlZWIzNmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuYwpAQCAtNDE2LDcgKzQxNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9kZWx0YTEwMTBsdF93b3JkY2xvY2tfc3RhdHVzIF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2RlbHRhMTAxMGx0X3dvcmRjbG9ja19zdGF0dXMgX19kZXZpbml0ZGF0YSA9CiB7CiAJLmFjY2VzcyA9CShTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCksCiAJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCkBAIC00MjksNyArNDI5LDcgQEAKICAqIGluaXRpYWxpemUgdGhlIGNoaXBzIG9uIE0tQXVkaW8gY2FyZHMKICAqLwogCi1zdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9hdWRpb3BoaWxlIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV9hdWRpb3BoaWxlIF9fZGV2aW5pdGRhdGEgPSB7CiAJLnR5cGUgPSBTTkRfQUs0NTI4LAogCS5udW1fYWRjcyA9IDIsCiAJLm51bV9kYWNzID0gMiwKQEAgLTQzOCw3ICs0MzgsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9hdWRpb3BoaWxlX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9hdWRpb3BoaWxlX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKIAkuY2FkZHIgPSAyLAogCS5jaWYgPSAwLAogCS5kYXRhX21hc2sgPSBJQ0UxNzEyX0RFTFRBX0FQX0RPVVQsCkBAIC00NTAsNyArNDUwLDcgQEAKIAkubWFza19mbGFncyA9IDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9kZWx0YTQxMCBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fZGVsdGE0MTAgX19kZXZpbml0ZGF0YSA9IHsKIAkudHlwZSA9IFNORF9BSzQ1MjksCiAJLm51bV9hZGNzID0gMiwKIAkubnVtX2RhY3MgPSA4LApAQCAtNDU5LDcgKzQ1OSw3IEBACiAJfQogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2RlbHRhNDEwX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9kZWx0YTQxMF9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMCwKIAkuY2lmID0gMCwKIAkuZGF0YV9tYXNrID0gSUNFMTcxMl9ERUxUQV9BUF9ET1VULApAQCAtNDcxLDcgKzQ3MSw3IEBACiAJLm1hc2tfZmxhZ3MgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fZGVsdGExMDEwbHQgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2RlbHRhMTAxMGx0IF9fZGV2aW5pdGRhdGEgPSB7CiAJLnR5cGUgPSBTTkRfQUs0NTI0LAogCS5udW1fYWRjcyA9IDgsCiAJLm51bV9kYWNzID0gOCwKQEAgLTQ4MSw3ICs0ODEsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9kZWx0YTEwMTBsdF9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fZGVsdGExMDEwbHRfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDIsCiAJLmNpZiA9IDAsIC8qIHRoZSBkZWZhdWx0IGxldmVsIG9mIHRoZSBDSUYgcGluIGZyb20gQUs0NTI0ICovCiAJLmRhdGFfbWFzayA9IElDRTE3MTJfREVMVEFfMTAxMExUX0RPVVQsCkBAIC00OTMsNyArNDkzLDcgQEAKIAkubWFza19mbGFncyA9IDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9kZWx0YTQ0IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV9kZWx0YTQ0IF9fZGV2aW5pdGRhdGEgPSB7CiAJLnR5cGUgPSBTTkRfQUs0NTI0LAogCS5udW1fYWRjcyA9IDQsCiAJLm51bV9kYWNzID0gNCwKQEAgLTUwMyw3ICs1MDMsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9kZWx0YTQ0X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9kZWx0YTQ0X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKIAkuY2FkZHIgPSAyLAogCS5jaWYgPSAwLCAvKiB0aGUgZGVmYXVsdCBsZXZlbCBvZiB0aGUgQ0lGIHBpbiBmcm9tIEFLNDUyNCAqLwogCS5kYXRhX21hc2sgPSBJQ0UxNzEyX0RFTFRBX0NPREVDX1NFUklBTF9EQVRBLApAQCAtNTE1LDcgKzUxNSw3IEBACiAJLm1hc2tfZmxhZ3MgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fdng0NDIgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3Z4NDQyIF9fZGV2aW5pdGRhdGEgPSB7CiAJLnR5cGUgPSBTTkRfQUs0NTI0LAogCS5udW1fYWRjcyA9IDQsCiAJLm51bV9kYWNzID0gNCwKQEAgLTUyNSw3ICs1MjUsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV92eDQ0Ml9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fdng0NDJfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDIsCiAJLmNpZiA9IDAsCiAJLmRhdGFfbWFzayA9IElDRTE3MTJfVlg0NDJfRE9VVCwKQEAgLTY1MCwxNSArNjUwLDE1IEBACiAgKiBhZGRpdGlvbmFsIGNvbnRyb2xzIGZvciBNLUF1ZGlvIGNhcmRzCiAgKi8KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2RlbHRhMTAxMF93b3JkY2xvY2tfc2VsZWN0IF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2RlbHRhMTAxMF93b3JkY2xvY2tfc2VsZWN0IF9fZGV2aW5pdGRhdGEgPQogSUNFMTcxMl9HUElPKFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAiV29yZCBDbG9jayBTeW5jIiwgMCwgSUNFMTcxMl9ERUxUQV9XT1JEX0NMT0NLX1NFTEVDVCwgMSwgMCk7Ci1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZGVsdGExMDEwbHRfd29yZGNsb2NrX3NlbGVjdCBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9kZWx0YTEwMTBsdF93b3JkY2xvY2tfc2VsZWN0IF9fZGV2aW5pdGRhdGEgPQogSUNFMTcxMl9HUElPKFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAiV29yZCBDbG9jayBTeW5jIiwgMCwgSUNFMTcxMl9ERUxUQV8xMDEwTFRfV09SRENMT0NLLCAwLCAwKTsKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9kZWx0YTEwMTBfd29yZGNsb2NrX3N0YXR1cyBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9kZWx0YTEwMTBfd29yZGNsb2NrX3N0YXR1cyBfX2RldmluaXRkYXRhID0KIElDRTE3MTJfR1BJTyhTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgIldvcmQgQ2xvY2sgU3RhdHVzIiwgMCwgSUNFMTcxMl9ERUxUQV9XT1JEX0NMT0NLX1NUQVRVUywgMSwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUpOwotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2RlbHRhZGlvMjQ5Nl9zcGRpZl9pbl9zZWxlY3QgX19kZXZpbml0ZGF0YSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZGVsdGFkaW8yNDk2X3NwZGlmX2luX3NlbGVjdCBfX2RldmluaXRkYXRhID0KIElDRTE3MTJfR1BJTyhTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgIklFQzk1OCBJbnB1dCBPcHRpY2FsIiwgMCwgSUNFMTcxMl9ERUxUQV9TUERJRl9JTlBVVF9TRUxFQ1QsIDAsIDApOwotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2RlbHRhX3NwZGlmX2luX3N0YXR1cyBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9kZWx0YV9zcGRpZl9pbl9zdGF0dXMgX19kZXZpbml0ZGF0YSA9CiBJQ0UxNzEyX0dQSU8oU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsICJEZWx0YSBJRUM5NTggSW5wdXQgU3RhdHVzIiwgMCwgSUNFMTcxMl9ERUxUQV9TUERJRl9JTl9TVEFULCAxLCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSk7CiAKIApAQCAtNzM1LDcgKzczNSw3IEBACiAKIAogLyogZW50cnkgcG9pbnQgKi8KLXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX2ljZTE3MTJfZGVsdGFfY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9kZWx0YV9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfREVMVEExMDEwLAogCQkubmFtZSA9ICJNIEF1ZGlvIERlbHRhIDEwMTAiLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuaCBiL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmgKaW5kZXggNzQ2ZWJkZS4uZTY1ZDY2OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuaAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5oCkBAIC00Niw3ICs0Niw3IEBACiAjZGVmaW5lIElDRTE3MTJfU1VCREVWSUNFX01FRElBU1RBVElPTgkweDY5NGMwMTAwCiAKIC8qIGVudHJ5IHBvaW50ICovCi1leHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9kZWx0YV9jYXJkc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX2ljZTE3MTJfZGVsdGFfY2FyZHNbXTsKIAogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvZXdzLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuYwppbmRleCBiMTM1Mzg5Li45YjdmZjMwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuYwpAQCAtMzMyLDcgKzMzMiw3IEBACiAKIC8qCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2V3czg4bXQgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2V3czg4bXQgX19kZXZpbml0ZGF0YSA9IHsKIAkubnVtX2FkY3MgPSA4LAogCS5udW1fZGFjcyA9IDgsCiAJLnR5cGUgPSBTTkRfQUs0NTI0LApAQCAtMzQyLDcgKzM0Miw3IEBACiAJfQogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2V3czg4bXRfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2V3czg4bXRfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDIsCiAJLmNpZiA9IDEsIC8qIENJRiBoaWdoICovCiAJLmRhdGFfbWFzayA9IElDRTE3MTJfRVdTODhfU0VSSUFMX0RBVEEsCkBAIC0zNTQsNyArMzU0LDcgQEAKIAkubWFza19mbGFncyA9IDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9ld3gyNDk2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV9ld3gyNDk2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLm51bV9hZGNzID0gMiwKIAkubnVtX2RhY3MgPSAyLAogCS50eXBlID0gU05EX0FLNDUyNCwKQEAgLTM2Myw3ICszNjMsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9ld3gyNDk2X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9ld3gyNDk2X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKIAkuY2FkZHIgPSAyLAogCS5jaWYgPSAxLCAvKiBDSUYgaGlnaCAqLwogCS5kYXRhX21hc2sgPSBJQ0UxNzEyX0VXUzg4X1NFUklBTF9EQVRBLApAQCAtMzc1LDcgKzM3NSw3IEBACiAJLm1hc2tfZmxhZ3MgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fNmZpcmUgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttXzZmaXJlIF9fZGV2aW5pdGRhdGEgPSB7CiAJLm51bV9hZGNzID0gNiwKIAkubnVtX2RhY3MgPSA2LAogCS50eXBlID0gU05EX0FLNDUyNCwKQEAgLTM4NCw3ICszODQsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV82ZmlyZV9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fNmZpcmVfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDIsCiAJLmNpZiA9IDEsIC8qIENJRiBoaWdoICovCiAJLmRhdGFfbWFzayA9IElDRTE3MTJfNkZJUkVfU0VSSUFMX0RBVEEsCkBAIC01NzgsNyArNTc4LDcgQEAKIAlyZXR1cm4gdmFsICE9IG52YWw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9ld3gyNDk2X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9ld3gyNDk2X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkubmFtZSA9ICJJbnB1dCBTZW5zaXRpdml0eSBTd2l0Y2giLApAQCAtNjc4LDcgKzY3OCw3IEBACiAJcmV0dXJuIG5kYXRhICE9IGRhdGE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9ld3M4OG10X2lucHV0X3NlbnNlIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZXdzODhtdF9pbnB1dF9zZW5zZSBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIklucHV0IFNlbnNpdGl2aXR5IFN3aXRjaCIsCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9ld3hfaW9fc2Vuc2VfaW5mbywKQEAgLTY4Nyw3ICs2ODcsNyBAQAogCS5jb3VudCA9IDgsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZXdzODhtdF9vdXRwdXRfc2Vuc2UgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9ld3M4OG10X291dHB1dF9zZW5zZSBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIk91dHB1dCBTZW5zaXRpdml0eSBTd2l0Y2giLAogCS5pbmZvID0gc25kX2ljZTE3MTJfZXd4X2lvX3NlbnNlX2luZm8sCkBAIC03NjksNyArNzY5LDcgQEAKICAgLnByaXZhdGVfdmFsdWUgPSB4c2hpZnQgfCAoeGludmVydCA8PCA4KSxcCiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9ld3M4OGRfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2V3czg4ZF9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJRVdTODhEX0NPTlRST0woU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsICJJRUM5NTggSW5wdXQgT3B0aWNhbCIsIDAsIDEsIDApLCAvKiBpbnZlcnRlZCAqLwogCUVXUzg4RF9DT05UUk9MKFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAiQURBVCBPdXRwdXQgT3B0aWNhbCIsIDEsIDAsIDApLAogCUVXUzg4RF9DT05UUk9MKFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAiQURBVCBFeHRlcm5hbCBNYXN0ZXIgQ2xvY2siLCAyLCAwLCAwKSwKQEAgLTkwOSw3ICs5MDksNyBAQAogICAucHJpdmF0ZV92YWx1ZSA9IHhzaGlmdCB8ICh4aW52ZXJ0IDw8IDgpLFwKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyXzZmaXJlX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl82ZmlyZV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiQW5hbG9nIElucHV0IFNlbGVjdCIsCkBAIC05ODksNyArOTg5LDcgQEAKIAogCiAvKiBlbnRyeSBwb2ludCAqLwotc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9ld3NfY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9ld3NfY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLnN1YnZlbmRvciA9IElDRTE3MTJfU1VCREVWSUNFX0VXWDI0OTYsCiAJCS5uYW1lID0gIlRlcnJhVGVjIEVXWDI0Lzk2IiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5oIGIvc291bmQvcGNpL2ljZTE3MTIvZXdzLmgKaW5kZXggYTEyYTBiMC4uZGY0NDliNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvZXdzLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvZXdzLmgKQEAgLTQwLDcgKzQwLDcgQEAKICNkZWZpbmUgSUNFMTcxMl9TVUJERVZJQ0VfUEhBU0U4OAkweDNiMTU1MTExCiAKIC8qIGVudHJ5IHBvaW50ICovCi1leHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9ld3NfY2FyZHNbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2V3c19jYXJkc1tdOwogCiAKIC8qIFRlcnJhVGVjIEVXWCAyNC85NiBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9ob29udGVjaC5jIGIvc291bmQvcGNpL2ljZTE3MTIvaG9vbnRlY2guYwppbmRleCAzZjI3ZDA0Li5kZjk3MzEzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9ob29udGVjaC5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2hvb250ZWNoLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogc3RhdGljIGludCBfX2RldmluaXQgc25kX2ljZTE3MTJfdmFsdWVfaW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKIAkvKiBIb29udGVjaCBTVERTUDI0IHdpdGggbW9kaWZpZWQgaGFyZHdhcmUgKi8KLQlzdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9zdGRzcDI0X212IF9fZGV2aW5pdGRhdGEgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fc3Rkc3AyNF9tdiBfX2RldmluaXRkYXRhID0gewogCQkubnVtX2FkY3MgPSAyLAogCQkubnVtX2RhY3MgPSAyLAogCQkudHlwZSA9IFNORF9BSzQ1MjQsCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAkJfQogCX07CiAKLQlzdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fc3Rkc3AyNF9tdl9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3N0ZHNwMjRfbXZfcHJpdiBfX2RldmluaXRkYXRhID0gewogCQkuY2FkZHIgPSAyLAogCQkuY2lmID0gMSwgLyogQ0lGIGhpZ2ggKi8KIAkJLmRhdGFfbWFzayA9IElDRTE3MTJfU1REU1AyNF9TRVJJQUxfREFUQSwKQEAgLTI5OCw3ICsyOTgsNyBAQAogCiAKIC8qIGVudHJ5IHBvaW50ICovCi1zdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2hvb250ZWNoX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK2NvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX2ljZTE3MTJfaG9vbnRlY2hfY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLnN1YnZlbmRvciA9IElDRTE3MTJfU1VCREVWSUNFX1NURFNQMjQsCiAJCS5uYW1lID0gIkhvb250ZWNoIFNvdW5kVHJhY2sgQXVkaW8gRFNQMjQiLApAQCAtMzI1LDQgKzMyNSwzIEBACiAJfSwKIAl7IH0gLyogdGVybWluYXRvciAqLwogfTsKLQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaG9vbnRlY2guaCBiL3NvdW5kL3BjaS9pY2UxNzEyL2hvb250ZWNoLmgKaW5kZXggMWVlNTM4Yi4uYjYyZDZlNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaG9vbnRlY2guaAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9ob29udGVjaC5oCkBAIC0zNSw3ICszNSw3IEBACiAjZGVmaW5lIElDRTE3MTJfU1VCREVWSUNFX1NURFNQMjRfTUVESUE3XzEJMHgxNjE0MTIxNwkvKiBIb29udGVjaCBTVCBBdWRpbyBEU1AyNCBNZWRpYSA3LjEgKi8KICNkZWZpbmUgSUNFMTcxMl9TVUJERVZJQ0VfRVZFTlRfRVo4CQkweDAwMDEwMDAxCS8qIEEgZHVtbXkgaWQgZm9yIEVaOCAqLwogCi1leHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9ob29udGVjaF9jYXJkc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX2ljZTE3MTJfaG9vbnRlY2hfY2FyZHNbXTsKIAogCiAvKiBIb29udGVjaCBTb3VuZFRyYWNrIEF1ZGlvIERTUCAyNCBHUElPIGRlZmluaXRpb25zICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKaW5kZXggOGJhMzFjZi4uODMwYTFiYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYwpAQCAtMTA3LDcgKzEwNyw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKGR4cl9lbmFibGUsICJFbmFibGUgRFhSIHN1cHBvcnQgZm9yIFRlcnJhdGVjIERNWDZGSVJFLiIpOwogCiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfaWNlMTcxMl9pZHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfaWNlMTcxMl9pZHNbXSA9IHsKIAl7IFBDSV9WRU5ET1JfSURfSUNFLCBQQ0lfREVWSUNFX0lEX0lDRV8xNzEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sICAgLyogSUNFMTcxMiAqLwogCXsgMCwgfQogfTsKQEAgLTI4Nyw3ICsyODcsNyBAQAogCXJldHVybiB2YWwgIT0gbnZhbDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX21peGVyX2RpZ21peF9yb3V0ZV9hYzk3IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbWl4ZXJfZGlnbWl4X3JvdXRlX2FjOTcgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJEaWdpdGFsIE1peGVyIFRvIEFDOTciLAogCS5pbmZvID0gc25kX2ljZTE3MTJfZGlnbWl4X3JvdXRlX2FjOTdfaW5mbywKQEAgLTcxOSw3ICs3MTksNyBAQAogCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwdHIpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX2ljZTE3MTJfcGxheWJhY2sgPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pY2UxNzEyX3BsYXliYWNrID0KIHsKIAkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKQEAgLTczOSw3ICs3MzksNyBAQAogCS5maWZvX3NpemUgPQkJMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfaWNlMTcxMl9wbGF5YmFja19kcyA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX2ljZTE3MTJfcGxheWJhY2tfZHMgPQogewogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfApAQCAtNzU5LDcgKzc1OSw3IEBACiAJLmZpZm9fc2l6ZSA9CQkwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pY2UxNzEyX2NhcHR1cmUgPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pY2UxNzEyX2NhcHR1cmUgPQogewogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfApAQCAtMTEzMyw3ICsxMTMzLDcgQEAKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcHRyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pY2UxNzEyX3BsYXliYWNrX3BybyA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX2ljZTE3MTJfcGxheWJhY2tfcHJvID0KIHsKIAkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKQEAgLTExNTMsNyArMTE1Myw3IEBACiAJLmZpZm9fc2l6ZSA9CQkwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pY2UxNzEyX2NhcHR1cmVfcHJvID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfaWNlMTcxMl9jYXB0dXJlX3BybyA9CiB7CiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CkBAIC0xMzc4LDkgKzEzNzgsOSBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9wbGF5YmFjaywgLTE0NDAwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3BsYXliYWNrLCAtMTQ0MDAsIDE1MCwgMCk7CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9tdWx0aV9wbGF5YmFja19jdHJsc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbXVsdGlfcGxheWJhY2tfY3RybHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIk11bHRpIFBsYXliYWNrIFN3aXRjaCIsCkBAIC0xNDA0LDcgKzE0MDQsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbXVsdGlfY2FwdHVyZV9hbmFsb2dfc3dpdGNoIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbXVsdGlfY2FwdHVyZV9hbmFsb2dfc3dpdGNoIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiSC9XIE11bHRpIENhcHR1cmUgU3dpdGNoIiwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl9zd2l0Y2hfaW5mbywKQEAgLTE0MTMsNyArMTQxMyw3IEBACiAJLnByaXZhdGVfdmFsdWUgPSAxMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX3NwZGlmX3N3aXRjaCBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX211bHRpX2NhcHR1cmVfc3BkaWZfc3dpdGNoIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIk11bHRpICIsQ0FQVFVSRSxTV0lUQ0gpLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX21peGVyX3N3aXRjaF9pbmZvLApAQCAtMTQyMyw3ICsxNDIzLDcgQEAKIAkuY291bnQgPSAyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX211bHRpX2NhcHR1cmVfYW5hbG9nX3ZvbHVtZSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX211bHRpX2NhcHR1cmVfYW5hbG9nX3ZvbHVtZSBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CiAJCSAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCkBAIC0xNDM1LDcgKzE0MzUsNyBAQAogCS50bHYgPSB7IC5wID0gZGJfc2NhbGVfcGxheWJhY2sgfQogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX211bHRpX2NhcHR1cmVfc3BkaWZfdm9sdW1lIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbXVsdGlfY2FwdHVyZV9zcGRpZl92b2x1bWUgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiTXVsdGkgIixDQVBUVVJFLFZPTFVNRSksCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfdm9sdW1lX2luZm8sCkBAIC0xNjI3LDcgKzE2MjcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZWVwcm9tIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZWVwcm9tIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfQ0FSRCwKIAkubmFtZSA9ICJJQ0UxNzEyIEVFUFJPTSIsCiAJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELApAQCAtMTY2Myw3ICsxNjYzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3NwZGlmX2RlZmF1bHQgX19kZXZpbml0ZGF0YSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfc3BkaWZfZGVmYXVsdCBfX2RldmluaXRkYXRhID0KIHsKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxERUZBVUxUKSwKQEAgLTE3MTQsNyArMTcxNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9zcGRpZl9tYXNrYyBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9zcGRpZl9tYXNrYyBfX2RldmluaXRkYXRhID0KIHsKIAkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCiAJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLApAQCAtMTcyMyw3ICsxNzIzLDcgQEAKIAkuZ2V0ID0JCXNuZF9pY2UxNzEyX3NwZGlmX21hc2tjX2dldCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9zcGRpZl9tYXNrcCBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9zcGRpZl9tYXNrcCBfX2RldmluaXRkYXRhID0KIHsKIAkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCiAJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLApAQCAtMTc1MCw3ICsxNzUwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3NwZGlmX3N0cmVhbSBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9zcGRpZl9zdHJlYW0gX19kZXZpbml0ZGF0YSA9CiB7CiAJLmFjY2VzcyA9CShTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKIAkJCSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUpLApAQCAtMTgxMSw3ICsxODExLDcgQEAKIHN0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewotCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dHNbXSA9IHsKIAkJIjgwMDAiLAkJLyogMDogNiAqLwogCQkiOTYwMCIsCQkvKiAxOiAzICovCiAJCSIxMTAyNSIsCS8qIDI6IDEwICovCkBAIC0xODQwLDcgKzE4NDAsNyBAQAogCQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciB4bGF0ZVsxNl0gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeGxhdGVbMTZdID0gewogCQk5LCA2LCAzLCAxLCA3LCA0LCAwLCAxMiwgOCwgNSwgMiwgMTEsIDI1NSwgMjU1LCAyNTUsIDEwCiAJfTsKIAl1bnNpZ25lZCBjaGFyIHZhbDsKQEAgLTE4NjQsNyArMTg2NCw3IEBACiAJCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0YXRpYyB1bnNpZ25lZCBpbnQgeHJhdGVbMTNdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgeHJhdGVbMTNdID0gewogCQk4MDAwLCA5NjAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsCiAJCTMyMDAwLCA0NDEwMCwgNDgwMDAsIDY0MDAwLCA4ODIwMCwgOTYwMDAKIAl9OwpAQCAtMTg5MSw3ICsxODkxLDcgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiTXVsdGkgVHJhY2sgSW50ZXJuYWwgQ2xvY2siLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrX2luZm8sCkBAIC0xOTAyLDcgKzE5MDIsNyBAQAogc3RhdGljIGludCBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2tfZGVmYXVsdF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7Ci0Jc3RhdGljIGNoYXIgKnRleHRzW10gPSB7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0c1tdID0gewogCQkiODAwMCIsCQkvKiAwOiA2ICovCiAJCSI5NjAwIiwJCS8qIDE6IDMgKi8KIAkJIjExMDI1IiwJLyogMjogMTAgKi8KQEAgLTE5MzEsNyArMTkzMSw3IEBACiAJCQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlpbnQgdmFsOwotCXN0YXRpYyB1bnNpZ25lZCBpbnQgeHJhdGVbMTNdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgeHJhdGVbMTNdID0gewogCQk4MDAwLCA5NjAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsCiAJCTMyMDAwLCA0NDEwMCwgNDgwMDAsIDY0MDAwLCA4ODIwMCwgOTYwMDAKIAl9OwpAQCAtMTk0OCw3ICsxOTQ4LDcgQEAKIHN0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrX2RlZmF1bHRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIGludCB4cmF0ZVsxM10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB4cmF0ZVsxM10gPSB7CiAJCTgwMDAsIDk2MDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwKIAkJMzIwMDAsIDQ0MTAwLCA0ODAwMCwgNjQwMDAsIDg4MjAwLCA5NjAwMAogCX07CkBAIC0xOTYyLDcgKzE5NjIsNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2tfZGVmYXVsdCBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3Byb19pbnRlcm5hbF9jbG9ja19kZWZhdWx0IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiTXVsdGkgVHJhY2sgSW50ZXJuYWwgQ2xvY2sgRGVmYXVsdCIsCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2tfZGVmYXVsdF9pbmZvLApAQCAtMjAwMSw3ICsyMDAxLDcgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfcHJvX3JhdGVfbG9ja2luZyBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3Byb19yYXRlX2xvY2tpbmcgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBSYXRlIExvY2tpbmciLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX3JhdGVfbG9ja2luZ19pbmZvLApAQCAtMjA0MCw3ICsyMDQwLDcgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfcHJvX3JhdGVfcmVzZXQgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9wcm9fcmF0ZV9yZXNldCBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIk11bHRpIFRyYWNrIFJhdGUgUmVzZXQiLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX3JhdGVfcmVzZXRfaW5mbywKQEAgLTIwNTQsNyArMjA1NCw3IEBACiBzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3Byb19yb3V0ZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7Ci0Jc3RhdGljIGNoYXIgKnRleHRzW10gPSB7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0c1tdID0gewogCQkiUENNIE91dCIsIC8qIDAgKi8KIAkJIkgvVyBJbiAwIiwgIkgvVyBJbiAxIiwgIkgvVyBJbiAyIiwgIkgvVyBJbiAzIiwgLyogMS00ICovCiAJCSJIL1cgSW4gNCIsICJIL1cgSW4gNSIsICJIL1cgSW4gNiIsICJIL1cgSW4gNyIsIC8qIDUtOCAqLwpAQCAtMjIwNyw3ICsyMjA3LDcgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbWl4ZXJfcHJvX2FuYWxvZ19yb3V0ZSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX21peGVyX3Byb19hbmFsb2dfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJIL1cgUGxheWJhY2sgUm91dGUiLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX3JvdXRlX2luZm8sCkBAIC0yMjE1LDcgKzIyMTUsNyBAQAogCS5wdXQgPSBzbmRfaWNlMTcxMl9wcm9fcm91dGVfYW5hbG9nX3B1dCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fc3BkaWZfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fc3BkaWZfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxOT05FKSAiUm91dGUiLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX3JvdXRlX2luZm8sCkBAIC0yMjU3LDcgKzIyNTcsNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fdm9sdW1lX3JhdGUgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fdm9sdW1lX3JhdGUgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBWb2x1bWUgUmF0ZSIsCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fdm9sdW1lX3JhdGVfaW5mbywKQEAgLTIyOTAsNyArMjI5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fcGVhayBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX21peGVyX3Byb19wZWFrIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiTXVsdGkgVHJhY2sgUGVhayIsCiAJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLApAQCAtMjMwNSw3ICsyMzA1LDcgQEAKIC8qCiAgKiBsaXN0IG9mIGF2YWlsYWJsZSBib2FyZHMKICAqLwotc3RhdGljIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKmNhcmRfdGFibGVzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICpjYXJkX3RhYmxlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJc25kX2ljZTE3MTJfaG9vbnRlY2hfY2FyZHMsCiAJc25kX2ljZTE3MTJfZGVsdGFfY2FyZHMsCiAJc25kX2ljZTE3MTJfZXdzX2NhcmRzLApAQCAtMjMyOSw3ICsyMzI5LDcgQEAKIHsKIAlpbnQgZGV2ID0gMHhhMDsJCS8qIEVFUFJPTSBkZXZpY2UgYWRkcmVzcyAqLwogCXVuc2lnbmVkIGludCBpLCBzaXplOwotCXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOworCWNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOwogCiAJaWYgKCEgbW9kZWxuYW1lIHx8ICEgKm1vZGVsbmFtZSkgewogCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPSAwOwpAQCAtMjY1OCw3ICsyNjU4LDcgQEAKICAqCiAgKi8KIAotc3RhdGljIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gbm9fbWF0Y2hlZCBfX2RldmluaXRkYXRhOworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gbm9fbWF0Y2hlZCBfX2RldmluaXRkYXRhOwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaWNlMTcxMl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQpAQCAtMjY2Nyw3ICsyNjY3LDcgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2U7CiAJaW50IHBjbV9kZXYgPSAwLCBlcnI7Ci0Jc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqKnRibCwgKmM7CisJY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqKnRibCwgKmM7CiAKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuaCBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuaAppbmRleCBjZTI3ZWFjLi5jM2Q5ZmVhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5oCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8c291bmQvaTJjLmg+CiAjaW5jbHVkZSA8c291bmQvYWs0eHh4LWFkZGEuaD4KICNpbmNsdWRlIDxzb3VuZC9hazQxMTQuaD4KKyNpbmNsdWRlIDxzb3VuZC9wdDIyNTguaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KIApAQCAtMzgxLDYgKzM4MiwxMSBAQAogCQkJdW5zaWduZWQgc2hvcnQgbWFzdGVyWzJdOwogCQkJdW5zaWduZWQgc2hvcnQgdm9sWzhdOwogCQl9IHBoYXNlMjg7CisJCS8qIGEgbm9uLXN0YW5kYXJkIEkyQyBkZXZpY2UgZm9yIHJldm81MSAqLworCQlzdHJ1Y3QgcmV2bzUxX3NwZWMgeworCQkJc3RydWN0IHNuZF9pMmNfZGV2aWNlICpkZXY7CisJCQlzdHJ1Y3Qgc25kX3B0MjI1OCAqcHQyMjU4OworCQl9IHJldm81MTsKIAkJLyogSG9vbnRlY2gtc3BlY2lmaWMgc2V0dGluZyAqLwogCQlzdHJ1Y3QgaG9vbnRlY2hfc3BlYyB7CiAJCQl1bnNpZ25lZCBjaGFyIGJveGJpdHNbNF07CkBAIC00NjIsNiArNDY4LDE0IEBACiAJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIG1hc2sgJiBiaXRzKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgc25kX2ljZTE3MTJfZ3Bpb19yZWFkX2JpdHMoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBtYXNrKQoreworCWljZS0+Z3Bpby5kaXJlY3Rpb24gJj0gfm1hc2s7CisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfZGlyKGljZSwgaWNlLT5ncGlvLmRpcmVjdGlvbik7CisJcmV0dXJuICAoc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSkgJiBtYXNrKTsKK30KKwogaW50IHNuZF9pY2UxNzEyX3NwZGlmX2J1aWxkX2NvbnRyb2xzKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKTsKIAogaW50IHNuZF9pY2UxNzEyX2FrbTR4eHhfaW5pdChzdHJ1Y3Qgc25kX2FrbTR4eHggKmFrLCBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggKnRlbXBsYXRlLApAQCAtNTAwLDggKzUxNCw4IEBACiAJdW5zaWduZWQgaW50IG1wdTQwMV8yX2luZm9fZmxhZ3M7CiAJY29uc3QgY2hhciAqbXB1NDAxXzFfbmFtZTsKIAljb25zdCBjaGFyICptcHU0MDFfMl9uYW1lOwotCXVuc2lnbmVkIGludCBlZXByb21fc2l6ZTsKLQl1bnNpZ25lZCBjaGFyICplZXByb21fZGF0YTsKKwljb25zdCB1bnNpZ25lZCBpbnQgZWVwcm9tX3NpemU7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZWVwcm9tX2RhdGE7CiB9OwogCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwppbmRleCAzZTNhMTAyLi4xMTI3ZWJkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCkBAIC01MCw3ICs1MCw3IEBACiAjaW5jbHVkZSAicHJvZGlneTE5Mi5oIgogI2luY2x1ZGUgImp1bGkuaCIKICNpbmNsdWRlICJwaGFzZS5oIgotCisjaW5jbHVkZSAid3RtLmgiCiAKIE1PRFVMRV9BVVRIT1IoIkphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVklBIElDRW5zZW1ibGUgSUNFMTcyNC8xNzIwIChFbnZ5MjRIVC9QVCkiKTsKQEAgLTY0LDYgKzY0LDcgQEAKIAkgICAgICAgUFJPRElHWTE5Ml9ERVZJQ0VfREVTQwogCSAgICAgICBKVUxJX0RFVklDRV9ERVNDCiAJICAgICAgIFBIQVNFX0RFVklDRV9ERVNDCisJICAgICAgIFdUTV9ERVZJQ0VfREVTQwogCQkie1ZJQSxWVDE3MjB9LCIKIAkJIntWSUEsVlQxNzI0fSwiCiAJCSJ7SUNFbnNlbWJsZSxHZW5lcmljIElDRTE3MjR9LCIKQEAgLTg2LDcgKzg3LDcgQEAKIAogCiAvKiBCb3RoIFZUMTcyMCBhbmQgVlQxNzI0IGhhdmUgdGhlIHNhbWUgUENJIElEcyAqLwotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNuZF92dDE3MjRfaWRzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX3Z0MTcyNF9pZHNbXSA9IHsKIAl7IFBDSV9WRU5ET1JfSURfSUNFLCBQQ0lfREVWSUNFX0lEX1ZUMTcyNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAogCXsgMCwgfQogfTsKQEAgLTM0MSw3ICszNDIsNyBAQAogCiAJd2hhdCA9IDA7CiAJc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgewotCQlzdHJ1Y3QgdnQxNzI0X3BjbV9yZWcgKnJlZzsKKwkJY29uc3Qgc3RydWN0IHZ0MTcyNF9wY21fcmVnICpyZWc7CiAJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOwogCQlyZWcgPSBzLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJCXdoYXQgfD0gcmVnLT5zdGFydDsKQEAgLTYwNSw3ICs2MDYsNyBAQAogc3RhdGljIGludCBzbmRfdnQxNzI0X3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCB2dDE3MjRfcGNtX3JlZyAqcmVnID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHZ0MTcyNF9wY21fcmVnICpyZWcgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAogCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOwogCW91dGwoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYWRkciwgaWNlLT5wcm9maV9wb3J0ICsgcmVnLT5hZGRyKTsKQEAgLTYyMCw3ICs2MjEsNyBAQAogc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF92dDE3MjRfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IHZ0MTcyNF9wY21fcmVnICpyZWcgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3QgdnQxNzI0X3BjbV9yZWcgKnJlZyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCXNpemVfdCBwdHI7CiAKIAlpZiAoIShpbmwoSUNFTVQxNzI0KGljZSwgRE1BX0NPTlRST0wpKSAmIHJlZy0+c3RhcnQpKQpAQCAtNjQ2LDIxICs2NDcsMjEgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgc3RydWN0IHZ0MTcyNF9wY21fcmVnIHZ0MTcyNF9wbGF5YmFja19wcm9fcmVnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2dDE3MjRfcGNtX3JlZyB2dDE3MjRfcGxheWJhY2tfcHJvX3JlZyA9IHsKIAkuYWRkciA9IFZUMTcyNF9NVF9QTEFZQkFDS19BRERSLAogCS5zaXplID0gVlQxNzI0X01UX1BMQVlCQUNLX1NJWkUsCiAJLmNvdW50ID0gVlQxNzI0X01UX1BMQVlCQUNLX0NPVU5ULAogCS5zdGFydCA9IFZUMTcyNF9QRE1BMF9TVEFSVCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdnQxNzI0X3BjbV9yZWcgdnQxNzI0X2NhcHR1cmVfcHJvX3JlZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdnQxNzI0X3BjbV9yZWcgdnQxNzI0X2NhcHR1cmVfcHJvX3JlZyA9IHsKIAkuYWRkciA9IFZUMTcyNF9NVF9DQVBUVVJFX0FERFIsCiAJLnNpemUgPSBWVDE3MjRfTVRfQ0FQVFVSRV9TSVpFLAogCS5jb3VudCA9IFZUMTcyNF9NVF9DQVBUVVJFX0NPVU5ULAogCS5zdGFydCA9IFZUMTcyNF9SRE1BMF9TVEFSVCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfdnQxNzI0X3BsYXliYWNrX3BybyA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3Z0MTcyNF9wbGF5YmFja19wcm8gPQogewogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfApAQCAtNjc5LDcgKzY4MCw3IEBACiAJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3Z0MTcyNF9zcGRpZiA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3Z0MTcyNF9zcGRpZiA9CiB7CiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CkBAIC03MDEsNyArNzAyLDcgQEAKIAkucGVyaW9kc19tYXggPQkJMTAyNCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfdnQxNzI0XzJjaF9zdGVyZW8gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF92dDE3MjRfMmNoX3N0ZXJlbyA9CiB7CiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CkBAIC03NzMsNyArNzc0LDcgQEAKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlpbnQgY2hzOwogCi0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gJnZ0MTcyNF9wbGF5YmFja19wcm9fcmVnOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopJnZ0MTcyNF9wbGF5YmFja19wcm9fcmVnOwogCWljZS0+cGxheWJhY2tfcHJvX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAlydW50aW1lLT5odyA9IHNuZF92dDE3MjRfcGxheWJhY2tfcHJvOwogCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKQEAgLTgwMiw3ICs4MDMsNyBAQAogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAKLQlydW50aW1lLT5wcml2YXRlX2RhdGEgPSAmdnQxNzI0X2NhcHR1cmVfcHJvX3JlZzsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSZ2dDE3MjRfY2FwdHVyZV9wcm9fcmVnOwogCWljZS0+Y2FwdHVyZV9wcm9fc3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCXJ1bnRpbWUtPmh3ID0gc25kX3Z0MTcyNF8yY2hfc3RlcmVvOwogCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKQEAgLTg4OCwxNCArODg5LDE0IEBACiAgKiBTUERJRiBQQ00KICAqLwogCi1zdGF0aWMgc3RydWN0IHZ0MTcyNF9wY21fcmVnIHZ0MTcyNF9wbGF5YmFja19zcGRpZl9yZWcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZ0MTcyNF9wY21fcmVnIHZ0MTcyNF9wbGF5YmFja19zcGRpZl9yZWcgPSB7CiAJLmFkZHIgPSBWVDE3MjRfTVRfUERNQTRfQUREUiwKIAkuc2l6ZSA9IFZUMTcyNF9NVF9QRE1BNF9TSVpFLAogCS5jb3VudCA9IFZUMTcyNF9NVF9QRE1BNF9DT1VOVCwKIAkuc3RhcnQgPSBWVDE3MjRfUERNQTRfU1RBUlQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHZ0MTcyNF9wY21fcmVnIHZ0MTcyNF9jYXB0dXJlX3NwZGlmX3JlZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdnQxNzI0X3BjbV9yZWcgdnQxNzI0X2NhcHR1cmVfc3BkaWZfcmVnID0gewogCS5hZGRyID0gVlQxNzI0X01UX1JETUExX0FERFIsCiAJLnNpemUgPSBWVDE3MjRfTVRfUkRNQTFfU0laRSwKIAkuY291bnQgPSBWVDE3MjRfTVRfUkRNQTFfQ09VTlQsCkBAIC05NTMsNyArOTU0LDcgQEAKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gJnZ0MTcyNF9wbGF5YmFja19zcGRpZl9yZWc7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikmdnQxNzI0X3BsYXliYWNrX3NwZGlmX3JlZzsKIAlpY2UtPnBsYXliYWNrX2Nvbl9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CiAJaWYgKGljZS0+Zm9yY2VfcGRtYTQpIHsKIAkJcnVudGltZS0+aHcgPSBzbmRfdnQxNzI0XzJjaF9zdGVyZW87CkBAIC05ODUsNyArOTg2LDcgQEAKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gJnZ0MTcyNF9jYXB0dXJlX3NwZGlmX3JlZzsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSZ2dDE3MjRfY2FwdHVyZV9zcGRpZl9yZWc7CiAJaWNlLT5jYXB0dXJlX2Nvbl9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CiAJaWYgKGljZS0+Zm9yY2VfcmRtYTEpIHsKIAkJcnVudGltZS0+aHcgPSBzbmRfdnQxNzI0XzJjaF9zdGVyZW87CkBAIC0xMDkwLDcgKzEwOTEsNyBAQAogICogaW5kZXBlbmRlbnQgc3Vycm91bmQgUENNcwogICovCiAKLXN0YXRpYyBzdHJ1Y3QgdnQxNzI0X3BjbV9yZWcgdnQxNzI0X3BsYXliYWNrX2RtYV9yZWdzWzNdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2dDE3MjRfcGNtX3JlZyB2dDE3MjRfcGxheWJhY2tfZG1hX3JlZ3NbM10gPSB7CiAJewogCQkuYWRkciA9IFZUMTcyNF9NVF9QRE1BMV9BRERSLAogCQkuc2l6ZSA9IFZUMTcyNF9NVF9QRE1BMV9TSVpFLApAQCAtMTEzNiw3ICsxMTM3LDcgQEAKIAkJcmV0dXJuIC1FQlVTWTsgLyogRklYTUU6IHNob3VsZCBoYW5kbGUgYmxvY2tpbmcgbW9kZSBwcm9wZXJseSAqLwogCX0KIAltdXRleF91bmxvY2soJmljZS0+b3Blbl9tdXRleCk7Ci0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gJnZ0MTcyNF9wbGF5YmFja19kbWFfcmVnc1tzdWJzdHJlYW0tPm51bWJlcl07CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikmdnQxNzI0X3BsYXliYWNrX2RtYV9yZWdzW3N1YnN0cmVhbS0+bnVtYmVyXTsKIAlpY2UtPnBsYXliYWNrX2Nvbl9zdWJzdHJlYW1fZHNbc3Vic3RyZWFtLT5udW1iZXJdID0gc3Vic3RyZWFtOwogCXJ1bnRpbWUtPmh3ID0gc25kX3Z0MTcyNF8yY2hfc3RlcmVvOwogCXNuZF9wY21fc2V0X3N5bmMoc3Vic3RyZWFtKTsKQEAgLTEzMTcsNyArMTMxOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X2VlcHJvbSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfZWVwcm9tIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfQ0FSRCwKIAkubmFtZSA9ICJJQ0UxNzI0IEVFUFJPTSIsCiAJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELApAQCAtMTQzMCw3ICsxNDMxLDcgQEAKIAlyZXR1cm4gKHZhbCAhPSBvbGQpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9zcGRpZl9kZWZhdWx0IF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfc3BkaWZfZGVmYXVsdCBfX2RldmluaXRkYXRhID0KIHsKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxERUZBVUxUKSwKQEAgLTE0NjIsNyArMTQ2Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3NwZGlmX21hc2tjIF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfc3BkaWZfbWFza2MgX19kZXZpbml0ZGF0YSA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKQEAgLTE0NzEsNyArMTQ3Miw3IEBACiAJLmdldCA9CQlzbmRfdnQxNzI0X3NwZGlmX21hc2tjX2dldCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3NwZGlmX21hc2twIF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfc3BkaWZfbWFza3AgX19kZXZpbml0ZGF0YSA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKQEAgLTE1MTYsNyArMTUxNyw3IEBACiAJcmV0dXJuIG9sZCAhPSB2YWw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3NwZGlmX3N3aXRjaCBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3NwZGlmX3N3aXRjaCBfX2RldmluaXRkYXRhID0KIHsKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkvKiBGSVhNRTogdGhlIGZvbGxvd2luZyBjb25mbGljdCB3aXRoIElFQzk1OCBQbGF5YmFjayBSb3V0ZSAqLwpAQCAtMTU4NCw3ICsxNTg1LDcgQEAKIHN0YXRpYyBpbnQgc25kX3Z0MTcyNF9wcm9faW50ZXJuYWxfY2xvY2tfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKLQlzdGF0aWMgY2hhciAqdGV4dHNfMTcyNFtdID0geworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dHNfMTcyNFtdID0gewogCQkiODAwMCIsCQkvKiAwOiA2ICovCiAJCSI5NjAwIiwJCS8qIDE6IDMgKi8KIAkJIjExMDI1IiwJLyogMjogMTAgKi8KQEAgLTE2MDIsNyArMTYwMyw3IEBACiAJCSIxOTIwMDAiLAkvKiAxNDogMTQgKi8KIAkJIklFQzk1OCBJbnB1dCIsCS8qIDE1OiAtLSAqLwogCX07Ci0Jc3RhdGljIGNoYXIgKnRleHRzXzE3MjBbXSA9IHsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRzXzE3MjBbXSA9IHsKIAkJIjgwMDAiLAkJLyogMDogNiAqLwogCQkiOTYwMCIsCQkvKiAxOiAzICovCiAJCSIxMTAyNSIsCS8qIDI6IDEwICovCkBAIC0xNjM1LDcgKzE2MzYsNyBAQAogCQkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHhsYXRlWzE2XSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB4bGF0ZVsxNl0gPSB7CiAJCTksIDYsIDMsIDEsIDcsIDQsIDAsIDEyLCA4LCA1LCAyLCAxMSwgMTMsIDI1NSwgMTQsIDEwCiAJfTsKIAl1bnNpZ25lZCBjaGFyIHZhbDsKQEAgLTE2OTQsNyArMTY5NSw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfcHJvX2ludGVybmFsX2Nsb2NrIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9wcm9faW50ZXJuYWxfY2xvY2sgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBJbnRlcm5hbCBDbG9jayIsCiAJLmluZm8gPSBzbmRfdnQxNzI0X3Byb19pbnRlcm5hbF9jbG9ja19pbmZvLApAQCAtMTczMyw3ICsxNzM0LDcgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9wcm9fcmF0ZV9sb2NraW5nIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9wcm9fcmF0ZV9sb2NraW5nIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiTXVsdGkgVHJhY2sgUmF0ZSBMb2NraW5nIiwKIAkuaW5mbyA9IHNuZF92dDE3MjRfcHJvX3JhdGVfbG9ja2luZ19pbmZvLApAQCAtMTc3Miw3ICsxNzczLDcgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9wcm9fcmF0ZV9yZXNldCBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfcHJvX3JhdGVfcmVzZXQgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBSYXRlIFJlc2V0IiwKIAkuaW5mbyA9IHNuZF92dDE3MjRfcHJvX3JhdGVfcmVzZXRfaW5mbywKQEAgLTE4MTYsNyArMTgxNyw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJdW5zaWduZWQgY2hhciBlaXRlbTsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciB4bGF0ZVs4XSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB4bGF0ZVs4XSA9IHsKIAkJMCwgMjU1LCAxLCAyLCAyNTUsIDI1NSwgMywgNCwKIAl9OwogCkBAIC0xODM1LDcgKzE4MzYsNyBAQAogewogCXVuc2lnbmVkIGludCBvbGRfdmFsLCBudmFsOwogCWludCBjaGFuZ2U7Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgeHJvdXRlWzhdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHhyb3V0ZVs4XSA9IHsKIAkJMCwgLyogUENNICovCiAJCTIsIC8qIFBTRElOMCBMZWZ0ICovCiAJCTMsIC8qIFBTRElOMCBSaWdodCAqLwpAQCAtMTg5MSw3ICsxODkyLDcgQEAKIAkJCSAgICAgZGlnaXRhbF9yb3V0ZV9zaGlmdChpZHgpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfbWl4ZXJfcHJvX2FuYWxvZ19yb3V0ZSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfbWl4ZXJfcHJvX2FuYWxvZ19yb3V0ZSBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIkgvVyBQbGF5YmFjayBSb3V0ZSIsCiAJLmluZm8gPSBzbmRfdnQxNzI0X3Byb19yb3V0ZV9pbmZvLApAQCAtMTg5OSw3ICsxOTAwLDcgQEAKIAkucHV0ID0gc25kX3Z0MTcyNF9wcm9fcm91dGVfYW5hbG9nX3B1dCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X21peGVyX3Byb19zcGRpZl9yb3V0ZSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfbWl4ZXJfcHJvX3NwZGlmX3JvdXRlIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTk9ORSkgIlJvdXRlIiwKIAkuaW5mbyA9IHNuZF92dDE3MjRfcHJvX3JvdXRlX2luZm8sCkBAIC0xOTM1LDcgKzE5MzYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9taXhlcl9wcm9fcGVhayBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfbWl4ZXJfcHJvX3BlYWsgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBQZWFrIiwKIAkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCkBAIC0xOTQ3LDkgKzE5NDgsOSBAQAogICoKICAqLwogCi1zdGF0aWMgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBub19tYXRjaGVkIF9fZGV2aW5pdGRhdGE7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBub19tYXRjaGVkIF9fZGV2aW5pdGRhdGE7CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICpjYXJkX3RhYmxlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqY2FyZF90YWJsZXNbXSBfX2RldmluaXRkYXRhID0gewogCXNuZF92dDE3MjRfcmV2b19jYXJkcywKIAlzbmRfdnQxNzI0X2FtcF9jYXJkcywgCiAJc25kX3Z0MTcyNF9hdXJlb25fY2FyZHMsCkBAIC0xOTU4LDYgKzE5NTksNyBAQAogCXNuZF92dDE3MjRfcHJvZGlneTE5Ml9jYXJkcywKIAlzbmRfdnQxNzI0X2p1bGlfY2FyZHMsCiAJc25kX3Z0MTcyNF9waGFzZV9jYXJkcywKKwlzbmRfdnQxNzI0X3d0bV9jYXJkcywKIAlOVUxMLAogfTsKIApAQCAtMjAwNyw3ICsyMDA5LDcgQEAKIHsKIAljb25zdCBpbnQgZGV2ID0gMHhhMDsJCS8qIEVFUFJPTSBkZXZpY2UgYWRkcmVzcyAqLwogCXVuc2lnbmVkIGludCBpLCBzaXplOwotCXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOworCWNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOwogCiAJaWYgKCEgbW9kZWxuYW1lIHx8ICEgKm1vZGVsbmFtZSkgewogCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPSAwOwpAQCAtMjMwNiw3ICsyMzA4LDcgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2U7CiAJaW50IHBjbV9kZXYgPSAwLCBlcnI7Ci0Jc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqKnRibCwgKmM7CisJY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqKnRibCwgKmM7CiAKIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYwppbmRleCA1MTc2YjQxLi5kODgxNzJmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvanVsaS5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAlzbmRfYWttNHh4eF9yZXNldChhaywgMCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2p1bGlfZGFjIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV9qdWxpX2RhYyBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNDM1OCwKIAkubnVtX2RhY3MgPSAyLAogCS5vcHMgPSB7CkBAIC0xNDYsNyArMTQ2LDcgQEAKICAqLwogc3RhdGljIGludCBfX2RldmluaXQganVsaV9pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFrNDExNF9pbml0X3ZhbHNbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhazQxMTRfaW5pdF92YWxzW10gPSB7CiAJCS8qIEFLNDExN19SRUdfUFdSRE4gKi8JQUs0MTE0X1JTVCB8IEFLNDExNF9QV04gfCBBSzQxMTRfT0NLUzAgfCBBSzQxMTRfT0NLUzEsCiAJCS8qIEFLNDExNF9SRVFfRk9STUFUICovCUFLNDExNF9ESUZfSTI0STJTLAogCQkvKiBBSzQxMTRfUkVHX0lPMCAqLwlBSzQxMTRfVFgxRSwKQEAgLTE1NCw3ICsxNTQsNyBAQAogCQkvKiBBSzQxMTRfUkVHX0lOVDBfTUFTSyAqLyAwLAogCQkvKiBBSzQxMTRfUkVHX0lOVDFfTUFTSyAqLyAwCiAJfTsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBhazQxMTRfaW5pdF90eGNzYltdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFrNDExNF9pbml0X3R4Y3NiW10gPSB7CiAJCTB4NDEsIDB4MDIsIDB4MmMsIDB4MDAsIDB4MDAKIAl9OwogCWludCBlcnI7CkBAIC0yMDYsMjQgKzIwNiwyNCBAQAogICogaGVuY2UgdGhlIGRyaXZlciBuZWVkcyB0byBzZXRzIHVwIGl0IHByb3Blcmx5LgogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGp1bGlfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKLQkweDIwLAkvKiBTWVNDT05GOiBjbG9jayA1MTIsIG1wdTQwMSwgMXhBREMsIDF4REFDcyAqLwotCTB4ODAsCS8qIEFDTElOSzogSTJTICovCi0JMHhmOCwJLyogSTJTOiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KLQkweGMzLAkvKiBTUERJRjogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLwotCTB4OWYsCS8qIEdQSU9fRElSICovCi0JMHhmZiwJLyogR1BJT19ESVIxICovCi0JMHg3ZiwJLyogR1BJT19ESVIyICovCi0JMHg5ZiwJLyogR1BJT19NQVNLICovCi0JMHhmZiwJLyogR1BJT19NQVNLMSAqLwotCTB4N2YsCS8qIEdQSU9fTUFTSzIgKi8KLQkweDE2LAkvKiBHUElPX1NUQVRFOiBpbnRlcm5hbCBjbG9jaywgbXVsdGlwbGUgMXgsIDQ4a0h6ICovCi0JMHg4MCwJLyogR1BJT19TVEFURTE6IG11dGUgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIganVsaV9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDIwLAkvKiBjbG9jayA1MTIsIG1wdTQwMSwgMXhBREMsIDF4REFDcyAqLworCVtJQ0VfRUVQMl9BQ0xJTktdICAgICAgPSAweDgwLAkvKiBJMlMgKi8KKwlbSUNFX0VFUDJfSTJTXSAgICAgICAgID0gMHhmOCwJLyogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCisJW0lDRV9FRVAyX1NQRElGXSAgICAgICA9IDB4YzMsCS8qIG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KKwlbSUNFX0VFUDJfR1BJT19ESVJdICAgID0gMHg5ZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIxXSAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIyXSAgID0gMHg3ZiwKKwlbSUNFX0VFUDJfR1BJT19NQVNLXSAgID0gMHg5ZiwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMV0gID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMl0gID0gMHg3ZiwKKwlbSUNFX0VFUDJfR1BJT19TVEFURV0gID0gMHgxNiwJLyogaW50ZXJuYWwgY2xvY2ssIG11bHRpcGxlIDF4LCA0OGtIeiAqLworCVtJQ0VfRUVQMl9HUElPX1NUQVRFMV0gPSAweDgwLAkvKiBtdXRlICovCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUyXSA9IDB4MDAsCiB9OwogCiAvKiBlbnRyeSBwb2ludCAqLwotc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X2p1bGlfY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X2p1bGlfY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfSlVMSSwKIAkJLm5hbWUgPSAiRVNJIEp1bGlAIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuaCBiL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuaAppbmRleCBkOWY4NTM0Li4xYjkyOTRmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvanVsaS5oCkBAIC01LDYgKzUsNiBAQAogCiAjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfSlVMSQkJMHgzMTMwNTM0NQkvKiBKdWxpQCAqLwogCi1leHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyNF9qdWxpX2NhcmRzW107CitleHRlcm4gY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyNF9qdWxpX2NhcmRzW107CiAKICNlbmRpZgkvKiBfX1NPVU5EX0pVTElfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BoYXNlLmMKaW5kZXggZTA4ZDczZi4uMDc1MTcxOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9waGFzZS5jCkBAIC03MSw3ICs3MSw3IEBACiAgKiBMb2dhcml0aG1pYyB2b2x1bWUgdmFsdWVzIGZvciBXTTg3NzAKICAqIENvbXB1dGVkIGFzIDIwICogTG9nMTAoMjU1IC8geCkKICAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgd21fdm9sWzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB3bV92b2xbMjU2XSA9IHsKIAkxMjcsIDQ4LCA0MiwgMzksIDM2LCAzNCwgMzMsIDMxLCAzMCwgMjksIDI4LCAyNywgMjcsIDI2LCAyNSwgMjUsIDI0LCAyNCwgMjMsCiAJMjMsIDIyLCAyMiwgMjEsIDIxLCAyMSwgMjAsIDIwLCAyMCwgMTksIDE5LCAxOSwgMTgsIDE4LCAxOCwgMTgsIDE3LCAxNywgMTcsCiAJMTcsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsCkBAIC04OSwxMyArODksMTMgQEAKICNkZWZpbmUgV01fVk9MX01BWAkoc2l6ZW9mKHdtX3ZvbCkgLSAxKQogI2RlZmluZSBXTV9WT0xfTVVURQkweDgwMDAKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fcGhhc2UyMiBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fcGhhc2UyMiBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNDUyNCwKIAkubnVtX2RhY3MgPSAyLAogCS5udW1fYWRjcyA9IDIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcGhhc2UyMl9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcGhhc2UyMl9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0JMiwKIAkuY2lmID0JCTEsCiAJLmRhdGFfbWFzayA9CTEgPDwgNCwKQEAgLTE1MiwzNiArMTUyLDM2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBoYXNlMjJfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKLQkweDAwLAkvKiBTWVNDT05GOiAxeEFEQywgMXhEQUNzICovCi0JMHg4MCwJLyogQUNMSU5LOiBJMlMgKi8KLQkweGY4LAkvKiBJMlM6IHZvbCwgOTZrLCAyNGJpdCovCi0JMHhjMywJLyogU1BESUY6IG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KLQkweEZGLAkvKiBHUElPX0RJUiAqLwotCTB4RkYsCS8qIEdQSU9fRElSMSAqLwotCTB4RkYsCS8qIEdQSU9fRElSMiAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSyAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSzEgKi8KLQkweDAwLAkvKiBHUElPX01BU0syICovCi0JMHgwMCwJLyogR1BJT19TVEFURTogKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMTogKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGhhc2UyMl9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDAwLAkvKiAxeEFEQywgMXhEQUNzICovCisJW0lDRV9FRVAyX0FDTElOS10gICAgICA9IDB4ODAsCS8qIEkyUyAqLworCVtJQ0VfRUVQMl9JMlNdICAgICAgICAgPSAweGY4LAkvKiB2b2wsIDk2aywgMjRiaXQgKi8KKwlbSUNFX0VFUDJfU1BESUZdICAgICAgID0gMHhjMywJLyogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLworCVtJQ0VfRUVQMl9HUElPX0RJUl0gICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX0RJUjFdICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX0RJUjJdICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX01BU0tdICAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX01BU0sxXSAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX01BU0syXSAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFXSAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFMV0gPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFMl0gPSAweDAwLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgcGhhc2UyOF9lZXByb21bXSBfX2RldmluaXRkYXRhID0gewotCTB4MGIsCS8qIFNZU0NPTkY6IGNsb2NrIDUxMiwgc3BkaWYtaW4vQURDLCA0REFDcyAqLwotCTB4ODAsCS8qIEFDTElOSzogSTJTICovCi0JMHhmYywJLyogSTJTOiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KLQkweGMzLAkvKiBTUERJRjogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLwotCTB4ZmYsCS8qIEdQSU9fRElSICovCi0JMHhmZiwJLyogR1BJT19ESVIxICovCi0JMHg1ZiwJLyogR1BJT19ESVIyICovCi0JMHgwMCwJLyogR1BJT19NQVNLICovCi0JMHgwMCwJLyogR1BJT19NQVNLMSAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSzIgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFICovCi0JMHgwMCwJLyogR1BJT19TVEFURTEgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGhhc2UyOF9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDBiLAkvKiBjbG9jayA1MTIsIHNwZGlmLWluL0FEQywgNERBQ3MgKi8KKwlbSUNFX0VFUDJfQUNMSU5LXSAgICAgID0gMHg4MCwJLyogSTJTICovCisJW0lDRV9FRVAyX0kyU10gICAgICAgICA9IDB4ZmMsCS8qIHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLworCVtJQ0VfRUVQMl9TUERJRl0gICAgICAgPSAweGMzLAkvKiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCisJW0lDRV9FRVAyX0dQSU9fRElSXSAgICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fRElSMV0gICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fRElSMl0gICA9IDB4NWYsCisJW0lDRV9FRVAyX0dQSU9fTUFTS10gICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzFdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzJdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEVdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUxXSA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUyXSA9IDB4MDAsCiB9OwogCiAvKgpAQCAtMzQzLDcgKzM0Myw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBoYXNlMjhfaW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQgd21faW5pdHNfcGhhc2UyOFtdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB3bV9pbml0c19waGFzZTI4W10gPSB7CiAJCS8qIFRoZXNlIGNvbWUgZmlyc3QgdG8gcmVkdWNlIGluaXQgcG9wIG5vaXNlICovCiAJCTB4MWIsIDB4MDQ0LAkJLyogQURDIE11eCAoQUMnOTcgc291cmNlKSAqLwogCQkweDFjLCAweDAwQiwJCS8qIE91dCBNdXgxIChWT1VUMSA9IERBQytBVVgsIFZPVVQyID0gREFDKSAqLwpAQCAtMzgyLDcgKzM4Miw3IEBACiAKIAl1bnNpZ25lZCBpbnQgdG1wOwogCXN0cnVjdCBzbmRfYWttNHh4eCAqYWs7Ci0JdW5zaWduZWQgc2hvcnQgKnA7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgKnA7CiAJaW50IGk7CiAKIAlpY2UtPm51bV90b3RhbF9kYWNzID0gODsKQEAgLTY5NywxMCArNjk3LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV93bV9kYWMsIC0xMjcwMCwgMTAwLCAxKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV93bV9wY20sIC02NDAwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfd21fZGFjLCAtMTI3MDAsIDEwMCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfd21fcGNtLCAtNjQwMCwgNTAsIDEpOwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcGhhc2UyOF9kYWNfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHBoYXNlMjhfZGFjX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKQEAgLTgxNSw3ICs4MTUsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd21fY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIlBDTSBQbGF5YmFjayBTd2l0Y2giLApAQCAtODcwLDcgKzg3MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9waGFzZV9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Citjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfcGhhc2VfY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfUEhBU0UyMiwKIAkJLm5hbWUgPSAiVGVycmF0ZWMgUEhBU0UgMjIiLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuaCBiL3NvdW5kL3BjaS9pY2UxNzEyL3BoYXNlLmgKaW5kZXggMTNlODQxYi4uYWQzNzlhOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuaAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9waGFzZS5oCkBAIC0zMSw3ICszMSw3IEBACiAjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfUEhBU0UyOAkweDNiMTU0OTExCiAKIC8qIGVudHJ5IHBvaW50ICovCi1leHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3BoYXNlX2NhcmRzW107CitleHRlcm4gY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3BoYXNlX2NhcmRzW107CiAKIC8qIFBIQVNFMjggR1BJTyBiaXRzICovCiAjZGVmaW5lIFBIQVNFMjhfU1BJX01JU08JKDEgPDwgMjEpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9wb250aXMuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5jCmluZGV4IDZjNzRjMmQuLjk1NTI0OTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5jCkBAIC00MzQsNyArNDM0LDcgQEAKICAqLwogc3RhdGljIGludCBjc19zb3VyY2VfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKLQlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRzW10gPSB7CiAJCSJDb2F4IiwJCS8qIFJYUDAgKi8KIAkJIk9wdGljYWwiLAkvKiBSWFAxICovCiAJCSJDRCIsCQkvKiBSWFAyICovCkBAIC01NjUsMTMgKzU2NSwxMyBAQAogCXJldHVybiBjaGFuZ2VkOwogfQogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfdm9sdW1lLCAtNjQwMCwgNTAsIDEpOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3ZvbHVtZSwgLTY0MDAsIDUwLCAxKTsKIAogLyoKICAqIG1peGVycwogICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwb250aXNfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHBvbnRpc19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLmFjY2VzcyA9IChTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKQEAgLTc0MSw3ICs3NDEsNyBAQAogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBwb250aXNfaW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQgd21faW5pdHNbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgd21faW5pdHNbXSA9IHsKIAkJLyogVGhlc2UgY29tZSBmaXJzdCB0byByZWR1Y2UgaW5pdCBwb3Agbm9pc2UgKi8KIAkJV01fQURDX01VWCwJMHgwMGMwLAkvKiBBREMgbXV0ZSAqLwogCQlXTV9EQUNfTVVURSwJMHgwMDAxLAkvKiBEQUMgc29mdG11dGUgKi8KQEAgLTc1MCw3ICs3NTAsNyBAQAogCQlXTV9QT1dFUkRPV04sCTB4MDAwOCwJLyogQWxsIHBvd2VyLXVwIGV4Y2VwdCBIUCAqLwogCQlXTV9SRVNFVCwJMHgwMDAwLAkvKiByZXNldCAqLwogCX07Ci0Jc3RhdGljIHVuc2lnbmVkIHNob3J0IHdtX2luaXRzMltdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB3bV9pbml0czJbXSA9IHsKIAkJV01fTUFTVEVSX0NUUkwsCTB4MDAyMiwJLyogMjU2ZnMsIHNsYXZlIG1vZGUgKi8KIAkJV01fREFDX0lOVCwJMHgwMDIyLAkvKiBJMlMsIG5vcm1hbCBwb2xhcml0eSwgMjRiaXQgKi8KIAkJV01fQURDX0lOVCwJMHgwMDIyLAkvKiBJMlMsIG5vcm1hbCBwb2xhcml0eSwgMjRiaXQgKi8KQEAgLTc3Niw3ICs3NzYsNyBAQAogCQlXTV9EQUNfTVVURSwJMHgwMDAwLAkvKiBEQUMgdW5tdXRlICovCiAJCVdNX0FEQ19NVVgsCTB4MDAwMywJLyogQURDIHVubXV0ZSwgYm90aCBDRC9MaW5lIE9uICovCiAJfTsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBjc19pbml0c1tdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGNzX2luaXRzW10gPSB7CiAJCTB4MDQsCTB4ODAsCS8qIFJVTiwgUlhQMCAqLwogCQkweDA1LAkweDA1LAkvKiBzbGF2ZSwgMjRiaXQgKi8KIAkJMHgwMSwJMHgwMCwKQEAgLTgyNiwyNCArODI2LDI0IEBACiAgKiBoZW5jZSB0aGUgZHJpdmVyIG5lZWRzIHRvIHNldHMgdXAgaXQgcHJvcGVybHkuCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgcG9udGlzX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JMHgwOCwJLyogU1lTQ09ORjogY2xvY2sgMjU2LCBtcHU0MDEsIHNwZGlmLWluL0FEQywgMURBQyAqLwotCTB4ODAsCS8qIEFDTElOSzogSTJTICovCi0JMHhmOCwJLyogSTJTOiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KLQkweGMzLAkvKiBTUERJRjogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLwotCTB4MDcsCS8qIEdQSU9fRElSICovCi0JMHgwMCwJLyogR1BJT19ESVIxICovCi0JMHgwMCwJLyogR1BJT19ESVIyIChpZ25vcmVkKSAqLwotCTB4MGYsCS8qIEdQSU9fTUFTSyAoNC03IHJlc2VydmVkIGZvciBDUzg0MTYpICovCi0JMHhmZiwJLyogR1BJT19NQVNLMSAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSzIgKGlnbm9yZWQpICovCi0JMHgwNiwJLyogR1BJT19TVEFURSAoMC1sb3csIDEtaGlnaCwgMi1oaWdoKSAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUxICovCi0JMHgwMCwJLyogR1BJT19TVEFURTIgKGlnbm9yZWQpICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwb250aXNfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKKwlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgwOCwJLyogY2xvY2sgMjU2LCBtcHU0MDEsIHNwZGlmLWluL0FEQywgMURBQyAqLworCVtJQ0VfRUVQMl9BQ0xJTktdICAgICAgPSAweDgwLAkvKiBJMlMgKi8KKwlbSUNFX0VFUDJfSTJTXSAgICAgICAgID0gMHhmOCwJLyogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCisJW0lDRV9FRVAyX1NQRElGXSAgICAgICA9IDB4YzMsCS8qIG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KKwlbSUNFX0VFUDJfR1BJT19ESVJdICAgID0gMHgwNywKKwlbSUNFX0VFUDJfR1BJT19ESVIxXSAgID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19ESVIyXSAgID0gMHgwMCwJLyogaWdub3JlZCAqLworCVtJQ0VfRUVQMl9HUElPX01BU0tdICAgPSAweDBmLAkvKiA0LTcgcmVzZXJ2ZWQgZm9yIENTODQxNiAqLworCVtJQ0VfRUVQMl9HUElPX01BU0sxXSAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX01BU0syXSAgPSAweDAwLAkvKiBpZ25vcmVkICovCisJW0lDRV9FRVAyX0dQSU9fU1RBVEVdICA9IDB4MDYsCS8qIDAtbG93LCAxLWhpZ2gsIDItaGlnaCAqLworCVtJQ0VfRUVQMl9HUElPX1NUQVRFMV0gPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFMl0gPSAweDAwLAkvKiBpZ25vcmVkICovCiB9OwogCiAvKiBlbnRyeSBwb2ludCAqLwotc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzIwX3BvbnRpc19jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Citjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjBfcG9udGlzX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBWVDE3MjBfU1VCREVWSUNFX1BPTlRJU19NUzMwMCwKIAkJLm5hbWUgPSAiUG9udGlzIE1TMzAwIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5oIGIvc291bmQvcGNpL2ljZTE3MTIvcG9udGlzLmgKaW5kZXggZDBkMTM3OC4uMWE0MTgyNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvcG9udGlzLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvcG9udGlzLmgKQEAgLTI4LDYgKzI4LDYgQEAKIAogI2RlZmluZSBWVDE3MjBfU1VCREVWSUNFX1BPTlRJU19NUzMwMAkweDAwMDIwMDAyCS8qIGEgZHVtbXkgaWQgZm9yIE1TMzAwICovCiAKLWV4dGVybiBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICBzbmRfdnQxNzIwX3BvbnRpc19jYXJkc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjBfcG9udGlzX2NhcmRzW107CiAKICNlbmRpZiAvKiBfX1NPVU5EX1BPTlRJU19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9wcm9kaWd5MTkyLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9wcm9kaWd5MTkyLmMKaW5kZXggNDFiMjYwNS4uMzFjYzY2ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuYwpAQCAtMzU3LDE0ICszNTcsMTQgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfZGFjLCAtMTkxMjUsIDc1LCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9hZGMsIDAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfZGFjLCAtMTkxMjUsIDc1LCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9hZGMsIDAsIDE1MCwgMCk7CiAKIC8qCiAgKiBtaXhlcnMKICAqLwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3RhY19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3RhY19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCkBAIC00NzUsNyArNDc1LDcgQEAKICAqLwogc3RhdGljIGludCBfX2RldmluaXQgcHJvZGlneTE5Ml9pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzdGFjX2luaXRzX3Byb2RpZ3lbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc3RhY19pbml0c19wcm9kaWd5W10gPSB7CiAJCVNUQUM5NDZYX1JFU0VULCAwLAogLyoJCVNUQUM5NDZYX01BU1RFUl9WT0xVTUUsIDAsCiAJCVNUQUM5NDZYX0xGX1ZPTFVNRSwgMCwKQEAgLTQ4Niw3ICs0ODYsNyBAQAogCQlTVEFDOTQ2WF9MRkVfVk9MVU1FLCAwLCovCiAJCSh1bnNpZ25lZCBzaG9ydCktMQogCX07Ci0JdW5zaWduZWQgc2hvcnQgKnA7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgKnA7CiAKIAkvKiBwcm9kaWd5IDE5MiAqLwogCWljZS0+bnVtX3RvdGFsX2RhY3MgPSA2OwpAQCAtNTA2LDI1ICs1MDYsMjUgQEAKICAqIGhlbmNlIHRoZSBkcml2ZXIgbmVlZHMgdG8gc2V0cyB1cCBpdCBwcm9wZXJseS4KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwcm9kaWd5NzFfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKLQkweDJiLAkvKiBTWVNDT05GOiBjbG9jayA1MTIsIG1wdTQwMSwgc3BkaWYtaW4vQURDLCA0REFDcyAqLwotCTB4ODAsCS8qIEFDTElOSzogSTJTICovCi0JMHhmOCwJLyogSTJTOiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KLQkweGMzLAkvKiBTUERJRjogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLwotCTB4ZmYsCS8qIEdQSU9fRElSICovCi0JMHhmZiwJLyogR1BJT19ESVIxICovCi0JMHhiZiwJLyogR1BJT19ESVIyICovCi0JMHgwMCwJLyogR1BJT19NQVNLICovCi0JMHgwMCwJLyogR1BJT19NQVNLMSAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSzIgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFICovCi0JMHgwMCwJLyogR1BJT19TVEFURTEgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcHJvZGlneTcxX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJW0lDRV9FRVAyX1NZU0NPTkZdICAgICA9IDB4MmIsCS8qIGNsb2NrIDUxMiwgbXB1NDAxLCBzcGRpZi1pbi9BREMsIDREQUNzICovCisJW0lDRV9FRVAyX0FDTElOS10gICAgICA9IDB4ODAsCS8qIEkyUyAqLworCVtJQ0VfRUVQMl9JMlNdICAgICAgICAgPSAweGY4LAkvKiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KKwlbSUNFX0VFUDJfU1BESUZdICAgICAgID0gMHhjMywJLyogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLworCVtJQ0VfRUVQMl9HUElPX0RJUl0gICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX0RJUjFdICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX0RJUjJdICAgPSAweGJmLAorCVtJQ0VfRUVQMl9HUElPX01BU0tdICAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX01BU0sxXSAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX01BU0syXSAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFXSAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFMV0gPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFMl0gPSAweDAwLAogfTsKIAogCiAvKiBlbnRyeSBwb2ludCAqLwotc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3Byb2RpZ3kxOTJfY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3Byb2RpZ3kxOTJfY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTE5MlZFLAogCQkubmFtZSA9ICJBdWRpb3RyYWsgUHJvZGlneSAxOTIiLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5oIGIvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5oCmluZGV4IDk0YzgyNGUuLjJmYTJlNjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuaAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9wcm9kaWd5MTkyLmgKQEAgLTYsNiArNiw2IEBACiAKICNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZMTkyVkUJIDB4MzQ0OTUzNDUJLyogUFJPRElHWSAxOTIgVkUgKi8KIAotZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjRfcHJvZGlneTE5Ml9jYXJkc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjRfcHJvZGlneTE5Ml9jYXJkc1tdOwogCiAjZW5kaWYJLyogX19TT1VORF9QUk9ESUdZMTkyX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3Jldm8uYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3Jldm8uYwppbmRleCBiZjk4ZWEzLi4wMjVhN2U4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9yZXZvLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvcmV2by5jCkBAIC04NCwzOCArODQsMTQyIEBACiB9CiAKIC8qCisgKiBJMkMgYWNjZXNzIHRvIHRoZSBQVDIyNTggdm9sdW1lIGNvbnRyb2xsZXIgb24gR1BJTyA2LzcgKFJldm9sdXRpb24gNS4xKQorICovCisKK3N0YXRpYyB2b2lkIHJldm9faTJjX3N0YXJ0KHN0cnVjdCBzbmRfaTJjX2J1cyAqYnVzKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gYnVzLT5wcml2YXRlX2RhdGE7CisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworfQorCitzdGF0aWMgdm9pZCByZXZvX2kyY19zdG9wKHN0cnVjdCBzbmRfaTJjX2J1cyAqYnVzKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gYnVzLT5wcml2YXRlX2RhdGE7CisJc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOworfQorCitzdGF0aWMgdm9pZCByZXZvX2kyY19kaXJlY3Rpb24oc3RydWN0IHNuZF9pMmNfYnVzICpidXMsIGludCBjbG9jaywgaW50IGRhdGEpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBidXMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWFzaywgdmFsOworCisJdmFsID0gMDsKKwlpZiAoY2xvY2spCisJCXZhbCB8PSBWVDE3MjRfUkVWT19JMkNfQ0xPQ0s7CS8qIHdyaXRlIFNDTCAqLworCWlmIChkYXRhKQorCQl2YWwgfD0gVlQxNzI0X1JFVk9fSTJDX0RBVEE7CS8qIHdyaXRlIFNEQSAqLworCW1hc2sgPSBWVDE3MjRfUkVWT19JMkNfQ0xPQ0sgfCBWVDE3MjRfUkVWT19JMkNfREFUQTsKKwlpY2UtPmdwaW8uZGlyZWN0aW9uICY9IH5tYXNrOworCWljZS0+Z3Bpby5kaXJlY3Rpb24gfD0gdmFsOworCXNuZF9pY2UxNzEyX2dwaW9fc2V0X2RpcihpY2UsIGljZS0+Z3Bpby5kaXJlY3Rpb24pOworCXNuZF9pY2UxNzEyX2dwaW9fc2V0X21hc2soaWNlLCB+bWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHJldm9faTJjX3NldGxpbmVzKHN0cnVjdCBzbmRfaTJjX2J1cyAqYnVzLCBpbnQgY2xrLCBpbnQgZGF0YSkKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJaWYgKGNsaykKKwkJdmFsIHw9IFZUMTcyNF9SRVZPX0kyQ19DTE9DSzsKKwlpZiAoZGF0YSkKKwkJdmFsIHw9IFZUMTcyNF9SRVZPX0kyQ19EQVRBOworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGVfYml0cyhpY2UsCisJCQkJICAgIFZUMTcyNF9SRVZPX0kyQ19EQVRBIHwKKwkJCQkgICAgVlQxNzI0X1JFVk9fSTJDX0NMT0NLLCB2YWwpOworCXVkZWxheSg1KTsKK30KKworc3RhdGljIGludCByZXZvX2kyY19nZXRkYXRhKHN0cnVjdCBzbmRfaTJjX2J1cyAqYnVzLCBpbnQgYWNrKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gYnVzLT5wcml2YXRlX2RhdGE7CisJaW50IGJpdDsKKworCWlmIChhY2spCisJCXVkZWxheSg1KTsKKwliaXQgPSBzbmRfaWNlMTcxMl9ncGlvX3JlYWRfYml0cyhpY2UsIFZUMTcyNF9SRVZPX0kyQ19EQVRBKSA/IDEgOiAwOworCXJldHVybiBiaXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2kyY19iaXRfb3BzIHJldm81MV9iaXRfb3BzID0geworCS5zdGFydCA9IHJldm9faTJjX3N0YXJ0LAorCS5zdG9wID0gcmV2b19pMmNfc3RvcCwKKwkuZGlyZWN0aW9uID0gcmV2b19pMmNfZGlyZWN0aW9uLAorCS5zZXRsaW5lcyA9IHJldm9faTJjX3NldGxpbmVzLAorCS5nZXRkYXRhID0gcmV2b19pMmNfZ2V0ZGF0YSwKK307CisKK3N0YXRpYyBpbnQgcmV2bzUxX2kyY19pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLAorCQkJICAgc3RydWN0IHNuZF9wdDIyNTggKnB0KQoreworCWludCBlcnI7CisKKwkvKiBjcmVhdGUgdGhlIEkyQyBidXMgKi8KKwllcnIgPSBzbmRfaTJjX2J1c19jcmVhdGUoaWNlLT5jYXJkLCAiSUNFMTcyNCBHUElPNiIsIE5VTEwsICZpY2UtPmkyYyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpY2UtPmkyYy0+cHJpdmF0ZV9kYXRhID0gaWNlOworCWljZS0+aTJjLT5od19vcHMuYml0ID0gJnJldm81MV9iaXRfb3BzOworCisJLyogY3JlYXRlIHRoZSBJMkMgZGV2aWNlICovCisJZXJyID0gc25kX2kyY19kZXZpY2VfY3JlYXRlKGljZS0+aTJjLCAiUFQyMjU4IiwgMHg0MCwKKwkJCQkgICAgJmljZS0+c3BlYy5yZXZvNTEuZGV2KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXB0LT5jYXJkID0gaWNlLT5jYXJkOworCXB0LT5pMmNfYnVzID0gaWNlLT5pMmM7CisJcHQtPmkyY19kZXYgPSBpY2UtPnNwZWMucmV2bzUxLmRldjsKKwlpY2UtPnNwZWMucmV2bzUxLnB0MjI1OCA9IHB0OworCisJc25kX3B0MjI1OF9yZXNldChwdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKICAqIGluaXRpYWxpemUgdGhlIGNoaXBzIG9uIE0tQXVkaW8gUmV2b2x1dGlvbiBjYXJkcwogICovCiAKICNkZWZpbmUgQUtfREFDKHhuYW1lLHhjaCkgeyAubmFtZSA9IHhuYW1lLCAubnVtX2NoYW5uZWxzID0geGNoIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eF9kYWNfY2hhbm5lbCByZXZvNzFfZnJvbnRbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHhfZGFjX2NoYW5uZWwgcmV2bzcxX2Zyb250W10gPSB7CiAJQUtfREFDKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMikKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHhfZGFjX2NoYW5uZWwgcmV2bzcxX3N1cnJvdW5kW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4X2RhY19jaGFubmVsIHJldm83MV9zdXJyb3VuZFtdID0gewogCUFLX0RBQygiUENNIENlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAxKSwKIAlBS19EQUMoIlBDTSBMRkUgUGxheWJhY2sgVm9sdW1lIiwgMSksCiAJQUtfREFDKCJQQ00gU2lkZSBQbGF5YmFjayBWb2x1bWUiLCAyKSwKIAlBS19EQUMoIlBDTSBSZWFyIFBsYXliYWNrIFZvbHVtZSIsIDIpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eF9kYWNfY2hhbm5lbCByZXZvNTFfZGFjW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4X2RhY19jaGFubmVsIHJldm81MV9kYWNbXSA9IHsKIAlBS19EQUMoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCAyKSwKIAlBS19EQUMoIlBDTSBDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMSksCiAJQUtfREFDKCJQQ00gTEZFIFBsYXliYWNrIFZvbHVtZSIsIDEpLAogCUFLX0RBQygiUENNIFJlYXIgUGxheWJhY2sgVm9sdW1lIiwgMiksCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9ha200eHh4X2FkY19jaGFubmVsIHJldm81MV9hZGNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICpyZXZvNTFfYWRjX2lucHV0X25hbWVzW10gPSB7CisJIk1pYyIsCisJIkxpbmUiLAorCSJDRCIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eF9hZGNfY2hhbm5lbCByZXZvNTFfYWRjW10gPSB7CiAJewogCQkubmFtZSA9ICJQQ00gQ2FwdHVyZSBWb2x1bWUiLAogCQkuc3dpdGNoX25hbWUgPSAiUENNIENhcHR1cmUgU3dpdGNoIiwKLQkJLm51bV9jaGFubmVscyA9IDIKKwkJLm51bV9jaGFubmVscyA9IDIsCisJCS5pbnB1dF9uYW1lcyA9IHJldm81MV9hZGNfaW5wdXRfbmFtZXMKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fcmV2b19mcm9udCBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fcmV2b19mcm9udCBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNDM4MSwKIAkubnVtX2RhY3MgPSAyLAogCS5vcHMgPSB7CkBAIC0xMjQsNyArMjI4LDcgQEAKIAkuZGFjX2luZm8gPSByZXZvNzFfZnJvbnQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcmV2b19mcm9udF9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcmV2b19mcm9udF9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMSwKIAkuY2lmID0gMCwKIAkuZGF0YV9tYXNrID0gVlQxNzI0X1JFVk9fQ0RPVVQsCkBAIC0xMzYsNyArMjQwLDcgQEAKIAkubWFza19mbGFncyA9IDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9yZXZvX3N1cnJvdW5kIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV9yZXZvX3N1cnJvdW5kIF9fZGV2aW5pdGRhdGEgPSB7CiAJLnR5cGUgPSBTTkRfQUs0MzU1LAogCS5pZHhfb2Zmc2V0ID0gMSwKIAkubnVtX2RhY3MgPSA2LApAQCAtMTQ2LDcgKzI1MCw3IEBACiAJLmRhY19pbmZvID0gcmV2bzcxX3N1cnJvdW5kLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3Jldm9fc3Vycm91bmRfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3Jldm9fc3Vycm91bmRfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDMsCiAJLmNpZiA9IDAsCiAJLmRhdGFfbWFzayA9IFZUMTcyNF9SRVZPX0NET1VULApAQCAtMTU4LDcgKzI2Miw3IEBACiAJLm1hc2tfZmxhZ3MgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fcmV2bzUxIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV9yZXZvNTEgX19kZXZpbml0ZGF0YSA9IHsKIAkudHlwZSA9IFNORF9BSzQzNTgsCiAJLm51bV9kYWNzID0gNiwKIAkub3BzID0gewpAQCAtMTY3LDM2ICsyNzEsMjEzIEBACiAJLmRhY19pbmZvID0gcmV2bzUxX2RhYywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9yZXZvNTFfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3Jldm81MV9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMiwKIAkuY2lmID0gMCwKIAkuZGF0YV9tYXNrID0gVlQxNzI0X1JFVk9fQ0RPVVQsCiAJLmNsa19tYXNrID0gVlQxNzI0X1JFVk9fQ0NMSywKLQkuY3NfbWFzayA9IFZUMTcyNF9SRVZPX0NTMCB8IFZUMTcyNF9SRVZPX0NTMSB8IFZUMTcyNF9SRVZPX0NTMiwKLQkuY3NfYWRkciA9IFZUMTcyNF9SRVZPX0NTMSB8IFZUMTcyNF9SRVZPX0NTMiwKLQkuY3Nfbm9uZSA9IFZUMTcyNF9SRVZPX0NTMCB8IFZUMTcyNF9SRVZPX0NTMSB8IFZUMTcyNF9SRVZPX0NTMiwKKwkuY3NfbWFzayA9IFZUMTcyNF9SRVZPX0NTMCB8IFZUMTcyNF9SRVZPX0NTMSwKKwkuY3NfYWRkciA9IFZUMTcyNF9SRVZPX0NTMSwKKwkuY3Nfbm9uZSA9IFZUMTcyNF9SRVZPX0NTMCB8IFZUMTcyNF9SRVZPX0NTMSwKIAkuYWRkX2ZsYWdzID0gVlQxNzI0X1JFVk9fQ0NMSywgLyogaGlnaCBhdCBpbml0ICovCiAJLm1hc2tfZmxhZ3MgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fcmV2bzUxX2FkYyBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fcmV2bzUxX2FkYyBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNTM2NSwKIAkubnVtX2FkY3MgPSAyLAogCS5hZGNfaW5mbyA9IHJldm81MV9hZGMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcmV2bzUxX2FkY19wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcmV2bzUxX2FkY19wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMiwKIAkuY2lmID0gMCwKIAkuZGF0YV9tYXNrID0gVlQxNzI0X1JFVk9fQ0RPVVQsCiAJLmNsa19tYXNrID0gVlQxNzI0X1JFVk9fQ0NMSywKLQkuY3NfbWFzayA9IFZUMTcyNF9SRVZPX0NTMCB8IFZUMTcyNF9SRVZPX0NTMSB8IFZUMTcyNF9SRVZPX0NTMiwKLQkuY3NfYWRkciA9IFZUMTcyNF9SRVZPX0NTMCB8IFZUMTcyNF9SRVZPX0NTMiwKLQkuY3Nfbm9uZSA9IFZUMTcyNF9SRVZPX0NTMCB8IFZUMTcyNF9SRVZPX0NTMSB8IFZUMTcyNF9SRVZPX0NTMiwKKwkuY3NfbWFzayA9IFZUMTcyNF9SRVZPX0NTMCB8IFZUMTcyNF9SRVZPX0NTMSwKKwkuY3NfYWRkciA9IFZUMTcyNF9SRVZPX0NTMCwKKwkuY3Nfbm9uZSA9IFZUMTcyNF9SRVZPX0NTMCB8IFZUMTcyNF9SRVZPX0NTMSwKIAkuYWRkX2ZsYWdzID0gVlQxNzI0X1JFVk9fQ0NMSywgLyogaGlnaCBhdCBpbml0ICovCiAJLm1hc2tfZmxhZ3MgPSAwLAogfTsKIAorc3RhdGljIHN0cnVjdCBzbmRfcHQyMjU4IHB0Y19yZXZvNTFfdm9sdW1lOworCisvKiBBSzQzNTggZm9yIEFQMTkyIERBQywgQUs1Mzg1QSBmb3IgQURDICovCitzdGF0aWMgdm9pZCBhcDE5Ml9zZXRfcmF0ZV92YWwoc3RydWN0IHNuZF9ha200eHh4ICphaywgdW5zaWduZWQgaW50IHJhdGUpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBhay0+cHJpdmF0ZV9kYXRhWzBdOworCisJcmV2b19zZXRfcmF0ZV92YWwoYWssIHJhdGUpOworCisjaWYgMSAvKiBGSVhNRTogZG8gd2UgbmVlZCB0aGlzIHByb2NlZHVyZT8gKi8KKwkvKiByZXNldCBERlMgcGluIG9mIEFLNTM4NUEgZm9yIEFEQywgdG9vICovCisJLyogREZTMCAocGluIDE4KSAtLSBHUElPMTAgcGluIDc3ICovCisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGVfYml0cyhpY2UsIDEgPDwgMTAsCisJCQkJICAgIHJhdGUgPiA0ODAwMCA/ICgxIDw8IDEwKSA6IDApOworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKKyNlbmRpZgorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4X2RhY19jaGFubmVsIGFwMTkyX2RhY1tdID0geworCUFLX0RBQygiUENNIFBsYXliYWNrIFZvbHVtZSIsIDIpCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV9hcDE5MiBfX2RldmluaXRkYXRhID0geworCS50eXBlID0gU05EX0FLNDM1OCwKKwkubnVtX2RhY3MgPSAyLAorCS5vcHMgPSB7CisJCS5zZXRfcmF0ZV92YWwgPSBhcDE5Ml9zZXRfcmF0ZV92YWwKKwl9LAorCS5kYWNfaW5mbyA9IGFwMTkyX2RhYywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9hcDE5Ml9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CisJLmNhZGRyID0gMiwKKwkuY2lmID0gMCwKKwkuZGF0YV9tYXNrID0gVlQxNzI0X1JFVk9fQ0RPVVQsCisJLmNsa19tYXNrID0gVlQxNzI0X1JFVk9fQ0NMSywKKwkuY3NfbWFzayA9IFZUMTcyNF9SRVZPX0NTMCB8IFZUMTcyNF9SRVZPX0NTMywKKwkuY3NfYWRkciA9IFZUMTcyNF9SRVZPX0NTMywKKwkuY3Nfbm9uZSA9IFZUMTcyNF9SRVZPX0NTMCB8IFZUMTcyNF9SRVZPX0NTMywKKwkuYWRkX2ZsYWdzID0gVlQxNzI0X1JFVk9fQ0NMSywgLyogaGlnaCBhdCBpbml0ICovCisJLm1hc2tfZmxhZ3MgPSAwLAorfTsKKworI2lmIDAKKy8qIEZJWE1FOiBhazQxMTQgbWFrZXMgdGhlIHNvdW5kIG11Y2ggbG93ZXIgZHVlIHRvIHNvbWUgY29uZmxpY3Rpb24sCisgKiAgICAgICAgc28gbGV0J3MgZGlzYWJsZSBpdCByaWdodCBub3cuLi4KKyAqLworI2RlZmluZSBCVUlMRF9BSzQxMTRfQVAxOTIKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfQUs0MTE0X0FQMTkyCisvKiBBSzQxMTQgc3VwcG9ydCBvbiBBdWRpb3BoaWxlIDE5MiAqLworLyogQ0RUTyAocGluIDMyKSAtLSBHUElPMiBwaW4gNTIKKyAqIENEVEkgKHBpbiAzMykgLS0gR1BJTzMgcGluIDUzIChzaGFyZWQgd2l0aCBBSzQzNTgpCisgKiBDQ0xLIChwaW4gMzQpIC0tIEdQSU8xIHBpbiA1MSAoc2hhcmVkIHdpdGggQUs0MzU4KQorICogQ1NOICAocGluIDM1KSAtLSBHUElPNyBwaW4gNTkKKyAqLworI2RlZmluZSBBSzQxMTRfQUREUgkweDAwCisKK3N0YXRpYyB2b2lkIHdyaXRlX2RhdGEoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIHVuc2lnbmVkIGludCBncGlvLAorCQkgICAgICAgdW5zaWduZWQgaW50IGRhdGEsIGludCBpZHgpCit7CisJZm9yICg7IGlkeCA+PSAwOyBpZHgtLSkgeworCQkvKiBkcm9wIGNsb2NrICovCisJCWdwaW8gJj0gflZUMTcyNF9SRVZPX0NDTEs7CisJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCBncGlvKTsKKwkJdWRlbGF5KDEpOworCQkvKiBzZXQgZGF0YSAqLworCQlpZiAoZGF0YSAmICgxIDw8IGlkeCkpCisJCQlncGlvIHw9IFZUMTcyNF9SRVZPX0NET1VUOworCQllbHNlCisJCQlncGlvICY9IH5WVDE3MjRfUkVWT19DRE9VVDsKKwkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIGdwaW8pOworCQl1ZGVsYXkoMSk7CisJCS8qIHJhaXNlIGNsb2NrICovCisJCWdwaW8gfD0gVlQxNzI0X1JFVk9fQ0NMSzsKKwkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIGdwaW8pOworCQl1ZGVsYXkoMSk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciByZWFkX2RhdGEoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIHVuc2lnbmVkIGludCBncGlvLAorCQkJICAgICAgIGludCBpZHgpCit7CisJdW5zaWduZWQgY2hhciBkYXRhID0gMDsKKworCWZvciAoOyBpZHggPj0gMDsgaWR4LS0pIHsKKwkJLyogZHJvcCBjbG9jayAqLworCQlncGlvICY9IH5WVDE3MjRfUkVWT19DQ0xLOworCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgZ3Bpbyk7CisJCXVkZWxheSgxKTsKKwkJLyogcmVhZCBkYXRhICovCisJCWlmIChzbmRfaWNlMTcxMl9ncGlvX3JlYWQoaWNlKSAmIFZUMTcyNF9SRVZPX0NESU4pCisJCQlkYXRhIHw9ICgxIDw8IGlkeCk7CisJCXVkZWxheSgxKTsKKwkJLyogcmFpc2UgY2xvY2sgKi8KKwkJZ3BpbyB8PSBWVDE3MjRfUkVWT19DQ0xLOworCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgZ3Bpbyk7CisJCXVkZWxheSgxKTsKKwl9CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFwMTkyXzR3aXJlX3N0YXJ0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJdG1wID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSk7CisJdG1wIHw9IFZUMTcyNF9SRVZPX0NDTEs7IC8qIGhpZ2ggYXQgaW5pdCAqLworCXRtcCB8PSBWVDE3MjRfUkVWT19DUzA7CisJdG1wICY9IH5WVDE3MjRfUkVWT19DUzM7CisJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CisJdWRlbGF5KDEpOworCXJldHVybiB0bXA7Cit9CisKK3N0YXRpYyB2b2lkIGFwMTkyXzR3aXJlX2ZpbmlzaChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgdW5zaWduZWQgaW50IHRtcCkKK3sKKwl0bXAgfD0gVlQxNzI0X1JFVk9fQ1MzOworCXRtcCB8PSBWVDE3MjRfUkVWT19DUzA7CisJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CisJdWRlbGF5KDEpOworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKK30KKworc3RhdGljIHZvaWQgYXAxOTJfYWs0MTE0X3dyaXRlKHZvaWQgKnByaXZhdGVfZGF0YSwgdW5zaWduZWQgY2hhciBhZGRyLAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdG1wLCBhZGRyZGF0YTsKKworCXRtcCA9IGFwMTkyXzR3aXJlX3N0YXJ0KGljZSk7CisJYWRkcmRhdGEgPSAoQUs0MTE0X0FERFIgPDwgNikgfCAweDIwIHwgKGFkZHIgJiAweDFmKTsKKwlhZGRyZGF0YSA9IChhZGRyZGF0YSA8PCA4KSB8IGRhdGE7CisJd3JpdGVfZGF0YShpY2UsIHRtcCwgYWRkcmRhdGEsIDE1KTsKKwlhcDE5Ml80d2lyZV9maW5pc2goaWNlLCB0bXApOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhcDE5Ml9hazQxMTRfcmVhZCh2b2lkICpwcml2YXRlX2RhdGEsIHVuc2lnbmVkIGNoYXIgYWRkcikKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKworCXRtcCA9IGFwMTkyXzR3aXJlX3N0YXJ0KGljZSk7CisJd3JpdGVfZGF0YShpY2UsIHRtcCwgKEFLNDExNF9BRERSIDw8IDYpIHwgKGFkZHIgJiAweDFmKSwgNyk7CisJZGF0YSA9IHJlYWRfZGF0YShpY2UsIHRtcCwgNyk7CisJYXAxOTJfNHdpcmVfZmluaXNoKGljZSwgdG1wKTsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBhcDE5Ml9hazQxMTRfaW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhazQxMTRfaW5pdF92YWxzW10gPSB7CisJCUFLNDExNF9SU1QgfCBBSzQxMTRfUFdOIHwgQUs0MTE0X09DS1MwIHwgQUs0MTE0X09DS1MxLAorCQlBSzQxMTRfRElGX0kyNEkyUywKKwkJQUs0MTE0X1RYMUUsCisJCUFLNDExNF9FRkhfMTAyNCB8IEFLNDExNF9ESVQgfCBBSzQxMTRfSVBTKDEpLAorCQkwLAorCQkwCisJfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhazQxMTRfaW5pdF90eGNzYltdID0geworCQkweDQxLCAweDAyLCAweDJjLCAweDAwLCAweDAwCisJfTsKKwlzdHJ1Y3QgYWs0MTE0ICphazsKKwlpbnQgZXJyOworCisJcmV0dXJuIHNuZF9hazQxMTRfY3JlYXRlKGljZS0+Y2FyZCwKKwkJCQkgYXAxOTJfYWs0MTE0X3JlYWQsCisJCQkJIGFwMTkyX2FrNDExNF93cml0ZSwKKwkJCQkgYWs0MTE0X2luaXRfdmFscywgYWs0MTE0X2luaXRfdHhjc2IsCisJCQkJIGljZSwgJmFrKTsKK30KKyNlbmRpZiAvKiBCVUlMRF9BSzQxMTRfQVAxOTIgKi8KKwogc3RhdGljIGludCBfX2RldmluaXQgcmV2b19pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCXN0cnVjdCBzbmRfYWttNHh4eCAqYWs7CkBAIC0yMTMsNiArNDk0LDEwIEBACiAJCWljZS0+bnVtX3RvdGFsX2RhY3MgPSA2OwogCQlpY2UtPm51bV90b3RhbF9hZGNzID0gMjsKIAkJYnJlYWs7CisJY2FzZSBWVDE3MjRfU1VCREVWSUNFX0FVRElPUEhJTEUxOTI6CisJCWljZS0+bnVtX3RvdGFsX2RhY3MgPSAyOworCQlpY2UtPm51bV90b3RhbF9hZGNzID0gMjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc25kX0JVRygpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIzNSwxNCArNTIwLDI4IEBACiAJCWJyZWFrOwogCWNhc2UgVlQxNzI0X1NVQkRFVklDRV9SRVZPTFVUSU9ONTE6CiAJCWljZS0+YWttX2NvZGVjcyA9IDI7Ci0JCWlmICgoZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrLCAmYWttX3Jldm81MSwgJmFrbV9yZXZvNTFfcHJpdiwgaWNlKSkgPCAwKQorCQllcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2luaXQoYWssICZha21fcmV2bzUxLAorCQkJCQkgICAgICAgJmFrbV9yZXZvNTFfcHJpdiwgaWNlKTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCQllcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2luaXQoYWsgKyAxLCAmYWttX3Jldm81MV9hZGMsCisJCWVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfaW5pdChhaysxLCAmYWttX3Jldm81MV9hZGMsCiAJCQkJCSAgICAgICAmYWttX3Jldm81MV9hZGNfcHJpdiwgaWNlKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCQkvKiB1bm11dGUgYWxsIGNvZGVjcyAtIG5lZWRlZCEgKi8KLQkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZV9iaXRzKGljZSwgVlQxNzI0X1JFVk9fTVVURSwgVlQxNzI0X1JFVk9fTVVURSk7CisJCWVyciA9IHJldm81MV9pMmNfaW5pdChpY2UsICZwdGNfcmV2bzUxX3ZvbHVtZSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJLyogdW5tdXRlIGFsbCBjb2RlY3MgKi8KKwkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZV9iaXRzKGljZSwgVlQxNzI0X1JFVk9fTVVURSwKKwkJCQkJICAgIFZUMTcyNF9SRVZPX01VVEUpOworCQlicmVhazsKKwljYXNlIFZUMTcyNF9TVUJERVZJQ0VfQVVESU9QSElMRTE5MjoKKwkJaWNlLT5ha21fY29kZWNzID0gMTsKKwkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrLCAmYWttX2FwMTkyLCAmYWttX2FwMTkyX3ByaXYsCisJCQkJCSAgICAgICBpY2UpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCQogCQlicmVhazsKIAl9CiAKQEAgLTI1NiwxNiArNTU1LDM0IEBACiAKIAlzd2l0Y2ggKGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgewogCWNhc2UgVlQxNzI0X1NVQkRFVklDRV9SRVZPTFVUSU9ONzE6CisJCWVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfYnVpbGRfY29udHJvbHMoaWNlKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKIAljYXNlIFZUMTcyNF9TVUJERVZJQ0VfUkVWT0xVVElPTjUxOgogCQllcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2J1aWxkX2NvbnRyb2xzKGljZSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gc25kX3B0MjI1OF9idWlsZF9jb250cm9scyhpY2UtPnNwZWMucmV2bzUxLnB0MjI1OCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBWVDE3MjRfU1VCREVWSUNFX0FVRElPUEhJTEUxOTI6CisJCWVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfYnVpbGRfY29udHJvbHMoaWNlKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworI2lmZGVmIEJVSUxEX0FLNDExNF9BUDE5MgorCQllcnIgPSBhcDE5Ml9hazQxMTRfaW5pdChpY2UpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisjZW5kaWYKKwkJYnJlYWs7CiAJfQogCXJldHVybiAwOwogfQogCiAvKiBlbnRyeSBwb2ludCAqLwotc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3Jldm9fY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3Jldm9fY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfUkVWT0xVVElPTjcxLAogCQkubmFtZSA9ICJNIEF1ZGlvIFJldm9sdXRpb24tNy4xIiwKQEAgLTI4MCw1ICs1OTcsMTIgQEAKIAkJLmNoaXBfaW5pdCA9IHJldm9faW5pdCwKIAkJLmJ1aWxkX2NvbnRyb2xzID0gcmV2b19hZGRfY29udHJvbHMsCiAJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX0FVRElPUEhJTEUxOTIsCisJCS5uYW1lID0gIk0gQXVkaW8gQXVkaW9waGlsZTE5MiIsCisJCS5tb2RlbCA9ICJhcDE5MiIsCisJCS5jaGlwX2luaXQgPSByZXZvX2luaXQsCisJCS5idWlsZF9jb250cm9scyA9IHJldm9fYWRkX2NvbnRyb2xzLAorCX0sCiAJeyB9IC8qIHRlcm1pbmF0b3IgKi8KIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9yZXZvLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9yZXZvLmgKaW5kZXggZWZiYjg2ZS4uMmEyNDQ4OCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvcmV2by5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3Jldm8uaApAQCAtMjYsMTMgKzI2LDE1IEBACiAKICNkZWZpbmUgUkVWT19ERVZJQ0VfREVTQyBcCiAJCSJ7TWlkaU1hbiBNIEF1ZGlvLFJldm9sdXRpb24gNy4xfSwiXAotCQkie01pZGlNYW4gTSBBdWRpbyxSZXZvbHV0aW9uIDUuMX0sIgorCQkie01pZGlNYW4gTSBBdWRpbyxSZXZvbHV0aW9uIDUuMX0sIlwKKwkJIntNaWRpTWFuIE0gQXVkaW8sQXVkaW9waGlsZSAxOTJ9LCIKIAogI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX1JFVk9MVVRJT043MQkweDEyMTQzMDM2CiAjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfUkVWT0xVVElPTjUxCTB4MTIxNDMxMzYKKyNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9BVURJT1BISUxFMTkyCTB4MTIxNDMyMzYKIAogLyogZW50cnkgcG9pbnQgKi8KLWV4dGVybiBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfcmV2b19jYXJkc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9yZXZvX2NhcmRzW107CiAKIAogLyoKQEAgLTQyLDkgKzQ0LDEyIEBACiAjZGVmaW5lIFZUMTcyNF9SRVZPX0NDTEsJMHgwMgogI2RlZmluZSBWVDE3MjRfUkVWT19DRElOCTB4MDQJLyogbm90IHVzZWQgKi8KICNkZWZpbmUgVlQxNzI0X1JFVk9fQ0RPVVQJMHgwOAotI2RlZmluZSBWVDE3MjRfUkVWT19DUzAJCTB4MTAJLyogQUs1MzY1IGNoaXBzZWxlY3QgZm9yIFJldi4gNS4xICovCisjZGVmaW5lIFZUMTcyNF9SRVZPX0NTMAkJMHgxMAkvKiBBSzUzNjUgY2hpcHNlbGVjdCBmb3IgKHJldm81MSkgKi8KICNkZWZpbmUgVlQxNzI0X1JFVk9fQ1MxCQkweDIwCS8qIGZyb250IEFLTTQzODEgY2hpcHNlbGVjdCAqLwotI2RlZmluZSBWVDE3MjRfUkVWT19DUzIJCTB4NDAJLyogc3Vycm91bmQgQUtNNDM1NSBjaGlwc2VsZWN0ICovCisjZGVmaW5lIFZUMTcyNF9SRVZPX0NTMgkJMHg0MAkvKiBzdXJyb3VuZCBBS000MzU1IENTIChyZXZvNzEpICovCisjZGVmaW5lIFZUMTcyNF9SRVZPX0kyQ19EQVRBICAgIDB4NDAgICAgLyogSTJDOiBQVCAyMjU4IFNEQSAob24gcmV2bzUxKSAqLworI2RlZmluZSBWVDE3MjRfUkVWT19JMkNfQ0xPQ0sgICAweDgwICAgIC8qIEkyQzogUFQgMjI1OCBTQ0wgKG9uIHJldm81MSkgKi8KKyNkZWZpbmUgVlQxNzI0X1JFVk9fQ1MzCQkweDgwCS8qIEFLNDExNCBmb3IgQVAxOTIgKi8KICNkZWZpbmUgVlQxNzI0X1JFVk9fTVVURQkoMTw8MjIpCS8qIDAgPSBhbGwgbXV0ZSwgMSA9IG5vcm1hbCBvcGVyYXRpb24gKi8KIAogI2VuZGlmIC8qIF9fU09VTkRfUkVWT19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi92dDE3MjBfbW9iby5jIGIvc291bmQvcGNpL2ljZTE3MTIvdnQxNzIwX21vYm8uYwppbmRleCA3Y2EyNjNjMS4uNzJiMDYwZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvdnQxNzIwX21vYm8uYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi92dDE3MjBfbW9iby5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogCiAjaW5jbHVkZSAiaWNlMTcxMi5oIgorI2luY2x1ZGUgImVudnkyNGh0LmgiCiAjaW5jbHVkZSAidnQxNzIwX21vYm8uaCIKIAogCkBAIC01NSw0MSArNTYsNDEgQEAKIAogLyogRUVQUk9NIGltYWdlICovCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGs4eDgwMF9lZXByb21bXSBfX2RldmluaXRkYXRhID0gewotCTB4MDEsCS8qIFNZU0NPTkY6IGNsb2NrIDI1NiwgMUFEQywgMkRBQ3MgKi8KLQkweDAyLAkvKiBBQ0xJTks6IEFDTElOSywgcGFja2VkICovCi0JMHgwMCwJLyogSTJTOiAtICovCi0JMHgwMCwJLyogU1BESUY6IC0gKi8KLQkweGZmLAkvKiBHUElPX0RJUiAqLwotCTB4ZmYsCS8qIEdQSU9fRElSMSAqLwotCTB4MDAsCS8qIC0gKi8KLQkweGZmLAkvKiBHUElPX01BU0sgKi8KLQkweGZmLAkvKiBHUElPX01BU0sxICovCi0JMHgwMCwJLyogLSAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMSAqLwotCTB4MDAsCS8qIC0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGs4eDgwMF9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDAxLAkvKiBjbG9jayAyNTYsIDFBREMsIDJEQUNzICovCisJW0lDRV9FRVAyX0FDTElOS10gICAgICA9IDB4MDIsCS8qIEFDTElOSywgcGFja2VkICovCisJW0lDRV9FRVAyX0kyU10gICAgICAgICA9IDB4MDAsCS8qIC0gKi8KKwlbSUNFX0VFUDJfU1BESUZdICAgICAgID0gMHgwMCwJLyogLSAqLworCVtJQ0VfRUVQMl9HUElPX0RJUl0gICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX0RJUjFdICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX0RJUjJdICAgPSAweDAwLAkvKiAtICovCisJW0lDRV9FRVAyX0dQSU9fTUFTS10gICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzFdICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzJdICA9IDB4MDAsCS8qIC0gKi8KKwlbSUNFX0VFUDJfR1BJT19TVEFURV0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTFdID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTJdID0gMHgwMCwJLyogLSAqLwogfTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgc24yNXBfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKLQkweDAxLAkvKiBTWVNDT05GOiBjbG9jayAyNTYsIDFBREMsIDJEQUNzICovCi0JMHgwMiwJLyogQUNMSU5LOiBBQ0xJTkssIHBhY2tlZCAqLwotCTB4MDAsCS8qIEkyUzogLSAqLwotCTB4NDEsCS8qIFNQRElGOiAtICovCi0JMHhmZiwJLyogR1BJT19ESVIgKi8KLQkweGZmLAkvKiBHUElPX0RJUjEgKi8KLQkweDAwLAkvKiAtICovCi0JMHhmZiwJLyogR1BJT19NQVNLICovCi0JMHhmZiwJLyogR1BJT19NQVNLMSAqLwotCTB4MDAsCS8qIC0gKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFICovCi0JMHgwMCwJLyogR1BJT19TVEFURTEgKi8KLQkweDAwLAkvKiAtICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzbjI1cF9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDAxLAkvKiBjbG9jayAyNTYsIDFBREMsIDJEQUNzICovCisJW0lDRV9FRVAyX0FDTElOS10gICAgICA9IDB4MDIsCS8qIEFDTElOSywgcGFja2VkICovCisJW0lDRV9FRVAyX0kyU10gICAgICAgICA9IDB4MDAsCS8qIC0gKi8KKwlbSUNFX0VFUDJfU1BESUZdICAgICAgID0gMHg0MSwJLyogLSAqLworCVtJQ0VfRUVQMl9HUElPX0RJUl0gICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX0RJUjFdICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX0RJUjJdICAgPSAweDAwLAkvKiAtICovCisJW0lDRV9FRVAyX0dQSU9fTUFTS10gICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzFdICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzJdICA9IDB4MDAsCS8qIC0gKi8KKwlbSUNFX0VFUDJfR1BJT19TVEFURV0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTFdID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTJdID0gMHgwMCwJLyogLSAqLwogfTsKIAogCiAvKiBlbnRyeSBwb2ludCAqLwotc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzIwX21vYm9fY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzIwX21vYm9fY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLnN1YnZlbmRvciA9IFZUMTcyMF9TVUJERVZJQ0VfSzhYODAwLAogCQkubmFtZSA9ICJBbGJhdHJvbiBLOFg4MDAgUHJvIElJIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3Z0MTcyMF9tb2JvLmggYi9zb3VuZC9wY2kvaWNlMTcxMi92dDE3MjBfbW9iby5oCmluZGV4IDBiMWIwZWUuLjcwYWYzYWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3Z0MTcyMF9tb2JvLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvdnQxNzIwX21vYm8uaApAQCAtMzYsNiArMzYsNiBAQAogI2RlZmluZSBWVDE3MjBfU1VCREVWSUNFXzlDSlMJCTB4MGYyNzIzMjcKICNkZWZpbmUgVlQxNzIwX1NVQkRFVklDRV9TTjI1UAkJMHg5NzEyMzY1MAogCi1leHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyMF9tb2JvX2NhcmRzW107CitleHRlcm4gY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyMF9tb2JvX2NhcmRzW107CiAKICNlbmRpZiAvKiBfX1NPVU5EX1ZUMTcyMF9NT0JPX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3d0bS5jIGIvc291bmQvcGNpL2ljZTE3MTIvd3RtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3MDZiMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3d0bS5jCkBAIC0wLDAgKzEsNTQyIEBACisvKgorICoJQUxTQSBkcml2ZXIgZm9yIElDRW5zZW1ibGUgVlQxNzI0IChFbnZ5MjRIVCkKKyAqCQorICoJTG93bGV2ZWwgZnVuY3Rpb25zIGZvciBFZ28gU3lzIFdhdmV0ZXJtaW5hbCAxOTJNCisgKgorICoJCUNvcHlyaWdodCAoYykgMjAwNiBHdWVkZXogQ2xlbWVudCA8a2xlbS5kZXZAZ21haWwuY29tPgorICoJCVNvbWUgZnVuY3Rpb25zIGFyZSB0YWtlbiBmcm9tIHRoZSBQcm9kaWd5MTkyIGRyaXZlcgorICoJCXNvdXJjZQorICoJCQorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoJCisgKi8JCisKKworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKworI2luY2x1ZGUgImljZTE3MTIuaCIKKyNpbmNsdWRlICJlbnZ5MjRodC5oIgorI2luY2x1ZGUgInd0bS5oIgorI2luY2x1ZGUgInN0YWM5NDZ4LmgiCisKKworLyoKKyAqCTIqQURDIDYqREFDIG5vMSByaW5nYnVmZmVyIHIvdyBvbiBpMmMgYnVzIAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhYzk0NjBfcHV0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCBpbnQgcmVnLCAKKwkJCQkJCXVuc2lnbmVkIGNoYXIgdmFsKQoreworCXNuZF92dDE3MjRfd3JpdGVfaTJjKGljZSwgU1RBQzk0NjBfSTJDX0FERFIsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHN0YWM5NDYwX2dldChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgaW50IHJlZykKK3sKKwlyZXR1cm4gc25kX3Z0MTcyNF9yZWFkX2kyYyhpY2UsIFNUQUM5NDYwX0kyQ19BRERSLCByZWcpOworfQorCisvKgorICoJMipBREMgMipEQUMgbm8yIHJpbmdidWZmZXIgci93IG9uIGkyYyBidXMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHN0YWM5NDYwXzJfcHV0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCBpbnQgcmVnLAorCQkJCQkJdW5zaWduZWQgY2hhciB2YWwpCit7CisJc25kX3Z0MTcyNF93cml0ZV9pMmMoaWNlLCBTVEFDOTQ2MF8yX0kyQ19BRERSLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBzdGFjOTQ2MF8yX2dldChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgaW50IHJlZykKK3sKKwlyZXR1cm4gc25kX3Z0MTcyNF9yZWFkX2kyYyhpY2UsIFNUQUM5NDYwXzJfSTJDX0FERFIsIHJlZyk7Cit9CisKKworLyoKKyAqCURBQyBtdXRlIGNvbnRyb2wKKyAqLworc3RhdGljIGludCBzdGFjOTQ2MF9kYWNfbXV0ZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCSAgICAgICAJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFjOTQ2MF9kYWNfbXV0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgdmFsOworCWludCBpZHgsIGlkOworCisJaWYgKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKSB7CisJCWlkeCA9IFNUQUM5NDZYX01BU1RFUl9WT0xVTUU7CisJCWlkID0gMDsKKwl9IGVsc2UgeworCQlpZCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCQlpZHggPSBpZCArIFNUQUM5NDZYX0xGX1ZPTFVNRTsKKwl9CisJaWYgKGlkIDwgNikKKwkJdmFsID0gc3RhYzk0NjBfZ2V0KGljZSwgaWR4KTsKKwllbHNlIAorCQl2YWwgPSBzdGFjOTQ2MF8yX2dldChpY2UsaWR4IC0gNik7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAofnZhbCA+PiA3KSAmIDB4MTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFjOTQ2MF9kYWNfbXV0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgbmV3LCBvbGQ7CisJaW50IGlkLCBpZHg7CisJaW50IGNoYW5nZTsKKworCWlmIChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgeworCQlpZHggPSBTVEFDOTQ2WF9NQVNURVJfVk9MVU1FOworCQlvbGQgPSBzdGFjOTQ2MF9nZXQoaWNlLCBpZHgpOworCQluZXcgPSAofnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdPDwgNyAmIDB4ODApIHwKKwkJICAgICAgIAkJCQkJKG9sZCAmIH4weDgwKTsKKwkJY2hhbmdlID0gKG5ldyAhPSBvbGQpOworCQlpZiAoY2hhbmdlKSB7CisJCQlzdGFjOTQ2MF9wdXQoaWNlLCBpZHgsIG5ldyk7CisJCQlzdGFjOTQ2MF8yX3B1dChpY2UsIGlkeCwgbmV3KTsKKwkJfQorCX0gZWxzZSB7CisJCWlkID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJCWlkeCA9IGlkICsgU1RBQzk0NlhfTEZfVk9MVU1FOworCQlpZiAoaWQgPCA2KQorCQkJb2xkID0gc3RhYzk0NjBfZ2V0KGljZSwgaWR4KTsKKwkJZWxzZSAKKwkJCW9sZCA9IHN0YWM5NDYwXzJfZ2V0KGljZSwgaWR4IC0gNik7CisJCW5ldyA9ICh+dWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF08PCA3ICYgMHg4MCkgfAorCQkJCQkJCShvbGQgJiB+MHg4MCk7CisJCWNoYW5nZSA9IChuZXcgIT0gb2xkKTsKKwkJaWYgKGNoYW5nZSkgeworCQkJaWYgKGlkIDwgNikKKwkJCSAgICAgICAJc3RhYzk0NjBfcHV0KGljZSwgaWR4LCBuZXcpOworCQkJZWxzZQorCQkJICAgICAgIAlzdGFjOTQ2MF8yX3B1dChpY2UsIGlkeCAtIDYsIG5ldyk7CisJCX0KKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqIAlEQUMgdm9sdW1lIGF0dGVudWF0aW9uIG1peGVyIGNvbnRyb2wKKyAqLworc3RhdGljIGludCBzdGFjOTQ2MF9kYWNfdm9sX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwkJCS8qIG11dGUgKi8KKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAweDdmOwkJLyogMGRCICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzk0NjBfZGFjX3ZvbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpZHgsIGlkOworCXVuc2lnbmVkIGNoYXIgdm9sOworCisJaWYgKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKSB7CisJCWlkeCA9IFNUQUM5NDZYX01BU1RFUl9WT0xVTUU7CisJCWlkID0gMDsKKwl9IGVsc2UgeworCQlpZCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCQlpZHggPSBpZCArIFNUQUM5NDZYX0xGX1ZPTFVNRTsKKwl9CisJaWYgKGlkIDwgNikKKwkJdm9sID0gc3RhYzk0NjBfZ2V0KGljZSwgaWR4KSAmIDB4N2Y7CisJZWxzZSAKKwkJdm9sID0gc3RhYzk0NjBfMl9nZXQoaWNlLCBpZHggLSA2KSAmIDB4N2Y7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAweDdmIC0gdm9sOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YWM5NDYwX2RhY192b2xfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCSAgICAgICAJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaWR4LCBpZDsKKwl1bnNpZ25lZCBjaGFyIHRtcCwgb3ZvbCwgbnZvbDsKKwlpbnQgY2hhbmdlOworCisJaWYgKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKSB7CisJCWlkeCA9IFNUQUM5NDZYX01BU1RFUl9WT0xVTUU7CisJCW52b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwkJdG1wID0gc3RhYzk0NjBfZ2V0KGljZSwgaWR4KTsKKwkJb3ZvbCA9IDB4N2YgLSAodG1wICYgMHg3Zik7CisJCWNoYW5nZSA9IChvdm9sICE9IG52b2wpOworCQlpZiAoY2hhbmdlKSB7CisJCQkgc3RhYzk0NjBfcHV0KGljZSwgaWR4LCAoMHg3ZiAtIG52b2wpIHwgKHRtcCAmIDB4ODApKTsKKwkJCSBzdGFjOTQ2MF8yX3B1dChpY2UsIGlkeCwgKDB4N2YgLSBudm9sKSB8ICh0bXAgJiAweDgwKSk7CisJCX0KKwl9IGVsc2UgeworCQlpZCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCQlpZHggPSBpZCArIFNUQUM5NDZYX0xGX1ZPTFVNRTsKKwkJbnZvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQlpZiAoaWQgPCA2KQorCQkJdG1wID0gc3RhYzk0NjBfZ2V0KGljZSwgaWR4KTsKKwkJZWxzZSAKKwkJCXRtcCA9IHN0YWM5NDYwXzJfZ2V0KGljZSwgaWR4IC0gNik7CisJCW92b2wgPSAweDdmIC0gKHRtcCAmIDB4N2YpOworCQljaGFuZ2UgPSAob3ZvbCAhPSBudm9sKTsKKwkJaWYgKGNoYW5nZSkgeworCQkJaWYgKGlkIDwgNikKKwkJCQlzdGFjOTQ2MF9wdXQoaWNlLCBpZHgsICgweDdmIC0gbnZvbCkgfAorCQkJCQkgICAgICAgCQkodG1wICYgMHg4MCkpOworCQkJZWxzZSAKKwkJCQlzdGFjOTQ2MF8yX3B1dChpY2UsIGlkeC02LCAoMHg3ZiAtIG52b2wpIHwKKwkJCQkJICAgICAgIAkJCSh0bXAgJiAweDgwKSk7CisJCX0KKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqIEFEQyBtdXRlIGNvbnRyb2wKKyAqLworc3RhdGljIGludCBzdGFjOTQ2MF9hZGNfbXV0ZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCSAgICAgICAJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YWM5NDYwX2FkY19tdXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgY2hhciB2YWw7CisJaW50IGksIGlkOworCQorCWlkID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJaWYgKGlkID09IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCQkJdmFsID0gc3RhYzk0NjBfZ2V0KGljZSwgU1RBQzk0NlhfTUlDX0xfVk9MVU1FICsgaSk7CisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9IH52YWw+PjcgJiAweDE7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisJCQl2YWwgPSBzdGFjOTQ2MF8yX2dldChpY2UsIFNUQUM5NDZYX01JQ19MX1ZPTFVNRSArIGkpOworCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gPSB+dmFsPj43ICYgMHgxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YWM5NDYwX2FkY19tdXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgY2hhciBuZXcsIG9sZDsKKwlpbnQgaSwgcmVnLCBpZDsKKwlpbnQgY2hhbmdlOworCQorCWlkID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJaWYgKGlkID09IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCQkJcmVnID0gU1RBQzk0NlhfTUlDX0xfVk9MVU1FICsgaTsKKwkJCW9sZCA9IHN0YWM5NDYwX2dldChpY2UsIHJlZyk7CisJCQluZXcgPSAofnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldPDw3JjB4ODApIHwKKwkJCSAgICAgICAJCQkJCShvbGQmfjB4ODApOworCQkJY2hhbmdlID0gKG5ldyAhPSBvbGQpOworCQkJaWYgKGNoYW5nZSkKKwkJCQlzdGFjOTQ2MF9wdXQoaWNlLCByZWcsIG5ldyk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisJCQlyZWcgPSBTVEFDOTQ2WF9NSUNfTF9WT0xVTUUgKyBpOworCQkJb2xkID0gc3RhYzk0NjBfMl9nZXQoaWNlLCByZWcpOworCQkJbmV3ID0gKH51Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXTw8NyYweDgwKSB8CisJCQkgICAgICAgCQkJCQkob2xkJn4weDgwKTsKKwkJCWNoYW5nZSA9IChuZXcgIT0gb2xkKTsKKwkJCWlmIChjaGFuZ2UpCisJCQkJc3RhYzk0NjBfMl9wdXQoaWNlLCByZWcsIG5ldyk7CisJCX0KKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqQURDIGdhaW4gbWl4ZXIgY29udHJvbAorICovCitzdGF0aWMgaW50IHN0YWM5NDYwX2FkY192b2xfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CQkvKiAwZEIgKi8KKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAweDBmOwkvKiAyMi41ZEIgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFjOTQ2MF9hZGNfdm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGksIHJlZywgaWQ7CisJdW5zaWduZWQgY2hhciB2b2w7CisJCisJaWQgPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwlpZiAoaWQgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisJCQlyZWcgPSBTVEFDOTQ2WF9NSUNfTF9WT0xVTUUgKyBpOworCQkJdm9sID0gc3RhYzk0NjBfZ2V0KGljZSwgcmVnKSAmIDB4MGY7CisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9IDB4MGYgLSB2b2w7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisJCQlyZWcgPSBTVEFDOTQ2WF9NSUNfTF9WT0xVTUUgKyBpOworCQkJdm9sID0gc3RhYzk0NjBfMl9nZXQoaWNlLCByZWcpICYgMHgwZjsKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0gMHgwZiAtIHZvbDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFjOTQ2MF9hZGNfdm9sX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaSwgcmVnLCBpZDsKKwl1bnNpZ25lZCBjaGFyIG92b2wsIG52b2w7CisJaW50IGNoYW5nZTsKKwkKKwlpZCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCWlmIChpZCA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKwkJCXJlZyA9IFNUQUM5NDZYX01JQ19MX1ZPTFVNRSArIGk7CisJCQludm9sID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV07CisJCQlvdm9sID0gMHgwZiAtIHN0YWM5NDYwX2dldChpY2UsIHJlZyk7CisJCQljaGFuZ2UgPSAoKG92b2wgJiAweDBmKSAhPSBudm9sKTsKKwkJCWlmIChjaGFuZ2UpCisJCQkJc3RhYzk0NjBfcHV0KGljZSwgcmVnLCAoMHgwZiAtIG52b2wpIHwKKwkJCQkJICAgICAgIAkJKG92b2wgJiB+MHgwZikpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCQkJcmVnID0gU1RBQzk0NlhfTUlDX0xfVk9MVU1FICsgaTsKKwkJCW52b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXTsKKwkJCW92b2wgPSAweDBmIC0gc3RhYzk0NjBfMl9nZXQoaWNlLCByZWcpOworCQkJY2hhbmdlID0gKChvdm9sICYgMHgwZikgIT0gbnZvbCk7CisJCQlpZiAoY2hhbmdlKQorCQkJCXN0YWM5NDYwXzJfcHV0KGljZSwgcmVnLCAoMHgwZiAtIG52b2wpIHwKKwkJCQkJICAgICAgIAkJKG92b2wgJiB+MHgwZikpOworCQl9CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBNSUMgLyBMSU5FIHN3aXRjaCBmb25jdGlvbgorICovCisKK3N0YXRpYyBpbnQgc3RhYzk0NjBfbWljX3N3X2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzk0NjBfbWljX3N3X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwlpbnQgaWQ7CisJCQorCWlkID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJaWYgKGlkID09IDApCisJICAgICAgIAl2YWwgPSBzdGFjOTQ2MF9nZXQoaWNlLCBTVEFDOTQ2WF9HRU5FUkFMX1BVUlBPU0UpOworCWVsc2UKKwkgICAgICAgCXZhbCA9IHN0YWM5NDYwXzJfZ2V0KGljZSwgU1RBQzk0NlhfR0VORVJBTF9QVVJQT1NFKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IH52YWw+PjcgJiAweDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzk0NjBfbWljX3N3X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIG5ldywgb2xkOworCWludCBjaGFuZ2UsIGlkOworCisJaWQgPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwlpZiAoaWQgPT0gMCkKKwkgICAgICAgCW9sZCA9IHN0YWM5NDYwX2dldChpY2UsIFNUQUM5NDZYX0dFTkVSQUxfUFVSUE9TRSk7CisJZWxzZQorCSAgICAgICAJb2xkID0gc3RhYzk0NjBfMl9nZXQoaWNlLCBTVEFDOTQ2WF9HRU5FUkFMX1BVUlBPU0UpOworCW5ldyA9ICh+dWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF08PCA3ICYgMHg4MCkgfCAob2xkICYgfjB4ODApOworCWNoYW5nZSA9IChuZXcgIT0gb2xkKTsKKwlpZiAoY2hhbmdlKSB7CisJCWlmIChpZCA9PSAwKQorCQkgICAgICAgCXN0YWM5NDYwX3B1dChpY2UsIFNUQUM5NDZYX0dFTkVSQUxfUFVSUE9TRSwgbmV3KTsKKwkJZWxzZQorCQkgICAgICAgCXN0YWM5NDYwXzJfcHV0KGljZSwgU1RBQzk0NlhfR0VORVJBTF9QVVJQT1NFLCBuZXcpOworCX0KKwlyZXR1cm4gY2hhbmdlOworfQorCisvKgorICogQ29udHJvbCB0YWJzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGFjOTY0MF9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gc3RhYzk0NjBfZGFjX211dGVfaW5mbywKKwkJLmdldCA9IHN0YWM5NDYwX2RhY19tdXRlX2dldCwKKwkJLnB1dCA9IHN0YWM5NDYwX2RhY19tdXRlX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSAxCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwKKwkJLmluZm8gPSBzdGFjOTQ2MF9kYWNfdm9sX2luZm8sCisJCS5nZXQgPSBzdGFjOTQ2MF9kYWNfdm9sX2dldCwKKwkJLnB1dCA9IHN0YWM5NDYwX2RhY192b2xfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNSUMvTGluZSBzd2l0Y2giLAorCQkuY291bnQgPSAyLAorCQkuaW5mbyA9IHN0YWM5NDYwX21pY19zd19pbmZvLAorCQkuZ2V0ID0gc3RhYzk0NjBfbWljX3N3X2dldCwKKwkJLnB1dCA9IHN0YWM5NDYwX21pY19zd19wdXQsCisKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkRBQyBTd2l0Y2giLAorCQkuY291bnQgPSA4LAorCQkuaW5mbyA9IHN0YWM5NDYwX2RhY19tdXRlX2luZm8sCisJCS5nZXQgPSBzdGFjOTQ2MF9kYWNfbXV0ZV9nZXQsCisJCS5wdXQgPSBzdGFjOTQ2MF9kYWNfbXV0ZV9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJEQUMgVm9sdW1lIiwKKwkJLmNvdW50ID0gOCwKKwkJLmluZm8gPSBzdGFjOTQ2MF9kYWNfdm9sX2luZm8sCisJCS5nZXQgPSBzdGFjOTQ2MF9kYWNfdm9sX2dldCwKKwkJLnB1dCA9IHN0YWM5NDYwX2RhY192b2xfcHV0LAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQURDIFN3aXRjaCIsCisJCS5jb3VudCA9IDIsCisJCS5pbmZvID0gc3RhYzk0NjBfYWRjX211dGVfaW5mbywKKwkJLmdldCA9IHN0YWM5NDYwX2FkY19tdXRlX2dldCwKKwkJLnB1dCA9IHN0YWM5NDYwX2FkY19tdXRlX3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkFEQyBWb2x1bWUiLAorCQkuY291bnQgPSAyLAorCQkuaW5mbyA9IHN0YWM5NDYwX2FkY192b2xfaW5mbywKKwkJLmdldCA9IHN0YWM5NDYwX2FkY192b2xfZ2V0LAorCQkucHV0ID0gc3RhYzk0NjBfYWRjX3ZvbF9wdXQsCisKKwl9CQorfTsKKworCisKKy8qSU5JVCovCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3dG1fYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQoreworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGFjOTY0MF9jb250cm9scyk7IGkrKykgeworCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsCisJCQkJc25kX2N0bF9uZXcxKCZzdGFjOTY0MF9jb250cm9sc1tpXSwgaWNlKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHd0bV9pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQoreworCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzdGFjX2luaXRzX3Byb2RpZ3lbXSA9IHsKKwkJU1RBQzk0NlhfUkVTRVQsIDAsCisJCSh1bnNpZ25lZCBzaG9ydCktMQorCX07CisJdW5zaWduZWQgc2hvcnQgKnA7CisJCQorCS8qV1RNIDE5Mk0qLworCWljZS0+bnVtX3RvdGFsX2RhY3MgPSA4OworCWljZS0+bnVtX3RvdGFsX2FkY3MgPSA0OworCWljZS0+Zm9yY2VfcmRtYTEgPSAxOworCisJLyppbml0aWFsaXplIGNvZGVjKi8KKwlwID0gc3RhY19pbml0c19wcm9kaWd5OworCWZvciAoOyAqcCAhPSAodW5zaWduZWQgc2hvcnQpLTE7IHAgKz0gMikgeworCQlzdGFjOTQ2MF9wdXQoaWNlLCBwWzBdLCBwWzFdKTsKKwkJc3RhYzk0NjBfMl9wdXQoaWNlLCBwWzBdLCBwWzFdKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd3RtX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJMHg0NywJLypTWVNDT05GOiBjbG9jayAxOTJLSHosIDRBREMsIDhEQUMgKi8KKwkweDgwLAkvKiBBQ0xJTksgOiBJMlMgKi8KKwkweGY4LAkvKiBJMlM6IHZvbDsgOTZrLCAyNGJpdCwgMTkyayAqLworCTB4YzEJLypTUERJRjogb3V0LWVuLCBzcGlkZiBleHQgb3V0Ki8sCisJMHg5ZiwJLyogR1BJT19ESVIgKi8KKwkweGZmLAkvKiBHUElPX0RJUjEgKi8KKwkweDdmLAkvKiBHUElPX0RJUjIgKi8KKwkweDlmLAkvKiBHUElPX01BU0sgKi8KKwkweGZmLAkvKiBHUElPX01BU0sxICovCisJMHg3ZiwJLyogR1BJT19NQVNLMiAqLworCTB4MTYsCS8qIEdQSU9fU1RBVEUgKi8KKwkweDgwLAkvKiBHUElPX1NUQVRFMSAqLworCTB4MDAsCS8qIEdQSU9fU1RBVEUyICovCit9OworCisKKy8qZW50cnkgcG9pbnQqLworc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3d0bV9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkuc3VidmVuZG9yID0gVlQxNzI0X1NVQkRFVklDRV9XVE0sCisJCS5uYW1lID0gIkVTSSBXYXZldGVybWluYWwgMTkyTSIsCisJCS5tb2RlbCA9ICJXVDE5Mk0iLAorCQkuY2hpcF9pbml0ID0gd3RtX2luaXQsCisJCS5idWlsZF9jb250cm9scyA9IHd0bV9hZGRfY29udHJvbHMsCisJCS5lZXByb21fc2l6ZSA9IHNpemVvZih3dG1fZWVwcm9tKSwKKwkJLmVlcHJvbV9kYXRhID0gd3RtX2VlcHJvbSwKKwl9LAorCXt9IC8qdGVybWluYXRvciovCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvd3RtLmggYi9zb3VuZC9wY2kvaWNlMTcxMi93dG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2EzOTRlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvd3RtLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfX1NPVU5EX1dUTV9ICisjZGVmaW5lIF9fU09VTkRfV1RNX0gKKworLyogSUQgKi8KKyNkZWZpbmUgV1RNX0RFVklDRV9ERVNDCQkie0VHTyBTWVMgSU5DLFdhdmVUZXJtaW5hbCAxOTJNfSwiCisjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfV1RNCTB4MzY0OTUzNDUJLyogV1QxOTJNIHZlcjEuMCAqLworCisvKgorICpjaGlwIGFkZHJlc3NlcyBvbiBJMkMgYnVzCisgKi8KKworI2RlZmluZQlBSzQxMTRfQUREUgkJMHgyMAkvKlMvUERJRiByZWNlaXZlciovCisjZGVmaW5lIFNUQUM5NDYwX0kyQ19BRERSCTB4NTQJLyogQURDKjIgfCBEQUMqNiAqLwkKKyNkZWZpbmUgU1RBQzk0NjBfMl9JMkNfQUREUgkweDU2CS8qIEFEQ3xEQUMgKjIgKi8JCisKKworZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF93dG1fY2FyZHNbXTsKKworI2VuZGlmIC8qIF9fU09VTkRfV1RNX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ludGVsOHgwLmMgYi9zb3VuZC9wY2kvaW50ZWw4eDAuYwppbmRleCAzMGFhYTYwLi5hMjg5YWJmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaW50ZWw4eDAuYworKysgYi9zb3VuZC9wY2kvaW50ZWw4eDAuYwpAQCAtNzEsNiArNzEsNyBAQAogc3RhdGljIGludCBidWdneV9zZW1hcGhvcmU7CiBzdGF0aWMgaW50IGJ1Z2d5X2lycSA9IC0xOyAvKiBhdXRvLWNoZWNrICovCiBzdGF0aWMgaW50IHhib3g7CitzdGF0aWMgaW50IHNwZGlmX2FjbGluayA9IC0xOwogCiBtb2R1bGVfcGFyYW0oaW5kZXgsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIEludGVsIGk4eDAgc291bmRjYXJkLiIpOwpAQCAtODYsNiArODcsOCBAQAogTU9EVUxFX1BBUk1fREVTQyhidWdneV9pcnEsICJFbmFibGUgd29ya2Fyb3VuZCBmb3IgYnVnZ3kgaW50ZXJydXB0cyBvbiBzb21lIG1vdGhlcmJvYXJkcy4iKTsKIG1vZHVsZV9wYXJhbSh4Ym94LCBib29sLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoeGJveCwgIlNldCB0byAxIGZvciBYYm94LCBpZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoZSBBQyc5NyBjb2RlYyBkZXRlY3Rpb24uIik7Cittb2R1bGVfcGFyYW0oc3BkaWZfYWNsaW5rLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhzcGRpZl9hY2xpbmssICJTL1BESUYgb3ZlciBBQy1saW5rLiIpOwogCiAvKiBqdXN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCiBzdGF0aWMgaW50IGVuYWJsZTsKQEAgLTM2OCwxMiArMzcxLDggQEAKIAogCWludCBpcnE7CiAKLQl1bnNpZ25lZCBpbnQgbW1pbzsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0Jdm9pZCBfX2lvbWVtICpyZW1hcF9hZGRyOwotCXVuc2lnbmVkIGludCBibV9tbWlvOwotCXVuc2lnbmVkIGxvbmcgYm1hZGRyOwotCXZvaWQgX19pb21lbSAqcmVtYXBfYm1hZGRyOworCXZvaWQgX19pb21lbSAqYWRkcjsKKwl2b2lkIF9faW9tZW0gKmJtYWRkcjsKIAogCXN0cnVjdCBwY2lfZGV2ICpwY2k7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwpAQCAtNDQ2LDcyICs0NDUsNDggQEAKICAqICBMb3dsZXZlbCBJL08gLSBidXNtYXN0ZXIKICAqLwogCi1zdGF0aWMgdTggaWdldGJ5dGUoc3RydWN0IGludGVsOHgwICpjaGlwLCB1MzIgb2Zmc2V0KQorc3RhdGljIGlubGluZSB1OCBpZ2V0Ynl0ZShzdHJ1Y3QgaW50ZWw4eDAgKmNoaXAsIHUzMiBvZmZzZXQpCiB7Ci0JaWYgKGNoaXAtPmJtX21taW8pCi0JCXJldHVybiByZWFkYihjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOwotCWVsc2UKLQkJcmV0dXJuIGluYihjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworCXJldHVybiBpb3JlYWQ4KGNoaXAtPmJtYWRkciArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyB1MTYgaWdldHdvcmQoc3RydWN0IGludGVsOHgwICpjaGlwLCB1MzIgb2Zmc2V0KQorc3RhdGljIGlubGluZSB1MTYgaWdldHdvcmQoc3RydWN0IGludGVsOHgwICpjaGlwLCB1MzIgb2Zmc2V0KQogewotCWlmIChjaGlwLT5ibV9tbWlvKQotCQlyZXR1cm4gcmVhZHcoY2hpcC0+cmVtYXBfYm1hZGRyICsgb2Zmc2V0KTsKLQllbHNlCi0JCXJldHVybiBpbncoY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKKwlyZXR1cm4gaW9yZWFkMTYoY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKIH0KIAotc3RhdGljIHUzMiBpZ2V0ZHdvcmQoc3RydWN0IGludGVsOHgwICpjaGlwLCB1MzIgb2Zmc2V0KQorc3RhdGljIGlubGluZSB1MzIgaWdldGR3b3JkKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCkKIHsKLQlpZiAoY2hpcC0+Ym1fbW1pbykKLQkJcmV0dXJuIHJlYWRsKGNoaXAtPnJlbWFwX2JtYWRkciArIG9mZnNldCk7Ci0JZWxzZQotCQlyZXR1cm4gaW5sKGNoaXAtPmJtYWRkciArIG9mZnNldCk7CisJcmV0dXJuIGlvcmVhZDMyKGNoaXAtPmJtYWRkciArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwdXRieXRlKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCwgdTggdmFsKQorc3RhdGljIGlubGluZSB2b2lkIGlwdXRieXRlKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCwgdTggdmFsKQogewotCWlmIChjaGlwLT5ibV9tbWlvKQotCQl3cml0ZWIodmFsLCBjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOwotCWVsc2UKLQkJb3V0Yih2YWwsIGNoaXAtPmJtYWRkciArIG9mZnNldCk7CisJaW93cml0ZTgodmFsLCBjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCBpcHV0d29yZChzdHJ1Y3QgaW50ZWw4eDAgKmNoaXAsIHUzMiBvZmZzZXQsIHUxNiB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQgaXB1dHdvcmQoc3RydWN0IGludGVsOHgwICpjaGlwLCB1MzIgb2Zmc2V0LCB1MTYgdmFsKQogewotCWlmIChjaGlwLT5ibV9tbWlvKQotCQl3cml0ZXcodmFsLCBjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOwotCWVsc2UKLQkJb3V0dyh2YWwsIGNoaXAtPmJtYWRkciArIG9mZnNldCk7CisJaW93cml0ZTE2KHZhbCwgY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKIH0KIAotc3RhdGljIHZvaWQgaXB1dGR3b3JkKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCwgdTMyIHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHV0ZHdvcmQoc3RydWN0IGludGVsOHgwICpjaGlwLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQogewotCWlmIChjaGlwLT5ibV9tbWlvKQotCQl3cml0ZWwodmFsLCBjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOwotCWVsc2UKLQkJb3V0bCh2YWwsIGNoaXAtPmJtYWRkciArIG9mZnNldCk7CisJaW93cml0ZTMyKHZhbCwgY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKIH0KIAogLyoKICAqICBMb3dsZXZlbCBJL08gLSBBQyc5NyByZWdpc3RlcnMKICAqLwogCi1zdGF0aWMgdTE2IGlhZ2V0d29yZChzdHJ1Y3QgaW50ZWw4eDAgKmNoaXAsIHUzMiBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHUxNiBpYWdldHdvcmQoc3RydWN0IGludGVsOHgwICpjaGlwLCB1MzIgb2Zmc2V0KQogewotCWlmIChjaGlwLT5tbWlvKQotCQlyZXR1cm4gcmVhZHcoY2hpcC0+cmVtYXBfYWRkciArIG9mZnNldCk7Ci0JZWxzZQotCQlyZXR1cm4gaW53KGNoaXAtPmFkZHIgKyBvZmZzZXQpOworCXJldHVybiBpb3JlYWQxNihjaGlwLT5hZGRyICsgb2Zmc2V0KTsKIH0KIAotc3RhdGljIHZvaWQgaWFwdXR3b3JkKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCwgdTE2IHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpYXB1dHdvcmQoc3RydWN0IGludGVsOHgwICpjaGlwLCB1MzIgb2Zmc2V0LCB1MTYgdmFsKQogewotCWlmIChjaGlwLT5tbWlvKQotCQl3cml0ZXcodmFsLCBjaGlwLT5yZW1hcF9hZGRyICsgb2Zmc2V0KTsKLQllbHNlCi0JCW91dHcodmFsLCBjaGlwLT5hZGRyICsgb2Zmc2V0KTsKKwlpb3dyaXRlMTYodmFsLCBjaGlwLT5hZGRyICsgb2Zmc2V0KTsKIH0KIAogLyoKQEAgLTE2MDYsMTAgKzE1ODEsMTQgQEAKIAljYXNlIERFVklDRV9JTlRFTF9JQ0g0OgogCQl0YmwgPSBpbnRlbF9wY21zOwogCQl0YmxzaXplID0gQVJSQVlfU0laRShpbnRlbF9wY21zKTsKKwkJaWYgKHNwZGlmX2FjbGluaykKKwkJCXRibHNpemUtLTsKIAkJYnJlYWs7CiAJY2FzZSBERVZJQ0VfTkZPUkNFOgogCQl0YmwgPSBuZm9yY2VfcGNtczsKIAkJdGJsc2l6ZSA9IEFSUkFZX1NJWkUobmZvcmNlX3BjbXMpOworCQlpZiAoc3BkaWZfYWNsaW5rKQorCQkJdGJsc2l6ZS0tOwogCQlicmVhazsKIAljYXNlIERFVklDRV9BTEk6CiAJCXRibCA9IGFsaV9wY21zOwpAQCAtMjA2OCwyNCArMjA0NywyNiBAQAogCX07CiAKIAljaGlwLT5zcGRpZl9pZHggPSAtMTsgLyogdXNlIFBDTU9VVCAob3IgZGlzYWJsZWQpICovCi0Jc3dpdGNoIChjaGlwLT5kZXZpY2VfdHlwZSkgewotCWNhc2UgREVWSUNFX05GT1JDRToKLQkJY2hpcC0+c3BkaWZfaWR4ID0gTlZEX1NQQkFSOwotCQlicmVhazsKLQljYXNlIERFVklDRV9BTEk6Ci0JCWNoaXAtPnNwZGlmX2lkeCA9IEFMSURfQUM5N1NQRElGT1VUOwotCQlicmVhazsKLQljYXNlIERFVklDRV9JTlRFTF9JQ0g0OgotCQljaGlwLT5zcGRpZl9pZHggPSBJQ0hEX1NQQkFSOwotCQlicmVhazsKLQl9OworCWlmICghc3BkaWZfYWNsaW5rKSB7CisJCXN3aXRjaCAoY2hpcC0+ZGV2aWNlX3R5cGUpIHsKKwkJY2FzZSBERVZJQ0VfTkZPUkNFOgorCQkJY2hpcC0+c3BkaWZfaWR4ID0gTlZEX1NQQkFSOworCQkJYnJlYWs7CisJCWNhc2UgREVWSUNFX0FMSToKKwkJCWNoaXAtPnNwZGlmX2lkeCA9IEFMSURfQUM5N1NQRElGT1VUOworCQkJYnJlYWs7CisJCWNhc2UgREVWSUNFX0lOVEVMX0lDSDQ6CisJCQljaGlwLT5zcGRpZl9pZHggPSBJQ0hEX1NQQkFSOworCQkJYnJlYWs7CisJCX07CisJfQogCiAJY2hpcC0+aW5fYWM5N19pbml0ID0gMTsKIAkKIAltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CiAJYWM5Ny5wcml2YXRlX2RhdGEgPSBjaGlwOwogCWFjOTcucHJpdmF0ZV9mcmVlID0gc25kX2ludGVsOHgwX21peGVyX2ZyZWVfYWM5NzsKLQlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX1NLSVBfTU9ERU07CisJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX01PREVNIHwgQUM5N19TQ0FQX1BPV0VSX1NBVkU7CiAJaWYgKGNoaXAtPnhib3gpCiAJCWFjOTcuc2NhcHMgfD0gQUM5N19TQ0FQX0RFVEVDVF9CWV9WRU5ET1I7CiAJaWYgKGNoaXAtPmRldmljZV90eXBlICE9IERFVklDRV9BTEkpIHsKQEAgLTIyMDEsMTEgKzIxODIsMTEgQEAKIAkJaWYgKChpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSkgJiBJQ0hfU0FNUExFX0NBUCkgPT0gSUNIX1NBTVBMRV8xNl8yMCkKIAkJCWNoaXAtPnNtcDIwYml0ID0gMTsKIAl9Ci0JaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9ORk9SQ0UpIHsKKwlpZiAoY2hpcC0+ZGV2aWNlX3R5cGUgPT0gREVWSUNFX05GT1JDRSAmJiAhc3BkaWZfYWNsaW5rKSB7CiAJCS8qIDQ4a0h6IG9ubHkgKi8KIAkJY2hpcC0+aWNoZFtjaGlwLT5zcGRpZl9pZHhdLnBjbS0+cmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMDsKIAl9Ci0JaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0KSB7CisJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0ICYmICFzcGRpZl9hY2xpbmspIHsKIAkJLyogdXNlIHNsb3QgMTAvMTEgZm9yIFNQRElGICovCiAJCXUzMiB2YWw7CiAJCXZhbCA9IGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9DTlQpKSAmIH5JQ0hfUENNX1NQRElGX01BU0s7CkBAIC0yMzMzLDcgKzIzMTQsNyBAQAogCQkvKiB1bm11dGUgdGhlIG91dHB1dCBvbiBTSVM3MDEyICovCiAJCWlwdXR3b3JkKGNoaXAsIDB4NGMsIGlnZXR3b3JkKGNoaXAsIDB4NGMpIHwgMSk7CiAJfQotCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfTkZPUkNFKSB7CisJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9ORk9SQ0UgJiYgIXNwZGlmX2FjbGluaykgewogCQkvKiBlbmFibGUgU1BESUYgaW50ZXJydXB0ICovCiAJCXVuc2lnbmVkIGludCB2YWw7CiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChjaGlwLT5wY2ksIDB4NGMsICZ2YWwpOwpAQCAtMjQyNiw3ICsyNDA3LDcgQEAKIAkvKiByZXNldCBjaGFubmVscyAqLwogCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5iZGJhcnNfY291bnQ7IGkrKykKIAkJaXB1dGJ5dGUoY2hpcCwgSUNIX1JFR19PRkZfQ1IgKyBjaGlwLT5pY2hkW2ldLnJlZ19vZmZzZXQsIElDSF9SRVNFVFJFR1MpOwotCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfTkZPUkNFKSB7CisJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9ORk9SQ0UgJiYgIXNwZGlmX2FjbGluaykgewogCQkvKiBzdG9wIHRoZSBzcGRpZiBpbnRlcnJ1cHQgKi8KIAkJdW5zaWduZWQgaW50IHZhbDsKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGNoaXAtPnBjaSwgMHg0YywgJnZhbCk7CkBAIC0yNDQzLDEwICsyNDI0LDEwIEBACiAJCQlmaWxsX25vY2FjaGUoY2hpcC0+YmRiYXJzLmFyZWEsIGNoaXAtPmJkYmFycy5ieXRlcywgMCk7CiAJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+YmRiYXJzKTsKIAl9Ci0JaWYgKGNoaXAtPnJlbWFwX2FkZHIpCi0JCWlvdW5tYXAoY2hpcC0+cmVtYXBfYWRkcik7Ci0JaWYgKGNoaXAtPnJlbWFwX2JtYWRkcikKLQkJaW91bm1hcChjaGlwLT5yZW1hcF9ibWFkZHIpOworCWlmIChjaGlwLT5hZGRyKQorCQlwY2lfaW91bm1hcChjaGlwLT5wY2ksIGNoaXAtPmFkZHIpOworCWlmIChjaGlwLT5ibWFkZHIpCisJCXBjaV9pb3VubWFwKGNoaXAtPnBjaSwgY2hpcC0+Ym1hZGRyKTsKIAlwY2lfcmVsZWFzZV9yZWdpb25zKGNoaXAtPnBjaSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CiAJa2ZyZWUoY2hpcCk7CkBAIC0yNTIwLDcgKzI1MDEsNyBAQAogCXNuZF9pbnRlbDh4MF9jaGlwX2luaXQoY2hpcCwgMCk7CiAKIAkvKiByZS1pbml0aWFsaXplIG1peGVyIHN0dWZmICovCi0JaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0KSB7CisJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0ICYmICFzcGRpZl9hY2xpbmspIHsKIAkJLyogZW5hYmxlIHNlcGFyYXRlIFNESU5zIGZvciBJQ0g0ICovCiAJCWlwdXRieXRlKGNoaXAsIElDSFJFRyhTRE0pLCBjaGlwLT5zZG1fc2F2ZWQpOwogCQkvKiB1c2Ugc2xvdCAxMC8xMSBmb3IgU1BESUYgKi8KQEAgLTI3OTMsMzUgKzI3NzQsMjcgQEAKIAogCWlmIChkZXZpY2VfdHlwZSA9PSBERVZJQ0VfQUxJKSB7CiAJCS8qIEFMSTU0NTUgaGFzIG5vIGFjOTcgcmVnaW9uICovCi0JCWNoaXAtPmJtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCQljaGlwLT5ibWFkZHIgPSBwY2lfaW9tYXAocGNpLCAwLCAwKTsKIAkJZ290byBwb3J0X2luaXRlZDsKIAl9CiAKLQlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBjaSwgMikgJiBJT1JFU09VUkNFX01FTSkgewkvKiBJQ0g0IGFuZCBOZm9yY2UgKi8KLQkJY2hpcC0+bW1pbyA9IDE7Ci0JCWNoaXAtPmFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAyKTsKLQkJY2hpcC0+cmVtYXBfYWRkciA9IGlvcmVtYXBfbm9jYWNoZShjaGlwLT5hZGRyLAotCQkJCQkJICAgcGNpX3Jlc291cmNlX2xlbihwY2ksIDIpKTsKLQkJaWYgKGNoaXAtPnJlbWFwX2FkZHIgPT0gTlVMTCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKLQkJCXNuZF9pbnRlbDh4MF9mcmVlKGNoaXApOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9IGVsc2UgewotCQljaGlwLT5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwY2ksIDIpICYgSU9SRVNPVVJDRV9NRU0pIC8qIElDSDQgYW5kIE5mb3JjZSAqLworCQljaGlwLT5hZGRyID0gcGNpX2lvbWFwKHBjaSwgMiwgMCk7CisJZWxzZQorCQljaGlwLT5hZGRyID0gcGNpX2lvbWFwKHBjaSwgMCwgMCk7CisJaWYgKCFjaGlwLT5hZGRyKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CisJCXNuZF9pbnRlbDh4MF9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVJTzsKIAl9Ci0JaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwY2ksIDMpICYgSU9SRVNPVVJDRV9NRU0pIHsJLyogSUNINCAqLwotCQljaGlwLT5ibV9tbWlvID0gMTsKLQkJY2hpcC0+Ym1hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMyk7Ci0JCWNoaXAtPnJlbWFwX2JtYWRkciA9IGlvcmVtYXBfbm9jYWNoZShjaGlwLT5ibWFkZHIsCi0JCQkJCQkgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpLCAzKSk7Ci0JCWlmIChjaGlwLT5yZW1hcF9ibWFkZHIgPT0gTlVMTCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ29udHJvbGxlciBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOwotCQkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCX0gZWxzZSB7Ci0JCWNoaXAtPmJtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOworCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGNpLCAzKSAmIElPUkVTT1VSQ0VfTUVNKSAvKiBJQ0g0ICovCisJCWNoaXAtPmJtYWRkciA9IHBjaV9pb21hcChwY2ksIDMsIDApOworCWVsc2UKKwkJY2hpcC0+Ym1hZGRyID0gcGNpX2lvbWFwKHBjaSwgMSwgMCk7CisJaWYgKCFjaGlwLT5ibWFkZHIpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ29udHJvbGxlciBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOworCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FSU87CiAJfQogCiAgcG9ydF9pbml0ZWQ6CkBAIC0yOTY0LDYgKzI5MzcsMjkgQEAKIAl7IDAsIE5VTEwgfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBzcGRpZl9hY2xpbmtfZGVmYXVsdHNbXSBfX2RldmluaXRkYXRhID0geworCVNORF9QQ0lfUVVJUksoMHgxNDdiLCAweDFjMWEsICJBU1VTIEtOOCIsIDEpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIGxvb2sgdXAgd2hpdGUvYmxhY2sgbGlzdCBmb3IgU1BESUYgb3ZlciBhYy1saW5rICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjaGVja19kZWZhdWx0X3NwZGlmX2FjbGluayhzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCWNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICp3OworCisJdyA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgc3BkaWZfYWNsaW5rX2RlZmF1bHRzKTsKKwlpZiAodykgeworCQlpZiAody0+dmFsdWUpCisJCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImludGVsOHgwOiBVc2luZyBTUERJRiBvdmVyICIKKwkJCQkgICAgIkFDLUxpbmsgZm9yICVzXG4iLCB3LT5uYW1lKTsKKwkJZWxzZQorCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJpbnRlbDh4MDogVXNpbmcgaW50ZWdyYXRlZCAiCisJCQkJICAgICJTUERJRiBETUEgZm9yICVzXG4iLCB3LT5uYW1lKTsKKwkJcmV0dXJuIHctPnZhbHVlOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgc25kX2ludGVsOHgwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2ksCiAJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCiB7CkBAIC0yOTc2LDE2ICsyOTcyLDE4IEBACiAJaWYgKGNhcmQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzd2l0Y2ggKHBjaV9pZC0+ZHJpdmVyX2RhdGEpIHsKLQljYXNlIERFVklDRV9ORk9SQ0U6Ci0JCXN0cmNweShjYXJkLT5kcml2ZXIsICJORk9SQ0UiKTsKLQkJYnJlYWs7Ci0JY2FzZSBERVZJQ0VfSU5URUxfSUNINDoKLQkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIklDSDQiKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIklDSCIpOwotCQlicmVhazsKKwlpZiAoc3BkaWZfYWNsaW5rIDwgMCkKKwkJc3BkaWZfYWNsaW5rID0gY2hlY2tfZGVmYXVsdF9zcGRpZl9hY2xpbmsocGNpKTsKKworCXN0cmNweShjYXJkLT5kcml2ZXIsICJJQ0giKTsKKwlpZiAoIXNwZGlmX2FjbGluaykgeworCQlzd2l0Y2ggKHBjaV9pZC0+ZHJpdmVyX2RhdGEpIHsKKwkJY2FzZSBERVZJQ0VfTkZPUkNFOgorCQkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIk5GT1JDRSIpOworCQkJYnJlYWs7CisJCWNhc2UgREVWSUNFX0lOVEVMX0lDSDQ6CisJCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiSUNINCIpOworCQl9CiAJfQogCiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIkludGVsIElDSCIpOwpAQCAtMzAyNSw4ICszMDIzLDggQEAKIAlzbmRfaW50ZWw4eDBfcHJvY19pbml0KGNoaXApOwogCiAJc25wcmludGYoY2FyZC0+bG9uZ25hbWUsIHNpemVvZihjYXJkLT5sb25nbmFtZSksCi0JCSAiJXMgd2l0aCAlcyBhdCAlI2x4LCBpcnEgJWkiLCBjYXJkLT5zaG9ydG5hbWUsCi0JCSBzbmRfYWM5N19nZXRfc2hvcnRfbmFtZShjaGlwLT5hYzk3WzBdKSwgY2hpcC0+YWRkciwgY2hpcC0+aXJxKTsKKwkJICIlcyB3aXRoICVzIGF0IGlycSAlaSIsIGNhcmQtPnNob3J0bmFtZSwKKwkJIHNuZF9hYzk3X2dldF9zaG9ydF9uYW1lKGNoaXAtPmFjOTdbMF0pLCBjaGlwLT5pcnEpOwogCiAJaWYgKCEgYWM5N19jbG9jaykKIAkJaW50ZWw4eDBfbWVhc3VyZV9hYzk3X2Nsb2NrKGNoaXApOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ludGVsOHgwbS5jIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCmluZGV4IDA5ZGNmOTIuLmMxNTVlMWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYworKysgYi9zb3VuZC9wY2kvaW50ZWw4eDBtLmMKQEAgLTE5NiwxMiArMTk2LDggQEAKIAogCWludCBpcnE7CiAKLQl1bnNpZ25lZCBpbnQgbW1pbzsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0Jdm9pZCBfX2lvbWVtICpyZW1hcF9hZGRyOwotCXVuc2lnbmVkIGludCBibV9tbWlvOwotCXVuc2lnbmVkIGxvbmcgYm1hZGRyOwotCXZvaWQgX19pb21lbSAqcmVtYXBfYm1hZGRyOworCXZvaWQgX19pb21lbSAqYWRkcjsKKwl2b2lkIF9faW9tZW0gKmJtYWRkcjsKIAogCXN0cnVjdCBwY2lfZGV2ICpwY2k7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwpAQCAtMjUzLDcyICsyNDksNDggQEAKICAqICBMb3dsZXZlbCBJL08gLSBidXNtYXN0ZXIKICAqLwogCi1zdGF0aWMgdTggaWdldGJ5dGUoc3RydWN0IGludGVsOHgwbSAqY2hpcCwgdTMyIG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTggaWdldGJ5dGUoc3RydWN0IGludGVsOHgwbSAqY2hpcCwgdTMyIG9mZnNldCkKIHsKLQlpZiAoY2hpcC0+Ym1fbW1pbykKLQkJcmV0dXJuIHJlYWRiKGNoaXAtPnJlbWFwX2JtYWRkciArIG9mZnNldCk7Ci0JZWxzZQotCQlyZXR1cm4gaW5iKGNoaXAtPmJtYWRkciArIG9mZnNldCk7CisJcmV0dXJuIGlvcmVhZDgoY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKIH0KIAotc3RhdGljIHUxNiBpZ2V0d29yZChzdHJ1Y3QgaW50ZWw4eDBtICpjaGlwLCB1MzIgb2Zmc2V0KQorc3RhdGljIGlubGluZSB1MTYgaWdldHdvcmQoc3RydWN0IGludGVsOHgwbSAqY2hpcCwgdTMyIG9mZnNldCkKIHsKLQlpZiAoY2hpcC0+Ym1fbW1pbykKLQkJcmV0dXJuIHJlYWR3KGNoaXAtPnJlbWFwX2JtYWRkciArIG9mZnNldCk7Ci0JZWxzZQotCQlyZXR1cm4gaW53KGNoaXAtPmJtYWRkciArIG9mZnNldCk7CisJcmV0dXJuIGlvcmVhZDE2KGNoaXAtPmJtYWRkciArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyB1MzIgaWdldGR3b3JkKHN0cnVjdCBpbnRlbDh4MG0gKmNoaXAsIHUzMiBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHUzMiBpZ2V0ZHdvcmQoc3RydWN0IGludGVsOHgwbSAqY2hpcCwgdTMyIG9mZnNldCkKIHsKLQlpZiAoY2hpcC0+Ym1fbW1pbykKLQkJcmV0dXJuIHJlYWRsKGNoaXAtPnJlbWFwX2JtYWRkciArIG9mZnNldCk7Ci0JZWxzZQotCQlyZXR1cm4gaW5sKGNoaXAtPmJtYWRkciArIG9mZnNldCk7CisJcmV0dXJuIGlvcmVhZDMyKGNoaXAtPmJtYWRkciArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwdXRieXRlKHN0cnVjdCBpbnRlbDh4MG0gKmNoaXAsIHUzMiBvZmZzZXQsIHU4IHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHV0Ynl0ZShzdHJ1Y3QgaW50ZWw4eDBtICpjaGlwLCB1MzIgb2Zmc2V0LCB1OCB2YWwpCiB7Ci0JaWYgKGNoaXAtPmJtX21taW8pCi0JCXdyaXRlYih2YWwsIGNoaXAtPnJlbWFwX2JtYWRkciArIG9mZnNldCk7Ci0JZWxzZQotCQlvdXRiKHZhbCwgY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKKwlpb3dyaXRlOCh2YWwsIGNoaXAtPmJtYWRkciArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwdXR3b3JkKHN0cnVjdCBpbnRlbDh4MG0gKmNoaXAsIHUzMiBvZmZzZXQsIHUxNiB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQgaXB1dHdvcmQoc3RydWN0IGludGVsOHgwbSAqY2hpcCwgdTMyIG9mZnNldCwgdTE2IHZhbCkKIHsKLQlpZiAoY2hpcC0+Ym1fbW1pbykKLQkJd3JpdGV3KHZhbCwgY2hpcC0+cmVtYXBfYm1hZGRyICsgb2Zmc2V0KTsKLQllbHNlCi0JCW91dHcodmFsLCBjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworCWlvd3JpdGUxNih2YWwsIGNoaXAtPmJtYWRkciArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwdXRkd29yZChzdHJ1Y3QgaW50ZWw4eDBtICpjaGlwLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIGlwdXRkd29yZChzdHJ1Y3QgaW50ZWw4eDBtICpjaGlwLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQogewotCWlmIChjaGlwLT5ibV9tbWlvKQotCQl3cml0ZWwodmFsLCBjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOwotCWVsc2UKLQkJb3V0bCh2YWwsIGNoaXAtPmJtYWRkciArIG9mZnNldCk7CisJaW93cml0ZTMyKHZhbCwgY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKIH0KIAogLyoKICAqICBMb3dsZXZlbCBJL08gLSBBQyc5NyByZWdpc3RlcnMKICAqLwogCi1zdGF0aWMgdTE2IGlhZ2V0d29yZChzdHJ1Y3QgaW50ZWw4eDBtICpjaGlwLCB1MzIgb2Zmc2V0KQorc3RhdGljIGlubGluZSB1MTYgaWFnZXR3b3JkKHN0cnVjdCBpbnRlbDh4MG0gKmNoaXAsIHUzMiBvZmZzZXQpCiB7Ci0JaWYgKGNoaXAtPm1taW8pCi0JCXJldHVybiByZWFkdyhjaGlwLT5yZW1hcF9hZGRyICsgb2Zmc2V0KTsKLQllbHNlCi0JCXJldHVybiBpbncoY2hpcC0+YWRkciArIG9mZnNldCk7CisJcmV0dXJuIGlvcmVhZDE2KGNoaXAtPmFkZHIgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCBpYXB1dHdvcmQoc3RydWN0IGludGVsOHgwbSAqY2hpcCwgdTMyIG9mZnNldCwgdTE2IHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpYXB1dHdvcmQoc3RydWN0IGludGVsOHgwbSAqY2hpcCwgdTMyIG9mZnNldCwgdTE2IHZhbCkKIHsKLQlpZiAoY2hpcC0+bW1pbykKLQkJd3JpdGV3KHZhbCwgY2hpcC0+cmVtYXBfYWRkciArIG9mZnNldCk7Ci0JZWxzZQotCQlvdXR3KHZhbCwgY2hpcC0+YWRkciArIG9mZnNldCk7CisJaW93cml0ZTE2KHZhbCwgY2hpcC0+YWRkciArIG9mZnNldCk7CiB9CiAKIC8qCkBAIC04NTgsNyArODMwLDcgQEAKIAltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CiAJYWM5Ny5wcml2YXRlX2RhdGEgPSBjaGlwOwogCWFjOTcucHJpdmF0ZV9mcmVlID0gc25kX2ludGVsOHgwX21peGVyX2ZyZWVfYWM5NzsKLQlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX1NLSVBfQVVESU87CisJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX0FVRElPIHwgQUM5N19TQ0FQX1BPV0VSX1NBVkU7CiAKIAlnbG9iX3N0YSA9IGlnZXRkd29yZChjaGlwLCBJQ0hSRUcoR0xPQl9TVEEpKTsKIApAQCAtMTAxOSwxMCArOTkxLDEwIEBACiAgICAgICBfX2h3X2VuZDoKIAlpZiAoY2hpcC0+YmRiYXJzLmFyZWEpCiAJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+YmRiYXJzKTsKLQlpZiAoY2hpcC0+cmVtYXBfYWRkcikKLQkJaW91bm1hcChjaGlwLT5yZW1hcF9hZGRyKTsKLQlpZiAoY2hpcC0+cmVtYXBfYm1hZGRyKQotCQlpb3VubWFwKGNoaXAtPnJlbWFwX2JtYWRkcik7CisJaWYgKGNoaXAtPmFkZHIpCisJCXBjaV9pb3VubWFwKGNoaXAtPnBjaSwgY2hpcC0+YWRkcik7CisJaWYgKGNoaXAtPmJtYWRkcikKKwkJcGNpX2lvdW5tYXAoY2hpcC0+cGNpLCBjaGlwLT5ibWFkZHIpOwogCWlmIChjaGlwLT5pcnEgPj0gMCkKIAkJZnJlZV9pcnEoY2hpcC0+aXJxLCBjaGlwKTsKIAlwY2lfcmVsZWFzZV9yZWdpb25zKGNoaXAtPnBjaSk7CkBAIC0xMTczLDM1ICsxMTQ1LDI3IEBACiAKIAlpZiAoZGV2aWNlX3R5cGUgPT0gREVWSUNFX0FMSSkgewogCQkvKiBBTEk1NDU1IGhhcyBubyBhYzk3IHJlZ2lvbiAqLwotCQljaGlwLT5ibWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKKwkJY2hpcC0+Ym1hZGRyID0gcGNpX2lvbWFwKHBjaSwgMCwgMCk7CiAJCWdvdG8gcG9ydF9pbml0ZWQ7CiAJfQogCi0JaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwY2ksIDIpICYgSU9SRVNPVVJDRV9NRU0pIHsJLyogSUNINCBhbmQgTmZvcmNlICovCi0JCWNoaXAtPm1taW8gPSAxOwotCQljaGlwLT5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMik7Ci0JCWNoaXAtPnJlbWFwX2FkZHIgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+YWRkciwKLQkJCQkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpLCAyKSk7Ci0JCWlmIChjaGlwLT5yZW1hcF9hZGRyID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7Ci0JCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JfSBlbHNlIHsKLQkJY2hpcC0+YWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGNpLCAyKSAmIElPUkVTT1VSQ0VfTUVNKSAvKiBJQ0g0IGFuZCBOZm9yY2UgKi8KKwkJY2hpcC0+YWRkciA9IHBjaV9pb21hcChwY2ksIDIsIDApOworCWVsc2UKKwkJY2hpcC0+YWRkciA9IHBjaV9pb21hcChwY2ksIDAsIDApOworCWlmICghY2hpcC0+YWRkcikgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOworCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FSU87CiAJfQotCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGNpLCAzKSAmIElPUkVTT1VSQ0VfTUVNKSB7CS8qIElDSDQgKi8KLQkJY2hpcC0+Ym1fbW1pbyA9IDE7Ci0JCWNoaXAtPmJtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDMpOwotCQljaGlwLT5yZW1hcF9ibWFkZHIgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+Ym1hZGRyLAotCQkJCQkJICAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMykpOwotCQlpZiAoY2hpcC0+cmVtYXBfYm1hZGRyID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkNvbnRyb2xsZXIgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKLQkJCXNuZF9pbnRlbDh4MF9mcmVlKGNoaXApOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9IGVsc2UgewotCQljaGlwLT5ibWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAxKTsKKwlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBjaSwgMykgJiBJT1JFU09VUkNFX01FTSkgLyogSUNINCAqLworCQljaGlwLT5ibWFkZHIgPSBwY2lfaW9tYXAocGNpLCAzLCAwKTsKKwllbHNlCisJCWNoaXAtPmJtYWRkciA9IHBjaV9pb21hcChwY2ksIDEsIDApOworCWlmICghY2hpcC0+Ym1hZGRyKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIkNvbnRyb2xsZXIgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKKwkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRUlPOwogCX0KIAogIHBvcnRfaW5pdGVkOgpAQCAtMTMzOSw4ICsxMzAzLDggQEAKIAkKIAlzbmRfaW50ZWw4eDBtX3Byb2NfaW5pdChjaGlwKTsKIAotCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCwgaXJxICVpIiwKLQkJY2FyZC0+c2hvcnRuYW1lLCBjaGlwLT5hZGRyLCBjaGlwLT5pcnEpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCBpcnEgJWkiLAorCQljYXJkLT5zaG9ydG5hbWUsIGNoaXAtPmlycSk7CiAKIAlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jIGIvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKaW5kZXggMzQ1ZWVmZS4uMjFkMDg5OWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCisrKyBiL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KQEAgLTI2Myw3ICsyNjQsMTUgQEAKICNkZWZpbmUgQ09NTUFORF9BQ0tfREVMQVkgICAxMyAgICAgICAgIC8vIG51bWJlciBvZiBSVEMgdGlja3MgdG8gd2FpdCBmb3IgYW4gYWNrbm93bGVkZ2VtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmcm9tIHRoZSBjYXJkIGFmdGVyIHNlbmRpbmcgYSBjb21tYW5kLgogCisjZGVmaW5lIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKKworI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKICNpbmNsdWRlICJrb3JnMTIxMi1maXJtd2FyZS5oIgorc3RhdGljIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSBzdGF0aWNfZHNwX2NvZGUgPSB7CisJLmRhdGEgPSAodTggKilkc3BDb2RlLAorCS5zaXplID0gc2l6ZW9mIGRzcENvZGUKK307CisjZW5kaWYKIAogZW51bSBDbG9ja1NvdXJjZUluZGV4IHsKICAgIEsxMjEyX0NMS0lEWF9BZGF0QXQ0NF8xSyA9IDAsICAgIC8vIHNlbGVjdHMgc291cmNlIGFzIEFEQVQgYXQgNDQuMSBrSHoKQEAgLTM0NSw4ICszNTQsNiBAQAogICAgICAgICBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgZG1hX3JlYzsKIAlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgZG1hX3NoYXJlZDsKIAotICAgICAgICB1MzIgZHNwQ29kZVNpemU7Ci0KIAl1MzIgRGF0YUJ1ZnNTaXplOwogCiAgICAgICAgIHN0cnVjdCBLb3JnQXVkaW9CdWZmZXIgICogcGxheURhdGFCdWZzUHRyOwpAQCAtMTIyMyw4ICsxMjMwLDYgQEAKIAogICAgICAgICBzbmRfa29yZzEyMTJfc2V0Q2FyZFN0YXRlKGtvcmcxMjEyLCBLMTIxMl9TVEFURV9EU1BfSU5fUFJPQ0VTUyk7CiAKLSAgICAgICAgbWVtY3B5KGtvcmcxMjEyLT5kbWFfZHNwLmFyZWEsIGRzcENvZGUsIGtvcmcxMjEyLT5kc3BDb2RlU2l6ZSk7Ci0KICAgICAgICAgcmMgPSBzbmRfa29yZzEyMTJfU2VuZDEyMTJDb21tYW5kKGtvcmcxMjEyLCBLMTIxMl9EQl9TdGFydERTUERvd25sb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwcGVyV29yZFN3YXAoa29yZzEyMTItPmRtYV9kc3AuYWRkciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCk7CkBAIC0yMTU2LDYgKzIxNjEsNyBAQAogICAgICAgICB1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBpb3BvcnRfc2l6ZSwgaW9tZW1fc2l6ZSwgaW9tZW0yX3NpemU7CiAgICAgICAgIHN0cnVjdCBzbmRfa29yZzEyMTIgKiBrb3JnMTIxMjsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmRzcF9jb2RlOwogCiAgICAgICAgIHN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgb3BzID0gewogICAgICAgICAgICAgICAgIC5kZXZfZnJlZSA9IHNuZF9rb3JnMTIxMl9kZXZfZnJlZSwKQEAgLTIzMjksOCArMjMzNSw2IEBACiAKICNlbmRpZiAvLyBLMTIxMl9MQVJHRUFMTE9DCiAKLSAgICAgICAga29yZzEyMTItPmRzcENvZGVTaXplID0gc2l6ZW9mIChkc3BDb2RlKTsKLQogICAgICAgICBrb3JnMTIxMi0+Vm9sdW1lVGFibGVQaHkgPSBrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUGh5ICsKIAkJb2Zmc2V0b2Yoc3RydWN0IEtvcmdTaGFyZWRCdWZmZXIsIHZvbHVtZURhdGEpOwogICAgICAgICBrb3JnMTIxMi0+Um91dGluZ1RhYmxlUGh5ID0ga29yZzEyMTItPnNoYXJlZEJ1ZmZlclBoeSArCkBAIC0yMzM4LDE3ICsyMzQyLDQwIEBACiAgICAgICAgIGtvcmcxMjEyLT5BZGF0VGltZUNvZGVQaHkgPSBrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUGh5ICsKIAkJb2Zmc2V0b2Yoc3RydWN0IEtvcmdTaGFyZWRCdWZmZXIsIEFkYXRUaW1lQ29kZSk7CiAKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZkc3BfY29kZSwgImtvcmcvazEyMTIuZHNwIiwgJnBjaS0+ZGV2KTsKKwlpZiAoZXJyIDwgMCkgeworCQlyZWxlYXNlX2Zpcm13YXJlKGRzcF9jb2RlKTsKKyNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisJCWRzcF9jb2RlID0gJnN0YXRpY19kc3BfY29kZTsKKyNlbHNlCisJCXNuZF9wcmludGsoS0VSTl9FUlIgImZpcm13YXJlIG5vdCBhdmFpbGFibGVcbiIpOworCQlzbmRfa29yZzEyMTJfZnJlZShrb3JnMTIxMik7CisJCXJldHVybiBlcnI7CisjZW5kaWYKKwl9CisKIAlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEocGNpKSwKLQkJCQlrb3JnMTIxMi0+ZHNwQ29kZVNpemUsICZrb3JnMTIxMi0+ZG1hX2RzcCkgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImtvcmcxMjEyOiBjYW4gbm90IGFsbG9jYXRlIGRzcCBjb2RlIG1lbW9yeSAoJWQgYnl0ZXMpXG4iLCBrb3JnMTIxMi0+ZHNwQ29kZVNpemUpOworCQkJCWRzcF9jb2RlLT5zaXplLCAma29yZzEyMTItPmRtYV9kc3ApIDwgMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJrb3JnMTIxMjogY2Fubm90IGFsbG9jYXRlIGRzcCBjb2RlIG1lbW9yeSAoJXpkIGJ5dGVzKVxuIiwgZHNwX2NvZGUtPnNpemUpOwogICAgICAgICAgICAgICAgIHNuZF9rb3JnMTIxMl9mcmVlKGtvcmcxMjEyKTsKKyNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisJCWlmIChkc3BfY29kZSAhPSAmc3RhdGljX2RzcF9jb2RlKQorI2VuZGlmCisJCQlyZWxlYXNlX2Zpcm13YXJlKGRzcF9jb2RlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgICAgICAgfQogCiAgICAgICAgIEsxMjEyX0RFQlVHX1BSSU5USygiSzEyMTJfREVCVUc6IERTUCBDb2RlIGFyZWEgPSAweCVwICgweCUwOHgpICVkIGJ5dGVzIFslc11cbiIsCi0JCSAgIGtvcmcxMjEyLT5kbWFfZHNwLmFyZWEsIGtvcmcxMjEyLT5kbWFfZHNwLmFkZHIsIGtvcmcxMjEyLT5kc3BDb2RlU2l6ZSwKKwkJICAga29yZzEyMTItPmRtYV9kc3AuYXJlYSwga29yZzEyMTItPmRtYV9kc3AuYWRkciwgZHNwX2NvZGUtPnNpemUsCiAJCSAgIHN0YXRlTmFtZVtrb3JnMTIxMi0+Y2FyZFN0YXRlXSk7CiAKKwltZW1jcHkoa29yZzEyMTItPmRtYV9kc3AuYXJlYSwgZHNwX2NvZGUtPmRhdGEsIGRzcF9jb2RlLT5zaXplKTsKKworI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKKwlpZiAoZHNwX2NvZGUgIT0gJnN0YXRpY19kc3BfY29kZSkKKyNlbmRpZgorCQlyZWxlYXNlX2Zpcm13YXJlKGRzcF9jb2RlKTsKKwogCXJjID0gc25kX2tvcmcxMjEyX1NlbmQxMjEyQ29tbWFuZChrb3JnMTIxMiwgSzEyMTJfREJfUmVib290Q2FyZCwgMCwgMCwgMCwgMCk7CiAKIAlpZiAocmMpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWFlc3RybzMuYyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCmluZGV4IDZlZmU2ZDUuLjQ1MjY5MDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9tYWVzdHJvMy5jCisrKyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CkBAIC00OCw2ICs0OSw3IEBACiAjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CiAjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKIE1PRFVMRV9BVVRIT1IoIlphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+LCBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkVTUyBNYWVzdHJvMyBQQ0kiKTsKQEAgLTc2OCwyMSArNzcwLDYgQEAKIC8qCiAgKi8KIAotLyogcXVpcmsgbGlzdHMgKi8KLXN0cnVjdCBtM19xdWlyayB7Ci0JY29uc3QgY2hhciAqbmFtZTsJLyogZGV2aWNlIG5hbWUgKi8KLQl1MTYgdmVuZG9yLCBkZXZpY2U7CS8qIHN1YnN5c3RlbSBpZHMgKi8KLQlpbnQgYW1wX2dwaW87CQkvKiBncGlvIHBpbiAjICBmb3IgZXh0ZXJuYWwgYW1wLCAtMSA9IGRlZmF1bHQgKi8KLQlpbnQgaXJkYV93b3JrYXJvdW5kOwkvKiBub24temVybyBpZiBhdm9pZCB0byB0b3VjaCAweDEwIG9uIEdQSU9fRElSRUNUSU9OCi0JCQkJICAgKGUuZy4gZm9yIElyREEgb24gRGVsbCBJbnNwaXJvbnMpICovCi19OwotCi1zdHJ1Y3QgbTNfaHZfcXVpcmsgewotCXUxNiB2ZW5kb3IsIGRldmljZSwgc3Vic3lzdGVtX3ZlbmRvciwgc3Vic3lzdGVtX2RldmljZTsKLQl1MzIgY29uZmlnOwkJLyogQUxMRUdST19DT05GSUcgaGFyZHdhcmUgdm9sdW1lIGJpdHMgKi8KLQlpbnQgaXNfb21uaWJvb2s7CS8qIERvIEhQIE9tbmlCb29rIEdQSU8gbWFnaWM/ICovCi19OwotCiBzdHJ1Y3QgbTNfbGlzdCB7CiAJaW50IGN1cmxlbjsKIAlpbnQgbWVtX2FkZHI7CkBAIC04MzAsOCArODE3LDYgQEAKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCiAJc3RydWN0IHBjaV9kZXYgKnBjaTsKLQljb25zdCBzdHJ1Y3QgbTNfcXVpcmsgKnF1aXJrOwotCWNvbnN0IHN0cnVjdCBtM19odl9xdWlyayAqaHZfcXVpcms7CiAKIAlpbnQgZGFjc19hY3RpdmU7CiAJaW50IHRpbWVyX3VzZXJzOwpAQCAtODQ1LDcgKzgzMCwxMSBAQAogCXU4IHJlc2V0X3N0YXRlOwogCiAJaW50IGV4dGVybmFsX2FtcDsKLQlpbnQgYW1wX2dwaW87CisJaW50IGFtcF9ncGlvOwkvKiBncGlvIHBpbiAjICBmb3IgZXh0ZXJuYWwgYW1wLCAtMSA9IGRlZmF1bHQgKi8KKwl1bnNpZ25lZCBpbnQgaHZfY29uZmlnOwkJLyogaGFyZHdhcmUtdm9sdW1lIGNvbmZpZyBiaXRzICovCisJdW5zaWduZWQgaXJkYV93b3JrYXJvdW5kIDoxOwkvKiBhdm9pZCB0byB0b3VjaCAweDEwIG9uIEdQSU9fRElSRUNUSU9OCisJCQkJCSAgIChlLmcuIGZvciBJckRBIG9uIERlbGwgSW5zcGlyb25zKSAqLworCXVuc2lnbmVkIGlzX29tbmlib29rIDoxOwkvKiBEbyBIUCBPbW5pQm9vayBHUElPIG1hZ2ljPyAqLwogCiAJLyogbWlkaSAqLwogCXN0cnVjdCBzbmRfcmF3bWlkaSAqcm1pZGk7CkBAIC04NjQsNiArODUzLDkgQEAKICNpZmRlZiBDT05GSUdfUE0KIAl1MTYgKnN1c3BlbmRfbWVtOwogI2VuZGlmCisKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmFzc3Bfa2VybmVsX2ltYWdlOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqYXNzcF9taW5pc3JjX2ltYWdlOwogfTsKIAogLyoKQEAgLTg5MSwxMjcgKzg4MywxMDQgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNuZF9tM19pZHMpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG0zX3F1aXJrIG0zX3F1aXJrX2xpc3RbXSA9IHsKLQkvKiBwYW5hc29uaWMgQ0YtMjggInRvdWdoYm9vayIgKi8KLQl7Ci0JCS5uYW1lID0gIlBhbmFzb25pYyBDRi0yOCIsCi0JCS52ZW5kb3IgPSAweDEwZjcsCi0JCS5kZXZpY2UgPSAweDgzM2UsCi0JCS5hbXBfZ3BpbyA9IDB4MGQsCi0JfSwKLQkvKiBwYW5hc29uaWMgQ0YtNzIgInRvdWdoYm9vayIgKi8KLQl7Ci0JCS5uYW1lID0gIlBhbmFzb25pYyBDRi03MiIsCi0JCS52ZW5kb3IgPSAweDEwZjcsCi0JCS5kZXZpY2UgPSAweDgzM2QsCi0JCS5hbXBfZ3BpbyA9IDB4MGQsCi0JfSwKLQkvKiBEZWxsIEluc3Bpcm9uIDQwMDAgKi8KLQl7Ci0JCS5uYW1lID0gIkRlbGwgSW5zcGlyb24gNDAwMCIsCi0JCS52ZW5kb3IgPSAweDEwMjgsCi0JCS5kZXZpY2UgPSAweDAwYjAsCi0JCS5hbXBfZ3BpbyA9IC0xLAotCQkuaXJkYV93b3JrYXJvdW5kID0gMSwKLQl9LAotCS8qIERlbGwgSW5zcGlyb24gODAwMCAqLwotCXsKLQkJLm5hbWUgPSAiRGVsbCBJbnNwaXJvbiA4MDAwIiwKLQkJLnZlbmRvciA9IDB4MTAyOCwKLQkJLmRldmljZSA9IDB4MDBhNCwKLQkJLmFtcF9ncGlvID0gLTEsCi0JCS5pcmRhX3dvcmthcm91bmQgPSAxLAotCX0sCi0JLyogRGVsbCBJbnNwaXJvbiA4MTAwICovCi0JewotCQkubmFtZSA9ICJEZWxsIEluc3Bpcm9uIDgxMDAiLAotCQkudmVuZG9yID0gMHgxMDI4LAotCQkuZGV2aWNlID0gMHgwMGU2LAotCQkuYW1wX2dwaW8gPSAtMSwKLQkJLmlyZGFfd29ya2Fyb3VuZCA9IDEsCi0JfSwKLQkvKiBORUMgTE04MDBKLzcgKi8KLQl7Ci0JCS5uYW1lID0gIk5FQyBMTTgwMEovNyIsCi0JCS52ZW5kb3IgPSAweDEwMzMsCi0JCS5kZXZpY2UgPSAweDgwZjEsCi0JCS5hbXBfZ3BpbyA9IDB4MDMsCi0JfSwKLQkvKiBMRUdFTkQgWmhhb1lhbmcgMzEwMENGICovCi0JewotCQkubmFtZSA9ICJMRUdFTkQgWmhhb1lhbmcgMzEwMENGIiwKLQkJLnZlbmRvciA9IDB4MTUwOSwKLQkJLmRldmljZSA9IDB4MTc0MCwKLQkJLmFtcF9ncGlvID0gMHgwMywKLQl9LAotCS8qIEVORCAqLwotCXsgTlVMTCB9CitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgbTNfYW1wX3F1aXJrX2xpc3RbXSBfX2RldmluaXRkYXRhID0geworCVNORF9QQ0lfUVVJUksoMHgxMGY3LCAweDgzM2UsICJQYW5hc29uaWMgQ0YtMjgiLCAweDBkKSwKKwlTTkRfUENJX1FVSVJLKDB4MTBmNywgMHg4MzNkLCAiUGFuYXNvbmljIENGLTcyIiwgMHgwZCksCisJU05EX1BDSV9RVUlSSygweDEwMzMsIDB4ODBmMSwgIk5FQyBMTTgwMEovNyIsIDB4MDMpLAorCVNORF9QQ0lfUVVJUksoMHgxNTA5LCAweDE3NDAsICJMRUdFTkQgWmhhb1lhbmcgMzEwMENGIiwgMHgwMyksCisJeyB9IC8qIEVORCAqLwogfTsKIAotLyogVGhlc2UgdmFsdWVzIGNhbWUgZnJvbSB0aGUgV2luZG93cyBkcml2ZXIuICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG0zX2h2X3F1aXJrIG0zX2h2X3F1aXJrX2xpc3RbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBtM19pcmRhX3F1aXJrX2xpc3RbXSBfX2RldmluaXRkYXRhID0geworCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAwYjAsICJEZWxsIEluc3Bpcm9uIDQwMDAiLCAxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMGE0LCAiRGVsbCBJbnNwaXJvbiA4MDAwIiwgMSksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDBlNiwgIkRlbGwgSW5zcGlyb24gODEwMCIsIDEpLAorCXsgfSAvKiBFTkQgKi8KK307CisKKy8qIGhhcmR3YXJlIHZvbHVtZSBxdWlya3MgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBtM19odl9xdWlya19saXN0W10gX19kZXZpbml0ZGF0YSA9IHsKIAkvKiBBbGxlZ3JvIGNoaXBzICovCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgwRTExLCAweDAwMkUsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDBFMTEsIDB4MDA5NCwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MEUxMSwgMHhCMTEyLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgwRTExLCAweEIxMTQsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwM0MsIDB4MDAxMiwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTAzQywgMHgwMDE4LCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxMDNDLCAweDAwMUMsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwM0MsIDB4MDAxRCwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTAzQywgMHgwMDFFLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxMDdCLCAweDMzNTAsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwRjcsIDB4ODMzOCwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTBGNywgMHg4MzNDLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxMEY3LCAweDgzM0QsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwRjcsIDB4ODMzRSwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTBGNywgMHg4MzNGLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxM0JELCAweDEwMTgsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEzQkQsIDB4MTAxOSwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTNCRCwgMHgxMDFBLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxNEZGLCAweDBGMDMsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE0RkYsIDB4MEYwNCwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTRGRiwgMHgwRjA1LCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxNTZELCAweEI0MDAsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE1NkQsIDB4Qjc5NSwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTU2RCwgMHhCNzk3LCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxNTZELCAweEM3MDAsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwMzMsIDB4ODBGMSwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwM0MsIDB4MDAxQSwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwgLyogSFAgT21uaUJvb2sgNjEwMCAqLwotCXsgMHgxMjVELCAweDE5ODgsIDB4MTA3QiwgMHgzNDBBLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTA3QiwgMHgzNDUwLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTA5RiwgMHgzMTM0LCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTA5RiwgMHgzMTYxLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTQ0RCwgMHgzMjgwLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTQ0RCwgMHgzMjgxLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTQ0RCwgMHhDMDAyLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTQ0RCwgMHhDMDAzLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTUwOSwgMHgxNzQwLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTYxMCwgMHgwMDEwLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTA0MiwgMHgxMDQyLCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTA3QiwgMHg5NTAwLCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTRGRiwgMHgwRjA2LCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTU1OCwgMHg4NTg2LCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTYxRiwgMHgyMDExLCBIVl9DVFJMX0VOQUJMRSwgMCB9LAorCVNORF9QQ0lfUVVJUksoMHgwRTExLCAweDAwMkUsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgwRTExLCAweDAwOTQsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgwRTExLCAweEIxMTIsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgwRTExLCAweEIxMTQsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNDLCAweDAwMTIsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNDLCAweDAwMTgsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNDLCAweDAwMUMsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNDLCAweDAwMUQsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNDLCAweDAwMUUsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdCLCAweDMzNTAsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxMEY3LCAweDgzMzgsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxMEY3LCAweDgzM0MsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxMEY3LCAweDgzM0QsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxMEY3LCAweDgzM0UsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxMEY3LCAweDgzM0YsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxM0JELCAweDEwMTgsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxM0JELCAweDEwMTksIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxM0JELCAweDEwMUEsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxNEZGLCAweDBGMDMsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxNEZGLCAweDBGMDQsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxNEZGLCAweDBGMDUsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxNTZELCAweEI0MDAsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxNTZELCAweEI3OTUsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxNTZELCAweEI3OTcsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxNTZELCAweEM3MDAsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDMzLCAweDgwRjEsIE5VTEwsCisJCSAgICAgIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QgfCBSRURVQ0VEX0RFQk9VTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzQywgMHgwMDFBLCBOVUxMLCAvKiBIUCBPbW5pQm9vayA2MTAwICovCisJCSAgICAgIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QgfCBSRURVQ0VEX0RFQk9VTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA3QiwgMHgzNDBBLCBOVUxMLAorCQkgICAgICBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSksCisJU05EX1BDSV9RVUlSSygweDEwN0IsIDB4MzQ1MCwgTlVMTCwKKwkJICAgICAgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxMDlGLCAweDMxMzQsIE5VTEwsCisJCSAgICAgIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QgfCBSRURVQ0VEX0RFQk9VTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA5RiwgMHgzMTYxLCBOVUxMLAorCQkgICAgICBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSksCisJU05EX1BDSV9RVUlSSygweDE0NEQsIDB4MzI4MCwgTlVMTCwKKwkJICAgICAgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxNDRELCAweDMyODEsIE5VTEwsCisJCSAgICAgIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QgfCBSRURVQ0VEX0RFQk9VTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ0RCwgMHhDMDAyLCBOVUxMLAorCQkgICAgICBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSksCisJU05EX1BDSV9RVUlSSygweDE0NEQsIDB4QzAwMywgTlVMTCwKKwkJICAgICAgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxNTA5LCAweDE3NDAsIE5VTEwsCisJCSAgICAgIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QgfCBSRURVQ0VEX0RFQk9VTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTYxMCwgMHgwMDEwLCBOVUxMLAorCQkgICAgICBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSksCisJU05EX1BDSV9RVUlSSygweDEwNDIsIDB4MTA0MiwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdCLCAweDk1MDAsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTRGRiwgMHgwRjA2LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE1NTgsIDB4ODU4NiwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxNjFGLCAweDIwMTEsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKIAkvKiBNYWVzdHJvMyBjaGlwcyAqLwotCXsgMHgxMjVELCAweDE5OTgsIDB4MTAzQywgMHgwMDBFLCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OTgsIDB4MTAzQywgMHgwMDEwLCBIVl9DVFJMX0VOQUJMRSwgMSB9LCAvKiBIUCBPbW5pQm9vayA2MDAwICovCi0JeyAweDEyNUQsIDB4MTk5OCwgMHgxMDNDLCAweDAwMTEsIEhWX0NUUkxfRU5BQkxFLCAxIH0sIC8qIEhQIE9tbmlCb29rIDUwMCAqLwotCXsgMHgxMjVELCAweDE5OTgsIDB4MTAzQywgMHgwMDFCLCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OTgsIDB4MTA0RCwgMHg4MEE2LCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OTgsIDB4MTA0RCwgMHg4MEFBLCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OTgsIDB4MTA3QiwgMHg1MzAwLCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OTgsIDB4MTEwQSwgMHgxOTk4LCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OTgsIDB4MTNCRCwgMHgxMDE1LCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OTgsIDB4MTNCRCwgMHgxMDFDLCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OTgsIDB4MTNCRCwgMHgxODAyLCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OTgsIDB4MTU5OSwgMHgwNzE1LCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OTgsIDB4NTY0MywgMHg1NjQzLCBIVl9DVFJMX0VOQUJMRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OUEsIDB4MTQ0RCwgMHgzMjYwLCBIVl9DVFJMX0VOQUJMRSB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTlBLCAweDE0NEQsIDB4MzI2MSwgSFZfQ1RSTF9FTkFCTEUgfCBSRURVQ0VEX0RFQk9VTkNFLCAwIH0sCi0JeyAweDEyNUQsIDB4MTk5QSwgMHgxNDRELCAweEMwMDAsIEhWX0NUUkxfRU5BQkxFIHwgUkVEVUNFRF9ERUJPVU5DRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OUEsIDB4MTQ0RCwgMHhDMDAxLCBIVl9DVFJMX0VOQUJMRSB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDAgfQorCVNORF9QQ0lfUVVJUksoMHgxMDNDLCAweDAwMEUsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzQywgMHgwMDEwLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDEwM0MsIDB4MDAxMSwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNDLCAweDAwMUIsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0RCwgMHg4MEE2LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDEwNEQsIDB4ODBBQSwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdCLCAweDUzMDAsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTEwQSwgMHgxOTk4LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDEzQkQsIDB4MTAxNSwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxM0JELCAweDEwMUMsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTNCRCwgMHgxODAyLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE1OTksIDB4MDcxNSwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHg1NjQzLCAweDU2NDMsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ0RCwgMHgzMjYwLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IFJFRFVDRURfREVCT1VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxNDRELCAweDMyNjEsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgUkVEVUNFRF9ERUJPVU5DRSksCisJU05EX1BDSV9RVUlSSygweDE0NEQsIDB4QzAwMCwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUgfCBSRURVQ0VEX0RFQk9VTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ0RCwgMHhDMDAxLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IFJFRFVDRURfREVCT1VOQ0UpLAorCXsgfSAvKiBFTkQgKi8KK307CisKKy8qIEhQIE9tbmlib29rIHF1aXJrcyAqLworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIG0zX29tbmlib29rX3F1aXJrX2xpc3RbXSBfX2RldmluaXRkYXRhID0geworCVNORF9QQ0lfUVVJUktfSUQoMHgxMDNjLCAweDAwMTApLCAvKiBIUCBPbW5pQm9vayA2MDAwICovCisJU05EX1BDSV9RVUlSS19JRCgweDEwM2MsIDB4MDAxMSksIC8qIEhQIE9tbmlCb29rIDUwMCAqLworCXsgfSAvKiBFTkQgKi8KIH07CiAKIC8qCkBAIC0yMDUwLDcgKzIwMTksNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewogCQlkaXIgPSBpbncoaW8gKyBHUElPX0RJUkVDVElPTik7Ci0JCWlmICghIGNoaXAtPnF1aXJrIHx8ICEgY2hpcC0+cXVpcmstPmlyZGFfd29ya2Fyb3VuZCkKKwkJaWYgKCFjaGlwLT5pcmRhX3dvcmthcm91bmQpCiAJCQlkaXIgfD0gMHgxMDsgLyogYXNzdW1pbmcgcGNpIGJ1cyBtYXN0ZXI/ICovCiAKIAkJc25kX20zX3JlbW90ZV9jb2RlY19jb25maWcoaW8sIDApOwpAQCAtMjEzMiw2ICsyMTAxLDEwIEBACiB9CiAKIAorI2RlZmluZSBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisKKyNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisKIC8qCiAgKiBEU1AgQ29kZSBpbWFnZXMKICAqLwpAQCAtMjI2MCw2ICsyMjMzLDMwIEBACiAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpcm13YXJlIGFzc3Bfa2VybmVsID0geworCS5kYXRhID0gKHU4ICopYXNzcF9rZXJuZWxfaW1hZ2UsCisJLnNpemUgPSBzaXplb2YgYXNzcF9rZXJuZWxfaW1hZ2UKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpcm13YXJlIGFzc3BfbWluaXNyYyA9IHsKKwkuZGF0YSA9ICh1OCAqKWFzc3BfbWluaXNyY19pbWFnZSwKKwkuc2l6ZSA9IHNpemVvZiBhc3NwX21pbmlzcmNfaW1hZ2UKK307CisKKyNlbmRpZiAvKiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMICovCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfbTNfY29udmVydF9mcm9tX2xlKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpIHsgfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHNuZF9tM19jb252ZXJ0X2Zyb21fbGUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKK3sKKwlpbnQgaTsKKwl1MTYgKmRhdGEgPSAodTE2ICopZnctPmRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnctPnNpemUgLyAyOyArK2kpCisJCWxlMTZfdG9fY3B1cygmZGF0YVtpXSk7Cit9CisjZW5kaWYKKwogCiAvKgogICogaW5pdGlhbGl6ZSBBU1NQCkBAIC0yMjc0LDYgKzIyNzEsNyBAQAogc3RhdGljIHZvaWQgc25kX20zX2Fzc3BfaW5pdChzdHJ1Y3Qgc25kX20zICpjaGlwKQogewogCXVuc2lnbmVkIGludCBpOworCXUxNiAqZGF0YTsKIAogCS8qIHplcm8ga2VybmVsIGRhdGEgKi8KIAlmb3IgKGkgPSAwOyBpIDwgKFJFVl9CX0RBVEFfTUVNT1JZX1VOSVRfTEVOR1RIICogTlVNX1VOSVRTX0tFUk5FTF9EQVRBKSAvIDI7IGkrKykKQEAgLTIyOTEsMTAgKzIyODksMTAgQEAKIAkJCSAgS0RBVEFfRE1BX1hGRVIwKTsKIAogCS8qIHdyaXRlIGtlcm5lbCBpbnRvIGNvZGUgbWVtb3J5Li4gKi8KLQlmb3IgKGkgPSAwIDsgaSA8IEFSUkFZX1NJWkUoYXNzcF9rZXJuZWxfaW1hZ2UpOyBpKyspIHsKKwlkYXRhID0gKHUxNiAqKWNoaXAtPmFzc3Bfa2VybmVsX2ltYWdlLT5kYXRhOworCWZvciAoaSA9IDAgOyBpICogMiA8IGNoaXAtPmFzc3Bfa2VybmVsX2ltYWdlLT5zaXplOyBpKyspIHsKIAkJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9DT0RFLCAKLQkJCQkgIFJFVl9CX0NPREVfTUVNT1JZX0JFR0lOICsgaSwgCi0JCQkJICBhc3NwX2tlcm5lbF9pbWFnZVtpXSk7CisJCQkJICBSRVZfQl9DT0RFX01FTU9SWV9CRUdJTiArIGksIGRhdGFbaV0pOwogCX0KIAogCS8qCkBAIC0yMzAzLDEwICsyMzAxLDEwIEBACiAJICogZHJvcCBpdCB0aGVyZS4gIEl0IHNlZW1zIHRoYXQgdGhlIG1pbmlzcmMgZG9lc24ndAogCSAqIG5lZWQgdmVjdG9ycywgc28gd2Ugd29uJ3QgYm90aGVyIHdpdGggdGhlbS4uCiAJICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXNzcF9taW5pc3JjX2ltYWdlKTsgaSsrKSB7CisJZGF0YSA9ICh1MTYgKiljaGlwLT5hc3NwX21pbmlzcmNfaW1hZ2UtPmRhdGE7CisJZm9yIChpID0gMDsgaSAqIDIgPCBjaGlwLT5hc3NwX21pbmlzcmNfaW1hZ2UtPnNpemU7IGkrKykgewogCQlzbmRfbTNfYXNzcF93cml0ZShjaGlwLCBNRU1UWVBFX0lOVEVSTkFMX0NPREUsIAotCQkJCSAgMHg0MDAgKyBpLCAKLQkJCQkgIGFzc3BfbWluaXNyY19pbWFnZVtpXSk7CisJCQkJICAweDQwMCArIGksIGRhdGFbaV0pOwogCX0KIAogCS8qCkBAIC0yNDQ0LDcgKzI0NDIsNyBAQAogCSAgICAgICBESVNBQkxFX0xFR0FDWSk7CiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgUENJX0xFR0FDWV9BVURJT19DVFJMLCB3KTsKIAotCWlmIChjaGlwLT5odl9xdWlyayAmJiBjaGlwLT5odl9xdWlyay0+aXNfb21uaWJvb2spIHsKKwlpZiAoY2hpcC0+aXNfb21uaWJvb2spIHsKIAkJLyoKIAkJICogVm9sdW1lIGJ1dHRvbnMgb24gc29tZSBIUCBPbW5pQm9vayBsYXB0b3BzIGRvbid0IHdvcmsKIAkJICogY29ycmVjdGx5LiBUaGlzIG1ha2VzIHRoZW0gd29yayBmb3IgdGhlIG1vc3QgcGFydC4KQEAgLTI0NjEsOCArMjQ1OSw3IEBACiAJfQogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9BTExFR1JPX0NPTkZJRywgJm4pOwogCW4gJj0gfihIVl9DVFJMX0VOQUJMRSB8IFJFRFVDRURfREVCT1VOQ0UgfCBIVl9CVVRUT05fRlJPTV9HRCk7Ci0JaWYgKGNoaXAtPmh2X3F1aXJrKQotCQluIHw9IGNoaXAtPmh2X3F1aXJrLT5jb25maWc7CisJbiB8PSBjaGlwLT5odl9jb25maWc7CiAJLyogRm9yIHNvbWUgcmVhc29uIHdlIG11c3QgYWx3YXlzIHVzZSByZWR1Y2VkIGRlYm91bmNlLiAqLwogCW4gfD0gUkVEVUNFRF9ERUJPVU5DRTsKIAluIHw9IFBNX0NUUkxfRU5BQkxFIHwgQ0xLX0RJVl9CWV80OSB8IFVTRV9QQ0lfVElNSU5HOwpAQCAtMjUxMCw3ICsyNTA3LDcgQEAKIAogCS8qIFRPRE86IE1QVTQwMSBub3Qgc3VwcG9ydGVkIHlldCAqLwogCXZhbCA9IEFTU1BfSU5UX0VOQUJMRSAvKnwgTVBVNDAxX0lOVF9FTkFCTEUqLzsKLQlpZiAoY2hpcC0+aHZfcXVpcmsgJiYgKGNoaXAtPmh2X3F1aXJrLT5jb25maWcgJiBIVl9DVFJMX0VOQUJMRSkpCisJaWYgKGNoaXAtPmh2X2NvbmZpZyAmIEhWX0NUUkxfRU5BQkxFKQogCQl2YWwgfD0gSFZfSU5UX0VOQUJMRTsKIAlvdXR3KHZhbCwgaW8gKyBIT1NUX0lOVF9DVFJMKTsKIAlvdXRiKGluYihpbyArIEFTU1BfQ09OVFJPTF9DKSB8IEFTU1BfSE9TVF9JTlRfRU5BQkxFLApAQCAtMjU1Myw2ICsyNTUwLDE1IEBACiAJaWYgKGNoaXAtPmlvYmFzZSkKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOwogCisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCWlmIChjaGlwLT5hc3NwX2tlcm5lbF9pbWFnZSAhPSAmYXNzcF9rZXJuZWwpCisjZW5kaWYKKwkJcmVsZWFzZV9maXJtd2FyZShjaGlwLT5hc3NwX2tlcm5lbF9pbWFnZSk7CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCWlmIChjaGlwLT5hc3NwX21pbmlzcmNfaW1hZ2UgIT0gJmFzc3BfbWluaXNyYykKKyNlbmRpZgorCQlyZWxlYXNlX2Zpcm13YXJlKGNoaXAtPmFzc3BfbWluaXNyY19pbWFnZSk7CisKIAlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKIAlrZnJlZShjaGlwKTsKIAlyZXR1cm4gMDsKQEAgLTI2NjUsOCArMjY3MSw3IEBACiB7CiAJc3RydWN0IHNuZF9tMyAqY2hpcDsKIAlpbnQgaSwgZXJyOwotCWNvbnN0IHN0cnVjdCBtM19xdWlyayAqcXVpcms7Ci0JY29uc3Qgc3RydWN0IG0zX2h2X3F1aXJrICpodl9xdWlyazsKKwljb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqcXVpcms7CiAJc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlX29wcyBvcHMgPSB7CiAJCS5kZXZfZnJlZSA9CXNuZF9tM19kZXZfZnJlZSwKIAl9OwpAQCAtMjcwNiwzNCArMjcxMSwzMiBAQAogCWNoaXAtPnBjaSA9IHBjaTsKIAljaGlwLT5pcnEgPSAtMTsKIAotCWZvciAocXVpcmsgPSBtM19xdWlya19saXN0OyBxdWlyay0+dmVuZG9yOyBxdWlyaysrKSB7Ci0JCWlmIChwY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gcXVpcmstPnZlbmRvciAmJgotCQkgICAgcGNpLT5zdWJzeXN0ZW1fZGV2aWNlID09IHF1aXJrLT5kZXZpY2UpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIm1hZXN0cm8zOiBlbmFibGVkIGhhY2sgZm9yICclcydcbiIsIHF1aXJrLT5uYW1lKTsKLQkJCWNoaXAtPnF1aXJrID0gcXVpcms7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWZvciAoaHZfcXVpcmsgPSBtM19odl9xdWlya19saXN0OyBodl9xdWlyay0+dmVuZG9yOyBodl9xdWlyaysrKSB7Ci0JCWlmIChwY2ktPnZlbmRvciA9PSBodl9xdWlyay0+dmVuZG9yICYmCi0JCSAgICBwY2ktPmRldmljZSA9PSBodl9xdWlyay0+ZGV2aWNlICYmCi0JCSAgICBwY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gaHZfcXVpcmstPnN1YnN5c3RlbV92ZW5kb3IgJiYKLQkJICAgIHBjaS0+c3Vic3lzdGVtX2RldmljZSA9PSBodl9xdWlyay0+c3Vic3lzdGVtX2RldmljZSkgewotCQkJY2hpcC0+aHZfcXVpcmsgPSBodl9xdWlyazsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCiAJY2hpcC0+ZXh0ZXJuYWxfYW1wID0gZW5hYmxlX2FtcDsKIAlpZiAoYW1wX2dwaW8gPj0gMCAmJiBhbXBfZ3BpbyA8PSAweDBmKQogCQljaGlwLT5hbXBfZ3BpbyA9IGFtcF9ncGlvOwotCWVsc2UgaWYgKGNoaXAtPnF1aXJrICYmIGNoaXAtPnF1aXJrLT5hbXBfZ3BpbyA+PSAwKQotCQljaGlwLT5hbXBfZ3BpbyA9IGNoaXAtPnF1aXJrLT5hbXBfZ3BpbzsKLQllbHNlIGlmIChjaGlwLT5hbGxlZ3JvX2ZsYWcpCi0JCWNoaXAtPmFtcF9ncGlvID0gR1BPX0VYVF9BTVBfQUxMRUdSTzsKLQllbHNlIC8qIHByZXN1bWFibHkgdGhpcyBpcyBmb3IgYWxsICdtYWVzdHJvMydzLi4gKi8KLQkJY2hpcC0+YW1wX2dwaW8gPSBHUE9fRVhUX0FNUF9NMzsKKwllbHNlIHsKKwkJcXVpcmsgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChwY2ksIG0zX2FtcF9xdWlya19saXN0KTsKKwkJaWYgKHF1aXJrKSB7CisJCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIm1hZXN0cm8zOiBzZXQgYW1wLWdwaW8gIgorCQkJCSAgICAiZm9yICclcydcbiIsIHF1aXJrLT5uYW1lKTsKKwkJCWNoaXAtPmFtcF9ncGlvID0gcXVpcmstPnZhbHVlOworCQl9IGVsc2UgaWYgKGNoaXAtPmFsbGVncm9fZmxhZykKKwkJCWNoaXAtPmFtcF9ncGlvID0gR1BPX0VYVF9BTVBfQUxMRUdSTzsKKwkJZWxzZSAvKiBwcmVzdW1hYmx5IHRoaXMgaXMgZm9yIGFsbCAnbWFlc3RybzMncy4uICovCisJCQljaGlwLT5hbXBfZ3BpbyA9IEdQT19FWFRfQU1QX00zOworCX0KKworCXF1aXJrID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBtM19pcmRhX3F1aXJrX2xpc3QpOworCWlmIChxdWlyaykgeworCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIm1hZXN0cm8zOiBlbmFibGVkIGlyZGEgd29ya2Fyb3VuZCAiCisJCQkgICAgImZvciAnJXMnXG4iLCBxdWlyay0+bmFtZSk7CisJCWNoaXAtPmlyZGFfd29ya2Fyb3VuZCA9IDE7CisJfQorCXF1aXJrID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBtM19odl9xdWlya19saXN0KTsKKwlpZiAocXVpcmspCisJCWNoaXAtPmh2X2NvbmZpZyA9IHF1aXJrLT52YWx1ZTsKKwlpZiAoc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBtM19vbW5pYm9va19xdWlya19saXN0KSkKKwkJY2hpcC0+aXNfb21uaWJvb2sgPSAxOwogCiAJY2hpcC0+bnVtX3N1YnN0cmVhbXMgPSBOUl9EU1BTOwogCWNoaXAtPnN1YnN0cmVhbXMgPSBrY2FsbG9jKGNoaXAtPm51bV9zdWJzdHJlYW1zLCBzaXplb2Yoc3RydWN0IG0zX2RtYSksCkBAIC0yNzQ0LDYgKzI3NDcsMzAgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmY2hpcC0+YXNzcF9rZXJuZWxfaW1hZ2UsCisJCQkgICAgICAgImVzcy9tYWVzdHJvM19hc3NwX2tlcm5lbC5mdyIsICZwY2ktPmRldik7CisJaWYgKGVyciA8IDApIHsKKyNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisJCWNoaXAtPmFzc3Bfa2VybmVsX2ltYWdlID0gJmFzc3Bfa2VybmVsOworI2Vsc2UKKwkJc25kX20zX2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisjZW5kaWYKKwl9IGVsc2UKKwkJc25kX20zX2NvbnZlcnRfZnJvbV9sZShjaGlwLT5hc3NwX2tlcm5lbF9pbWFnZSk7CisKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZjaGlwLT5hc3NwX21pbmlzcmNfaW1hZ2UsCisJCQkgICAgICAgImVzcy9tYWVzdHJvM19hc3NwX21pbmlzcmMuZnciLCAmcGNpLT5kZXYpOworCWlmIChlcnIgPCAwKSB7CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCQljaGlwLT5hc3NwX21pbmlzcmNfaW1hZ2UgPSAmYXNzcF9taW5pc3JjOworI2Vsc2UKKwkJc25kX20zX2ZyZWUoY2hpcCk7CisJCXJldHVybiBlcnI7CisjZW5kaWYKKwl9IGVsc2UKKwkJc25kX20zX2NvbnZlcnRfZnJvbV9sZShjaGlwLT5hc3NwX21pbmlzcmNfaW1hZ2UpOworCiAJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgY2FyZC0+ZHJpdmVyKSkgPCAwKSB7CiAJCXNuZF9tM19mcmVlKGNoaXApOwogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnRfbWl4ZXIuYyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X21peGVyLmMKaW5kZXggMTNkZTBmNy4uZDdkMTVjMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnRfbWl4ZXIuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9taXhlci5jCkBAIC0zODksNyArMzg5LDcgQEAKIAlyZXR1cm4gY2hhbmdlZDsKIH0KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2FuYWxvZywgLTk2MDAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9hbmFsb2csIC05NjAwLCA1MCwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtaXhhcnRfY29udHJvbF9hbmFsb2dfbGV2ZWwgPSB7CiAJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCkBAIC04NzIsNyArODcyLDcgQEAKIAlyZXR1cm4gY2hhbmdlZDsKIH0KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2RpZ2l0YWwsIC0xMDk1MCwgNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2RpZ2l0YWwsIC0xMDk1MCwgNTAsIDApOwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX21peGFydF9wY21fdm9sID0KIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jIGIvc291bmQvcGNpL25tMjU2L25tMjU2LmMKaW5kZXggODc5ZTMxYS4uMDNiM2E0NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL25tMjU2L25tMjU2LmMKKysrIGIvc291bmQvcGNpL25tMjU2L25tMjU2LmMKQEAgLTE2MjgsMjMgKzE2MjgsMTUgQEAKIH0KIAogCi1zdHJ1Y3Qgbm0yNTZfcXVpcmsgewotCXVuc2lnbmVkIHNob3J0IHZlbmRvcjsKLQl1bnNpZ25lZCBzaG9ydCBkZXZpY2U7Ci0JaW50IHR5cGU7Ci19OwotCiBlbnVtIHsgTk1fQkxBQ0tMSVNURUQsIE5NX1JFU0VUX1dPUktBUk9VTkQsIE5NX1JFU0VUX1dPUktBUk9VTkRfMiB9OwogCi1zdGF0aWMgc3RydWN0IG5tMjU2X3F1aXJrIG5tMjU2X3F1aXJrc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgbm0yNTZfcXVpcmtzW10gX19kZXZpbml0ZGF0YSA9IHsKIAkvKiBIUCBvbW5pYm9vayA0MTUwIGhhcyBjczQyMzIgY29kZWMgaW50ZXJuYWxseSAqLwotCXsgLnZlbmRvciA9IDB4MTAzYywgLmRldmljZSA9IDB4MDAwNywgLnR5cGUgPSBOTV9CTEFDS0xJU1RFRCB9LAotCS8qIFNvbnkgUENHLUYzMDUgKi8KLQl7IC52ZW5kb3IgPSAweDEwNGQsIC5kZXZpY2UgPSAweDgwNDEsIC50eXBlID0gTk1fUkVTRVRfV09SS0FST1VORCB9LAotCS8qIERlbGwgTGF0aXR1ZGUgTFMgKi8KLQl7IC52ZW5kb3IgPSAweDEwMjgsIC5kZXZpY2UgPSAweDAwODAsIC50eXBlID0gTk1fUkVTRVRfV09SS0FST1VORCB9LAotCS8qIERlbGwgTGF0aXR1ZGUgQ1N4ICovCi0JeyAudmVuZG9yID0gMHgxMDI4LCAuZGV2aWNlID0gMHgwMDkxLCAudHlwZSA9IE5NX1JFU0VUX1dPUktBUk9VTkRfMiB9LAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDAwMDcsICJIUCBvbW5pYm9vayA0MTUwIiwgTk1fQkxBQ0tMSVNURUQpLAorCS8qIFJlc2V0IHdvcmthcm91bmRzIHRvIGF2b2lkIGxvY2stdXBzICovCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4ODA0MSwgIlNvbnkgUENHLUYzMDUiLCBOTV9SRVNFVF9XT1JLQVJPVU5EKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMDgwLCAiRGVsbCBMYXRpdHVkZSBMUyIsIE5NX1JFU0VUX1dPUktBUk9VTkQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAwOTEsICJEZWxsIExhdGl0dWRlIENTeCIsIE5NX1JFU0VUX1dPUktBUk9VTkRfMiksCiAJeyB9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiAKQEAgLTE2NTUsMjYgKzE2NDcsMjIgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IG5tMjU2ICpjaGlwOwogCWludCBlcnI7Ci0Jc3RydWN0IG5tMjU2X3F1aXJrICpxOwotCXUxNiBzdWJzeXN0ZW1fdmVuZG9yLCBzdWJzeXN0ZW1fZGV2aWNlOworCWNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICpxOwogCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnN1YnN5c3RlbV92ZW5kb3IpOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJnN1YnN5c3RlbV9kZXZpY2UpOwotCi0JZm9yIChxID0gbm0yNTZfcXVpcmtzOyBxLT52ZW5kb3I7IHErKykgewotCQlpZiAocS0+dmVuZG9yID09IHN1YnN5c3RlbV92ZW5kb3IgJiYgcS0+ZGV2aWNlID09IHN1YnN5c3RlbV9kZXZpY2UpIHsKLQkJCXN3aXRjaCAocS0+dHlwZSkgewotCQkJY2FzZSBOTV9CTEFDS0xJU1RFRDoKLQkJCQlwcmludGsoS0VSTl9JTkZPICJubTI1NjogVGhlIGRldmljZSBpcyBibGFja2xpc3RlZC4gIgotCQkJCSAgICAgICAiTG9hZGluZyBzdG9wcGVkXG4iKTsKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCWNhc2UgTk1fUkVTRVRfV09SS0FST1VORF8yOgotCQkJCXJlc2V0X3dvcmthcm91bmRfMiA9IDE7Ci0JCQkJLyogRmFsbC10aHJvdWdoICovCi0JCQljYXNlIE5NX1JFU0VUX1dPUktBUk9VTkQ6Ci0JCQkJcmVzZXRfd29ya2Fyb3VuZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJcSA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgbm0yNTZfcXVpcmtzKTsKKwlpZiAocSkgeworCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIm5tMjU2OiBFbmFibGVkIHF1aXJrIGZvciAlcy5cbiIsIHEtPm5hbWUpOworCQlzd2l0Y2ggKHEtPnZhbHVlKSB7CisJCWNhc2UgTk1fQkxBQ0tMSVNURUQ6CisJCQlwcmludGsoS0VSTl9JTkZPICJubTI1NjogVGhlIGRldmljZSBpcyBibGFja2xpc3RlZC4gIgorCQkJICAgICAgICJMb2FkaW5nIHN0b3BwZWRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCWNhc2UgTk1fUkVTRVRfV09SS0FST1VORF8yOgorCQkJcmVzZXRfd29ya2Fyb3VuZF8yID0gMTsKKwkJCS8qIEZhbGwtdGhyb3VnaCAqLworCQljYXNlIE5NX1JFU0VUX1dPUktBUk9VTkQ6CisJCQlyZXNldF93b3JrYXJvdW5kID0gMTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfbWl4ZXIuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXhlci5jCmluZGV4IGIxMzNhZDkuLmQ5Y2M4ZDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXhlci5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hocl9taXhlci5jCkBAIC00NCw4ICs0NCw4IEBACiAjZGVmaW5lIFBDWEhSX0FOQUxPR19QTEFZQkFDS19MRVZFTF9NQVggIDEyOAkvKiAgICAwLjAgZEIgKi8KICNkZWZpbmUgUENYSFJfQU5BTE9HX1BMQVlCQUNLX1pFUk9fTEVWRUwgMTA0CS8qICAtMjQuMCBkQiAoIDAuMCBkQiAtIGZpeCBsZXZlbCArMjQuMCBkQiApICovCiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9hbmFsb2dfY2FwdHVyZSwgLTk2MDAsIDUwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9hbmFsb2dfcGxheWJhY2ssIC0xMjgwMCwgMTAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9hbmFsb2dfY2FwdHVyZSwgLTk2MDAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9hbmFsb2dfcGxheWJhY2ssIC0xMjgwMCwgMTAwLCAwKTsKIAogc3RhdGljIGludCBwY3hocl91cGRhdGVfYW5hbG9nX2F1ZGlvX2xldmVsKHN0cnVjdCBzbmRfcGN4aHIgKmNoaXAsIGludCBpc19jYXB0dXJlLCBpbnQgY2hhbm5lbCkKIHsKQEAgLTE5NSw3ICsxOTUsNyBAQAogI2RlZmluZSBQQ1hIUl9ESUdJVEFMX0xFVkVMX01BWAkJMHgxZmYJLyogKzE4IGRCICovCiAjZGVmaW5lIFBDWEhSX0RJR0lUQUxfWkVST19MRVZFTAkweDFiNwkvKiAgMCBkQiAqLwogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfZGlnaXRhbCwgLTEwOTUwLCA1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfZGlnaXRhbCwgLTEwOTUwLCA1MCwgMCk7CiAKICNkZWZpbmUgTU9SRV9USEFOX09ORV9TVFJFQU1fTEVWRUwJMHgwMDAwMDEKICNkZWZpbmUgVkFMSURfU1RSRUFNX1BBTl9MRVZFTF9NQVNLCTB4ODAwMDAwCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKaW5kZXggNjM4Mzk4Ny4uODliM2M3ZmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKQEAgLTgwLDYgKzgwLDcgQEAKIC8qIFdyaXRlIHJlZ2lzdGVycy4gVGhlc2UgYXJlIGRlZmluZWQgYXMgYnl0ZS1vZmZzZXRzIGZyb20gdGhlIGlvYmFzZSB2YWx1ZS4KICAqLwogI2RlZmluZSBIRFNQX3Jlc2V0UG9pbnRlciAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSERTUF9mcmVxUmVnCQkJMAogI2RlZmluZSBIRFNQX291dHB1dEJ1ZmZlckFkZHJlc3MJMzIKICNkZWZpbmUgSERTUF9pbnB1dEJ1ZmZlckFkZHJlc3MJCTM2CiAjZGVmaW5lIEhEU1BfY29udHJvbFJlZ2lzdGVyCQk2NApAQCAtNDY5LDYgKzQ3MCw3IEBACiAJc3RydWN0IHBjaV9kZXYgICAgICAgKnBjaTsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sICpzcGRpZl9jdGw7CiAgICAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICBtaXhlcl9tYXRyaXhbSERTUF9NQVRSSVhfTUlYRVJfU0laRV07CisJdW5zaWduZWQgaW50ICAgICAgICAgIGRkc192YWx1ZTsgLyogbGFzdCB2YWx1ZSB3cml0dGVuIHRvIGZyZXEgcmVnaXN0ZXIgKi8KIH07CiAKIC8qIFRoZXNlIHRhYmxlcyBtYXAgdGhlIEFMU0EgY2hhbm5lbHMgMS4uTiB0byB0aGUgY2hhbm5lbHMgdGhhdCB3ZQpAQCAtNTk4LDYgKzYwMCw3IEBACiAJCXJldHVybiAoNjQgKiBvdXQpICsgKDMyICsgKGluKSk7CiAJY2FzZSAweDk2OgogCWNhc2UgMHg5NzoKKwljYXNlIDB4OTg6CiAJCXJldHVybiAoMzIgKiBvdXQpICsgKDE2ICsgKGluKSk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuICg1MiAqIG91dCkgKyAoMjYgKyAoaW4pKTsKQEAgLTYxMSw2ICs2MTQsNyBAQAogCQlyZXR1cm4gKDY0ICogb3V0KSArIGluOwogCWNhc2UgMHg5NjoKIAljYXNlIDB4OTc6CisJY2FzZSAweDk4OgogCQlyZXR1cm4gKDMyICogb3V0KSArIGluOwogCWRlZmF1bHQ6CiAJCXJldHVybiAoNTIgKiBvdXQpICsgaW47CkBAIC05MzgsNiArOTQyLDExIEBACiBzdGF0aWMgdm9pZCBoZHNwX3Jlc2V0X2h3X3BvaW50ZXIoc3RydWN0IGhkc3AgKmhkc3ApCiB7CiAJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9yZXNldFBvaW50ZXIsIDApOworCWlmIChoZHNwLT5pb190eXBlID09IEg5NjMyICYmIGhkc3AtPmZpcm13YXJlX3JldiA+PSAxNTIpCisJCS8qIEhEU1BfcmVzZXRQb2ludGVyID0gSERTUF9mcmVxUmVnLCB3aGljaCBpcyBzdHJhbmdlIGFuZAorCQkgKiByZXF1aXJlcyAoPykgdG8gd3JpdGUgYWdhaW4gRERTIHZhbHVlIGFmdGVyIGEgcmVzZXQgcG9pbnRlcgorCQkgKiAoYXQgbGVhc3QsIGl0IHdvcmtzIGxpa2UgdGhpcykgKi8KKwkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9mcmVxUmVnLCBoZHNwLT5kZHNfdmFsdWUpOwogfQogCiBzdGF0aWMgdm9pZCBoZHNwX3N0YXJ0X2F1ZGlvKHN0cnVjdCBoZHNwICpzKQpAQCAtOTgyLDYgKzk5MSwzMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBoZHNwX3NldF9kZHNfdmFsdWUoc3RydWN0IGhkc3AgKmhkc3AsIGludCByYXRlKQoreworCXU2NCBuOworCXUzMiByOworCQorCWlmIChyYXRlID49IDExMjAwMCkKKwkJcmF0ZSAvPSA0OworCWVsc2UgaWYgKHJhdGUgPj0gNTYwMDApCisJCXJhdGUgLz0gMjsKKworCS8qIFJNRSBzYXlzIG4gPSAxMDQ4NTc2MDAwMDAwMDAsIGJ1dCBpbiB0aGUgd2luZG93cyBNQURJIGRyaXZlciwgSSBzZWU6CisvLwlyZXR1cm4gMTA0ODU3NjAwMDAwMDAwIC8gcmF0ZTsgLy8gMTAwIE1IegorCXJldHVybiAxMTAxMDA0ODAwMDAwMDAgLyByYXRlOyAvLyAxMDUgTUh6CisgICAgICAgICovCSAgIAorCW4gPSAxMDQ4NTc2MDAwMDAwMDBVTEw7ICAvKiAgPSAgMl4yMCAqIDEwXjggKi8KKwlkaXY2NF8zMigmbiwgcmF0ZSwgJnIpOworCS8qIG4gc2hvdWxkIGJlIGxlc3MgdGhhbiAyXjMyIGZvciBiZWluZyB3cml0dGVuIHRvIEZSRVEgcmVnaXN0ZXIgKi8KKwlzbmRfYXNzZXJ0KChuID4+IDMyKSA9PSAwKTsKKwkvKiBIRFNQX2ZyZXFSZWcgYW5kIEhEU1BfcmVzZXRQb2ludGVyIGFyZSB0aGUgc2FtZSwgc28ga2VlcCB0aGUgRERTCisJICAgdmFsdWUgdG8gd3JpdGUgaXQgYWZ0ZXIgYSByZXNldCAqLworCWhkc3AtPmRkc192YWx1ZSA9IG47CisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2ZyZXFSZWcsIGhkc3AtPmRkc192YWx1ZSk7Cit9CisKIHN0YXRpYyBpbnQgaGRzcF9zZXRfcmF0ZShzdHJ1Y3QgaGRzcCAqaGRzcCwgaW50IHJhdGUsIGludCBjYWxsZWRfaW50ZXJuYWxseSkKIHsKIAlpbnQgcmVqZWN0X2lmX29wZW4gPSAwOwpAQCAtMTA5MCw2ICsxMTIzLDEwIEBACiAJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSByYXRlX2JpdHM7CiAJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CiAKKwkvKiBGb3IgSERTUDk2MzIgcmV2IDE1MiwgbmVlZCB0byBzZXQgRERTIHZhbHVlIGluIEZSRVEgcmVnaXN0ZXIgKi8KKwlpZiAoaGRzcC0+aW9fdHlwZSA9PSBIOTYzMiAmJiBoZHNwLT5maXJtd2FyZV9yZXYgPj0gMTUyKQorCQloZHNwX3NldF9kZHNfdmFsdWUoaGRzcCwgcmF0ZSk7CisKIAlpZiAocmF0ZSA+PSAxMjgwMDApIHsKIAkJaGRzcC0+Y2hhbm5lbF9tYXAgPSBjaGFubmVsX21hcF9IOTYzMl9xczsKIAl9IGVsc2UgaWYgKHJhdGUgPiA0ODAwMCkgewpAQCAtNDk0Myw2ICs0OTgwLDcgQEAKIAloZHNwLT5pcnEgPSBwY2ktPmlycTsKIAloZHNwLT5wcmVjaXNlX3B0ciA9IDA7CiAJaGRzcC0+dXNlX21pZGlfdGFza2xldCA9IDE7CisJaGRzcC0+ZGRzX3ZhbHVlID0gMDsKIAogCWlmICgoZXJyID0gc25kX2hkc3BfaW5pdGlhbGl6ZV9tZW1vcnkoaGRzcCkpIDwgMCkKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCmluZGV4IDA1NDdmNmYuLmUwMjE1YWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwpAQCAtNiw2ICs2LDggQEAKICAqICAgICAgY29kZSBiYXNlZCBvbiBoZHNwLmMgICBQYXVsIERhdmlzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyY3VzIEFuZGVyc3NvbgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRob21hcyBDaGFyYm9ubmVsCisgKiAgICAgIE1vZGlmaWVkIDIwMDYtMDYtMDEgZm9yIEFFUzMyIHN1cHBvcnQgYnkgUmVteSBCcnVubworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZW15LmJydW5vQHRyaW5ub3YuY29tPgogICoKICAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTc3LDcgKzc5LDggQEAKIAogTU9EVUxFX0FVVEhPUgogICAgICAgKCJXaW5mcmllZCBSaXRzY2ggPHJpdHNjaF9BVF9pZW0uYXQ+LCBQYXVsIERhdmlzIDxwYXVsQGxpbnV4YXVkaW9zeXN0ZW1zLmNvbT4sICIKLSAgICAgICAiTWFyY3VzIEFuZGVyc3NvbiwgVGhvbWFzIENoYXJib25uZWwgPHRob21hc0B1bmRhdGEub3JnPiIpOworICAgICAgICJNYXJjdXMgQW5kZXJzc29uLCBUaG9tYXMgQ2hhcmJvbm5lbCA8dGhvbWFzQHVuZGF0YS5vcmc+LCAiCisgICAgICAgIlJlbXkgQnJ1bm8gPHJlbXkuYnJ1bm9AdHJpbm5vdi5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlJNRSBIRFNQTSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7Uk1FIEhEU1BNLU1BREl9fSIpOwpAQCAtMTA3LDcgKzExMCwxMiBAQAogLyogLS0tIFJlYWQgcmVnaXN0ZXJzLiAtLS0KICAgIFRoZXNlIGFyZSBkZWZpbmVkIGFzIGJ5dGUtb2Zmc2V0cyBmcm9tIHRoZSBpb2Jhc2UgdmFsdWUgKi8KICNkZWZpbmUgSERTUE1fc3RhdHVzUmVnaXN0ZXIgICAgMAotI2RlZmluZSBIRFNQTV9zdGF0dXNSZWdpc3RlcjIgIDk2CisvKiNkZWZpbmUgSERTUE1fc3RhdHVzUmVnaXN0ZXIyICA5NiAqLworLyogYWZ0ZXIgUk1FIFdpbmRvd3MgZHJpdmVyIHNvdXJjZXMsIHN0YXR1czIgaXMgNC1ieXRlIHdvcmQgIyA0OCA9IHdvcmQgYXQKKyAqIG9mZnNldCAxOTIsIGZvciBBRVMzMiAqYW5kKiBNQURJCisgKiA9PiBuZWVkIHRvIGNoZWNrIHRoYXQgb2Zmc2V0IDE5MiBpcyB3b3JraW5nIG9uIE1BREkgKi8KKyNkZWZpbmUgSERTUE1fc3RhdHVzUmVnaXN0ZXIyICAxOTIKKyNkZWZpbmUgSERTUE1fdGltZWNvZGVSZWdpc3RlciAxMjgKIAogI2RlZmluZSBIRFNQTV9taWRpRGF0YUluMCAgICAgMzYwCiAjZGVmaW5lIEhEU1BNX21pZGlEYXRhSW4xICAgICAzNjQKQEAgLTE0MCwzNyArMTQ4LDUwIEBACiAjZGVmaW5lIEhEU1BNX0ZyZXF1ZW5jeTAgICgxPDw2KSAgLyogMD00NC4xa0h6Lzg4LjJrSHogMT00OGtIei85NmtIeiAqLwogI2RlZmluZSBIRFNQTV9GcmVxdWVuY3kxICAoMTw8NykgIC8qIDA9MzJrSHovNjRrSHogKi8KICNkZWZpbmUgSERTUE1fRG91YmxlU3BlZWQgKDE8PDgpICAvKiAwPW5vcm1hbCBzcGVlZCwgMT1kb3VibGUgc3BlZWQgKi8KLSNkZWZpbmUgSERTUE1fUXVhZFNwZWVkICAgKDE8PDMxKSAvKiBxdWFkIHNwZWVkIGJpdCwgbm90IGltcGxlbWVudGVkIG5vdyAqLworI2RlZmluZSBIRFNQTV9RdWFkU3BlZWQgICAoMTw8MzEpIC8qIHF1YWQgc3BlZWQgYml0ICovCiAKKyNkZWZpbmUgSERTUE1fUHJvZmVzc2lvbmFsICgxPDw5KSAvKiBQcm9mZXNzaW9uYWwgKi8gLyogQUVTMzIgT05MWSAqLwogI2RlZmluZSBIRFNQTV9UWF82NGNoICAgICAoMTw8MTApIC8qIE91dHB1dCA2NGNoYW5uZWwgTU9ERT0xLAotCQkJCSAgICAgNTZjaGFubmVsTU9ERT0wICovCisJCQkJICAgICA1NmNoYW5uZWxNT0RFPTAgKi8gLyogTUFESSBPTkxZKi8KKyNkZWZpbmUgSERTUE1fRW1waGFzaXMgICAgKDE8PDEwKSAvKiBFbXBoYXNpcyAqLyAvKiBBRVMzMiBPTkxZICovCiAKICNkZWZpbmUgSERTUE1fQXV0b0lucCAgICAgKDE8PDExKSAvKiBBdXRvIElucHV0ICh0YWtlb3ZlcikgPT0gU2FmZSBNb2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPW9mZiwgMT1vbiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPW9mZiwgMT1vbiAgKi8gLyogTUFESSBPTkxZICovCisjZGVmaW5lIEhEU1BNX0RvbGJ5ICAgICAgICgxPDwxMSkgLyogRG9sYnkgPSAiTm9uQXVkaW8iID8/ICovIC8qIEFFUzMyIE9OTFkgKi8KIAotI2RlZmluZSBIRFNQTV9JbnB1dFNlbGVjdDAgKDE8PDE0KSAvKiBJbnB1dCBzZWxlY3QgMD0gb3B0aWNhbCwgMT1jb2F4ICovCisjZGVmaW5lIEhEU1BNX0lucHV0U2VsZWN0MCAoMTw8MTQpIC8qIElucHV0IHNlbGVjdCAwPSBvcHRpY2FsLCAxPWNvYXggKi8gLyogTUFESSBPTkxZKi8KICNkZWZpbmUgSERTUE1fSW5wdXRTZWxlY3QxICgxPDwxNSkgLyogc2hvdWxkIGJlIDAgKi8KIAogI2RlZmluZSBIRFNQTV9TeW5jUmVmMCAgICAgKDE8PDE2KSAvKiAwPVdPcmQsIDE9TUFESSAqLwotI2RlZmluZSBIRFNQTV9TeW5jUmVmMSAgICAgKDE8PDE3KSAvKiBzaG91bGQgYmUgMCAqLworI2RlZmluZSBIRFNQTV9TeW5jUmVmMSAgICAgKDE8PDE3KSAvKiBmb3IgQUVTMzI6IFN5bmNSZWZOIGNvZGVzIHRoZSBBRVMgIyAqLworI2RlZmluZSBIRFNQTV9TeW5jUmVmMiAgICAgKDE8PDEzKQorI2RlZmluZSBIRFNQTV9TeW5jUmVmMyAgICAgKDE8PDI1KQogCisjZGVmaW5lIEhEU1BNX1NNVVggICAgICAgICAoMTw8MTgpIC8qIEZyYW1lID8/PyAqLyAvKiBNQURJIE9OWSAqLwogI2RlZmluZSBIRFNQTV9jbHJfdG1zICAgICAgKDE8PDE5KSAvKiBjbGVhciB0cmFjayBtYXJrZXIsIGRvIG5vdCB1c2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFUyBhZGRpdGlvbmFsIGJpdHMgaW4KIAkJCQkgICAgICBsb3dlciA1IEF1ZGlvZGF0YWJpdHMgPz8/ICovCisjZGVmaW5lIEhEU1BNX3RheGlfcmVzZXQgICAoMTw8MjApIC8qID8/PyAqLyAvKiBNQURJIE9OTFkgPyAqLworI2RlZmluZSBIRFNQTV9XQ0s0OCAgICAgICAgKDE8PDIwKSAvKiBGcmFtZSA/Pz8gPSBIRFNQTV9TTVVYICovIC8qIEFFUzMyIE9OTFkgKi8KIAogI2RlZmluZSBIRFNQTV9NaWRpMEludGVycnVwdEVuYWJsZSAoMTw8MjIpCiAjZGVmaW5lIEhEU1BNX01pZGkxSW50ZXJydXB0RW5hYmxlICgxPDwyMykKIAogI2RlZmluZSBIRFNQTV9MaW5lT3V0ICgxPDwyNCkgLyogQW5hbG9nIE91dCBvbiBjaGFubmVsIDYzLzY0IG9uPTEsIG11dGU9MCAqLwogCisjZGVmaW5lIEhEU1BNX0RTX0RvdWJsZVdpcmUgKDE8PDI2KSAvKiBBRVMzMiBPTkxZICovCisjZGVmaW5lIEhEU1BNX1FTX0RvdWJsZVdpcmUgKDE8PDI3KSAvKiBBRVMzMiBPTkxZICovCisjZGVmaW5lIEhEU1BNX1FTX1F1YWRXaXJlICAgKDE8PDI4KSAvKiBBRVMzMiBPTkxZICovCisKKyNkZWZpbmUgSERTUE1fd2Nsa19zZWwgKDE8PDMwKQogCiAvKiAtLS0gYml0IGhlbHBlciBkZWZpbmVzICovCiAjZGVmaW5lIEhEU1BNX0xhdGVuY3lNYXNrICAgIChIRFNQTV9MYXRlbmN5MHxIRFNQTV9MYXRlbmN5MXxIRFNQTV9MYXRlbmN5MikKLSNkZWZpbmUgSERTUE1fRnJlcXVlbmN5TWFzayAgKEhEU1BNX0ZyZXF1ZW5jeTB8SERTUE1fRnJlcXVlbmN5MSkKKyNkZWZpbmUgSERTUE1fRnJlcXVlbmN5TWFzayAgKEhEU1BNX0ZyZXF1ZW5jeTB8SERTUE1fRnJlcXVlbmN5MXxIRFNQTV9Eb3VibGVTcGVlZHxIRFNQTV9RdWFkU3BlZWQpCiAjZGVmaW5lIEhEU1BNX0lucHV0TWFzayAgICAgIChIRFNQTV9JbnB1dFNlbGVjdDB8SERTUE1fSW5wdXRTZWxlY3QxKQogI2RlZmluZSBIRFNQTV9JbnB1dE9wdGljYWwgICAwCiAjZGVmaW5lIEhEU1BNX0lucHV0Q29heGlhbCAgIChIRFNQTV9JbnB1dFNlbGVjdDApCi0jZGVmaW5lIEhEU1BNX1N5bmNSZWZNYXNrICAgIChIRFNQTV9TeW5jUmVmMHxIRFNQTV9TeW5jUmVmMSkKKyNkZWZpbmUgSERTUE1fU3luY1JlZk1hc2sgICAgKEhEU1BNX1N5bmNSZWYwfEhEU1BNX1N5bmNSZWYxfEhEU1BNX1N5bmNSZWYyfEhEU1BNX1N5bmNSZWYzKQogI2RlZmluZSBIRFNQTV9TeW5jUmVmX1dvcmQgICAwCiAjZGVmaW5lIEhEU1BNX1N5bmNSZWZfTUFESSAgIChIRFNQTV9TeW5jUmVmMCkKIApAQCAtMTgzLDYgKzIwNCw5IEBACiAjZGVmaW5lIEhEU1BNX0ZyZXF1ZW5jeTY0S0h6ICAgKEhEU1BNX0RvdWJsZVNwZWVkfEhEU1BNX0ZyZXF1ZW5jeTApCiAjZGVmaW5lIEhEU1BNX0ZyZXF1ZW5jeTg4XzJLSHogKEhEU1BNX0RvdWJsZVNwZWVkfEhEU1BNX0ZyZXF1ZW5jeTEpCiAjZGVmaW5lIEhEU1BNX0ZyZXF1ZW5jeTk2S0h6ICAgKEhEU1BNX0RvdWJsZVNwZWVkfEhEU1BNX0ZyZXF1ZW5jeTF8SERTUE1fRnJlcXVlbmN5MCkKKyNkZWZpbmUgSERTUE1fRnJlcXVlbmN5MTI4S0h6ICAgKEhEU1BNX1F1YWRTcGVlZHxIRFNQTV9GcmVxdWVuY3kwKQorI2RlZmluZSBIRFNQTV9GcmVxdWVuY3kxNzZfNEtIeiAgIChIRFNQTV9RdWFkU3BlZWR8SERTUE1fRnJlcXVlbmN5MSkKKyNkZWZpbmUgSERTUE1fRnJlcXVlbmN5MTkyS0h6ICAgKEhEU1BNX1F1YWRTcGVlZHxIRFNQTV9GcmVxdWVuY3kxfEhEU1BNX0ZyZXF1ZW5jeTApCiAKIC8qIC0tLSBmb3IgaW50ZXJuYWwgZGlzY3JpbWluYXRpb24gKi8KICNkZWZpbmUgSERTUE1fQ0xPQ0tfU09VUkNFX0FVVE9TWU5DICAgICAgICAgIDAJLyogU2FtcGxlIENsb2NrIFNvdXJjZXMgKi8KQEAgLTIyOSw3ICsyNTMsOCBAQAogI2RlZmluZSBIRFNQTV9CSUdFTkRJQU5fTU9ERSAgKDE8PDkpCiAjZGVmaW5lIEhEU1BNX1JEX01VTFRJUExFICAgICAoMTw8MTApCiAKLS8qIC0tLSBTdGF0dXMgUmVnaXN0ZXIgYml0cyAtLS0gKi8KKy8qIC0tLSBTdGF0dXMgUmVnaXN0ZXIgYml0cyAtLS0gKi8gLyogTUFESSBPTkxZICovIC8qIEJpdHMgZGVmaW5lZCBoZXJlIGFuZAorICAgICB0aGF0IGRvIG5vdCBjb25mbGljdCB3aXRoIHNwZWNpZmljIGJpdHMgZm9yIEFFUzMyIHNlZW0gdG8gYmUgdmFsaWQgYWxzbyBmb3IgdGhlIEFFUzMyICovCiAjZGVmaW5lIEhEU1BNX2F1ZGlvSVJRUGVuZGluZyAgICAoMTw8MCkJLyogSVJRIGlzIGhpZ2ggYW5kIHBlbmRpbmcgKi8KICNkZWZpbmUgSERTUE1fUlhfNjRjaCAgICAgICAgICAgICgxPDwxKQkvKiBJbnB1dCA2NGNoYW4uIE1PREU9MSwgNTZjaG4uIE1PREU9MCAqLwogI2RlZmluZSBIRFNQTV9BQl9pbnQgICAgICAgICAgICAgKDE8PDIpCS8qIElucHV0Q2hhbm5lbCBPcHQ9MCwgQ29heD0xIChsaWtlIGlucDApICovCkBAIC0yNjMsNyArMjg4LDcgQEAKICNkZWZpbmUgSERTUE1fbWFkaUZyZXExNzZfNCAoSERTUE1fbWFkaUZyZXEzKQogI2RlZmluZSBIRFNQTV9tYWRpRnJlcTE5MiAgIChIRFNQTV9tYWRpRnJlcTN8SERTUE1fbWFkaUZyZXEwKQogCi0vKiBTdGF0dXMyIFJlZ2lzdGVyIGJpdHMgKi8KKy8qIFN0YXR1czIgUmVnaXN0ZXIgYml0cyAqLyAvKiBNQURJIE9OTFkgKi8KIAogI2RlZmluZSBIRFNQTV92ZXJzaW9uMCAoMTw8MCkJLyogbm90IHJlYWx5IGRlZmluZWQgYnV0IEkgZ3Vlc3MgKi8KICNkZWZpbmUgSERTUE1fdmVyc2lvbjEgKDE8PDEpCS8qIGluIGZvcm1lciBjYXJkcyBpdCB3YXMgPz8/ICovCkBAIC0yOTcsNiArMzIyLDU2IEBACiAjZGVmaW5lIEhEU1BNX1NlbFN5bmNSZWZfTUFESSAgICAgIChIRFNQTV9TZWxTeW5jUmVmMCkKICNkZWZpbmUgSERTUE1fU2VsU3luY1JlZl9OVkFMSUQgICAgKEhEU1BNX1NlbFN5bmNSZWYwfEhEU1BNX1NlbFN5bmNSZWYxfEhEU1BNX1NlbFN5bmNSZWYyKQogCisvKgorICAgRm9yIEFFUzMyLCBiaXRzIGZvciBzdGF0dXMsIHN0YXR1czIgYW5kIHRpbWVjb2RlIGFyZSBkaWZmZXJlbnQKKyovCisvKiBzdGF0dXMgKi8KKyNkZWZpbmUgSERTUE1fQUVTMzJfd2NMb2NrCTB4MDIwMDAwMAorI2RlZmluZSBIRFNQTV9BRVMzMl93Y0ZyZXFfYml0ICAyMgorLyogKHN0YXR1cyA+PiBIRFNQTV9BRVMzMl93Y0ZyZXFfYml0KSAmIDB4RiBnaXZlcyBXQyBmcmVxdWVuY3kgKGNmIGZ1bmN0aW9uIAorICBIRFNQTV9iaXQyZnJlcSAqLworI2RlZmluZSBIRFNQTV9BRVMzMl9zeW5jcmVmX2JpdCAgMTYKKy8qIChzdGF0dXMgPj4gSERTUE1fQUVTMzJfc3luY3JlZl9iaXQpICYgMHhGIGdpdmVzIHN5bmMgc291cmNlICovCisKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9XT1JEIDAKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVMxIDEKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVMyIDIKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVMzIDMKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM0IDQKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM1IDUKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM2IDYKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM3IDcKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM4IDgKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9OT05FIC0xCisKKy8qICBzdGF0dXMyICovCisvKiBIRFNQTV9Mb2NrQUVTX2JpdCBpcyBnaXZlbiBieSBIRFNQTV9Mb2NrQUVTID4+IChBRVMjIC0gMSkgKi8KKyNkZWZpbmUgSERTUE1fTG9ja0FFUyAgIDB4ODAKKyNkZWZpbmUgSERTUE1fTG9ja0FFUzEgIDB4ODAKKyNkZWZpbmUgSERTUE1fTG9ja0FFUzIgIDB4NDAKKyNkZWZpbmUgSERTUE1fTG9ja0FFUzMgIDB4MjAKKyNkZWZpbmUgSERTUE1fTG9ja0FFUzQgIDB4MTAKKyNkZWZpbmUgSERTUE1fTG9ja0FFUzUgIDB4OAorI2RlZmluZSBIRFNQTV9Mb2NrQUVTNiAgMHg0CisjZGVmaW5lIEhEU1BNX0xvY2tBRVM3ICAweDIKKyNkZWZpbmUgSERTUE1fTG9ja0FFUzggIDB4MQorLyoKKyAgIFRpbWVjb2RlCisgICBBZnRlciB3aW5kb3dzIGRyaXZlciBzb3VyY2VzLCBiaXRzIDQqaSB0byA0KmkrMyBnaXZlIHRoZSBpbnB1dCBmcmVxdWVuY3kgb24KKyAgIEFFUyBpKzEKKyBiaXRzIDMyMTAKKyAgICAgIDAwMDEgIDMya0h6CisgICAgICAwMDEwICA0NC4xa0h6CisgICAgICAwMDExICA0OGtIegorICAgICAgMDEwMCAgNjRrSHoKKyAgICAgIDAxMDEgIDg4LjJrSHoKKyAgICAgIDAxMTAgIDk2a0h6CisgICAgICAwMTExICAxMjhrSHoKKyAgICAgIDEwMDAgIDE3Ni40a0h6CisgICAgICAxMDAxICAxOTJrSHoKKyAgTkI6IFRpbWVjb2RlIHJlZ2lzdGVyIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIG9uIEFFUzMyIGNhcmQgcmV2aXNpb24gMjMwCisqLworCiAvKiBNaXhlciBWYWx1ZXMgKi8KICNkZWZpbmUgVU5JVFlfR0FJTiAgICAgICAgICAzMjc2OAkvKiA9IDY1NTM2LzIgKi8KICNkZWZpbmUgTUlOVVNfSU5GSU5JVFlfR0FJTiAwCkBAIC0zMTQsMTAgKzM4OSwxNCBAQAogICAgc2l6ZSBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMsIGFuZAogICAgYWxzbyB0aGUgbGF0ZW5jeSB0byB1c2UuIAogICAgZm9yIG9uZSBkaXJlY3Rpb24gISEhCisgICA9PiBuZWVkIHRvIG11cGx0aXBseSBieSAyISEKICovCi0jZGVmaW5lIEhEU1BNX0RNQV9BUkVBX0JZVEVTIChIRFNQTV9NQVhfQ0hBTk5FTFMgKiBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUykKKyNkZWZpbmUgSERTUE1fRE1BX0FSRUFfQllURVMgKDIgKiBIRFNQTV9NQVhfQ0hBTk5FTFMgKiBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUykKICNkZWZpbmUgSERTUE1fRE1BX0FSRUFfS0lMT0JZVEVTIChIRFNQTV9ETUFfQVJFQV9CWVRFUy8xMDI0KQogCisvKiByZXZpc2lvbnMgPj0gMjMwIGluZGljYXRlIEFFUzMyIGNhcmQgKi8KKyNkZWZpbmUgSERTUE1fQUVTUkVWSVNJT04gMjMwCisKIHN0cnVjdCBoZHNwbV9taWRpIHsKIAlzdHJ1Y3QgaGRzcG0gKmhkc3BtOwogCWludCBpZDsKQEAgLTMzNiw3ICs0MTUsOSBAQAogICAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBsYXliYWNrX3N1YnN0cmVhbTsgLyogYW5kL29yIGNhcHR1cmUgc3RyZWFtICovCiAKIAljaGFyICpjYXJkX25hbWU7CSAgICAgLyogZm9yIHByb2NpbmZvICovCi0JdW5zaWduZWQgc2hvcnQgZmlybXdhcmVfcmV2OyAvKiBkb250IGtub3cgaWYgcmVsZXZhbnQgKi8KKwl1bnNpZ25lZCBzaG9ydCBmaXJtd2FyZV9yZXY7IC8qIGRvbnQga25vdyBpZiByZWxldmFudCAoeWVzIGlmIEFFUzMyKSovCisKKwl1bnNpZ25lZCBjaGFyIGlzX2FlczMyOyAgICAvKiBpbmRpY2F0ZXMgaWYgY2FyZCBpcyBBRVMzMiAqLwogCiAJaW50IHByZWNpc2VfcHRyOwkvKiB1c2UgcHJlY2lzZSBwb2ludGVycywgdG8gYmUgdGVzdGVkICovCiAJaW50IG1vbml0b3Jfb3V0czsJLyogc2V0IHVwIG1vbml0b3Jpbmcgb3V0cyBpbml0IGZsYWcgKi8KQEAgLTQ1Myw2ICs1MzQsMTUgQEAKIHN0YXRpYyB2b2lkIGhkc3BtX3NldF9zZ2J1ZihzdHJ1Y3QgaGRzcG0gKiBoZHNwbSwgc3RydWN0IHNuZF9zZ19idWYgKnNnYnVmLAogCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnLCBpbnQgY2hhbm5lbHMpOwogCitzdGF0aWMgaW5saW5lIGludCBIRFNQTV9iaXQyZnJlcShpbnQgbikKK3sKKwlzdGF0aWMgaW50IGJpdDJmcmVxX3RhYltdID0geyAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsCisJCTk2MDAwLCAxMjgwMDAsIDE3NjQwMCwgMTkyMDAwIH07CisJaWYgKG4gPCAxIHx8IG4gPiA5KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYml0MmZyZXFfdGFiW25dOworfQorCiAvKiBXcml0ZS9yZWFkIHRvL2Zyb20gSERTUE0gd2l0aCBBZHJlc3NlcyBpbiBCeXRlcwogICAgbm90IHdvcmRzIGJ1dCBvbmx5IDMyQml0IHdyaXRlcyBhcmUgYWxsb3dlZCAqLwogCkBAIC01NDQsODYgKzYzNCwxMDUgQEAKIC8qIGNoZWNrIGZvciBleHRlcm5hbCBzYW1wbGUgcmF0ZSAqLwogc3RhdGljIGlubGluZSBpbnQgaGRzcG1fZXh0ZXJuYWxfc2FtcGxlX3JhdGUoc3RydWN0IGhkc3BtICogaGRzcG0pCiB7Ci0JdW5zaWduZWQgaW50IHN0YXR1czIgPSBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3RlcjIpOwotCXVuc2lnbmVkIGludCBzdGF0dXMgPSBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3Rlcik7Ci0JdW5zaWduZWQgaW50IHJhdGVfYml0czsKLQlpbnQgcmF0ZSA9IDA7CisJaWYgKGhkc3BtLT5pc19hZXMzMikgeworCQl1bnNpZ25lZCBpbnQgc3RhdHVzMiA9IGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX3N0YXR1c1JlZ2lzdGVyMik7CisJCXVuc2lnbmVkIGludCBzdGF0dXMgPSBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3Rlcik7CisJCXVuc2lnbmVkIGludCB0aW1lY29kZSA9IGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX3RpbWVjb2RlUmVnaXN0ZXIpOwogCi0JLyogaWYgd29yZGNsb2NrIGhhcyBzeW5jZWQgZnJlcSBhbmQgd29yZGNsb2NrIGlzIHZhbGlkICovCi0JaWYgKChzdGF0dXMyICYgSERTUE1fd2NMb2NrKSAhPSAwICYmCi0JICAgIChzdGF0dXMgJiBIRFNQTV9TZWxTeW5jUmVmMCkgPT0gMCkgeworCQlpbnQgc3luY3JlZiA9IGhkc3BtX2F1dG9zeW5jX3JlZihoZHNwbSk7CiAKLQkJcmF0ZV9iaXRzID0gc3RhdHVzMiAmIEhEU1BNX3djRnJlcU1hc2s7CisJCWlmIChzeW5jcmVmID09IEhEU1BNX0FFUzMyX0FVVE9TWU5DX0ZST01fV09SRCAmJgorCQkJCXN0YXR1cyAmIEhEU1BNX0FFUzMyX3djTG9jaykKKwkJCXJldHVybiBIRFNQTV9iaXQyZnJlcSgoc3RhdHVzID4+IEhEU1BNX0FFUzMyX3djRnJlcV9iaXQpICYgMHhGKTsKKwkJaWYgKHN5bmNyZWYgPj0gSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVMxICYmCisJCQlzeW5jcmVmIDw9IEhEU1BNX0FFUzMyX0FVVE9TWU5DX0ZST01fQUVTOCAmJgorCQkJc3RhdHVzMiAmIChIRFNQTV9Mb2NrQUVTID4+CisJCQkgICAgICAgICAgKHN5bmNyZWYgLSBIRFNQTV9BRVMzMl9BVVRPU1lOQ19GUk9NX0FFUzEpKSkKKwkJCXJldHVybiBIRFNQTV9iaXQyZnJlcSgodGltZWNvZGUgPj4KKwkJCSAgKDQqKHN5bmNyZWYtSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVMxKSkpICYgMHhGKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IHN0YXR1czIgPSBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3RlcjIpOworCQl1bnNpZ25lZCBpbnQgc3RhdHVzID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fc3RhdHVzUmVnaXN0ZXIpOworCQl1bnNpZ25lZCBpbnQgcmF0ZV9iaXRzOworCQlpbnQgcmF0ZSA9IDA7CiAKLQkJc3dpdGNoIChyYXRlX2JpdHMpIHsKLQkJY2FzZSBIRFNQTV93Y0ZyZXEzMjoKLQkJCXJhdGUgPSAzMjAwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX3djRnJlcTQ0XzE6Ci0JCQlyYXRlID0gNDQxMDA7Ci0JCQlicmVhazsKLQkJY2FzZSBIRFNQTV93Y0ZyZXE0ODoKLQkJCXJhdGUgPSA0ODAwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX3djRnJlcTY0OgotCQkJcmF0ZSA9IDY0MDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSERTUE1fd2NGcmVxODhfMjoKLQkJCXJhdGUgPSA4ODIwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX3djRnJlcTk2OgotCQkJcmF0ZSA9IDk2MDAwOwotCQkJYnJlYWs7Ci0JCQkvKiBRdWFkc3BlZWQgQml0IG1pc3NpbmcgPz8/PyAqLwotCQlkZWZhdWx0OgotCQkJcmF0ZSA9IDA7Ci0JCQlicmVhazsKKwkJLyogaWYgd29yZGNsb2NrIGhhcyBzeW5jZWQgZnJlcSBhbmQgd29yZGNsb2NrIGlzIHZhbGlkICovCisJCWlmICgoc3RhdHVzMiAmIEhEU1BNX3djTG9jaykgIT0gMCAmJgorCQkJCShzdGF0dXMgJiBIRFNQTV9TZWxTeW5jUmVmMCkgPT0gMCkgeworCisJCQlyYXRlX2JpdHMgPSBzdGF0dXMyICYgSERTUE1fd2NGcmVxTWFzazsKKworCQkJc3dpdGNoIChyYXRlX2JpdHMpIHsKKwkJCWNhc2UgSERTUE1fd2NGcmVxMzI6CisJCQkJcmF0ZSA9IDMyMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBIRFNQTV93Y0ZyZXE0NF8xOgorCQkJCXJhdGUgPSA0NDEwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSERTUE1fd2NGcmVxNDg6CisJCQkJcmF0ZSA9IDQ4MDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBIRFNQTV93Y0ZyZXE2NDoKKwkJCQlyYXRlID0gNjQwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEhEU1BNX3djRnJlcTg4XzI6CisJCQkJcmF0ZSA9IDg4MjAwOworCQkJCWJyZWFrOworCQkJY2FzZSBIRFNQTV93Y0ZyZXE5NjoKKwkJCQlyYXRlID0gOTYwMDA7CisJCQkJYnJlYWs7CisJCQkJLyogUXVhZHNwZWVkIEJpdCBtaXNzaW5nID8/Pz8gKi8KKwkJCWRlZmF1bHQ6CisJCQkJcmF0ZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KLQl9CiAKLQkvKiBpZiByYXRlIGRldGVjdGVkIGFuZCBTeW5jcmVmIGlzIFdvcmQgdGhhbiBoYXZlIGl0LCB3b3JkIGhhcyBwcmlvcml0eSB0byBNQURJICovCi0JaWYgKHJhdGUgIT0gMAotCSAgICAmJiAoc3RhdHVzMiAmIEhEU1BNX1NlbFN5bmNSZWZNYXNrKSA9PSBIRFNQTV9TZWxTeW5jUmVmX1dPUkQpCisJCS8qIGlmIHJhdGUgZGV0ZWN0ZWQgYW5kIFN5bmNyZWYgaXMgV29yZCB0aGFuIGhhdmUgaXQsIHdvcmQgaGFzIHByaW9yaXR5IHRvIE1BREkgKi8KKwkJaWYgKHJhdGUgIT0gMCAmJgorCSAgICAgICAgICAgIChzdGF0dXMyICYgSERTUE1fU2VsU3luY1JlZk1hc2spID09IEhEU1BNX1NlbFN5bmNSZWZfV09SRCkKKwkJCXJldHVybiByYXRlOworCisJCS8qIG1hYnkgYSBtYWRpIGlucHV0ICh3aGljaCBpcyB0YWtlbiBpZiBzZWwgc3luYyBpcyBtYWRpKSAqLworCQlpZiAoc3RhdHVzICYgSERTUE1fbWFkaUxvY2spIHsKKwkJCXJhdGVfYml0cyA9IHN0YXR1cyAmIEhEU1BNX21hZGlGcmVxTWFzazsKKworCQkJc3dpdGNoIChyYXRlX2JpdHMpIHsKKwkJCWNhc2UgSERTUE1fbWFkaUZyZXEzMjoKKwkJCQlyYXRlID0gMzIwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEhEU1BNX21hZGlGcmVxNDRfMToKKwkJCQlyYXRlID0gNDQxMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEhEU1BNX21hZGlGcmVxNDg6CisJCQkJcmF0ZSA9IDQ4MDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBIRFNQTV9tYWRpRnJlcTY0OgorCQkJCXJhdGUgPSA2NDAwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSERTUE1fbWFkaUZyZXE4OF8yOgorCQkJCXJhdGUgPSA4ODIwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSERTUE1fbWFkaUZyZXE5NjoKKwkJCQlyYXRlID0gOTYwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEhEU1BNX21hZGlGcmVxMTI4OgorCQkJCXJhdGUgPSAxMjgwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEhEU1BNX21hZGlGcmVxMTc2XzQ6CisJCQkJcmF0ZSA9IDE3NjQwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSERTUE1fbWFkaUZyZXExOTI6CisJCQkJcmF0ZSA9IDE5MjAwMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmF0ZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KIAkJcmV0dXJuIHJhdGU7Ci0KLQkvKiBtYWJ5IGEgbWFkaSBpbnB1dCAod2hpY2ggaXMgdGFrZW4gaWYgc2VsIHN5bmMgaXMgbWFkaSkgKi8KLQlpZiAoc3RhdHVzICYgSERTUE1fbWFkaUxvY2spIHsKLQkJcmF0ZV9iaXRzID0gc3RhdHVzICYgSERTUE1fbWFkaUZyZXFNYXNrOwotCi0JCXN3aXRjaCAocmF0ZV9iaXRzKSB7Ci0JCWNhc2UgSERTUE1fbWFkaUZyZXEzMjoKLQkJCXJhdGUgPSAzMjAwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX21hZGlGcmVxNDRfMToKLQkJCXJhdGUgPSA0NDEwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX21hZGlGcmVxNDg6Ci0JCQlyYXRlID0gNDgwMDA7Ci0JCQlicmVhazsKLQkJY2FzZSBIRFNQTV9tYWRpRnJlcTY0OgotCQkJcmF0ZSA9IDY0MDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSERTUE1fbWFkaUZyZXE4OF8yOgotCQkJcmF0ZSA9IDg4MjAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSERTUE1fbWFkaUZyZXE5NjoKLQkJCXJhdGUgPSA5NjAwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX21hZGlGcmVxMTI4OgotCQkJcmF0ZSA9IDEyODAwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX21hZGlGcmVxMTc2XzQ6Ci0JCQlyYXRlID0gMTc2NDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSERTUE1fbWFkaUZyZXExOTI6Ci0JCQlyYXRlID0gMTkyMDAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyYXRlID0gMDsKLQkJCWJyZWFrOwotCQl9CiAJfQotCXJldHVybiByYXRlOwogfQogCiAvKiBMYXRlbmN5IGZ1bmN0aW9uICovCkBAIC02NzYsNyArNzg1LDggQEAKIAlpbnQgbiA9IGhkc3BtLT5wZXJpb2RfYnl0ZXM7CiAJdm9pZCAqYnVmID0gaGRzcG0tPnBsYXliYWNrX2J1ZmZlcjsKIAotCXNuZF9hc3NlcnQoYnVmICE9IE5VTEwsIHJldHVybik7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgSERTUE1fTUFYX0NIQU5ORUxTOyBpKyspIHsKIAkJbWVtc2V0KGJ1ZiwgMCwgbik7CkBAIC03MTYsNiArODI2LDcgQEAKIAlpbnQgY3VycmVudF9yYXRlOwogCWludCByYXRlX2JpdHM7CiAJaW50IG5vdF9zZXQgPSAwOworCWludCBpc19zaW5nbGUsIGlzX2RvdWJsZSwgaXNfcXVhZDsKIAogCS8qIEFTU1VNUFRJT046IGhkc3BtLT5sb2NrIGlzIGVpdGhlciBzZXQsIG9yIHRoZXJlIGlzIG5vIG5lZWQgZm9yCiAJICAgaXQgKGUuZy4gZHVyaW5nIG1vZHVsZSBpbml0aWFsaXphdGlvbikuCkBAIC03NjYsNDMgKzg3Nyw1NiBAQAogCSAgIGNoYW5nZXMgaW4gdGhlIHJlYWQvd3JpdGUgcm91dGluZXMuICAKIAkgKi8KIAorCWlzX3NpbmdsZSA9IChjdXJyZW50X3JhdGUgPD0gNDgwMDApOworCWlzX2RvdWJsZSA9IChjdXJyZW50X3JhdGUgPiA0ODAwMCAmJiBjdXJyZW50X3JhdGUgPD0gOTYwMDApOworCWlzX3F1YWQgPSAoY3VycmVudF9yYXRlID4gOTYwMDApOworCiAJc3dpdGNoIChyYXRlKSB7CiAJY2FzZSAzMjAwMDoKLQkJaWYgKGN1cnJlbnRfcmF0ZSA+IDQ4MDAwKSB7CisJCWlmICghaXNfc2luZ2xlKQogCQkJcmVqZWN0X2lmX29wZW4gPSAxOwotCQl9CiAJCXJhdGVfYml0cyA9IEhEU1BNX0ZyZXF1ZW5jeTMyS0h6OwogCQlicmVhazsKIAljYXNlIDQ0MTAwOgotCQlpZiAoY3VycmVudF9yYXRlID4gNDgwMDApIHsKKwkJaWYgKCFpc19zaW5nbGUpCiAJCQlyZWplY3RfaWZfb3BlbiA9IDE7Ci0JCX0KIAkJcmF0ZV9iaXRzID0gSERTUE1fRnJlcXVlbmN5NDRfMUtIejsKIAkJYnJlYWs7CiAJY2FzZSA0ODAwMDoKLQkJaWYgKGN1cnJlbnRfcmF0ZSA+IDQ4MDAwKSB7CisJCWlmICghaXNfc2luZ2xlKQogCQkJcmVqZWN0X2lmX29wZW4gPSAxOwotCQl9CiAJCXJhdGVfYml0cyA9IEhEU1BNX0ZyZXF1ZW5jeTQ4S0h6OwogCQlicmVhazsKIAljYXNlIDY0MDAwOgotCQlpZiAoY3VycmVudF9yYXRlIDw9IDQ4MDAwKSB7CisJCWlmICghaXNfZG91YmxlKQogCQkJcmVqZWN0X2lmX29wZW4gPSAxOwotCQl9CiAJCXJhdGVfYml0cyA9IEhEU1BNX0ZyZXF1ZW5jeTY0S0h6OwogCQlicmVhazsKIAljYXNlIDg4MjAwOgotCQlpZiAoY3VycmVudF9yYXRlIDw9IDQ4MDAwKSB7CisJCWlmICghaXNfZG91YmxlKQogCQkJcmVqZWN0X2lmX29wZW4gPSAxOwotCQl9CiAJCXJhdGVfYml0cyA9IEhEU1BNX0ZyZXF1ZW5jeTg4XzJLSHo7CiAJCWJyZWFrOwogCWNhc2UgOTYwMDA6Ci0JCWlmIChjdXJyZW50X3JhdGUgPD0gNDgwMDApIHsKKwkJaWYgKCFpc19kb3VibGUpCiAJCQlyZWplY3RfaWZfb3BlbiA9IDE7Ci0JCX0KIAkJcmF0ZV9iaXRzID0gSERTUE1fRnJlcXVlbmN5OTZLSHo7CiAJCWJyZWFrOworCWNhc2UgMTI4MDAwOgorCQlpZiAoIWlzX3F1YWQpCisJCQlyZWplY3RfaWZfb3BlbiA9IDE7CisJCXJhdGVfYml0cyA9IEhEU1BNX0ZyZXF1ZW5jeTEyOEtIejsKKwkJYnJlYWs7CisJY2FzZSAxNzY0MDA6CisJCWlmICghaXNfcXVhZCkKKwkJCXJlamVjdF9pZl9vcGVuID0gMTsKKwkJcmF0ZV9iaXRzID0gSERTUE1fRnJlcXVlbmN5MTc2XzRLSHo7CisJCWJyZWFrOworCWNhc2UgMTkyMDAwOgorCQlpZiAoIWlzX3F1YWQpCisJCQlyZWplY3RfaWZfb3BlbiA9IDE7CisJCXJhdGVfYml0cyA9IEhEU1BNX0ZyZXF1ZW5jeTE5MktIejsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtODE5LDcgKzk0Myw3IEBACiAJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgfD0gcmF0ZV9iaXRzOwogCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9jb250cm9sUmVnaXN0ZXIsIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyKTsKIAotCWlmIChyYXRlID4gNjQwMDApCisJaWYgKHJhdGUgPiA5NjAwMCAvKiA2NDAwMCovKQogCQloZHNwbS0+Y2hhbm5lbF9tYXAgPSBjaGFubmVsX21hcF9tYWRpX3FzOwogCWVsc2UgaWYgKHJhdGUgPiA0ODAwMCkKIAkJaGRzcG0tPmNoYW5uZWxfbWFwID0gY2hhbm5lbF9tYXBfbWFkaV9kczsKQEAgLTE0NTUsMTEgKzE1NzksMjcgQEAKIAkvKiBOb3RpY2UgdGhhdCB0aGlzIGxvb2tzIGF0IHRoZSByZXF1ZXN0ZWQgc3luYyBzb3VyY2UsCiAJICAgbm90IHRoZSBvbmUgYWN0dWFsbHkgaW4gdXNlLgogCSAqLwotCXN3aXRjaCAoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9TeW5jUmVmTWFzaykgewotCWNhc2UgSERTUE1fU3luY1JlZl9Xb3JkOgotCQlyZXR1cm4gSERTUE1fU1lOQ19GUk9NX1dPUkQ7Ci0JY2FzZSBIRFNQTV9TeW5jUmVmX01BREk6Ci0JCXJldHVybiBIRFNQTV9TWU5DX0ZST01fTUFESTsKKwlpZiAoaGRzcG0tPmlzX2FlczMyKSB7CisJCXN3aXRjaCAoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9TeW5jUmVmTWFzaykgeworCQkvKiBudW1iZXIgZ2l2ZXMgQUVTIGluZGV4LCBleGNlcHQgZm9yIDAgd2hpY2gKKwkJICAgY29ycmVzcG9uZHMgdG8gV29yZENsb2NrICovCisJCWNhc2UgMDogcmV0dXJuIDA7CisJCWNhc2UgSERTUE1fU3luY1JlZjA6IHJldHVybiAxOworCQljYXNlIEhEU1BNX1N5bmNSZWYxOiByZXR1cm4gMjsKKwkJY2FzZSBIRFNQTV9TeW5jUmVmMStIRFNQTV9TeW5jUmVmMDogcmV0dXJuIDM7CisJCWNhc2UgSERTUE1fU3luY1JlZjI6IHJldHVybiA0OworCQljYXNlIEhEU1BNX1N5bmNSZWYyK0hEU1BNX1N5bmNSZWYwOiByZXR1cm4gNTsKKwkJY2FzZSBIRFNQTV9TeW5jUmVmMitIRFNQTV9TeW5jUmVmMTogcmV0dXJuIDY7CisJCWNhc2UgSERTUE1fU3luY1JlZjIrSERTUE1fU3luY1JlZjErSERTUE1fU3luY1JlZjA6IHJldHVybiA3OworCQljYXNlIEhEU1BNX1N5bmNSZWYzOiByZXR1cm4gODsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9TeW5jUmVmTWFzaykgeworCQljYXNlIEhEU1BNX1N5bmNSZWZfV29yZDoKKwkJCXJldHVybiBIRFNQTV9TWU5DX0ZST01fV09SRDsKKwkJY2FzZSBIRFNQTV9TeW5jUmVmX01BREk6CisJCQlyZXR1cm4gSERTUE1fU1lOQ19GUk9NX01BREk7CisJCX0KIAl9CiAKIAlyZXR1cm4gSERTUE1fU1lOQ19GUk9NX1dPUkQ7CkBAIC0xNDY5LDE1ICsxNjA5LDQ5IEBACiB7CiAJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfkhEU1BNX1N5bmNSZWZNYXNrOwogCi0Jc3dpdGNoIChwcmVmKSB7Ci0JY2FzZSBIRFNQTV9TWU5DX0ZST01fTUFESToKLQkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUE1fU3luY1JlZl9NQURJOwotCQlicmVhazsKLQljYXNlIEhEU1BNX1NZTkNfRlJPTV9XT1JEOgotCQloZHNwbS0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQTV9TeW5jUmVmX1dvcmQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKKwlpZiAoaGRzcG0tPmlzX2FlczMyKSB7CisJCXN3aXRjaCAocHJlZikgeworCQljYXNlIDA6CisJCSAgICAgICBoZHNwbS0+Y29udHJvbF9yZWdpc3RlciB8PSAwOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgMToKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYwOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgMjoKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYxOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgMzoKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYxK0hEU1BNX1N5bmNSZWYwOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgNDoKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYyOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgNToKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYyK0hEU1BNX1N5bmNSZWYwOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgNjoKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYyK0hEU1BNX1N5bmNSZWYxOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgNzoKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYyK0hEU1BNX1N5bmNSZWYxK0hEU1BNX1N5bmNSZWYwOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgODoKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYzOworCQkgICAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgICAgICByZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHByZWYpIHsKKwkJY2FzZSBIRFNQTV9TWU5DX0ZST01fTUFESToKKwkJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWZfTUFESTsKKwkJCWJyZWFrOworCQljYXNlIEhEU1BNX1NZTkNfRlJPTV9XT1JEOgorCQkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUE1fU3luY1JlZl9Xb3JkOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJCX0KIAl9CiAJaGRzcG1fd3JpdGUoaGRzcG0sIEhEU1BNX2NvbnRyb2xSZWdpc3RlciwgaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIpOwogCXJldHVybiAwOwpAQCAtMTQ4NiwxOCArMTY2MCwzNiBAQAogc3RhdGljIGludCBzbmRfaGRzcG1faW5mb19wcmVmX3N5bmNfcmVmKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewotCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyAiV29yZCIsICJNQURJIiB9OworCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKLQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKLQl1aW5mby0+Y291bnQgPSAxOworCWlmIChoZHNwbS0+aXNfYWVzMzIpIHsKKwkJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7ICJXb3JkIiwgIkFFUzEiLCAiQUVTMiIsICJBRVMzIiwKKwkJCSJBRVM0IiwgIkFFUzUiLAkiQUVTNiIsICJBRVM3IiwgIkFFUzgiIH07CiAKLQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCQl1aW5mby0+Y291bnQgPSAxOwogCi0JaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCi0JCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQotCQkgICAgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOwotCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAotCSAgICAgICB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gOTsKKworCQlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQorCQkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwkJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCisJCQkJdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCX0gZWxzZSB7CisJCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyAiV29yZCIsICJNQURJIiB9OworCisJCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCQl1aW5mby0+Y291bnQgPSAxOworCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKKworCQlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQorCQkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwkJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCisJCQkJdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTUxNyw3ICsxNzA5LDcgQEAKIAlpbnQgY2hhbmdlLCBtYXg7CiAJdW5zaWduZWQgaW50IHZhbDsKIAotCW1heCA9IDI7CisJbWF4ID0gaGRzcG0tPmlzX2FlczMyID8gOSA6IDI7CiAKIAlpZiAoIXNuZF9oZHNwbV91c2VfaXNfZXhjbHVzaXZlKGhkc3BtKSkKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTE1NDIsNDAgKzE3MzQsNjQgQEAKIAogc3RhdGljIGludCBoZHNwbV9hdXRvc3luY19yZWYoc3RydWN0IGhkc3BtICogaGRzcG0pCiB7Ci0JLyogVGhpcyBsb29rcyBhdCB0aGUgYXV0b3N5bmMgc2VsZWN0ZWQgc3luYyByZWZlcmVuY2UgKi8KLQl1bnNpZ25lZCBpbnQgc3RhdHVzMiA9IGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX3N0YXR1c1JlZ2lzdGVyMik7CisJaWYgKGhkc3BtLT5pc19hZXMzMikgeworCQl1bnNpZ25lZCBpbnQgc3RhdHVzID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fc3RhdHVzUmVnaXN0ZXIpOworCQl1bnNpZ25lZCBpbnQgc3luY3JlZiA9IChzdGF0dXMgPj4gSERTUE1fQUVTMzJfc3luY3JlZl9iaXQpICYgMHhGOworCQlpZiAoc3luY3JlZiA9PSAwKQorCQkJcmV0dXJuIEhEU1BNX0FFUzMyX0FVVE9TWU5DX0ZST01fV09SRDsKKwkJaWYgKHN5bmNyZWYgPD0gOCkKKwkJCXJldHVybiBzeW5jcmVmOworCQlyZXR1cm4gSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9OT05FOworCX0gZWxzZSB7CisJCS8qIFRoaXMgbG9va3MgYXQgdGhlIGF1dG9zeW5jIHNlbGVjdGVkIHN5bmMgcmVmZXJlbmNlICovCisJCXVuc2lnbmVkIGludCBzdGF0dXMyID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fc3RhdHVzUmVnaXN0ZXIyKTsKIAotCXN3aXRjaCAoc3RhdHVzMiAmIEhEU1BNX1NlbFN5bmNSZWZNYXNrKSB7CisJCXN3aXRjaCAoc3RhdHVzMiAmIEhEU1BNX1NlbFN5bmNSZWZNYXNrKSB7CisJCWNhc2UgSERTUE1fU2VsU3luY1JlZl9XT1JEOgorCQkJcmV0dXJuIEhEU1BNX0FVVE9TWU5DX0ZST01fV09SRDsKKwkJY2FzZSBIRFNQTV9TZWxTeW5jUmVmX01BREk6CisJCQlyZXR1cm4gSERTUE1fQVVUT1NZTkNfRlJPTV9NQURJOworCQljYXNlIEhEU1BNX1NlbFN5bmNSZWZfTlZBTElEOgorCQkJcmV0dXJuIEhEU1BNX0FVVE9TWU5DX0ZST01fTk9ORTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CiAKLQljYXNlIEhEU1BNX1NlbFN5bmNSZWZfV09SRDoKLQkJcmV0dXJuIEhEU1BNX0FVVE9TWU5DX0ZST01fV09SRDsKLQotCWNhc2UgSERTUE1fU2VsU3luY1JlZl9NQURJOgotCQlyZXR1cm4gSERTUE1fQVVUT1NZTkNfRlJPTV9NQURJOwotCi0JY2FzZSBIRFNQTV9TZWxTeW5jUmVmX05WQUxJRDoKLQkJcmV0dXJuIEhEU1BNX0FVVE9TWU5DX0ZST01fTk9ORTsKLQotCWRlZmF1bHQ6CiAJCXJldHVybiAwOwogCX0KLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNuZF9oZHNwbV9pbmZvX2F1dG9zeW5jX3JlZihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKLQlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsgIldvcmRDbG9jayIsICJNQURJIiwgIk5vbmUiIH07CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAotCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwotCXVpbmZvLT5jb3VudCA9IDE7Ci0JdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOwotCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQotCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0KLQkJICAgIHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKLQlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKLQkgICAgICAgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCWlmIChoZHNwbS0+aXNfYWVzMzIpIHsKKwkJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7ICJXb3JkQ2xvY2siLCAiQUVTMSIsICJBRVMyIiwgIkFFUzMiLAorCQkJIkFFUzQiLAkiQUVTNSIsICJBRVM2IiwgIkFFUzciLCAiQUVTOCIsICJOb25lIn07CisKKwkJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJCXVpbmZvLT5jb3VudCA9IDE7CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMTA7CisJCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9CisJCQkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCQlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkJCQl0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJfQorCWVsc2UKKwl7CisJCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyAiV29yZENsb2NrIiwgIk1BREkiLCAiTm9uZSIgfTsKKworCQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwkJdWluZm8tPmNvdW50ID0gMTsKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOworCQlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQorCQkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwkJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCisJCQkJdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg0MSw2ICsyMDU3LDE5NSBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKKyNkZWZpbmUgSERTUE1fRU1QSEFTSVMoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwbV9pbmZvX2VtcGhhc2lzLCBcCisgIC5nZXQgPSBzbmRfaGRzcG1fZ2V0X2VtcGhhc2lzLCBcCisgIC5wdXQgPSBzbmRfaGRzcG1fcHV0X2VtcGhhc2lzIFwKK30KKworc3RhdGljIGludCBoZHNwbV9lbXBoYXNpcyhzdHJ1Y3QgaGRzcG0gKiBoZHNwbSkKK3sKKwlyZXR1cm4gKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUE1fRW1waGFzaXMpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaGRzcG1fc2V0X2VtcGhhc2lzKHN0cnVjdCBoZHNwbSAqIGhkc3BtLCBpbnQgZW1wKQoreworCWlmIChlbXApCisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX0VtcGhhc2lzOworCWVsc2UKKwkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfkhEU1BNX0VtcGhhc2lzOworCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9jb250cm9sUmVnaXN0ZXIsIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9pbmZvX2VtcGhhc2lzKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX2dldF9lbXBoYXNpcyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlzcGluX2xvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGhkc3BtX2VtcGhhc2lzKGhkc3BtKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcG1fcHV0X2VtcGhhc2lzKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoIXNuZF9oZHNwbV91c2VfaXNfZXhjbHVzaXZlKGhkc3BtKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDE7CisJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCWNoYW5nZSA9IChpbnQpIHZhbCAhPSBoZHNwbV9lbXBoYXNpcyhoZHNwbSk7CisJaGRzcG1fc2V0X2VtcGhhc2lzKGhkc3BtLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgSERTUE1fRE9MQlkoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwbV9pbmZvX2RvbGJ5LCBcCisgIC5nZXQgPSBzbmRfaGRzcG1fZ2V0X2RvbGJ5LCBcCisgIC5wdXQgPSBzbmRfaGRzcG1fcHV0X2RvbGJ5IFwKK30KKworc3RhdGljIGludCBoZHNwbV9kb2xieShzdHJ1Y3QgaGRzcG0gKiBoZHNwbSkKK3sKKwlyZXR1cm4gKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUE1fRG9sYnkpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaGRzcG1fc2V0X2RvbGJ5KHN0cnVjdCBoZHNwbSAqIGhkc3BtLCBpbnQgZG9sKQoreworCWlmIChkb2wpCisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX0RvbGJ5OworCWVsc2UKKwkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfkhEU1BNX0RvbGJ5OworCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9jb250cm9sUmVnaXN0ZXIsIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9pbmZvX2RvbGJ5KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX2dldF9kb2xieShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRzcG0gKmhkc3BtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBoZHNwbV9kb2xieShoZHNwbSk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX3B1dF9kb2xieShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRzcG0gKmhkc3BtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmICghc25kX2hkc3BtX3VzZV9pc19leGNsdXNpdmUoaGRzcG0pKQorCQlyZXR1cm4gLUVCVVNZOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMTsKKwlzcGluX2xvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJY2hhbmdlID0gKGludCkgdmFsICE9IGhkc3BtX2RvbGJ5KGhkc3BtKTsKKwloZHNwbV9zZXRfZG9sYnkoaGRzcG0sIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBIRFNQTV9QUk9GRVNTSU9OQUwoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwbV9pbmZvX3Byb2Zlc3Npb25hbCwgXAorICAuZ2V0ID0gc25kX2hkc3BtX2dldF9wcm9mZXNzaW9uYWwsIFwKKyAgLnB1dCA9IHNuZF9oZHNwbV9wdXRfcHJvZmVzc2lvbmFsIFwKK30KKworc3RhdGljIGludCBoZHNwbV9wcm9mZXNzaW9uYWwoc3RydWN0IGhkc3BtICogaGRzcG0pCit7CisJcmV0dXJuIChoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BNX1Byb2Zlc3Npb25hbCkgPyAxIDogMDsKK30KKworc3RhdGljIGludCBoZHNwbV9zZXRfcHJvZmVzc2lvbmFsKHN0cnVjdCBoZHNwbSAqIGhkc3BtLCBpbnQgZG9sKQoreworCWlmIChkb2wpCisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1Byb2Zlc3Npb25hbDsKKwllbHNlCisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQTV9Qcm9mZXNzaW9uYWw7CisJaGRzcG1fd3JpdGUoaGRzcG0sIEhEU1BNX2NvbnRyb2xSZWdpc3RlciwgaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX2luZm9fcHJvZmVzc2lvbmFsKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9nZXRfcHJvZmVzc2lvbmFsKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlzcGluX2xvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGhkc3BtX3Byb2Zlc3Npb25hbChoZHNwbSk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX3B1dF9wcm9mZXNzaW9uYWwoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoIXNuZF9oZHNwbV91c2VfaXNfZXhjbHVzaXZlKGhkc3BtKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDE7CisJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCWNoYW5nZSA9IChpbnQpIHZhbCAhPSBoZHNwbV9wcm9mZXNzaW9uYWwoaGRzcG0pOworCWhkc3BtX3NldF9wcm9mZXNzaW9uYWwoaGRzcG0sIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKwogI2RlZmluZSBIRFNQTV9JTlBVVF9TRUxFQ1QoeG5hbWUsIHhpbmRleCkgXAogeyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAogICAubmFtZSA9IHhuYW1lLCBcCkBAIC0xOTEyLDYgKzIzMTcsMTYzIEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAorI2RlZmluZSBIRFNQTV9EU19XSVJFKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKKyAgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfaGRzcG1faW5mb19kc193aXJlLCBcCisgIC5nZXQgPSBzbmRfaGRzcG1fZ2V0X2RzX3dpcmUsIFwKKyAgLnB1dCA9IHNuZF9oZHNwbV9wdXRfZHNfd2lyZSBcCit9CisKK3N0YXRpYyBpbnQgaGRzcG1fZHNfd2lyZShzdHJ1Y3QgaGRzcG0gKiBoZHNwbSkKK3sKKwlyZXR1cm4gKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUE1fRFNfRG91YmxlV2lyZSkgPyAxIDogMDsKK30KKworc3RhdGljIGludCBoZHNwbV9zZXRfZHNfd2lyZShzdHJ1Y3QgaGRzcG0gKiBoZHNwbSwgaW50IGRzKQoreworCWlmIChkcykKKwkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUE1fRFNfRG91YmxlV2lyZTsKKwllbHNlCisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQTV9EU19Eb3VibGVXaXJlOworCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9jb250cm9sUmVnaXN0ZXIsIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9pbmZvX2RzX3dpcmUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyAiU2luZ2xlIiwgIkRvdWJsZSIgfTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAyOworCisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQorCQkgICAgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAorCSAgICAgICB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcG1fZ2V0X2RzX3dpcmUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlzcGluX2xvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGhkc3BtX2RzX3dpcmUoaGRzcG0pOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9wdXRfZHNfd2lyZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoIXNuZF9oZHNwbV91c2VfaXNfZXhjbHVzaXZlKGhkc3BtKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDE7CisJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCWNoYW5nZSA9IChpbnQpIHZhbCAhPSBoZHNwbV9kc193aXJlKGhkc3BtKTsKKwloZHNwbV9zZXRfZHNfd2lyZShoZHNwbSwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisjZGVmaW5lIEhEU1BNX1FTX1dJUkUoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwbV9pbmZvX3FzX3dpcmUsIFwKKyAgLmdldCA9IHNuZF9oZHNwbV9nZXRfcXNfd2lyZSwgXAorICAucHV0ID0gc25kX2hkc3BtX3B1dF9xc193aXJlIFwKK30KKworc3RhdGljIGludCBoZHNwbV9xc193aXJlKHN0cnVjdCBoZHNwbSAqIGhkc3BtKQoreworCWlmIChoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BNX1FTX0RvdWJsZVdpcmUpCisJCXJldHVybiAxOworCWlmIChoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BNX1FTX1F1YWRXaXJlKQorCQlyZXR1cm4gMjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZHNwbV9zZXRfcXNfd2lyZShzdHJ1Y3QgaGRzcG0gKiBoZHNwbSwgaW50IG1vZGUpCit7CisJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfihIRFNQTV9RU19Eb3VibGVXaXJlIHwgSERTUE1fUVNfUXVhZFdpcmUpOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAxOgorCQloZHNwbS0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQTV9RU19Eb3VibGVXaXJlOworCQlicmVhazsKKwljYXNlIDI6CisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1FTX1F1YWRXaXJlOworCQlicmVhazsKKwl9CisJaGRzcG1fd3JpdGUoaGRzcG0sIEhEU1BNX2NvbnRyb2xSZWdpc3RlciwgaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX2luZm9fcXNfd2lyZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsgIlNpbmdsZSIsICJEb3VibGUiLCAiUXVhZCIgfTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOworCisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQorCQkgICAgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAorCSAgICAgICB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcG1fZ2V0X3FzX3dpcmUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXNwaW5fbG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaGRzcG1fcXNfd2lyZShoZHNwbSk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX3B1dF9xc193aXJlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZTsKKwlpbnQgdmFsOworCisJaWYgKCFzbmRfaGRzcG1fdXNlX2lzX2V4Y2x1c2l2ZShoZHNwbSkpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJaWYgKHZhbCA8IDApCisJCXZhbCA9IDA7CisJaWYgKHZhbCA+IDIpCisJCXZhbCA9IDI7CisJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCWNoYW5nZSA9IChpbnQpIHZhbCAhPSBoZHNwbV9xc193aXJlKGhkc3BtKTsKKwloZHNwbV9zZXRfcXNfd2lyZShoZHNwbSwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCiAvKiAgICAgICAgICAgU2ltcGxlIE1peGVyCiAgIGRlcHJlY2F0ZWQgc2luY2UgdG8gbXVjaCBmYWRlcnMgPz8/CiAgIE1JWEVSIGludGVyZmFjZSBzYXlzIG91dHB1dCAoc291cmNlLCBkZXN0aW5hdGlvbiwgdmFsdWUpCkBAIC0yMTM1LDE0ICsyNjk3LDI0IEBACiAKIHN0YXRpYyBpbnQgaGRzcG1fd2Nfc3luY19jaGVjayhzdHJ1Y3QgaGRzcG0gKiBoZHNwbSkKIHsKLQlpbnQgc3RhdHVzMiA9IGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX3N0YXR1c1JlZ2lzdGVyMik7Ci0JaWYgKHN0YXR1czIgJiBIRFNQTV93Y0xvY2spIHsKLQkJaWYgKHN0YXR1czIgJiBIRFNQTV93Y1N5bmMpCisJaWYgKGhkc3BtLT5pc19hZXMzMikgeworCQlpbnQgc3RhdHVzID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fc3RhdHVzUmVnaXN0ZXIpOworCQlpZiAoc3RhdHVzICYgSERTUE1fQUVTMzJfd2NMb2NrKSB7CisJCQkvKiBJIGRvbid0IGtub3cgaG93IHRvIGRpZmZlcmVuY2lhdGUgc3luYyBmcm9tIGxvY2suCisJCQkgICBEb2luZyBhcyBpZiBzeW5jIGZvciBub3cgKi8KIAkJCXJldHVybiAyOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpbnQgc3RhdHVzMiA9IGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX3N0YXR1c1JlZ2lzdGVyMik7CisJCWlmIChzdGF0dXMyICYgSERTUE1fd2NMb2NrKSB7CisJCQlpZiAoc3RhdHVzMiAmIEhEU1BNX3djU3luYykKKwkJCQlyZXR1cm4gMjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc25kX2hkc3BtX2dldF93Y19zeW5jX2NoZWNrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLApAQCAtMjE4OCw5ICsyNzYwLDQzIEBACiB9CiAKIAorI2RlZmluZSBIRFNQTV9BRVNfU1lOQ19DSEVDSyh4bmFtZSwgeGluZGV4KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCisgIC5uYW1lID0geG5hbWUsIFwKKyAgLmluZGV4ID0geGluZGV4LCBcCisgIC5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwgXAorICAuaW5mbyA9IHNuZF9oZHNwbV9pbmZvX3N5bmNfY2hlY2ssIFwKKyAgLmdldCA9IHNuZF9oZHNwbV9nZXRfYWVzX3N5bmNfY2hlY2sgXAorfQorCitzdGF0aWMgaW50IGhkc3BtX2Flc19zeW5jX2NoZWNrKHN0cnVjdCBoZHNwbSAqIGhkc3BtLCBpbnQgaWR4KQoreworCWludCBzdGF0dXMyID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fc3RhdHVzUmVnaXN0ZXIyKTsKKwlpZiAoc3RhdHVzMiAmIChIRFNQTV9Mb2NrQUVTID4+IGlkeCkpIHsKKwkJLyogSSBkb24ndCBrbm93IGhvdyB0byBkaWZmZXJlbmNpYXRlIHN5bmMgZnJvbSBsb2NrLgorCQkgICBEb2luZyBhcyBpZiBzeW5jIGZvciBub3cgKi8KKwkJcmV0dXJuIDI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9nZXRfYWVzX3N5bmNfY2hlY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBvZmZzZXQ7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCW9mZnNldCA9IHVjb250cm9sLT5pZC5pbmRleCAtIDE7CisJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IDgpCisJCXJldHVybiAtRUlOVkFMOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCWhkc3BtX2Flc19zeW5jX2NoZWNrKGhkc3BtLCBvZmZzZXQpOworCXJldHVybiAwOworfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaGRzcG1fY29udHJvbHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaGRzcG1fY29udHJvbHNfbWFkaVtdID0gewogCiAJSERTUE1fTUlYRVIoIk1peGVyIiwgMCksCiAvKiAnU2FtcGxlIENsb2NrIFNvdXJjZScgY29tcGxpZXMgd2l0aCB0aGUgYWxzYSBjb250cm9sIG5hbWluZyBzY2hlbWUgKi8KQEAgLTIyMTEsNiArMjgxNywyOSBAQAogCUhEU1BNX0lOUFVUX1NFTEVDVCgiSW5wdXQgU2VsZWN0IiwgMCksCiB9OwogCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2hkc3BtX2NvbnRyb2xzX2FlczMyW10gPSB7CisKKwlIRFNQTV9NSVhFUigiTWl4ZXIiLCAwKSwKKy8qICdTYW1wbGUgQ2xvY2sgU291cmNlJyBjb21wbGllcyB3aXRoIHRoZSBhbHNhIGNvbnRyb2wgbmFtaW5nIHNjaGVtZSAqLworCUhEU1BNX0NMT0NLX1NPVVJDRSgiU2FtcGxlIENsb2NrIFNvdXJjZSIsIDApLAorCisJSERTUE1fU1lTVEVNX0NMT0NLX01PREUoIlN5c3RlbSBDbG9jayBNb2RlIiwgMCksCisJSERTUE1fUFJFRl9TWU5DX1JFRigiUHJlZmVycmVkIFN5bmMgUmVmZXJlbmNlIiwgMCksCisJSERTUE1fQVVUT1NZTkNfUkVGKCJBdXRvU3luYyBSZWZlcmVuY2UiLCAwKSwKKwlIRFNQTV9TWVNURU1fU0FNUExFX1JBVEUoIlN5c3RlbSBTYW1wbGUgUmF0ZSIsIDApLAorLyogJ0V4dGVybmFsIFJhdGUnIGNvbXBsaWVzIHdpdGggdGhlIGFsc2EgY29udHJvbCBuYW1pbmcgc2NoZW1lICovCisJSERTUE1fQVVUT1NZTkNfU0FNUExFX1JBVEUoIkV4dGVybmFsIFJhdGUiLCAwKSwKKwlIRFNQTV9XQ19TWU5DX0NIRUNLKCJXb3JkIENsb2NrIExvY2sgU3RhdHVzIiwgMCksCisvKglIRFNQTV9BRVNfU1lOQ19DSEVDSygiQUVTIExvY2sgU3RhdHVzIiwgMCksKi8gLyogY3JlYXRlZCBpbiBzbmRfaGRzcG1fY3JlYXRlX2NvbnRyb2xzKCkgKi8KKwlIRFNQTV9MSU5FX09VVCgiTGluZSBPdXQiLCAwKSwKKwlIRFNQTV9FTVBIQVNJUygiRW1waGFzaXMiLCAwKSwKKwlIRFNQTV9ET0xCWSgiTm9uIEF1ZGlvIiwgMCksCisJSERTUE1fUFJPRkVTU0lPTkFMKCJQcm9mZXNzaW9uYWwiLCAwKSwKKwlIRFNQTV9DX1RNUygiQ2xlYXIgVHJhY2sgTWFya2VyIiwgMCksCisJSERTUE1fRFNfV0lSRSgiRG91YmxlIFNwZWVkIFdpcmUgTW9kZSIsIDApLAorCUhEU1BNX1FTX1dJUkUoIlF1YWQgU3BlZWQgV2lyZSBNb2RlIiwgMCksCit9OworCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2hkc3BtX3BsYXliYWNrX21peGVyID0gSERTUE1fUExBWUJBQ0tfTUlYRVI7CiAKIApAQCAtMjI0NSwyMCArMjg3NCw0MCBAQAogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CiAKIAkvKiBhZGQgY29udHJvbCBsaXN0IGZpcnN0ICovCisJaWYgKGhkc3BtLT5pc19hZXMzMikgeworCQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZXNfc3luY19jdGwgPQorCQkJSERTUE1fQUVTX1NZTkNfQ0hFQ0soIkFFUyBMb2NrIFN0YXR1cyIsIDApOwogCi0JZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9oZHNwbV9jb250cm9scyk7IGlkeCsrKSB7Ci0JCWlmICgoZXJyID0KLQkJICAgICBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0KLQkJCQkgc25kX2N0bF9uZXcxKCZzbmRfaGRzcG1fY29udHJvbHNbaWR4XSwKLQkJCQkJICAgICAgaGRzcG0pKSkgPCAwKSB7Ci0JCQlyZXR1cm4gZXJyOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoc25kX2hkc3BtX2NvbnRyb2xzX2FlczMyKTsKKwkJICAgICBpZHgrKykgeworCQkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwKKwkJCQkJICBzbmRfY3RsX25ldzEoJnNuZF9oZHNwbV9jb250cm9sc19hZXMzMltpZHhdLAorCQkJCQkJICAgICAgIGhkc3BtKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCWZvciAoaWR4ID0gMTsgaWR4IDw9IDg7IGlkeCsrKSB7CisJCQlhZXNfc3luY19jdGwuaW5kZXggPSBpZHg7CisJCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLAorCQkJCQkgIHNuZF9jdGxfbmV3MSgmYWVzX3N5bmNfY3RsLCBoZHNwbSkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfaGRzcG1fY29udHJvbHNfbWFkaSk7CisJCSAgICAgaWR4KyspIHsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsCisJCQkJCSAgc25kX2N0bF9uZXcxKCZzbmRfaGRzcG1fY29udHJvbHNfbWFkaVtpZHhdLAorCQkJCQkJICAgICAgIGhkc3BtKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQogCiAJLyogQ2hhbm5lbCBwbGF5YmFjayBtaXhlciBhcyBkZWZhdWx0IGNvbnRyb2wgCi0JICAgTm90ZTogdGhlIHdob2xlIG1hdHJpeCB3b3VsZCBiZSAxMjgqSERTUE1fTUlYRVJfQ0hBTk5FTFMgRmFkZXJzLCB0aGF0cyB0b28gYmlnIGZvciBhbnkgYWxzYW1peGVyCi0JICAgdGhleSBhcmUgYWNjZXNpYmxlIHZpYSBzcGVjaWFsIElPQ1RMIG9uIGh3ZGVwCi0JICAgYW5kIHRoZSBtaXhlciAyZGltZW5zaW9uYWwgbWl4ZXIgY29udHJvbCAqLworTm90ZTogdGhlIHdob2xlIG1hdHJpeCB3b3VsZCBiZSAxMjgqSERTUE1fTUlYRVJfQ0hBTk5FTFMgRmFkZXJzLCB0aGF0cyB0b28gYmlnIGZvciBhbnkgYWxzYW1peGVyCit0aGV5IGFyZSBhY2Nlc2libGUgdmlhIHNwZWNpYWwgSU9DVEwgb24gaHdkZXAKK2FuZCB0aGUgbWl4ZXIgMmRpbWVuc2lvbmFsIG1peGVyIGNvbnRyb2wgKi8KIAogCXNuZF9oZHNwbV9wbGF5YmFja19taXhlci5uYW1lID0gIkNobiI7CiAJbGltaXQgPSBIRFNQTV9NQVhfQ0hBTk5FTFM7CkBAIC0yMjg5LDcgKzI5MzgsOCBAQAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyB2b2lkCi1zbmRfaGRzcG1fcHJvY19yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqIGVudHJ5LCBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCitzbmRfaGRzcG1fcHJvY19yZWFkX21hZGkoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICogZW50cnksCisJCQkgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKQogewogCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSAoc3RydWN0IGhkc3BtICopIGVudHJ5LT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKQEAgLTI0MjAsMTEgKzMwNzAsMTAgQEAKIAkJY2xvY2tfc291cmNlID0gIkVycm9yIjsKIAl9CiAJc25kX2lwcmludGYoYnVmZmVyLCAiU2FtcGxlIENsb2NrIFNvdXJjZTogJXNcbiIsIGNsb2NrX3NvdXJjZSk7Ci0JaWYgKCEoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9DbG9ja01vZGVNYXN0ZXIpKSB7CisJaWYgKCEoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9DbG9ja01vZGVNYXN0ZXIpKQogCQlzeXN0ZW1fY2xvY2tfbW9kZSA9ICJTbGF2ZSI7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXN5c3RlbV9jbG9ja19tb2RlID0gIk1hc3RlciI7Ci0JfQogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlN5c3RlbSBDbG9jayBNb2RlOiAlc1xuIiwgc3lzdGVtX2Nsb2NrX21vZGUpOwogCiAJc3dpdGNoIChoZHNwbV9wcmVmX3N5bmNfcmVmKGhkc3BtKSkgewpAQCAtMjQ4NCwxMyArMzEzMywyMTMgQEAKIAlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOwogfQogCitzdGF0aWMgdm9pZAorc25kX2hkc3BtX3Byb2NfcmVhZF9hZXMzMihzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKiBlbnRyeSwKKwkJCSAgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKQoreworCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSAoc3RydWN0IGhkc3BtICopIGVudHJ5LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzMjsKKwl1bnNpZ25lZCBpbnQgdGltZWNvZGU7CisJaW50IHByZWZfc3luY3JlZjsKKwljaGFyICphdXRvc3luY19yZWY7CisJY2hhciAqc3lzdGVtX2Nsb2NrX21vZGU7CisJY2hhciAqY2xvY2tfc291cmNlOworCWludCB4OworCisJc3RhdHVzID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fc3RhdHVzUmVnaXN0ZXIpOworCXN0YXR1czIgPSBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3RlcjIpOworCXRpbWVjb2RlID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fdGltZWNvZGVSZWdpc3Rlcik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICIlcyAoQ2FyZCAjJWQpIFJldi4leFxuIiwKKwkJICAgIGhkc3BtLT5jYXJkX25hbWUsIGhkc3BtLT5jYXJkLT5udW1iZXIgKyAxLAorCQkgICAgaGRzcG0tPmZpcm13YXJlX3Jldik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJJUlE6ICVkIFJlZ2lzdGVycyBidXM6IDB4JWx4IFZNOiAweCVseFxuIiwKKwkJICAgIGhkc3BtLT5pcnEsIGhkc3BtLT5wb3J0LCAodW5zaWduZWQgbG9uZyloZHNwbS0+aW9iYXNlKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIi0tLSBTeXN0ZW0gLS0tXG4iKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwKKwkJICAgICJJUlEgUGVuZGluZzogQXVkaW89JWQsIE1JREkwPSVkLCBNSURJMT0lZCwgSVJRY291bnQ9JWRcbiIsCisJCSAgICBzdGF0dXMgJiBIRFNQTV9hdWRpb0lSUVBlbmRpbmcsCisJCSAgICAoc3RhdHVzICYgSERTUE1fbWlkaTBJUlFQZW5kaW5nKSA/IDEgOiAwLAorCQkgICAgKHN0YXR1cyAmIEhEU1BNX21pZGkxSVJRUGVuZGluZykgPyAxIDogMCwKKwkJICAgIGhkc3BtLT5pcnFfY291bnQpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwKKwkJICAgICJIVyBwb2ludGVyOiBpZCA9ICVkLCByYXdwdHIgPSAlZCAoJWQtPiVkKSBlc3RpbWF0ZWQ9ICVsZCAoYnl0ZXMpXG4iLAorCQkgICAgKChzdGF0dXMgJiBIRFNQTV9CdWZmZXJJRCkgPyAxIDogMCksCisJCSAgICAoc3RhdHVzICYgSERTUE1fQnVmZmVyUG9zaXRpb25NYXNrKSwKKwkJICAgIChzdGF0dXMgJiBIRFNQTV9CdWZmZXJQb3NpdGlvbk1hc2spICUgKDIgKgorCQkJCQkJCSAgIChpbnQpaGRzcG0tPgorCQkJCQkJCSAgIHBlcmlvZF9ieXRlcyksCisJCSAgICAoKHN0YXR1cyAmIEhEU1BNX0J1ZmZlclBvc2l0aW9uTWFzaykgLQorCQkgICAgIDY0KSAlICgyICogKGludCloZHNwbS0+cGVyaW9kX2J5dGVzKSwKKwkJICAgIChsb25nKSBoZHNwbV9od19wb2ludGVyKGhkc3BtKSAqIDQpOworCisJc25kX2lwcmludGYoYnVmZmVyLAorCQkgICAgIk1JREkgRklGTzogT3V0MT0weCV4LCBPdXQyPTB4JXgsIEluMT0weCV4LCBJbjI9MHgleCBcbiIsCisJCSAgICBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9taWRpU3RhdHVzT3V0MCkgJiAweEZGLAorCQkgICAgaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fbWlkaVN0YXR1c091dDEpICYgMHhGRiwKKwkJICAgIGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX21pZGlTdGF0dXNJbjApICYgMHhGRiwKKwkJICAgIGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX21pZGlTdGF0dXNJbjEpICYgMHhGRik7CisJc25kX2lwcmludGYoYnVmZmVyLAorCQkgICAgIlJlZ2lzdGVyOiBjdHJsMT0weCV4LCBjdHJsMj0weCV4LCBzdGF0dXMxPTB4JXgsIHN0YXR1czI9MHgleCwgdGltZWNvZGU9MHgleFxuIiwKKwkJICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyLCBoZHNwbS0+Y29udHJvbDJfcmVnaXN0ZXIsCisJCSAgICBzdGF0dXMsIHN0YXR1czIsIHRpbWVjb2RlKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIi0tLSBTZXR0aW5ncyAtLS1cbiIpOworCisJeCA9IDEgPDwgKDYgKworCQkgIGhkc3BtX2RlY29kZV9sYXRlbmN5KGhkc3BtLT4KKwkJCQkgICAgICAgY29udHJvbF9yZWdpc3RlciAmCisJCQkJICAgICAgIEhEU1BNX0xhdGVuY3lNYXNrKSk7CisKKwlzbmRfaXByaW50ZihidWZmZXIsCisJCSAgICAiU2l6ZSAoTGF0ZW5jeSk6ICVkIHNhbXBsZXMgKDIgcGVyaW9kcyBvZiAlbHUgYnl0ZXMpXG4iLAorCQkgICAgeCwgKHVuc2lnbmVkIGxvbmcpIGhkc3BtLT5wZXJpb2RfYnl0ZXMpOworCisJc25kX2lwcmludGYoYnVmZmVyLCAiTGluZSBvdXQ6ICVzLCAgIFByZWNpc2UgUG9pbnRlcjogJXNcbiIsCisJCSAgICAoaGRzcG0tPgorCQkgICAgIGNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9MaW5lT3V0KSA/ICJvbiAiIDogIm9mZiIsCisJCSAgICAoaGRzcG0tPnByZWNpc2VfcHRyKSA/ICJvbiIgOiAib2ZmIik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsCisJCSAgICAiQ2xlYXJUcmFja01hcmtlciAlcywgRW1waGFzaXMgJXMsIERvbGJ5ICVzXG4iLAorCQkgICAgKGhkc3BtLT4KKwkJICAgICBjb250cm9sX3JlZ2lzdGVyICYgSERTUE1fY2xyX3RtcykgPyAib24iIDogIm9mZiIsCisJCSAgICAoaGRzcG0tPgorCQkgICAgIGNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9FbXBoYXNpcykgPyAib24iIDogIm9mZiIsCisJCSAgICAoaGRzcG0tPgorCQkgICAgIGNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9Eb2xieSkgPyAib24iIDogIm9mZiIpOworCisJc3dpdGNoIChoZHNwbV9jbG9ja19zb3VyY2UoaGRzcG0pKSB7CisJY2FzZSBIRFNQTV9DTE9DS19TT1VSQ0VfQVVUT1NZTkM6CisJCWNsb2NrX3NvdXJjZSA9ICJBdXRvU3luYyI7CisJCWJyZWFrOworCWNhc2UgSERTUE1fQ0xPQ0tfU09VUkNFX0lOVEVSTkFMXzMyS0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgMzIga0h6IjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQTV9DTE9DS19TT1VSQ0VfSU5URVJOQUxfNDRfMUtIWjoKKwkJY2xvY2tfc291cmNlID0gIkludGVybmFsIDQ0LjEga0h6IjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQTV9DTE9DS19TT1VSQ0VfSU5URVJOQUxfNDhLSFo6CisJCWNsb2NrX3NvdXJjZSA9ICJJbnRlcm5hbCA0OCBrSHoiOworCQlicmVhazsKKwljYXNlIEhEU1BNX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF82NEtIWjoKKwkJY2xvY2tfc291cmNlID0gIkludGVybmFsIDY0IGtIeiI7CisJCWJyZWFrOworCWNhc2UgSERTUE1fQ0xPQ0tfU09VUkNFX0lOVEVSTkFMXzg4XzJLSFo6CisJCWNsb2NrX3NvdXJjZSA9ICJJbnRlcm5hbCA4OC4yIGtIeiI7CisJCWJyZWFrOworCWNhc2UgSERTUE1fQ0xPQ0tfU09VUkNFX0lOVEVSTkFMXzk2S0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgOTYga0h6IjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQTV9DTE9DS19TT1VSQ0VfSU5URVJOQUxfMTI4S0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgMTI4IGtIeiI7CisJCWJyZWFrOworCWNhc2UgSERTUE1fQ0xPQ0tfU09VUkNFX0lOVEVSTkFMXzE3Nl80S0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgMTc2LjQga0h6IjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQTV9DTE9DS19TT1VSQ0VfSU5URVJOQUxfMTkyS0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgMTkyIGtIeiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNsb2NrX3NvdXJjZSA9ICJFcnJvciI7CisJfQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlNhbXBsZSBDbG9jayBTb3VyY2U6ICVzXG4iLCBjbG9ja19zb3VyY2UpOworCWlmICghKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUE1fQ2xvY2tNb2RlTWFzdGVyKSkKKwkJc3lzdGVtX2Nsb2NrX21vZGUgPSAiU2xhdmUiOworCWVsc2UKKwkJc3lzdGVtX2Nsb2NrX21vZGUgPSAiTWFzdGVyIjsKKwlzbmRfaXByaW50ZihidWZmZXIsICJTeXN0ZW0gQ2xvY2sgTW9kZTogJXNcbiIsIHN5c3RlbV9jbG9ja19tb2RlKTsKKworCXByZWZfc3luY3JlZiA9IGhkc3BtX3ByZWZfc3luY19yZWYoaGRzcG0pOworCWlmIChwcmVmX3N5bmNyZWYgPT0gMCkKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiUHJlZmVycmVkIFN5bmMgUmVmZXJlbmNlOiBXb3JkIENsb2NrXG4iKTsKKwllbHNlCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlByZWZlcnJlZCBTeW5jIFJlZmVyZW5jZTogQUVTJWRcbiIsCisJCQkJcHJlZl9zeW5jcmVmKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlN5c3RlbSBDbG9jayBGcmVxdWVuY3k6ICVkXG4iLAorCQkgICAgaGRzcG0tPnN5c3RlbV9zYW1wbGVfcmF0ZSk7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJEb3VibGUgc3BlZWQ6ICVzXG4iLAorCQkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9EU19Eb3VibGVXaXJlPworCQkJIkRvdWJsZSB3aXJlIiA6ICJTaW5nbGUgd2lyZSIpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlF1YWQgc3BlZWQ6ICVzXG4iLAorCQkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9RU19Eb3VibGVXaXJlPworCQkJIkRvdWJsZSB3aXJlIiA6CisJCQloZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BNX1FTX1F1YWRXaXJlPworCQkJIlF1YWQgd2lyZSIgOiAiU2luZ2xlIHdpcmUiKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIi0tLSBTdGF0dXM6XG4iKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIldvcmQ6ICVzICBGcmVxdWVuY3k6ICVkXG4iLAorCQkJKHN0YXR1cyAmIEhEU1BNX0FFUzMyX3djTG9jayk/ICJTeW5jICAgIiA6ICJObyBMb2NrIiwKKwkJCUhEU1BNX2JpdDJmcmVxKChzdGF0dXMgPj4gSERTUE1fQUVTMzJfd2NGcmVxX2JpdCkgJiAweEYpKTsKKworCWZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiQUVTJWQ6ICVzICBGcmVxdWVuY3k6ICVkXG4iLAorCQkJCXgrMSwKKwkJCQkoc3RhdHVzMiAmIChIRFNQTV9Mb2NrQUVTID4+IHgpKT8gIlN5bmMgICAiOiAiTm8gTG9jayIsCisJCQkJSERTUE1fYml0MmZyZXEoKHRpbWVjb2RlID4+ICg0KngpKSAmIDB4RikpOworCX0KKworCXN3aXRjaCAoaGRzcG1fYXV0b3N5bmNfcmVmKGhkc3BtKSkgeworCWNhc2UgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9OT05FOiBhdXRvc3luY19yZWY9Ik5vbmUiOyBicmVhazsKKwljYXNlIEhEU1BNX0FFUzMyX0FVVE9TWU5DX0ZST01fV09SRDogYXV0b3N5bmNfcmVmPSJXb3JkIENsb2NrIjsgYnJlYWs7CisJY2FzZSBIRFNQTV9BRVMzMl9BVVRPU1lOQ19GUk9NX0FFUzE6IGF1dG9zeW5jX3JlZj0iQUVTMSI7IGJyZWFrOworCWNhc2UgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVMyOiBhdXRvc3luY19yZWY9IkFFUzIiOyBicmVhazsKKwljYXNlIEhEU1BNX0FFUzMyX0FVVE9TWU5DX0ZST01fQUVTMzogYXV0b3N5bmNfcmVmPSJBRVMzIjsgYnJlYWs7CisJY2FzZSBIRFNQTV9BRVMzMl9BVVRPU1lOQ19GUk9NX0FFUzQ6IGF1dG9zeW5jX3JlZj0iQUVTNCI7IGJyZWFrOworCWNhc2UgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM1OiBhdXRvc3luY19yZWY9IkFFUzUiOyBicmVhazsKKwljYXNlIEhEU1BNX0FFUzMyX0FVVE9TWU5DX0ZST01fQUVTNjogYXV0b3N5bmNfcmVmPSJBRVM2IjsgYnJlYWs7CisJY2FzZSBIRFNQTV9BRVMzMl9BVVRPU1lOQ19GUk9NX0FFUzc6IGF1dG9zeW5jX3JlZj0iQUVTNyI7IGJyZWFrOworCWNhc2UgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM4OiBhdXRvc3luY19yZWY9IkFFUzgiOyBicmVhazsKKwlkZWZhdWx0OiBhdXRvc3luY19yZWYgPSAiLS0tIjsgYnJlYWs7CisJfQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkF1dG9TeW5jIHJlZiA9ICVzXG4iLCBhdXRvc3luY19yZWYpOworCisJc25kX2lwcmludGYoYnVmZmVyLCAiXG4iKTsKK30KKworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKK3N0YXRpYyB2b2lkCitzbmRfaGRzcG1fcHJvY19yZWFkX2RlYnVnKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqIGVudHJ5LAorCQkJICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCit7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IChzdHJ1Y3QgaGRzcG0gKillbnRyeS0+cHJpdmF0ZV9kYXRhOworCisJaW50IGosaTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTYgLyogMTAyNCo2NCAqLzsgaSArPSBqKQorCXsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiMHglMDhYOiAiLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqICs9IDQpCisJCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDhYICIsIGhkc3BtX3JlYWQoaGRzcG0sIGkgKyBqKSk7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisJfQorfQorI2VuZGlmCisKKworCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX2hkc3BtX3Byb2NfaW5pdChzdHJ1Y3QgaGRzcG0gKiBoZHNwbSkKIHsKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCFzbmRfY2FyZF9wcm9jX25ldyhoZHNwbS0+Y2FyZCwgImhkc3BtIiwgJmVudHJ5KSkKIAkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBoZHNwbSwKLQkJCQkgICAgICBzbmRfaGRzcG1fcHJvY19yZWFkKTsKKwkJCQkgICAgICBoZHNwbS0+aXNfYWVzMzIgPworCQkJCSAgICAgIHNuZF9oZHNwbV9wcm9jX3JlYWRfYWVzMzIgOgorCQkJCSAgICAgIHNuZF9oZHNwbV9wcm9jX3JlYWRfbWFkaSk7CisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworCS8qIGRlYnVnIGZpbGUgdG8gcmVhZCBhbGwgaGRzcG0gcmVnaXN0ZXJzICovCisJaWYgKCFzbmRfY2FyZF9wcm9jX25ldyhoZHNwbS0+Y2FyZCwgImRlYnVnIiwgJmVudHJ5KSkKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBoZHNwbSwKKwkJCQlzbmRfaGRzcG1fcHJvY19yZWFkX2RlYnVnKTsKKyNlbmRpZgogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjUwNywxMyArMzM1NiwyMCBAQAogCiAJLyogc2V0IGRlZmF1bHRzOiAgICAgICAqLwogCi0JaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgPSBIRFNQTV9DbG9ja01vZGVNYXN0ZXIgfAkvKiBNYXN0ZXIgQ2xvYWNrIE1vZGUgb24gKi8KLQkgICAgaGRzcG1fZW5jb2RlX2xhdGVuY3koNykgfAkvKiBsYXRlbmN5IG1heGltdW0gPSA4MTkyIHNhbXBsZXMgKi8KLQkgICAgSERTUE1fSW5wdXRDb2F4aWFsIHwJLyogSW5wdXQgQ29heCBub3QgT3B0aWNhbCAqLwotCSAgICBIRFNQTV9TeW5jUmVmX01BREkgfAkvKiBNYWRpIGlzIHN5bmNjbG9jayAqLwotCSAgICBIRFNQTV9MaW5lT3V0IHwJLyogQW5hbG9nIG91dHB1dCBpbiAqLwotCSAgICBIRFNQTV9UWF82NGNoIHwJLyogdHJhbnNtaXQgaW4gNjRjaCBtb2RlICovCi0JICAgIEhEU1BNX0F1dG9JbnA7CS8qIEF1dG9JbnB1dCBjaG9zc2luZyAodGFrZW92ZXIpICovCisJaWYgKGhkc3BtLT5pc19hZXMzMikKKwkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgPSBIRFNQTV9DbG9ja01vZGVNYXN0ZXIgfAkvKiBNYXN0ZXIgQ2xvYWNrIE1vZGUgb24gKi8KKwkJCWhkc3BtX2VuY29kZV9sYXRlbmN5KDcpIHwJLyogbGF0ZW5jeSBtYXhpbXVtID0gODE5MiBzYW1wbGVzICovCisJCQlIRFNQTV9TeW5jUmVmMCB8CS8qIEFFUzEgaXMgc3luY2Nsb2NrICovCisJCQlIRFNQTV9MaW5lT3V0IHwJLyogQW5hbG9nIG91dHB1dCBpbiAqLworCQkJSERTUE1fUHJvZmVzc2lvbmFsOyAgLyogUHJvZmVzc2lvbmFsIG1vZGUgKi8KKwllbHNlCisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyID0gSERTUE1fQ2xvY2tNb2RlTWFzdGVyIHwJLyogTWFzdGVyIENsb2FjayBNb2RlIG9uICovCisJCQloZHNwbV9lbmNvZGVfbGF0ZW5jeSg3KSB8CS8qIGxhdGVuY3kgbWF4aW11bSA9IDgxOTIgc2FtcGxlcyAqLworCQkJSERTUE1fSW5wdXRDb2F4aWFsIHwJLyogSW5wdXQgQ29heCBub3QgT3B0aWNhbCAqLworCQkJSERTUE1fU3luY1JlZl9NQURJIHwJLyogTWFkaSBpcyBzeW5jY2xvY2sgKi8KKwkJCUhEU1BNX0xpbmVPdXQgfAkvKiBBbmFsb2cgb3V0cHV0IGluICovCisJCQlIRFNQTV9UWF82NGNoIHwJLyogdHJhbnNtaXQgaW4gNjRjaCBtb2RlICovCisJCQlIRFNQTV9BdXRvSW5wOwkvKiBBdXRvSW5wdXQgY2hvc3NpbmcgKHRha2VvdmVyKSAqLwogCiAJLyogISBIRFNQTV9GcmVxdWVuY3kwfEhEU1BNX0ZyZXF1ZW5jeTEgPSA0NC4xa2h6ICovCiAJLyogISAgSERTUE1fRG91YmxlU3BlZWQgSERTUE1fUXVhZFNwZWVkID0gbm9ybWFsIHNwZWVkICovCkBAIC0yODIyLDYgKzM2NzgsOCBAQAogCiAJCWhkc3BtLT5wbGF5YmFja19idWZmZXIgPQogCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYTsKKwkJc25kX3ByaW50ZGQoIkFsbG9jYXRlZCBzYW1wbGUgYnVmZmVyIGZvciBwbGF5YmFjayBhdCAlcFxuIiwKKwkJCQloZHNwbS0+cGxheWJhY2tfYnVmZmVyKTsKIAl9IGVsc2UgewogCQloZHNwbV9zZXRfc2didWYoaGRzcG0sIHNnYnVmLCBIRFNQTV9wYWdlQWRkcmVzc0J1ZmZlckluLAogCQkJCXBhcmFtc19jaGFubmVscyhwYXJhbXMpKTsKQEAgLTI4MzEsNyArMzY4OSwxNSBAQAogCiAJCWhkc3BtLT5jYXB0dXJlX2J1ZmZlciA9CiAJCSAgICAodW5zaWduZWQgY2hhciAqKSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhOworCQlzbmRfcHJpbnRkZCgiQWxsb2NhdGVkIHNhbXBsZSBidWZmZXIgZm9yIGNhcHR1cmUgYXQgJXBcbiIsCisJCQkJaGRzcG0tPmNhcHR1cmVfYnVmZmVyKTsKIAl9CisJLyoKKwkgICBzbmRfcHJpbnRkZCgiQWxsb2NhdGVkIHNhbXBsZSBidWZmZXIgZm9yICVzIGF0IDB4JTA4WFxuIiwKKwkgICBzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8KKwkgICAicGxheWJhY2siIDogImNhcHR1cmUiLAorCSAgIHNuZF9wY21fc2didWZfZ2V0X2FkZHIoc2didWYsIDApKTsKKwkgKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjk4Miw5ICszODQ4LDEwIEBACiAJCSAgU05EUlZfUENNX1JBVEVfNDQxMDAgfAogCQkgIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKIAkJICBTTkRSVl9QQ01fUkFURV82NDAwMCB8Ci0JCSAgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCksCisJCSAgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCSAgU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMTkyMDAwICksCiAJLnJhdGVfbWluID0gMzIwMDAsCi0JLnJhdGVfbWF4ID0gOTYwMDAsCisJLnJhdGVfbWF4ID0gMTkyMDAwLAogCS5jaGFubmVsc19taW4gPSAxLAogCS5jaGFubmVsc19tYXggPSBIRFNQTV9NQVhfQ0hBTk5FTFMsCiAJLmJ1ZmZlcl9ieXRlc19tYXggPQpAQCAtMzAwNiw5ICszODczLDEwIEBACiAJCSAgU05EUlZfUENNX1JBVEVfNDQxMDAgfAogCQkgIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKIAkJICBTTkRSVl9QQ01fUkFURV82NDAwMCB8Ci0JCSAgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCksCisJCSAgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCSAgU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMTkyMDAwKSwKIAkucmF0ZV9taW4gPSAzMjAwMCwKLQkucmF0ZV9tYXggPSA5NjAwMCwKKwkucmF0ZV9tYXggPSAxOTIwMDAsCiAJLmNoYW5uZWxzX21pbiA9IDEsCiAJLmNoYW5uZWxzX21heCA9IEhEU1BNX01BWF9DSEFOTkVMUywKIAkuYnVmZmVyX2J5dGVzX21heCA9CkBAIC0zMzE1LDcgKzQxODMsOCBAQAogCiAJcGNtID0gaGRzcG0tPnBjbTsKIAotCXdhbnRlZCA9IEhEU1BNX0RNQV9BUkVBX0JZVEVTICsgNDA5NjsJLyogZG9udCBrbm93IHdoeSwgYnV0IGl0IHdvcmtzICovCisvKgl3YW50ZWQgPSBIRFNQTV9ETUFfQVJFQV9CWVRFUyArIDQwOTY7Ki8JLyogZG9udCBrbm93IHdoeSwgYnV0IGl0IHdvcmtzICovCisJd2FudGVkID0gSERTUE1fRE1BX0FSRUFfQllURVM7CiAKIAlpZiAoKGVyciA9CiAJICAgICBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwKQEAgLTM0NjcsOSArNDMzNiwxNiBAQAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGhkc3BtLT5wY2ksCiAJCQkgICAgIFBDSV9DTEFTU19SRVZJU0lPTiwgJmhkc3BtLT5maXJtd2FyZV9yZXYpOwogCi0Jc3RyY3B5KGNhcmQtPmRyaXZlciwgIkhEU1BNIik7CisJaGRzcG0tPmlzX2FlczMyID0gKGhkc3BtLT5maXJtd2FyZV9yZXYgPj0gSERTUE1fQUVTUkVWSVNJT04pOworCiAJc3RyY3B5KGNhcmQtPm1peGVybmFtZSwgIlhpbGlueCBGUEdBIik7Ci0JaGRzcG0tPmNhcmRfbmFtZSA9ICJSTUUgSERTUE0gTUFESSI7CisJaWYgKGhkc3BtLT5pc19hZXMzMikgeworCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiSERTUEFFUzMyIik7CisJCWhkc3BtLT5jYXJkX25hbWUgPSAiUk1FIEhEU1BNIEFFUzMyIjsKKwl9IGVsc2UgeworCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiSERTUE0iKTsKKwkJaGRzcG0tPmNhcmRfbmFtZSA9ICJSTUUgSERTUE0gTUFESSI7CisJfQogCiAJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCmluZGV4IDQ3NGYyZDQuLjNiZmYzMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCkBAIC0yNjI3LDcgKzI2MjcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfZ3ZvbCwgLTYzNzUsIDI1LCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9ndm9sLCAtNjM3NSwgMjUsIDApOwogCiBzdGF0aWMgaW50IHNuZF90cmlkZW50X3ZvbF9jb250cm9sX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCkBAIC0yODQ0LDcgKzI4NDQsNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9jcnZvbCwgLTMxNzUsIDI1LCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9jcnZvbCwgLTMxNzUsIDI1LCAxKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF90cmlkZW50X3BjbV9ydm9sX2NvbnRyb2wgX19kZXZpbml0ZGF0YSA9CiB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCBhNTcyYjAxLi5hMjg5OTIyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTE2OTksNyArMTY5OSw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2R4cywgLTk0NTAsIDE1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfZHhzLCAtOTQ1MCwgMTUwLCAxKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92aWE4MjMzX3BjbWR4c192b2x1bWVfY29udHJvbCBfX2RldmluaXRkYXRhID0gewogCS5uYW1lID0gIlBDTSBQbGF5YmFjayBWb2x1bWUiLApAQCAtMTgyMyw3ICsxODIzLDcgQEAKIAlhYzk3LnByaXZhdGVfZGF0YSA9IGNoaXA7CiAJYWM5Ny5wcml2YXRlX2ZyZWUgPSBzbmRfdmlhODJ4eF9taXhlcl9mcmVlX2FjOTc7CiAJYWM5Ny5wY2kgPSBjaGlwLT5wY2k7Ci0JYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX01PREVNOworCWFjOTcuc2NhcHMgPSBBQzk3X1NDQVBfU0tJUF9NT0RFTSB8IEFDOTdfU0NBUF9QT1dFUl9TQVZFOwogCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIoY2hpcC0+YWM5N19idXMsICZhYzk3LCAmY2hpcC0+YWM5NykpIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMjM1Nyw5MyArMjM1Nyw1OSBAQAogLyoKICAqIGF1dG8gZGV0ZWN0aW9uIG9mIERYUyBjaGFubmVsIHN1cHBvcnRzLgogICovCi1zdHJ1Y3QgZHhzX3doaXRlbGlzdCB7Ci0JdW5zaWduZWQgc2hvcnQgc3VidmVuZG9yOwotCXVuc2lnbmVkIHNob3J0IHN1YmRldmljZTsgCi0JdW5zaWduZWQgc2hvcnQgbWFzazsgCi0Jc2hvcnQgYWN0aW9uOwkvKiBuZXcgZHhzX3N1cHBvcnQgdmFsdWUgKi8KKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGR4c193aGl0ZWxpc3RbXSBfX2RldmluaXRkYXRhID0geworCVNORF9QQ0lfUVVJUksoMHgxMDA1LCAweDQ3MTAsICJBdmFuY2UgTG9naWMgTW9ibyIsIFZJQV9EWFNfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHgwOTk2LCAiRVNDIE1vYm8iLCBWSUFfRFhTXzQ4SyksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MGE4MSwgIkVDUyBLN1ZUQTMgdjguMCIsIFZJQV9EWFNfTk9fVlJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHgwYTg1LCAiRUNTIEw3Vk1NMiIsIFZJQV9EWFNfTk9fVlJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMCwgIkVTQyBLOCIsIFZJQV9EWFNfU1JDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHhhYTAxLCAiRVNDIEs4VDg5MC1BIiwgVklBX0RYU19TUkMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwMzMsICJBY2VyIEluc3BpcmUgMTM1M0xNIiwgVklBX0RYU19OT19WUkEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwNDYsICJBY2VyIEFzcGlyZSAxNTI0IFdMTWkiLCBWSUFfRFhTX1NSQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDAsICJBU1VTIEE3L0E4IiwgVklBX0RYU19OT19WUkEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDcxLCAwLCAiRGl2ZXJzZSBOb3RlYm9vayIsIFZJQV9EWFNfTk9fVlJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTBjZiwgMHgxMThlLCAiRlNDIExhcHRvcCIsIFZJQV9EWFNfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTEwNiwgMCwgIkFTUm9jayIsIFZJQV9EWFNfU1JDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTI5NywgMHhhMjMyLCAiU2h1dHRsZSIsIFZJQV9EWFNfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTI5NywgMHhjMTYwLCAiU2h1dHRsZSBTazQxRyIsIFZJQV9EWFNfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ1OCwgMHhhMDAyLCAiR2lnYWJ5dGUgR0EtN1ZBWFAiLCBWSUFfRFhTX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4MzgwMCwgIk1TSSBLVDI2NiIsIFZJQV9EWFNfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3MTIwLCAiTVNJIEtUNFYiLCBWSUFfRFhTX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzE0MiwgIk1TSSBLOE1NLVYiLCBWSUFfRFhTX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDAsICJNU0kgTW9ibyIsIFZJQV9EWFNfU1JDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ3YiwgMHgxNDAxLCAiQUJJVCBLRDcoLVJBSUQpIiwgVklBX0RYU19FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxNDdiLCAweDE0MTEsICJBQklUIFZBLTIwIiwgVklBX0RYU19FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxNDdiLCAweDE0MTMsICJBQklUIEtWOCBQcm8iLCBWSUFfRFhTX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE0N2IsIDB4MTQxNSwgIkFCSVQgQVY4IiwgVklBX0RYU19OT19WUkEpLAorCVNORF9QQ0lfUVVJUksoMHgxNGZmLCAweDA0MDMsICJUd2luaGVhZCBtb2JvIiwgVklBX0RYU19FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxNGZmLCAweDA0MDgsICJUd2luaGVhZCBsYXB0b3AiLCBWSUFfRFhTX1NSQyksCisJU05EX1BDSV9RVUlSSygweDE1NTgsIDB4NDcwMSwgIkNsZXZvIEQ0NzAiLCBWSUFfRFhTX1NSQyksCisJU05EX1BDSV9RVUlSSygweDE1ODQsIDB4ODEyMCwgIkRpdmVyc2UgTGFwdG9wIiwgVklBX0RYU19FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDgxMjMsICJUYXJnYS9Vbml3aWxsIiwgVklBX0RYU19OT19WUkEpLAorCVNORF9QQ0lfUVVJUksoMHgxNjFmLCAweDIwMmIsICJBbWlyYSBOb3RlYm9vayIsIFZJQV9EWFNfTk9fVlJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTYxZiwgMHgyMDMyLCAibTY4MHggbWFjaGluZXMiLCBWSUFfRFhTXzQ4SyksCisJU05EX1BDSV9RVUlSSygweDE2MzEsIDB4ZTAwNCwgIlBCIEVhc3lOb3RlIDMxNzQiLCBWSUFfRFhTX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE2OTUsIDB4MzAwNSwgIkVQb1ggRVAtOEs5QSIsIFZJQV9EWFNfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTY5NSwgMCwgIkVQb1ggbW9ibyIsIFZJQV9EWFNfU1JDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTZmMywgMCwgIkpldHdheSBLOCIsIFZJQV9EWFNfU1JDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTczNCwgMCwgIkZTQyBMYXB0b3AiLCBWSUFfRFhTX1NSQyksCisJU05EX1BDSV9RVUlSSygweDE4NDksIDB4MzA1OSwgIkFTUm9jayBLN1ZNMiIsIFZJQV9EWFNfTk9fVlJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTg0OSwgMCwgIkFTUm9jayBtb2JvIiwgVklBX0RYU19TUkMpLAorCVNORF9QQ0lfUVVJUksoMHgxOTE5LCAweDIwMGEsICJTb2x0ZWsgU0wtSzgiLCAgVklBX0RYU19OT19WUkEpLAorCVNORF9QQ0lfUVVJUksoMHg0MDA1LCAweDQ3MTAsICJNU0kgSzdUMjY2IiwgVklBX0RYU19TUkMpLAorCXsgfSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjaGVja19keHNfbGlzdChzdHJ1Y3QgcGNpX2RldiAqcGNpLCBpbnQgcmV2aXNpb24pCiB7Ci0Jc3RhdGljIHN0cnVjdCBkeHNfd2hpdGVsaXN0IHdoaXRlbGlzdFtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JCXsgLnN1YnZlbmRvciA9IDB4MTAwNSwgLnN1YmRldmljZSA9IDB4NDcxMCwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIEF2YW5jZSBMb2dpYyBNb2JvICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTAxOSwgLnN1YmRldmljZSA9IDB4MDk5NiwgLmFjdGlvbiA9IFZJQV9EWFNfNDhLIH0sCi0JCXsgLnN1YnZlbmRvciA9IDB4MTAxOSwgLnN1YmRldmljZSA9IDB4MGE4MSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEVDUyBLN1ZUQTMgdjguMCAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDEwMTksIC5zdWJkZXZpY2UgPSAweDBhODUsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBFQ1MgTDdWTU0yICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTAxOSwgLnN1YmRldmljZSA9IDB4YTEwMSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sCi0JCXsgLnN1YnZlbmRvciA9IDB4MTAxOSwgLnN1YmRldmljZSA9IDB4YWEwMSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEVDUyBLOFQ4OTAtQSAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDEwMjUsIC5zdWJkZXZpY2UgPSAweDAwMzMsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBBY2VyIEluc3BpcmUgMTM1M0xNICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTAyNSwgLnN1YmRldmljZSA9IDB4MDA0NiwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEFjZXIgQXNwaXJlIDE1MjQgV0xNaSAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDEwNDMsIC5zdWJkZXZpY2UgPSAweDgwOTUsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBBU1VTIEE3VjhYIChGSVhNRTogcG9zc2libHkgVklBX0RYU19FTkFCTEU/KSovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTA0MywgLnN1YmRldmljZSA9IDB4ODBhMSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEFTVVMgQTdWOC1YICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTA0MywgLnN1YmRldmljZSA9IDB4ODBiMCwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEFTVVMgQTdWNjAwICYgSzhWKi8gCi0JCXsgLnN1YnZlbmRvciA9IDB4MTA0MywgLnN1YmRldmljZSA9IDB4ODEwZCwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEFTVVMgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxMDQzLCAuc3ViZGV2aWNlID0gMHg4MTJhLCAuYWN0aW9uID0gVklBX0RYU19TUkMgICAgfSwgLyogQVNVUyBBOFYgRGVsdXhlICovIAotCQl7IC5zdWJ2ZW5kb3IgPSAweDEwNDMsIC5zdWJkZXZpY2UgPSAweDgxNzQsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyAgICB9LCAvKiBBU1VTICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTA0MywgLnN1YmRldmljZSA9IDB4ODFiOSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDICAgIH0sIC8qIEFTVVMgQThWLU1YICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTA3MSwgLnN1YmRldmljZSA9IDB4ODM3NSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIFZvYmlzL1lha3Vtby9NaXRhYyBub3RlYm9vayAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDEwNzEsIC5zdWJkZXZpY2UgPSAweDgzOTksIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBVbWF4IEFCIDU5NVQgKFZJQSBLOE44MDBBIC0gVlQ4MjM3KSAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDEwY2YsIC5zdWJkZXZpY2UgPSAweDExOGUsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBGU0MgbGFwdG9wICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTEwNiwgLnN1YmRldmljZSA9IDB4NDE2MSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEFTUm9jayBLN1ZUMiAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDExMDYsIC5zdWJkZXZpY2UgPSAweDQ1NTIsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBRREkgS3Vkb3ogN1gvNjAwLTZBTCAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDExMDYsIC5zdWJkZXZpY2UgPSAweGFhMDEsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBFUElBIE1JSSAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDExMDYsIC5zdWJkZXZpY2UgPSAweGMwMDEsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBJbnNpZ2h0IFA0LUlUWCAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDEyOTcsIC5zdWJkZXZpY2UgPSAweGEyMzIsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBTaHV0dGxlID8/ICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTI5NywgLnN1YmRldmljZSA9IDB4YzE2MCwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIFNodXR0bGUgU0s0MUcgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDU4LCAuc3ViZGV2aWNlID0gMHhhMDAyLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogR2lnYWJ5dGUgR0EtN1ZBWFAgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHgwMDgwLCAuYWN0aW9uID0gVklBX0RYU19TUkMgfSwgLyogTVNJIEs4VCBOZW8tRklTMlIgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHgwNDMwLCAuYWN0aW9uID0gVklBX0RYU19TUkMgfSwgLyogTVNJIDcxNDIgKEs4TU0tVikgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHgwNDcwLCAuYWN0aW9uID0gVklBX0RYU19TUkMgfSwgLyogTVNJIEtUODgwIERlbHRhLUZTUiAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweDM4MDAsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBNU0kgS1QyNjYgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHg1OTAxLCAuYWN0aW9uID0gVklBX0RYU19OT19WUkEgfSwgLyogTVNJIEtUNiBEZWx0YS1TUiAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweDcwMjMsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBNU0kgSzhUIE5lbzItRkkgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHg3MTIwLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogTVNJIEtUNFYgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHg3MTQyLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogTVNJIEs4TU0tViAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweGIwMTIsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBQNE04MDAvVklBODIzN1IgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDdiLCAuc3ViZGV2aWNlID0gMHgxNDAxLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogQUJJVCBLRDcoLVJBSUQpICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTQ3YiwgLnN1YmRldmljZSA9IDB4MTQxMSwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIEFCSVQgVkEtMjAgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDdiLCAuc3ViZGV2aWNlID0gMHgxNDEzLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogQUJJVCBLVjggUHJvICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTQ3YiwgLnN1YmRldmljZSA9IDB4MTQxNSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEFiaXQgQVY4ICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTRmZiwgLnN1YmRldmljZSA9IDB4MDQwMywgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIFR3aW5oZWFkIG1vYm8gKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNGZmLCAuc3ViZGV2aWNlID0gMHgwNDA4LCAuYWN0aW9uID0gVklBX0RYU19TUkMgfSwgLyogVHdpbmhlYWQgbGFwdG9wICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTU1OCwgLnN1YmRldmljZSA9IDB4NDcwMSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIENsZXZvIEQ0NzAgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNTg0LCAuc3ViZGV2aWNlID0gMHg4MTIwLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogR2VyaWNvbS9UYXJnYS9Wb2Jpcy9Vbml3aWxsIGxhcHRvcCAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE1ODQsIC5zdWJkZXZpY2UgPSAweDgxMjMsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBVbml3aWxsIChUYXJnYSBWaXNpb25hcnkgWFAtMjEwKSAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE2MWYsIC5zdWJkZXZpY2UgPSAweDIwMmIsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBBbWlyYSBOb3RlIGJvb2sgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNjFmLCAuc3ViZGV2aWNlID0gMHgyMDMyLCAuYWN0aW9uID0gVklBX0RYU180OEsgfSwgLyogbTY4MHggbWFjaGluZXMgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNjMxLCAuc3ViZGV2aWNlID0gMHhlMDA0LCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogRWFzeSBOb3RlIDMxNzQsIFBhY2thcmQgQmVsbCAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE2OTUsIC5zdWJkZXZpY2UgPSAweDMwMDUsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBFUG9YIEVQLThLOUEgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNjk1LCAuc3ViZGV2aWNlID0gMHgzMDBjLCAuYWN0aW9uID0gVklBX0RYU19TUkMgfSwgLyogRVBvWCBFUC04S1JBSSAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE2OTUsIC5zdWJkZXZpY2UgPSAweDMwMGUsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBFUG9YIDlIRUFJICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTZmMywgLnN1YmRldmljZSA9IDB4NjQwNSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEpldHdheSBLOE04TVMgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNzM0LCAuc3ViZGV2aWNlID0gMHgxMDc4LCAuYWN0aW9uID0gVklBX0RYU19TUkMgfSwgLyogRlNDIEFtaWxvIEw3MzAwICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTczNCwgLnN1YmRldmljZSA9IDB4MTA5MywgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEZTQyAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE3MzQsIC5zdWJkZXZpY2UgPSAweDEwYWIsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBGU0MgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxODQ5LCAuc3ViZGV2aWNlID0gMHgzMDU5LCAuYWN0aW9uID0gVklBX0RYU19OT19WUkEgfSwgLyogQVNSb2NrIEs3Vk0yICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTg0OSwgLnN1YmRldmljZSA9IDB4OTczOSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEFTUm9jayBtb2JvKD8pICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTg0OSwgLnN1YmRldmljZSA9IDB4OTc2MSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEFTUm9jayBtb2JvKD8pICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTkxOSwgLnN1YmRldmljZSA9IDB4MjAwYSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIFNvbHRlayBTTC1LOFRwcm8tOTM5ICovCi0JCXsgLnN1YnZlbmRvciA9IDB4NDAwNSwgLnN1YmRldmljZSA9IDB4NDcxMCwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sCS8qIE1TSSBLN1QyNjYgUHJvMiAoTVMtNjM4MCBWMi4wKSBCSU9TIDMuNyAqLwotCQl7IH0gLyogdGVybWluYXRvciAqLwotCX07Ci0JY29uc3Qgc3RydWN0IGR4c193aGl0ZWxpc3QgKnc7Ci0JdW5zaWduZWQgc2hvcnQgc3Vic3lzdGVtX3ZlbmRvcjsKLQl1bnNpZ25lZCBzaG9ydCBzdWJzeXN0ZW1fZGV2aWNlOworCWNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICp3OwogCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnN1YnN5c3RlbV92ZW5kb3IpOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJnN1YnN5c3RlbV9kZXZpY2UpOwotCi0JZm9yICh3ID0gd2hpdGVsaXN0OyB3LT5zdWJ2ZW5kb3I7IHcrKykgewotCQlpZiAody0+c3VidmVuZG9yICE9IHN1YnN5c3RlbV92ZW5kb3IpCi0JCQljb250aW51ZTsKLQkJaWYgKHctPm1hc2spIHsKLQkJCWlmICgody0+bWFzayAmIHN1YnN5c3RlbV9kZXZpY2UpID09IHctPnN1YmRldmljZSkKLQkJCQlyZXR1cm4gdy0+YWN0aW9uOwotCQl9IGVsc2UgewotCQkJaWYgKHN1YnN5c3RlbV9kZXZpY2UgPT0gdy0+c3ViZGV2aWNlKQotCQkJCXJldHVybiB3LT5hY3Rpb247Ci0JCX0KKwl3ID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBkeHNfd2hpdGVsaXN0KTsKKwlpZiAodykgeworCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gInZpYTgyeHg6IERYUyB3aGl0ZSBsaXN0IGZvciAlcyBmb3VuZFxuIiwKKwkJCSAgICB3LT5uYW1lKTsKKwkJcmV0dXJuIHctPnZhbHVlOwogCX0KIAogCS8qIGZvciBuZXdlciByZXZpc2lvbiwgZGVmYXVsdCB0byBEWFNfU1JDICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jIGIvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYwppbmRleCAxN2Q2Yjg0Li5iMzM4ZTE1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKQEAgLTkwMCw3ICs5MDAsNyBAQAogCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKIAlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF92aWE4Mnh4X21peGVyX2ZyZWVfYWM5NzsKIAlhYzk3LnBjaSA9IGNoaXAtPnBjaTsKLQlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX1NLSVBfQVVESU87CisJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX0FVRElPIHwgQUM5N19TQ0FQX1BPV0VSX1NBVkU7CiAJYWM5Ny5udW0gPSBjaGlwLT5hYzk3X3NlY29uZGFyeTsKIAogCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIoY2hpcC0+YWM5N19idXMsICZhYzk3LCAmY2hpcC0+YWM5NykpIDwgMCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92eDIyMi92eDIyMi5jIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKaW5kZXggODlmNThlYS4uNDc0ZWFjOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKKysrIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKQEAgLTczLDggKzczLDggQEAKIC8qCiAgKi8KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX29sZF92b2wsIC0xMTM1MCwgNTAsIDApOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2FrbSwgLTczNTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9vbGRfdm9sLCAtMTEzNTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9ha20sIC03MzUwLCA1MCwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3Z4X2hhcmR3YXJlIHZ4MjIyX29sZF9odyA9IHsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyX29wcy5jIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyX29wcy5jCmluZGV4IDVlNTE5NTAuLjU1NTU4YmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS92eDIyMi92eDIyMl9vcHMuYworKysgYi9zb3VuZC9wY2kvdngyMjIvdngyMjJfb3BzLmMKQEAgLTg0Niw3ICs4NDYsNyBAQAogCiAjZGVmaW5lIE1JQ19MRVZFTF9NQVgJMHhmZgogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfbWljLCAtNjQ1MCwgNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX21pYywgLTY0NTAsIDUwLCAwKTsKIAogLyoKICAqIGNvbnRyb2xzIEFQSSBmb3IgaW5wdXQgbGV2ZWxzCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9pbWFnZS5oIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfaW1hZ2UuaAppbmRleCAxYjA3NDY5Li4xMTJmMmZmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9pbWFnZS5oCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX2ltYWdlLmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9IV01DT0RFXwogI2RlZmluZSBfSFdNQ09ERV8KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgRHNwSW5zdFtZRFNYR19EU1BMRU5HVEggLyA0XSA9IHsKK3N0YXRpYyB1MzIgRHNwSW5zdFtZRFNYR19EU1BMRU5HVEggLyA0XSA9IHsKIAkweDAwMDAwMDgxLCAweDAwMDAwMWE0LCAweDAwMDAwMDBhLCAweDAwMDAwMDJmLAogCTB4MDAwODAyNTMsIDB4MDE4MDAzMTcsIDB4MDAwMDQwN2IsIDB4MDAwMDg0M2YsCiAJMHgwMDAxNDgzYywgMHgwMDAxOTQzYywgMHgwMDA1ZDgzYywgMHgwMDAwMWMzYywKQEAgLTEyLDcgKzEyLDcgQEAKIAkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBDbnRybEluc3RbWURTWEdfQ1RSTExFTkdUSCAvIDRdID0geworc3RhdGljIHUzMiBDbnRybEluc3RbWURTWEdfQ1RSTExFTkdUSCAvIDRdID0gewogCTB4MDAwMDA3LCAweDI0MDAwNywgMHgwQzAwMDcsIDB4MUMwMDA3LAogCTB4MDYwMDA3LCAweDcwMDAwMiwgMHgwMDAwMjAsIDB4MDMwMDQwLAogCTB4MDA3MTA0LCAweDAwNDI4NiwgMHgwMzAwNDAsIDB4MDAwRjBELApAQCAtNzkxLDcgKzc5MSw3IEBACiAvLyAwNC8wOSAgY3JlYXQKIC8vIDA0LzEyICBzdG9wIG5pc2UgZml4CiAvLyAwNi8yMSAgV29ya2luZ09mZiB0aW1taW5nCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBDbnRybEluc3QxRVtZRFNYR19DVFJMTEVOR1RIIC8gNF0gPSB7CitzdGF0aWMgdTMyIENudHJsSW5zdDFFW1lEU1hHX0NUUkxMRU5HVEggLyA0XSA9IHsKIAkweDAwMDAwNywgMHgyNDAwMDcsIDB4MEMwMDA3LCAweDFDMDAwNywKIAkweDA2MDAwNywgMHg3MDAwMDIsIDB4MDAwMDIwLCAweDAzMDA0MCwKIAkweDAwNzEwNCwgMHgwMDQyODYsIDB4MDMwMDQwLCAweDAwMEYwRCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwppbmRleCA3ODgxOTQ0Li5mZDEyNjc0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKKysrIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCkBAIC0yLDEyICsyLDYgQEAKICAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KICAqICBSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBZTUY3MjQvNzQwLzc0NC83NTQgY2hpcHMKICAqCi0gKiAgQlVHUzoKLSAqICAgIC0tCi0gKgotICogIFRPRE86Ci0gKiAgICAtLQotICoKICAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKQEAgLTI2LDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC00MiwxMCArMzcsNyBAQAogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLS8qCi0gKiAgY29uc3RhbnRzCi0gKi8KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKIC8qCiAgKiAgY29tbW9uIEkvTyByb3V0aW5lcwpAQCAtMTc5LDYgKzE3MSwxNyBAQAogCXJldHVybiB2YWxbMF07CiB9CiAKK3N0YXRpYyB2b2lkIHNuZF95bWZwY2lfcGNtXzQ0MV92b2x1bWVfc2V0KHN0cnVjdCBzbmRfeW1mcGNpX3BjbSAqeXBjbSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJc3RydWN0IHNuZF95bWZwY2lfcGNtX21peGVyICptaXhlcjsKKwkKKwltaXhlciA9ICZ5cGNtLT5jaGlwLT5wY21fbWl4ZXJbeXBjbS0+c3Vic3RyZWFtLT5udW1iZXJdOworCXZhbHVlID0gbWluX3QodW5zaWduZWQgaW50LCBtaXhlci0+bGVmdCwgMHg3ZmZmKSA+PiAxOworCXZhbHVlIHw9IChtaW5fdCh1bnNpZ25lZCBpbnQsIG1peGVyLT5yaWdodCwgMHg3ZmZmKSA+PiAxKSA8PCAxNjsKKwlzbmRfeW1mcGNpX3dyaXRlbCh5cGNtLT5jaGlwLCBZRFNYR1JfQlVGNDQxT1VUVk9MLCB2YWx1ZSk7Cit9CisKIC8qCiAgKiAgSGFyZHdhcmUgc3RhcnQgbWFuYWdlbWVudAogICovCkBAIC0yOTAsNiArMjkzLDEwIEBACiAJc25kX2Fzc2VydChwdm9pY2UgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwogCXNuZF95bWZwY2lfaHdfc3RvcChjaGlwKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+dm9pY2VfbG9jaywgZmxhZ3MpOworCWlmIChwdm9pY2UtPm51bWJlciA9PSBjaGlwLT5zcmM0NDFfdXNlZCkgeworCQljaGlwLT5zcmM0NDFfdXNlZCA9IC0xOworCQlwdm9pY2UtPnlwY20tPnVzZV80NDFfc2xvdCA9IDA7CisJfQogCXB2b2ljZS0+dXNlID0gcHZvaWNlLT5wY20gPSBwdm9pY2UtPnN5bnRoID0gcHZvaWNlLT5taWRpID0gMDsKIAlwdm9pY2UtPnlwY20gPSBOVUxMOwogCXB2b2ljZS0+aW50ZXJydXB0ID0gTlVMTDsKQEAgLTM5NCw3ICs0MDEsNyBAQAogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKIAkJY2hpcC0+Y3RybF9wbGF5YmFja1t5cGNtLT52b2ljZXNbMF0tPm51bWJlciArIDFdID0gY3B1X3RvX2xlMzIoeXBjbS0+dm9pY2VzWzBdLT5iYW5rX2FkZHIpOwotCQlpZiAoeXBjbS0+dm9pY2VzWzFdICE9IE5VTEwpCisJCWlmICh5cGNtLT52b2ljZXNbMV0gIT0gTlVMTCAmJiAheXBjbS0+dXNlXzQ0MV9zbG90KQogCQkJY2hpcC0+Y3RybF9wbGF5YmFja1t5cGNtLT52b2ljZXNbMV0tPm51bWJlciArIDFdID0gY3B1X3RvX2xlMzIoeXBjbS0+dm9pY2VzWzFdLT5iYW5rX2FkZHIpOwogCQl5cGNtLT5ydW5uaW5nID0gMTsKIAkJYnJlYWs7CkBAIC00MDIsNyArNDA5LDcgQEAKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgogCQljaGlwLT5jdHJsX3BsYXliYWNrW3lwY20tPnZvaWNlc1swXS0+bnVtYmVyICsgMV0gPSAwOwotCQlpZiAoeXBjbS0+dm9pY2VzWzFdICE9IE5VTEwpCisJCWlmICh5cGNtLT52b2ljZXNbMV0gIT0gTlVMTCAmJiAheXBjbS0+dXNlXzQ0MV9zbG90KQogCQkJY2hpcC0+Y3RybF9wbGF5YmFja1t5cGNtLT52b2ljZXNbMV0tPm51bWJlciArIDFdID0gMDsKIAkJeXBjbS0+cnVubmluZyA9IDA7CiAJCWJyZWFrOwpAQCAtNDg5LDYgKzQ5Niw3IEBACiAJdW5zaWduZWQgaW50IG5iYW5rOwogCXUzMiB2b2xfbGVmdCwgdm9sX3JpZ2h0OwogCXU4IHVzZV9sZWZ0LCB1c2VfcmlnaHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNuZF9hc3NlcnQodm9pY2UgIT0gTlVMTCwgcmV0dXJuKTsKIAlpZiAocnVudGltZS0+Y2hhbm5lbHMgPT0gMSkgewpAQCAtNTA3LDExICs1MTUsMjcgQEAKIAkJdm9sX2xlZnQgPSBjcHVfdG9fbGUzMigweDQwMDAwMDAwKTsKIAkJdm9sX3JpZ2h0ID0gY3B1X3RvX2xlMzIoMHg0MDAwMDAwMCk7CiAJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZ5cGNtLT5jaGlwLT52b2ljZV9sb2NrLCBmbGFncyk7CiAJZm9ybWF0ID0gcnVudGltZS0+Y2hhbm5lbHMgPT0gMiA/IDB4MDAwMTAwMDAgOiAwOwogCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDgpCiAJCWZvcm1hdCB8PSAweDgwMDAwMDAwOworCWVsc2UgaWYgKHlwY20tPmNoaXAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NTQgJiYKKwkJIHJ1bnRpbWUtPnJhdGUgPT0gNDQxMDAgJiYgcnVudGltZS0+Y2hhbm5lbHMgPT0gMiAmJgorCQkgdm9pY2VpZHggPT0gMCAmJiAoeXBjbS0+Y2hpcC0+c3JjNDQxX3VzZWQgPT0gLTEgfHwKKwkJCQkgICB5cGNtLT5jaGlwLT5zcmM0NDFfdXNlZCA9PSB2b2ljZS0+bnVtYmVyKSkgeworCQl5cGNtLT5jaGlwLT5zcmM0NDFfdXNlZCA9IHZvaWNlLT5udW1iZXI7CisJCXlwY20tPnVzZV80NDFfc2xvdCA9IDE7CisJCWZvcm1hdCB8PSAweDEwMDAwMDAwOworCQlzbmRfeW1mcGNpX3BjbV80NDFfdm9sdW1lX3NldCh5cGNtKTsKKwl9CisJaWYgKHlwY20tPmNoaXAtPnNyYzQ0MV91c2VkID09IHZvaWNlLT5udW1iZXIgJiYKKwkgICAgKGZvcm1hdCAmIDB4MTAwMDAwMDApID09IDApIHsKKwkJeXBjbS0+Y2hpcC0+c3JjNDQxX3VzZWQgPSAtMTsKKwkJeXBjbS0+dXNlXzQ0MV9zbG90ID0gMDsKKwl9CiAJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID09IDIgJiYgKHZvaWNlaWR4ICYgMSkgIT0gMCkKIAkJZm9ybWF0IHw9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeXBjbS0+Y2hpcC0+dm9pY2VfbG9jaywgZmxhZ3MpOwogCWZvciAobmJhbmsgPSAwOyBuYmFuayA8IDI7IG5iYW5rKyspIHsKIAkJYmFuayA9ICZ2b2ljZS0+YmFua1tuYmFua107CiAJCW1lbXNldChiYW5rLCAwLCBzaXplb2YoKmJhbmspKTsKQEAgLTE0ODAsNyArMTUwNCw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX0xJTkVBUihkYl9zY2FsZV9uYXRpdmUsIFRMVl9EQl9HQUlOX01VVEUsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihkYl9zY2FsZV9uYXRpdmUsIFRMVl9EQl9HQUlOX01VVEUsIDApOwogCiAjZGVmaW5lIFlNRlBDSV9ET1VCTEUoeG5hbWUsIHhpbmRleCwgcmVnKSBcCiB7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKQEAgLTE3MjIsNyArMTc0NiwxMCBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+dm9pY2VfbG9jaywgZmxhZ3MpOwogCQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lICYmIHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhKSB7CiAJCQlzdHJ1Y3Qgc25kX3ltZnBjaV9wY20gKnlwY20gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQkJCXlwY20tPnVwZGF0ZV9wY21fdm9sID0gMjsKKwkJCWlmICgheXBjbS0+dXNlXzQ0MV9zbG90KQorCQkJCXlwY20tPnVwZGF0ZV9wY21fdm9sID0gMjsKKwkJCWVsc2UKKwkJCQlzbmRfeW1mcGNpX3BjbV80NDFfdm9sdW1lX3NldCh5cGNtKTsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT52b2ljZV9sb2NrLCBmbGFncyk7CiAJCXJldHVybiAxOwpAQCAtMTk3MSwxMyArMTk5OCw5NCBAQAogCX0KIH0KIAorI2RlZmluZSBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisKKyNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisKICNpbmNsdWRlICJ5bWZwY2lfaW1hZ2UuaCIKIAorc3RhdGljIHN0cnVjdCBmaXJtd2FyZSBzbmRfeW1mcGNpX2RzcF9taWNyb2NvZGUgPSB7CisJLnNpemUgPSBZRFNYR19EU1BMRU5HVEgsCisJLmRhdGEgPSAodTggKilEc3BJbnN0LAorfTsKK3N0YXRpYyBzdHJ1Y3QgZmlybXdhcmUgc25kX3ltZnBjaV9jb250cm9sbGVyX21pY3JvY29kZSA9IHsKKwkuc2l6ZSA9IFlEU1hHX0NUUkxMRU5HVEgsCisJLmRhdGEgPSAodTggKilDbnRybEluc3QsCit9Oworc3RhdGljIHN0cnVjdCBmaXJtd2FyZSBzbmRfeW1mcGNpX2NvbnRyb2xsZXJfMWVfbWljcm9jb2RlID0geworCS5zaXplID0gWURTWEdfQ1RSTExFTkdUSCwKKwkuZGF0YSA9ICh1OCAqKUNudHJsSW5zdDFFLAorfTsKKyNlbmRpZgorCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX3ltZnBjaV9jb252ZXJ0X2Zyb21fbGUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykgeyB9CisjZWxzZQorc3RhdGljIHZvaWQgc25kX3ltZnBjaV9jb252ZXJ0X2Zyb21fbGUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKK3sKKwlpbnQgaTsKKwl1MzIgKmRhdGEgPSAodTMyICopZnctPmRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnctPnNpemUgLyA0OyArK2kpCisJCWxlMzJfdG9fY3B1cygmZGF0YVtpXSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzbmRfeW1mcGNpX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IHNuZF95bWZwY2kgKmNoaXApCit7CisJaW50IGVyciwgaXNfMWU7CisJY29uc3QgY2hhciAqbmFtZTsKKworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmNoaXAtPmRzcF9taWNyb2NvZGUsICJ5YW1haGEvZHMxX2RzcC5mdyIsCisJCQkgICAgICAgJmNoaXAtPnBjaS0+ZGV2KTsKKwlpZiAoZXJyID49IDApIHsKKwkJaWYgKGNoaXAtPmRzcF9taWNyb2NvZGUtPnNpemUgPT0gWURTWEdfRFNQTEVOR1RIKQorCQkJc25kX3ltZnBjaV9jb252ZXJ0X2Zyb21fbGUoY2hpcC0+ZHNwX21pY3JvY29kZSk7CisJCWVsc2UgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRFNQIG1pY3JvY29kZSBoYXMgd3Jvbmcgc2l6ZVxuIik7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJfQorCWlmIChlcnIgPCAwKSB7CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCQljaGlwLT5kc3BfbWljcm9jb2RlID0gJnNuZF95bWZwY2lfZHNwX21pY3JvY29kZTsKKyNlbHNlCisJCXJldHVybiBlcnI7CisjZW5kaWYKKwl9CisJaXNfMWUgPSBjaGlwLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9ZQU1BSEFfNzI0RiB8fAorCQljaGlwLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9ZQU1BSEFfNzQwQyB8fAorCQljaGlwLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9ZQU1BSEFfNzQ0IHx8CisJCWNoaXAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NTQ7CisJbmFtZSA9IGlzXzFlID8gInlhbWFoYS9kczFlX2N0cmwuZnciIDogInlhbWFoYS9kczFfY3RybC5mdyI7CisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmY2hpcC0+Y29udHJvbGxlcl9taWNyb2NvZGUsIG5hbWUsCisJCQkgICAgICAgJmNoaXAtPnBjaS0+ZGV2KTsKKwlpZiAoZXJyID49IDApIHsKKwkJaWYgKGNoaXAtPmNvbnRyb2xsZXJfbWljcm9jb2RlLT5zaXplID09IFlEU1hHX0NUUkxMRU5HVEgpCisJCQlzbmRfeW1mcGNpX2NvbnZlcnRfZnJvbV9sZShjaGlwLT5jb250cm9sbGVyX21pY3JvY29kZSk7CisJCWVsc2UgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29udHJvbGxlciBtaWNyb2NvZGUiCisJCQkJICAgIiBoYXMgd3Jvbmcgc2l6ZVxuIik7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJfQorCWlmIChlcnIgPCAwKSB7CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCQljaGlwLT5jb250cm9sbGVyX21pY3JvY29kZSA9CisJCQlpc18xZSA/ICZzbmRfeW1mcGNpX2NvbnRyb2xsZXJfMWVfbWljcm9jb2RlCisJCQkgICAgICA6ICZzbmRfeW1mcGNpX2NvbnRyb2xsZXJfbWljcm9jb2RlOworI2Vsc2UKKwkJcmV0dXJuIGVycjsKKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgc25kX3ltZnBjaV9kb3dubG9hZF9pbWFnZShzdHJ1Y3Qgc25kX3ltZnBjaSAqY2hpcCkKIHsKIAlpbnQgaTsKIAl1MTYgY3RybDsKLQl1bnNpZ25lZCBsb25nICppbnN0OworCXUzMiAqaW5zdDsKIAogCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9OQVRJVkVEQUNPVVRWT0wsIDB4MDAwMDAwMDApOwogCXNuZF95bWZwY2lfZGlzYWJsZV9kc3AoY2hpcCk7CkBAIC0xOTkyLDIxICsyMTAwLDEyIEBACiAJc25kX3ltZnBjaV93cml0ZXcoY2hpcCwgWURTWEdSX0dMT0JBTENUUkwsIGN0cmwgJiB+MHgwMDA3KTsKIAogCS8qIHNldHVwIERTUCBpbnN0cnVjdGlvbiBjb2RlICovCisJaW5zdCA9ICh1MzIgKiljaGlwLT5kc3BfbWljcm9jb2RlLT5kYXRhOwogCWZvciAoaSA9IDA7IGkgPCBZRFNYR19EU1BMRU5HVEggLyA0OyBpKyspCi0JCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9EU1BJTlNUUkFNICsgKGkgPDwgMiksIERzcEluc3RbaV0pOworCQlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfRFNQSU5TVFJBTSArIChpIDw8IDIpLCBpbnN0W2ldKTsKIAogCS8qIHNldHVwIGNvbnRyb2wgaW5zdHJ1Y3Rpb24gY29kZSAqLwotCXN3aXRjaCAoY2hpcC0+ZGV2aWNlX2lkKSB7Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83MjRGOgotCWNhc2UgUENJX0RFVklDRV9JRF9ZQU1BSEFfNzQwQzoKLQljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0NDoKLQljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc1NDoKLQkJaW5zdCA9IENudHJsSW5zdDFFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpbnN0ID0gQ250cmxJbnN0OwotCQlicmVhazsKLQl9CisJaW5zdCA9ICh1MzIgKiljaGlwLT5jb250cm9sbGVyX21pY3JvY29kZS0+ZGF0YTsKIAlmb3IgKGkgPSAwOyBpIDwgWURTWEdfQ1RSTExFTkdUSCAvIDQ7IGkrKykKIAkJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX0NUUkxJTlNUUkFNICsgKGkgPDwgMiksIGluc3RbaV0pOwogCkBAIC0yMTYwLDYgKzIyNTksMTUgQEAKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoY2hpcC0+cGNpLCAweDQwLCBjaGlwLT5vbGRfbGVnYWN5X2N0cmwpOwogCQogCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKKwlpZiAoY2hpcC0+ZHNwX21pY3JvY29kZSAhPSAmc25kX3ltZnBjaV9kc3BfbWljcm9jb2RlKQorI2VuZGlmCisJCXJlbGVhc2VfZmlybXdhcmUoY2hpcC0+ZHNwX21pY3JvY29kZSk7CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCWlmIChjaGlwLT5jb250cm9sbGVyX21pY3JvY29kZSAhPSAmc25kX3ltZnBjaV9jb250cm9sbGVyX21pY3JvY29kZSAmJgorCSAgICBjaGlwLT5jb250cm9sbGVyX21pY3JvY29kZSAhPSAmc25kX3ltZnBjaV9jb250cm9sbGVyXzFlX21pY3JvY29kZSkKKyNlbmRpZgorCQlyZWxlYXNlX2Zpcm13YXJlKGNoaXAtPmNvbnRyb2xsZXJfbWljcm9jb2RlKTsKIAlrZnJlZShjaGlwKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIxODAsNyArMjI4OCw3IEBACiAJWURTWEdSX1BSSUFEQ0xPT1BWT0wsCiAJWURTWEdSX05BVElWRURBQ0lOVk9MLAogCVlEU1hHUl9OQVRJVkVEQUNPVVRWT0wsCi0JLy8gWURTWEdSX0JVRjQ0MU9VVFZPTCwKKwlZRFNYR1JfQlVGNDQxT1VUVk9MLAogCVlEU1hHUl9OQVRJVkVBRENJTlZPTCwKIAlZRFNYR1JfU1BESUZMT09QVk9MLAogCVlEU1hHUl9TUERJRk9VVFZPTCwKQEAgLTIyOTUsNiArMjQwMyw3IEBACiAJY2hpcC0+cmVnX2FyZWFfcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWNoaXAtPnJlZ19hcmVhX3ZpcnQgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+cmVnX2FyZWFfcGh5cywgMHg4MDAwKTsKIAlwY2lfc2V0X21hc3RlcihwY2kpOworCWNoaXAtPnNyYzQ0MV91c2VkID0gLTE7CiAKIAlpZiAoKGNoaXAtPnJlc19yZWdfYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihjaGlwLT5yZWdfYXJlYV9waHlzLCAweDgwMDAsICJZTUZQQ0kiKSkgPT0gTlVMTCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLCBjaGlwLT5yZWdfYXJlYV9waHlzLCBjaGlwLT5yZWdfYXJlYV9waHlzICsgMHg4MDAwIC0gMSk7CkBAIC0yMzE1LDYgKzI0MjQsMTIgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCisJZXJyID0gc25kX3ltZnBjaV9yZXF1ZXN0X2Zpcm13YXJlKGNoaXApOworCWlmIChlcnIgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImZpcm13YXJlIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJc25kX3ltZnBjaV9mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworCX0KIAlzbmRfeW1mcGNpX2Rvd25sb2FkX2ltYWdlKGNoaXApOwogCiAJdWRlbGF5KDEwMCk7IC8qIHNlZW1zIHdlIG5lZWQgYSBkZWxheSBhZnRlciBkb3dubG9hZGluZyBpbWFnZS4uICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvdngvdnhwX21peGVyLmMgYi9zb3VuZC9wY21jaWEvdngvdnhwX21peGVyLmMKaW5kZXggYmNlZDdiNi4uMmIxZjk5NiAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3Z4L3Z4cF9taXhlci5jCisrKyBiL3NvdW5kL3BjbWNpYS92eC92eHBfbWl4ZXIuYwpAQCAtNjQsNyArNjQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfbWljLCAtMjEsIDMsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX21pYywgLTIxLCAzLCAwKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZ4X2NvbnRyb2xfbWljX2xldmVsID0gewogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLApkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwppbmRleCBkN2RmNTllLi4zNjNiY2I1IDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYworKysgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwpAQCAtOTEsNyArOTEsNyBAQAogICogT25seSBvdXRwdXQgbGV2ZWxzIGNhbiBiZSBtb2RpZmllZAogICovCiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9vbGRfdm9sLCAtMTEzNTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9vbGRfdm9sLCAtMTEzNTAsIDUwLCAwKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfdnhfaGFyZHdhcmUgdnhwb2NrZXRfaHcgPSB7CiAJLm5hbWUgPSAiVlhQb2NrZXQiLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL0tjb25maWcgYi9zb3VuZC9zb2MvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzgyMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL0tjb25maWcKQEAgLTAsMCArMSwzMiBAQAorIworIyBTb0MgYXVkaW8gY29uZmlndXJhdGlvbgorIworCittZW51ICJTb0MgYXVkaW8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNORCE9bgorCitjb25maWcgU05EX1NPQ19BQzk3X0JVUworCWJvb2wKKworY29uZmlnIFNORF9TT0MKKwl0cmlzdGF0ZSAiU29DIGF1ZGlvIHN1cHBvcnQiCisJLS0taGVscC0tLQorCisJICBJZiB5b3Ugd2FudCBTb0Mgc3VwcG9ydCwgeW91IHNob3VsZCBzYXkgWSBoZXJlIGFuZCBhbHNvIHRvIHRoZQorCSAgc3BlY2lmaWMgZHJpdmVyIGZvciB5b3VyIFNvQyBiZWxvdy4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIHNlbGVjdCB0aGUKKwkgIHNwZWNpZmljIGNvZGVjKHMpIGF0dGFjaGVkIHRvIHRoZSBTb0MKKworCSAgVGhpcyBTb0MgYXVkaW8gc3VwcG9ydCBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtc29jLWNvcmUuCisKKyMgQWxsIHRoZSBzdXBwb3J0ZWQgU29jJ3MKK21lbnUgIlNvQyBQbGF0Zm9ybXMiCitkZXBlbmRzIG9uIFNORF9TT0MKK3NvdXJjZSAic291bmQvc29jL2F0OTEvS2NvbmZpZyIKK3NvdXJjZSAic291bmQvc29jL3B4YS9LY29uZmlnIgorZW5kbWVudQorCisjIFN1cHBvcnRlZCBjb2RlY3MKK3NvdXJjZSAic291bmQvc29jL2NvZGVjcy9LY29uZmlnIgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlNmY0OQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK3NuZC1zb2MtY29yZS1vYmpzIDo9IHNvYy1jb3JlLm8gc29jLWRhcG0ubworCitvYmotJChDT05GSUdfU05EX1NPQykJKz0gc25kLXNvYy1jb3JlLm8KK29iai0kKENPTkZJR19TTkRfU09DKQkrPSBjb2RlY3MvIGF0OTEvIHB4YS8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdDkxL0tjb25maWcgYi9zb3VuZC9zb2MvYXQ5MS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViY2YwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYXQ5MS9LY29uZmlnCkBAIC0wLDAgKzEsMzIgQEAKK21lbnUgIlNvQyBBdWRpbyBmb3IgdGhlIEF0bWVsIEFUOTEiCisKK2NvbmZpZyBTTkRfQVQ5MV9TT0MKKwl0cmlzdGF0ZSAiU29DIEF1ZGlvIGZvciB0aGUgQXRtZWwgQVQ5MSBTeXN0ZW0tb24tQ2hpcCIKKwlkZXBlbmRzIG9uIEFSQ0hfQVQ5MSAmJiBTTkQKKwlzZWxlY3QgU05EX1BDTQorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIGNvZGVjcyBhdHRhY2hlZCB0bworCSAgdGhlIEFUOTEgU1NDIGludGVyZmFjZS4gWW91IHdpbGwgYWxzbyBuZWVkCisJICB0byBzZWxlY3QgdGhlIGF1ZGlvIGludGVyZmFjZXMgdG8gc3VwcG9ydCBiZWxvdy4KKworY29uZmlnIFNORF9BVDkxX1NPQ19JMlMKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX0FUOTFfU09DX0VUSV9CMV9XTTg3MzEKKwl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBXTTg3MzEtYmFzZWQgRW5kcmVsaWEgRVRJLUIxIGJvYXJkcyIKKwlkZXBlbmRzIG9uIFNORF9BVDkxX1NPQyAmJiAoTUFDSF9FVElfQjEgfHwgTUFDSF9FVElfQzEpCisJc2VsZWN0IFNORF9BVDkxX1NPQ19JMlMKKwlzZWxlY3QgU05EX1NPQ19XTTg3MzEKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIFdNODczMS1iYXNlZAorCSAgRW5kcmVsaWEgVGVjaG5vbG9naWVzIEluYyBFVEktQjEgb3IgRVRJLUMxIGJvYXJkcy4KKworY29uZmlnIFNORF9BVDkxX1NPQ19FVElfU0xBVkUKKwlib29sICJSdW4gY29kZWMgaW4gc2xhdmUgTW9kZSBvbiBFbmRyZWxpYSBib2FyZHMiCisJZGVwZW5kcyBvbiBTTkRfQVQ5MV9TT0NfRVRJX0IxX1dNODczMQorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHJ1biB3aXRoIHRoZSBBVDkxIFNTQyBnZW5lcmF0aW5nIHRoZSBCQ0xLCisJICBhbmQgTFJDIHNpZ25hbHMgb24gRW5kcmVsaWEgYm9hcmRzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXQ5MS9NYWtlZmlsZSBiL3NvdW5kL3NvYy9hdDkxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3N2IwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYXQ5MS9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjIEFUOTEgUGxhdGZvcm0gU3VwcG9ydAorc25kLXNvYy1hdDkxLW9ianMgOj0gYXQ5MS1wY20ubworc25kLXNvYy1hdDkxLWkycy1vYmpzIDo9IGF0OTEtaTJzLm8KKworb2JqLSQoQ09ORklHX1NORF9BVDkxX1NPQykgKz0gc25kLXNvYy1hdDkxLm8KK29iai0kKENPTkZJR19TTkRfQVQ5MV9TT0NfSTJTKSArPSBzbmQtc29jLWF0OTEtaTJzLm8KKworIyBBVDkxIE1hY2hpbmUgU3VwcG9ydAorc25kLXNvYy1ldGktYjEtd204NzMxLW9ianMgOj0gZXRpX2IxX3dtODczMS5vCisKK29iai0kKENPTkZJR19TTkRfQVQ5MV9TT0NfRVRJX0IxX1dNODczMSkgKz0gc25kLXNvYy1ldGktYjEtd204NzMxLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdDkxL2F0OTEtaTJzLmMgYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLWkycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYzU0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLWkycy5jCkBAIC0wLDAgKzEsNzIwIEBACisvKgorICogYXQ5MS1pMnMuYyAgLS0gIEFMU0EgU29DIEkyUyBBdWRpbyBMYXllciBQbGF0Zm9ybSBkcml2ZXIKKyAqCisgKiBBdXRob3I6IEZyYW5rIE1hbmRhcmlubyA8Zm1hbmRhcmlub0BlbmRyZWxpYS5jb20+CisgKiAgICAgICAgIEVuZHJlbGlhIFRlY2hub2xvZ2llcyBJbmMuCisgKgorICogQmFzZWQgb24gcHhhMnh4IFBsYXRmb3JtIGRyaXZlcnMgYnkKKyAqIExpYW0gR2lyZHdvb2QgPGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfcG1jLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9zc2MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxX3BkYy5oPgorCisjaW5jbHVkZSAiYXQ5MS1wY20uaCIKKyNpbmNsdWRlICJhdDkxLWkycy5oIgorCisjaWYgMAorI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKEtFUk5fREVCVUcgImF0OTEtaTJzOiIgeCkKKyNlbHNlCisjZGVmaW5lCURCRyh4Li4uKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05MjYwKQorI2RlZmluZSBOVU1fU1NDX0RFVklDRVMJCTEKKyNlbHNlCisjZGVmaW5lIE5VTV9TU0NfREVWSUNFUwkJMworI2VuZGlmCisKKworLyoKKyAqIFNTQyBQREMgcmVnaXN0ZXJzIHJlcXVpcmVkIGJ5IHRoZSBQQ00gRE1BIGVuZ2luZS4KKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX3BkY19yZWdzIHBkY190eF9yZWcgPSB7CisJLnhwcgkJPSBBVDkxX1BEQ19UUFIsCisJLnhjcgkJPSBBVDkxX1BEQ19UQ1IsCisJLnhucHIJCT0gQVQ5MV9QRENfVE5QUiwKKwkueG5jcgkJPSBBVDkxX1BEQ19UTkNSLAorfTsKKworc3RhdGljIHN0cnVjdCBhdDkxX3BkY19yZWdzIHBkY19yeF9yZWcgPSB7CisJLnhwcgkJPSBBVDkxX1BEQ19SUFIsCisJLnhjcgkJPSBBVDkxX1BEQ19SQ1IsCisJLnhucHIJCT0gQVQ5MV9QRENfUk5QUiwKKwkueG5jcgkJPSBBVDkxX1BEQ19STkNSLAorfTsKKworLyoKKyAqIFNTQyAmIFBEQyBzdGF0dXMgYml0cyBmb3IgdHJhbnNtaXQgYW5kIHJlY2VpdmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9zc2NfbWFzayBzc2NfdHhfbWFzayA9IHsKKwkuc3NjX2VuYWJsZQk9IEFUOTFfU1NDX1RYRU4sCisJLnNzY19kaXNhYmxlCT0gQVQ5MV9TU0NfVFhESVMsCisJLnNzY19lbmR4CT0gQVQ5MV9TU0NfRU5EVFgsCisJLnNzY19lbmRidWYJPSBBVDkxX1NTQ19UWEJVRkUsCisJLnBkY19lbmFibGUJPSBBVDkxX1BEQ19UWFRFTiwKKwkucGRjX2Rpc2FibGUJPSBBVDkxX1BEQ19UWFRESVMsCit9OworCitzdGF0aWMgc3RydWN0IGF0OTFfc3NjX21hc2sgc3NjX3J4X21hc2sgPSB7CisJLnNzY19lbmFibGUJPSBBVDkxX1NTQ19SWEVOLAorCS5zc2NfZGlzYWJsZQk9IEFUOTFfU1NDX1JYRElTLAorCS5zc2NfZW5keAk9IEFUOTFfU1NDX0VORFJYLAorCS5zc2NfZW5kYnVmCT0gQVQ5MV9TU0NfUlhCVUZGLAorCS5wZGNfZW5hYmxlCT0gQVQ5MV9QRENfUlhURU4sCisJLnBkY19kaXNhYmxlCT0gQVQ5MV9QRENfUlhURElTLAorfTsKKworCisvKgorICogRE1BIHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9wY21fZG1hX3BhcmFtcyBzc2NfZG1hX3BhcmFtc1tOVU1fU1NDX0RFVklDRVNdWzJdID0geworCXt7CisJLm5hbWUJCT0gIlNTQzAvSTJTIFBDTSBTdGVyZW8gb3V0IiwKKwkucGRjCQk9ICZwZGNfdHhfcmVnLAorCS5tYXNrCQk9ICZzc2NfdHhfbWFzaywKKwl9LAorCXsKKwkubmFtZQkJPSAiU1NDMC9JMlMgUENNIFN0ZXJlbyBpbiIsCisJLnBkYwkJPSAmcGRjX3J4X3JlZywKKwkubWFzawkJPSAmc3NjX3J4X21hc2ssCisJfX0sCisjaWYgTlVNX1NTQ19ERVZJQ0VTID09IDMKKwl7eworCS5uYW1lCQk9ICJTU0MxL0kyUyBQQ00gU3RlcmVvIG91dCIsCisJLnBkYwkJPSAmcGRjX3R4X3JlZywKKwkubWFzawkJPSAmc3NjX3R4X21hc2ssCisJfSwKKwl7CisJLm5hbWUJCT0gIlNTQzEvSTJTIFBDTSBTdGVyZW8gaW4iLAorCS5wZGMJCT0gJnBkY19yeF9yZWcsCisJLm1hc2sJCT0gJnNzY19yeF9tYXNrLAorCX19LAorCXt7CisJLm5hbWUJCT0gIlNTQzIvSTJTIFBDTSBTdGVyZW8gb3V0IiwKKwkucGRjCQk9ICZwZGNfdHhfcmVnLAorCS5tYXNrCQk9ICZzc2NfdHhfbWFzaywKKwl9LAorCXsKKwkubmFtZQkJPSAiU1NDMS9JMlMgUENNIFN0ZXJlbyBpbiIsCisJLnBkYwkJPSAmcGRjX3J4X3JlZywKKwkubWFzawkJPSAmc3NjX3J4X21hc2ssCisJfX0sCisjZW5kaWYKK307CisKK3N0cnVjdCBhdDkxX3NzY19zdGF0ZSB7CisJdTMyCXNzY19jbXI7CisJdTMyCXNzY19yY21yOworCXUzMglzc2NfcmZtcjsKKwl1MzIJc3NjX3RjbXI7CisJdTMyCXNzY190Zm1yOworCXUzMglzc2Nfc3I7CisJdTMyCXNzY19pbXI7Cit9OworCitzdGF0aWMgc3RydWN0IGF0OTFfc3NjX2luZm8geworCWNoYXIJCSpuYW1lOworCXN0cnVjdCBhdDkxX3NzY19wZXJpcGggc3NjOworCXNwaW5sb2NrX3QgCWxvY2s7CQkvKiBsb2NrIGZvciBkaXJfbWFzayAqLworCXVuc2lnbmVkIHNob3J0CWRpcl9tYXNrOwkvKiAwPXVudXNlZCwgMT1wbGF5YmFjaywgMj1jYXB0dXJlICovCisJdW5zaWduZWQgc2hvcnQJaW5pdGlhbGl6ZWQ7CS8qIDE9U1NDIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisJdW5zaWduZWQgc2hvcnQJZGFpZm10OworCXVuc2lnbmVkIHNob3J0CWNtcl9kaXY7CisJdW5zaWduZWQgc2hvcnQJdGNtcl9wZXJpb2Q7CisJdW5zaWduZWQgc2hvcnQJcmNtcl9wZXJpb2Q7CisJc3RydWN0IGF0OTFfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXNbMl07CisJc3RydWN0IGF0OTFfc3NjX3N0YXRlIHNzY19zdGF0ZTsKKworfSBzc2NfaW5mb1tOVU1fU1NDX0RFVklDRVNdID0geworCXsKKwkubmFtZQkJPSAic3NjMCIsCisJLmxvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5kaXJfbWFzawk9IDAsCisJLmluaXRpYWxpemVkCT0gMCwKKwl9LAorI2lmIE5VTV9TU0NfREVWSUNFUyA9PSAzCisJeworCS5uYW1lCQk9ICJzc2MxIiwKKwkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLmRpcl9tYXNrCT0gMCwKKwkuaW5pdGlhbGl6ZWQJPSAwLAorCX0sCisJeworCS5uYW1lCQk9ICJzc2MyIiwKKwkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLmRpcl9tYXNrCT0gMCwKKwkuaW5pdGlhbGl6ZWQJPSAwLAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXQ5MV9pMnNfc3lzY2xrOworCisvKgorICogU1NDIGludGVycnVwdCBoYW5kbGVyLiAgUGFzc2VzIFBEQyBpbnRlcnJ1cHRzIHRvIHRoZSBETUEKKyAqIGludGVycnVwdCBoYW5kbGVyIGluIHRoZSBQQ00gZHJpdmVyLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYXQ5MV9pMnNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3AgPSBkZXZfaWQ7CisJc3RydWN0IGF0OTFfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXM7CisJdTMyIHNzY19zcjsKKwlpbnQgaTsKKworCXNzY19zciA9IGF0OTFfc3NjX3JlYWQoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfU1IpCisJCQkmIGF0OTFfc3NjX3JlYWQoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfSU1SKTsKKworCS8qCisJICogTG9vcCB0aHJvdWdoIHRoZSBzdWJzdHJlYW1zIGF0dGFjaGVkIHRvIHRoaXMgU1NDLiAgSWYKKwkgKiBhIERNQS1yZWxhdGVkIGludGVycnVwdCBvY2N1cnJlZCBvbiB0aGF0IHN1YnN0cmVhbSwgY2FsbAorCSAqIHRoZSBETUEgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24sIGlmIG9uZSBoYXMgYmVlbgorCSAqIHJlZ2lzdGVyZWQgaW4gdGhlIGRtYV9wYXJhbXMgc3RydWN0dXJlIGJ5IHRoZSBQQ00gZHJpdmVyLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNzY19wLT5kbWFfcGFyYW1zKTsgaSsrKSB7CisJCWRtYV9wYXJhbXMgPSBzc2NfcC0+ZG1hX3BhcmFtc1tpXTsKKworCQlpZiAoZG1hX3BhcmFtcyAhPSBOVUxMICYmIGRtYV9wYXJhbXMtPmRtYV9pbnRyX2hhbmRsZXIgIT0gTlVMTCAmJgorCQkJKHNzY19zciAmCisJCQkoZG1hX3BhcmFtcy0+bWFzay0+c3NjX2VuZHggfCBkbWFfcGFyYW1zLT5tYXNrLT5zc2NfZW5kYnVmKSkpCisKKwkJCWRtYV9wYXJhbXMtPmRtYV9pbnRyX2hhbmRsZXIoc3NjX3NyLCBkbWFfcGFyYW1zLT5zdWJzdHJlYW0pOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIFN0YXJ0dXAuICBPbmx5IHRoYXQgb25lIHN1YnN0cmVhbSBhbGxvd2VkIGluIGVhY2ggZGlyZWN0aW9uLgorICovCitzdGF0aWMgaW50IGF0OTFfaTJzX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdDkxX3NzY19pbmZvICpzc2NfcCA9ICZzc2NfaW5mb1tydGQtPmRhaS0+Y3B1X2RhaS0+aWRdOworCWludCBkaXJfbWFzazsKKworCURCRygiaTJzX3N0YXJ0dXA6IFNTQ19TUj0weCUwOGx4XG4iLAorCQkJYXQ5MV9zc2NfcmVhZChzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19TUikpOworCWRpcl9tYXNrID0gc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IDB4MSA6IDB4MjsKKworCXNwaW5fbG9ja19pcnEoJnNzY19wLT5sb2NrKTsKKwlpZiAoc3NjX3AtPmRpcl9tYXNrICYgZGlyX21hc2spIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZzc2NfcC0+bG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXNzY19wLT5kaXJfbWFzayB8PSBkaXJfbWFzazsKKwlzcGluX3VubG9ja19pcnEoJnNzY19wLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2h1dGRvd24uICBDbGVhciBETUEgcGFyYW1ldGVycyBhbmQgc2h1dGRvd24gdGhlIFNTQyBpZiB0aGVyZQorICogYXJlIG5vIG90aGVyIHN1YnN0cmVhbXMgb3Blbi4KKyAqLworc3RhdGljIHZvaWQgYXQ5MV9pMnNfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdDkxX3NzY19pbmZvICpzc2NfcCA9ICZzc2NfaW5mb1tydGQtPmRhaS0+Y3B1X2RhaS0+aWRdOworCXN0cnVjdCBhdDkxX3BjbV9kbWFfcGFyYW1zICpkbWFfcGFyYW1zOworCWludCBkaXIsIGRpcl9tYXNrOworCisJZGlyID0gc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IDAgOiAxOworCWRtYV9wYXJhbXMgPSBzc2NfcC0+ZG1hX3BhcmFtc1tkaXJdOworCisJaWYgKGRtYV9wYXJhbXMgIT0gTlVMTCkgeworCQlhdDkxX3NzY193cml0ZShkbWFfcGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfU1NDX0NSLAorCQkJCWRtYV9wYXJhbXMtPm1hc2stPnNzY19kaXNhYmxlKTsKKwkJREJHKCIlcyBkaXNhYmxlZCBTU0NfU1I9MHglMDhseFxuIiwgKGRpciA/ICJyZWNlaXZlIiA6ICJ0cmFuc21pdCIpLAorCQkJYXQ5MV9zc2NfcmVhZChzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19TUikpOworCisJCWRtYV9wYXJhbXMtPnNzY19iYXNlID0gTlVMTDsKKwkJZG1hX3BhcmFtcy0+c3Vic3RyZWFtID0gTlVMTDsKKwkJc3NjX3AtPmRtYV9wYXJhbXNbZGlyXSA9IE5VTEw7CisJfQorCisJZGlyX21hc2sgPSAxIDw8IGRpcjsKKworCXNwaW5fbG9ja19pcnEoJnNzY19wLT5sb2NrKTsKKwlzc2NfcC0+ZGlyX21hc2sgJj0gfmRpcl9tYXNrOworCWlmICghc3NjX3AtPmRpcl9tYXNrKSB7CisJCS8qIFNodXRkb3duIHRoZSBTU0MgY2xvY2suICovCisJCURCRygiU3RvcHBpbmcgcGlkICVkIGNsb2NrXG4iLCBzc2NfcC0+c3NjLnBpZCk7CisJCWF0OTFfc3lzX3dyaXRlKEFUOTFfUE1DX1BDRFIsIDE8PHNzY19wLT5zc2MucGlkKTsKKworCQlpZiAoc3NjX3AtPmluaXRpYWxpemVkKSB7CisJCQlmcmVlX2lycShzc2NfcC0+c3NjLnBpZCwgc3NjX3ApOworCQkJc3NjX3AtPmluaXRpYWxpemVkID0gMDsKKwkJfQorCisJCS8qIFJlc2V0IHRoZSBTU0MgKi8KKwkJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfQ1IsIEFUOTFfU1NDX1NXUlNUKTsKKworCQkvKiBDbGVhciB0aGUgU1NDIGRpdmlkZXJzICovCisJCXNzY19wLT5jbXJfZGl2ID0gc3NjX3AtPnRjbXJfcGVyaW9kID0gc3NjX3AtPnJjbXJfcGVyaW9kID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZzc2NfcC0+bG9jayk7Cit9CisKKy8qCisgKiBSZWNvcmQgdGhlIFNTQyBzeXN0ZW0gY2xvY2sgcmF0ZS4KKyAqLworc3RhdGljIGludCBhdDkxX2kyc19zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpLAorCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwkvKgorCSAqIFRoZSBvbmx5IGNsb2NrIHN1cHBsaWVkIHRvIHRoZSBTU0MgaXMgdGhlIEFUOTEgbWFzdGVyIGNsb2NrLAorCSAqIHdoaWNoIGlzIG9ubHkgdXNlZCBpZiB0aGUgU1NDIGlzIGdlbmVyYXRpbmcgQkNMSyBhbmQvb3IKKwkgKiBMUkMgY2xvY2tzLgorCSAqLworCXN3aXRjaCAoY2xrX2lkKSB7CisJY2FzZSBBVDkxX1NZU0NMS19NQ0s6CisJCWF0OTFfaTJzX3N5c2NsayA9IGZyZXE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUmVjb3JkIHRoZSBEQUkgZm9ybWF0IGZvciB1c2UgaW4gaHdfcGFyYW1zKCkuCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9pMnNfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSwKKwkJdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3AgPSAmc3NjX2luZm9bY3B1X2RhaS0+aWRdOworCisJaWYgKChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgIT0gU05EX1NPQ19EQUlGTVRfSTJTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNzY19wLT5kYWlmbXQgPSBmbXQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWNvcmQgU1NDIGNsb2NrIGRpdmlkZXJzIGZvciB1c2UgaW4gaHdfcGFyYW1zKCkuCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9pMnNfc2V0X2RhaV9jbGtkaXYoc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSwKKwlpbnQgZGl2X2lkLCBpbnQgZGl2KQoreworCXN0cnVjdCBhdDkxX3NzY19pbmZvICpzc2NfcCA9ICZzc2NfaW5mb1tjcHVfZGFpLT5pZF07CisKKwlzd2l0Y2ggKGRpdl9pZCkgeworCWNhc2UgQVQ5MVNTQ19DTVJfRElWOgorCQkvKgorCQkgKiBUaGUgc2FtZSBtYXN0ZXIgY2xvY2sgZGl2aWRlciBpcyB1c2VkIGZvciBib3RoCisJCSAqIHRyYW5zbWl0IGFuZCByZWNlaXZlLCBzbyBpZiBhIHZhbHVlIGhhcyBhbHJlYWR5CisJCSAqIGJlZW4gc2V0LCBpdCBtdXN0IG1hdGNoIHRoaXMgdmFsdWUuCisJCSAqLworCQlpZiAoc3NjX3AtPmNtcl9kaXYgPT0gMCkKKwkJCXNzY19wLT5jbXJfZGl2ID0gZGl2OworCQllbHNlCisJCQlpZiAoZGl2ICE9IHNzY19wLT5jbXJfZGl2KQorCQkJCXJldHVybiAtRUJVU1k7CisJCWJyZWFrOworCisJY2FzZSBBVDkxU1NDX1RDTVJfUEVSSU9EOgorCQlzc2NfcC0+dGNtcl9wZXJpb2QgPSBkaXY7CisJCWJyZWFrOworCisJY2FzZSBBVDkxU1NDX1JDTVJfUEVSSU9EOgorCQlzc2NfcC0+cmNtcl9wZXJpb2QgPSBkaXY7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIFNTQy4KKyAqLworc3RhdGljIGludCBhdDkxX2kyc19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBpZCA9IHJ0ZC0+ZGFpLT5jcHVfZGFpLT5pZDsKKwlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3AgPSAmc3NjX2luZm9baWRdOworCXN0cnVjdCBhdDkxX3BjbV9kbWFfcGFyYW1zICpkbWFfcGFyYW1zOworCWludCBkaXIsIGNoYW5uZWxzLCBiaXRzOworCXUzMiB0Zm1yLCByZm1yLCB0Y21yLCByY21yOworCWludCBzdGFydF9ldmVudDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBDdXJyZW50bHksIHRoZXJlIGlzIG9ubHkgb25lIHNldCBvZiBkbWEgcGFyYW1zIGZvcgorCSAqIGVhY2ggZGlyZWN0aW9uLiAgSWYgbW9yZSBhcmUgYWRkZWQsIHRoaXMgY29kZSB3aWxsCisJICogaGF2ZSB0byBiZSBjaGFuZ2VkIHRvIHNlbGVjdCB0aGUgcHJvcGVyIHNldC4KKwkgKi8KKwlkaXIgPSBzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8gMCA6IDE7CisKKwlkbWFfcGFyYW1zID0gJnNzY19kbWFfcGFyYW1zW2lkXVtkaXJdOworCWRtYV9wYXJhbXMtPnNzY19iYXNlID0gc3NjX3AtPnNzYy5iYXNlOworCWRtYV9wYXJhbXMtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKworCXNzY19wLT5kbWFfcGFyYW1zW2Rpcl0gPSBkbWFfcGFyYW1zOworCisJLyoKKwkgKiBUaGUgY3B1X2RhaS0+ZG1hX2RhdGEgZmllbGQgaXMgb25seSB1c2VkIHRvIGNvbW11bmljYXRlIHRoZQorCSAqIGFwcHJvcHJpYXRlIERNQSBwYXJhbWV0ZXJzIHRvIHRoZSBwY20gZHJpdmVyIGh3X3BhcmFtcygpCisJICogZnVuY3Rpb24uICBJdCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzCisJICogYXMgaXQgaXMgY29tbW9uIHRvIGFsbCBzdWJzdHJlYW1zLgorCSAqLworCXJ0ZC0+ZGFpLT5jcHVfZGFpLT5kbWFfZGF0YSA9IGRtYV9wYXJhbXM7CisKKwljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCisJLyoKKwkgKiBUaGUgU1NDIG9ubHkgc3VwcG9ydHMgdXAgdG8gMTYtYml0IHNhbXBsZXMgaW4gSTJTIGZvcm1hdCwgZHVlCisJICogdG8gdGhlIHNpemUgb2YgdGhlIEZyYW1lIE1vZGUgUmVnaXN0ZXIgRlNMRU4gZmllbGQuICBBbHNvLCBJMlMKKwkgKiBpbXBsaWVzIHNpZ25lZCBkYXRhLgorCSAqLworCWJpdHMgPSAxNjsKKwlkbWFfcGFyYW1zLT5wZGNfeGZlcl9zaXplID0gMjsKKworCS8qCisJICogQ29tcHV0ZSBTU0MgcmVnaXN0ZXIgc2V0dGluZ3MuCisJICovCisJc3dpdGNoIChzc2NfcC0+ZGFpZm10KSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQkvKgorCQkgKiBTU0MgcHJvdmlkZXMgQkNMSyBhbmQgTFJDIGNsb2Nrcy4KKwkJICoKKwkJICogVGhlIFNTQyB0cmFuc21pdCBhbmQgcmVjZWl2ZSBjbG9ja3MgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZQorCQkgKiBNQ0sgZGl2aWRlciwgYW5kIHRoZSBCQ0xLIHNpZ25hbCBpcyBvdXRwdXQgb24gdGhlIFNTQyBUSyBsaW5lLgorCQkgKi8KKwkJcmNtciA9CSAgKCggc3NjX3AtPnJjbXJfcGVyaW9kCQk8PCAyNCkgJiBBVDkxX1NTQ19QRVJJT0QpCisJCQl8ICgoIDEJCQkJPDwgMTYpICYgQVQ5MV9TU0NfU1RURExZKQorCQkJfCAoKCBBVDkxX1NTQ19TVEFSVF9GQUxMSU5HX1JGCSAgICAgKSAmIEFUOTFfU1NDX1NUQVJUKQorCQkJfCAoKCBBVDkxX1NTQ19DS19SSVNJTkcJCSAgICAgKSAmIEFUOTFfU1NDX0NLSSkKKwkJCXwgKCggQVQ5MV9TU0NfQ0tPX05PTkUJCSAgICAgKSAmIEFUOTFfU1NDX0NLTykKKwkJCXwgKCggQVQ5MV9TU0NfQ0tTX0RJVgkJICAgICApICYgQVQ5MV9TU0NfQ0tTKTsKKworCQlyZm1yID0JICAoKCBBVDkxX1NTQ19GU0VER0VfUE9TSVRJVkUJICAgICApICYgQVQ5MV9TU0NfRlNFREdFKQorCQkJfCAoKCBBVDkxX1NTQ19GU09TX05FR0FUSVZFCSAgICAgKSAmIEFUOTFfU1NDX0ZTT1MpCisJCQl8ICgoKGJpdHMgLSAxKQkJCTw8IDE2KSAmIEFUOTFfU1NDX0ZTTEVOKQorCQkJfCAoKChjaGFubmVscyAtIDEpCQk8PCAgOCkgJiBBVDkxX1NTQ19EQVROQikKKwkJCXwgKCggMQkJCQk8PCAgNykgJiBBVDkxX1NTQ19NU0JGKQorCQkJfCAoKCAwCQkJCTw8ICA1KSAmIEFUOTFfU1NDX0xPT1ApCisJCQl8ICgoKGJpdHMgLSAxKQkJCTw8ICAwKSAmIEFUOTFfU1NDX0RBVEFMRU4pOworCisJCXRjbXIgPQkgICgoIHNzY19wLT50Y21yX3BlcmlvZAkJPDwgMjQpICYgQVQ5MV9TU0NfUEVSSU9EKQorCQkJfCAoKCAxCQkJCTw8IDE2KSAmIEFUOTFfU1NDX1NUVERMWSkKKwkJCXwgKCggQVQ5MV9TU0NfU1RBUlRfRkFMTElOR19SRiAgICAgICApICYgQVQ5MV9TU0NfU1RBUlQpCisJCQl8ICgoIEFUOTFfU1NDX0NLSV9GQUxMSU5HCSAgICAgKSAmIEFUOTFfU1NDX0NLSSkKKwkJCXwgKCggQVQ5MV9TU0NfQ0tPX0NPTlRJTlVPVVMJICAgICApICYgQVQ5MV9TU0NfQ0tPKQorCQkJfCAoKCBBVDkxX1NTQ19DS1NfRElWCQkgICAgICkgJiBBVDkxX1NTQ19DS1MpOworCisJCXRmbXIgPQkgICgoIEFUOTFfU1NDX0ZTRURHRV9QT1NJVElWRQkgICAgICkgJiBBVDkxX1NTQ19GU0VER0UpCisJCQl8ICgoIDAJCQkJPDwgMjMpICYgQVQ5MV9TU0NfRlNERU4pCisJCQl8ICgoIEFUOTFfU1NDX0ZTT1NfTkVHQVRJVkUJICAgICApICYgQVQ5MV9TU0NfRlNPUykKKwkJCXwgKCgoYml0cyAtIDEpCQkJPDwgMTYpICYgQVQ5MV9TU0NfRlNMRU4pCisJCQl8ICgoKGNoYW5uZWxzIC0gMSkJCTw8ICA4KSAmIEFUOTFfU1NDX0RBVE5CKQorCQkJfCAoKCAxCQkJCTw8ICA3KSAmIEFUOTFfU1NDX01TQkYpCisJCQl8ICgoIDAJCQkJPDwgIDUpICYgQVQ5MV9TU0NfREFUREVGKQorCQkJfCAoKChiaXRzIC0gMSkJCQk8PCAgMCkgJiBBVDkxX1NTQ19EQVRBTEVOKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisKKwkJLyoKKwkJICogQ09ERUMgc3VwcGxpZXMgQkNMSyBhbmQgTFJDIGNsb2Nrcy4KKwkJICoKKwkJICogVGhlIFNTQyB0cmFuc21pdCBjbG9jayBpcyBvYnRhaW5lZCBmcm9tIHRoZSBCQ0xLIHNpZ25hbCBvbgorCQkgKiBvbiB0aGUgVEsgbGluZSwgYW5kIHRoZSBTU0MgcmVjZWl2ZSBjbG9jayBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUKKwkJICogdHJhbnNtaXQgY2xvY2suCisJCSAqCisJCSAqIEZvciBzaW5nbGUgY2hhbm5lbCBkYXRhLCBvbmUgc2FtcGxlIGlzIHRyYW5zZmVycmVkIG9uIHRoZSBmYWxsaW5nCisJCSAqIGVkZ2Ugb2YgdGhlIExSQyBjbG9jay4gIEZvciB0d28gY2hhbm5lbCBkYXRhLCBvbmUgc2FtcGxlIGlzCisJCSAqIHRyYW5zZmVycmVkIG9uIGJvdGggZWRnZXMgb2YgdGhlIExSQyBjbG9jay4KKwkJICovCisJCXN0YXJ0X2V2ZW50ID0gY2hhbm5lbHMgPT0gMQorCQkJCT8gQVQ5MV9TU0NfU1RBUlRfRkFMTElOR19SRgorCQkJCTogQVQ5MV9TU0NfU1RBUlRfRURHRV9SRjsKKworCQlyY21yID0JICAoKCAwCQkJCTw8IDI0KSAmIEFUOTFfU1NDX1BFUklPRCkKKwkJCXwgKCggMQkJCQk8PCAxNikgJiBBVDkxX1NTQ19TVFRETFkpCisJCQl8ICgoIHN0YXJ0X2V2ZW50CQkgICAgICkgJiBBVDkxX1NTQ19TVEFSVCkKKwkJCXwgKCggQVQ5MV9TU0NfQ0tfUklTSU5HCQkgICAgICkgJiBBVDkxX1NTQ19DS0kpCisJCQl8ICgoIEFUOTFfU1NDX0NLT19OT05FCQkgICAgICkgJiBBVDkxX1NTQ19DS08pCisJCQl8ICgoIEFUOTFfU1NDX0NLU19DTE9DSwkJICAgICApICYgQVQ5MV9TU0NfQ0tTKTsKKworCQlyZm1yID0JICAoKCBBVDkxX1NTQ19GU0VER0VfUE9TSVRJVkUJICAgICApICYgQVQ5MV9TU0NfRlNFREdFKQorCQkJfCAoKCBBVDkxX1NTQ19GU09TX05PTkUJCSAgICAgKSAmIEFUOTFfU1NDX0ZTT1MpCisJCQl8ICgoIDAJCQkJPDwgMTYpICYgQVQ5MV9TU0NfRlNMRU4pCisJCQl8ICgoIDAJCQkJPDwgIDgpICYgQVQ5MV9TU0NfREFUTkIpCisJCQl8ICgoIDEJCQkJPDwgIDcpICYgQVQ5MV9TU0NfTVNCRikKKwkJCXwgKCggMAkJCQk8PCAgNSkgJiBBVDkxX1NTQ19MT09QKQorCQkJfCAoKChiaXRzIC0gMSkJCQk8PCAgMCkgJiBBVDkxX1NTQ19EQVRBTEVOKTsKKworCQl0Y21yID0JICAoKCAwCQkJCTw8IDI0KSAmIEFUOTFfU1NDX1BFUklPRCkKKwkJCXwgKCggMQkJCQk8PCAxNikgJiBBVDkxX1NTQ19TVFRETFkpCisJCQl8ICgoIHN0YXJ0X2V2ZW50CQkgICAgICkgJiBBVDkxX1NTQ19TVEFSVCkKKwkJCXwgKCggQVQ5MV9TU0NfQ0tJX0ZBTExJTkcJICAgICApICYgQVQ5MV9TU0NfQ0tJKQorCQkJfCAoKCBBVDkxX1NTQ19DS09fTk9ORQkJICAgICApICYgQVQ5MV9TU0NfQ0tPKQorCQkJfCAoKCBBVDkxX1NTQ19DS1NfUElOCQkgICAgICkgJiBBVDkxX1NTQ19DS1MpOworCisJCXRmbXIgPQkgICgoIEFUOTFfU1NDX0ZTRURHRV9QT1NJVElWRQkgICAgICkgJiBBVDkxX1NTQ19GU0VER0UpCisJCQl8ICgoIDAJCQkJPDwgMjMpICYgQVQ5MV9TU0NfRlNERU4pCisJCQl8ICgoIEFUOTFfU1NDX0ZTT1NfTk9ORQkJICAgICApICYgQVQ5MV9TU0NfRlNPUykKKwkJCXwgKCggMAkJCQk8PCAxNikgJiBBVDkxX1NTQ19GU0xFTikKKwkJCXwgKCggMAkJCQk8PCAgOCkgJiBBVDkxX1NTQ19EQVROQikKKwkJCXwgKCggMQkJCQk8PCAgNykgJiBBVDkxX1NTQ19NU0JGKQorCQkJfCAoKCAwCQkJCTw8ICA1KSAmIEFUOTFfU1NDX0RBVERFRikKKwkJCXwgKCgoYml0cyAtIDEpCQkJPDwgIDApICYgQVQ5MV9TU0NfREFUQUxFTik7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZNOgorCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGUzoKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdDkxLWkyczogdW5zdXBwb3J0ZWQgREFJIGZvcm1hdCAweCV4LlxuIiwKKwkJCXNzY19wLT5kYWlmbXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCURCRygiUkNNUj0lMDh4IFJGTVI9JTA4eCBUQ01SPSUwOHggVEZNUj0lMDh4XG4iLCByY21yLCByZm1yLCB0Y21yLCB0Zm1yKTsKKworCWlmICghc3NjX3AtPmluaXRpYWxpemVkKSB7CisKKwkJLyogRW5hYmxlIFBNQyBwZXJpcGhlcmFsIGNsb2NrIGZvciB0aGlzIFNTQyAqLworCQlEQkcoIlN0YXJ0aW5nIHBpZCAlZCBjbG9ja1xuIiwgc3NjX3AtPnNzYy5waWQpOworCQlhdDkxX3N5c193cml0ZShBVDkxX1BNQ19QQ0VSLCAxPDxzc2NfcC0+c3NjLnBpZCk7CisKKwkJLyogUmVzZXQgdGhlIFNTQyBhbmQgaXRzIFBEQyByZWdpc3RlcnMgKi8KKwkJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfQ1IsIEFUOTFfU1NDX1NXUlNUKTsKKworCQlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1BEQ19SUFIsIDApOworCQlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1BEQ19SQ1IsIDApOworCQlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1BEQ19STlBSLCAwKTsKKwkJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9QRENfUk5DUiwgMCk7CisJCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfUERDX1RQUiwgMCk7CisJCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfUERDX1RDUiwgMCk7CisJCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfUERDX1ROUFIsIDApOworCQlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1BEQ19UTkNSLCAwKTsKKworCQlpZiAoKHJldCA9IHJlcXVlc3RfaXJxKHNzY19wLT5zc2MucGlkLCBhdDkxX2kyc19pbnRlcnJ1cHQsCisJCQkJCTAsIHNzY19wLT5uYW1lLCBzc2NfcCkpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXQ5MS1pMnM6IHJlcXVlc3RfaXJxIGZhaWx1cmVcbiIpOworCisJCQlEQkcoIlN0b3BwaW5nIHBpZCAlZCBjbG9ja1xuIiwgc3NjX3AtPnNzYy5waWQpOworCQkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfUENFUiwgMTw8c3NjX3AtPnNzYy5waWQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXNzY19wLT5pbml0aWFsaXplZCA9IDE7CisJfQorCisJLyogc2V0IFNTQyBjbG9jayBtb2RlIHJlZ2lzdGVyICovCisJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfQ01SLCBzc2NfcC0+Y21yX2Rpdik7CisKKwkvKiBzZXQgcmVjZWl2ZSBjbG9jayBtb2RlIGFuZCBmb3JtYXQgKi8KKwlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19SQ01SLCByY21yKTsKKwlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19SRk1SLCByZm1yKTsKKworCS8qIHNldCB0cmFuc21pdCBjbG9jayBtb2RlIGFuZCBmb3JtYXQgKi8KKwlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19UQ01SLCB0Y21yKTsKKwlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19URk1SLCB0Zm1yKTsKKworCURCRygiaHdfcGFyYW1zOiBTU0MgaW5pdGlhbGl6ZWRcbiIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXQ5MV9pMnNfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0OTFfc3NjX2luZm8gKnNzY19wID0gJnNzY19pbmZvW3J0ZC0+ZGFpLT5jcHVfZGFpLT5pZF07CisJc3RydWN0IGF0OTFfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXM7CisJaW50IGRpcjsKKworCWRpciA9IHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyAwIDogMTsKKwlkbWFfcGFyYW1zID0gc3NjX3AtPmRtYV9wYXJhbXNbZGlyXTsKKworCWF0OTFfc3NjX3dyaXRlKGRtYV9wYXJhbXMtPnNzY19iYXNlICsgQVQ5MV9TU0NfQ1IsCisJCQlkbWFfcGFyYW1zLT5tYXNrLT5zc2NfZW5hYmxlKTsKKworCURCRygiJXMgZW5hYmxlZCBTU0NfU1I9MHglMDhseFxuIiwgZGlyID8gInJlY2VpdmUiIDogInRyYW5zbWl0IiwKKwkJYXQ5MV9zc2NfcmVhZChkbWFfcGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfU1NDX1NSKSk7CisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhdDkxX2kyc19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSkKK3sKKwlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3A7CisKKwlpZighY3B1X2RhaS0+YWN0aXZlKQorCQlyZXR1cm4gMDsKKworCXNzY19wID0gJnNzY19pbmZvW2NwdV9kYWktPmlkXTsKKworCS8qIFNhdmUgdGhlIHN0YXR1cyByZWdpc3RlciBiZWZvcmUgZGlzYWJsaW5nIHRyYW5zbWl0IGFuZCByZWNlaXZlLiAqLworCXNzY19wLT5zc2Nfc3RhdGUuc3NjX3NyID0gYXQ5MV9zc2NfcmVhZChzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19TUik7CisJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfQ1IsCisJCQlBVDkxX1NTQ19UWERJUyB8IEFUOTFfU1NDX1JYRElTKTsKKworCS8qIFNhdmUgdGhlIGN1cnJlbnQgaW50ZXJydXB0IG1hc2ssIHRoZW4gZGlzYWJsZSB1bm1hc2tlZCBpbnRlcnJ1cHRzLiAqLworCXNzY19wLT5zc2Nfc3RhdGUuc3NjX2ltciA9IGF0OTFfc3NjX3JlYWQoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfSU1SKTsKKwlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19JRFIsIHNzY19wLT5zc2Nfc3RhdGUuc3NjX2ltcik7CisKKwlzc2NfcC0+c3NjX3N0YXRlLnNzY19jbXIgID0gYXQ5MV9zc2NfcmVhZChzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19DTVIpOworCXNzY19wLT5zc2Nfc3RhdGUuc3NjX3JjbXIgPSBhdDkxX3NzY19yZWFkKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1JDTVIpOworCXNzY19wLT5zc2Nfc3RhdGUuc3NjX3JmbXIgPSBhdDkxX3NzY19yZWFkKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1JGTVIpOworCXNzY19wLT5zc2Nfc3RhdGUuc3NjX3RjbXIgPSBhdDkxX3NzY19yZWFkKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1RDTVIpOworCXNzY19wLT5zc2Nfc3RhdGUuc3NjX3RmbXIgPSBhdDkxX3NzY19yZWFkKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1RGTVIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9pMnNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSkKK3sKKwlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3A7CisKKwlpZighY3B1X2RhaS0+YWN0aXZlKQorCQlyZXR1cm4gMDsKKworCXNzY19wID0gJnNzY19pbmZvW2NwdV9kYWktPmlkXTsKKworCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1RGTVIsIHNzY19wLT5zc2Nfc3RhdGUuc3NjX3RmbXIpOworCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1RDTVIsIHNzY19wLT5zc2Nfc3RhdGUuc3NjX3RjbXIpOworCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1JGTVIsIHNzY19wLT5zc2Nfc3RhdGUuc3NjX3JmbXIpOworCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1JDTVIsIHNzY19wLT5zc2Nfc3RhdGUuc3NjX3JjbXIpOworCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX0NNUiwgIHNzY19wLT5zc2Nfc3RhdGUuc3NjX2Ntcik7CisKKwlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19JRVIsICBzc2NfcC0+c3NjX3N0YXRlLnNzY19pbXIpOworCisJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfQ1IsCisJCSgoc3NjX3AtPnNzY19zdGF0ZS5zc2Nfc3IgJiBBVDkxX1NTQ19SWEVOQSkgPyBBVDkxX1NTQ19SWEVOIDogMCkgfAorCQkoKHNzY19wLT5zc2Nfc3RhdGUuc3NjX3NyICYgQVQ5MV9TU0NfVFhFTkEpID8gQVQ5MV9TU0NfVFhFTiA6IDApKTsKKworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBhdDkxX2kyc19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgYXQ5MV9pMnNfcmVzdW1lCQlOVUxMCisjZW5kaWYKKworI2RlZmluZSBBVDkxX0kyU19SQVRFUyAoU05EUlZfUENNX1JBVEVfODAwMCAgfCBTTkRSVl9QQ01fUkFURV8xMTAyNSB8XAorCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8XAorCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8XAorCQkJU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84ODIwMCB8XAorCQkJU05EUlZfUENNX1JBVEVfOTYwMDApCisKK3N0cnVjdCBzbmRfc29jX2NwdV9kYWkgYXQ5MV9pMnNfZGFpW05VTV9TU0NfREVWSUNFU10gPSB7CisJewkubmFtZSA9ICJhdDkxX3NzYzAvaTJzIiwKKwkJLmlkID0gMCwKKwkJLnR5cGUgPSBTTkRfU09DX0RBSV9JMlMsCisJCS5zdXNwZW5kID0gYXQ5MV9pMnNfc3VzcGVuZCwKKwkJLnJlc3VtZSA9IGF0OTFfaTJzX3Jlc3VtZSwKKwkJLnBsYXliYWNrID0geworCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IEFUOTFfSTJTX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBBVDkxX0kyU19SQVRFUywKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkJLm9wcyA9IHsKKwkJCS5zdGFydHVwID0gYXQ5MV9pMnNfc3RhcnR1cCwKKwkJCS5zaHV0ZG93biA9IGF0OTFfaTJzX3NodXRkb3duLAorCQkJLnByZXBhcmUgPSBhdDkxX2kyc19wcmVwYXJlLAorCQkJLmh3X3BhcmFtcyA9IGF0OTFfaTJzX2h3X3BhcmFtcyx9LAorCQkuZGFpX29wcyA9IHsKKwkJCS5zZXRfc3lzY2xrID0gYXQ5MV9pMnNfc2V0X2RhaV9zeXNjbGssCisJCQkuc2V0X2ZtdCA9IGF0OTFfaTJzX3NldF9kYWlfZm10LAorCQkJLnNldF9jbGtkaXYgPSBhdDkxX2kyc19zZXRfZGFpX2Nsa2Rpdix9LAorCQkucHJpdmF0ZV9kYXRhID0gJnNzY19pbmZvWzBdLnNzYywKKwl9LAorI2lmIE5VTV9TU0NfREVWSUNFUyA9PSAzCisJewkubmFtZSA9ICJhdDkxX3NzYzEvaTJzIiwKKwkJLmlkID0gMSwKKwkJLnR5cGUgPSBTTkRfU09DX0RBSV9JMlMsCisJCS5zdXNwZW5kID0gYXQ5MV9pMnNfc3VzcGVuZCwKKwkJLnJlc3VtZSA9IGF0OTFfaTJzX3Jlc3VtZSwKKwkJLnBsYXliYWNrID0geworCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IEFUOTFfSTJTX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBBVDkxX0kyU19SQVRFUywKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkJLm9wcyA9IHsKKwkJCS5zdGFydHVwID0gYXQ5MV9pMnNfc3RhcnR1cCwKKwkJCS5zaHV0ZG93biA9IGF0OTFfaTJzX3NodXRkb3duLAorCQkJLnByZXBhcmUgPSBhdDkxX2kyc19wcmVwYXJlLAorCQkJLmh3X3BhcmFtcyA9IGF0OTFfaTJzX2h3X3BhcmFtcyx9LAorCQkuZGFpX29wcyA9IHsKKwkJCS5zZXRfc3lzY2xrID0gYXQ5MV9pMnNfc2V0X2RhaV9zeXNjbGssCisJCQkuc2V0X2ZtdCA9IGF0OTFfaTJzX3NldF9kYWlfZm10LAorCQkJLnNldF9jbGtkaXYgPSBhdDkxX2kyc19zZXRfZGFpX2Nsa2Rpdix9LAorCQkucHJpdmF0ZV9kYXRhID0gJnNzY19pbmZvWzFdLnNzYywKKwl9LAorCXsJLm5hbWUgPSAiYXQ5MV9zc2MyL2kycyIsCisJCS5pZCA9IDIsCisJCS50eXBlID0gU05EX1NPQ19EQUlfSTJTLAorCQkuc3VzcGVuZCA9IGF0OTFfaTJzX3N1c3BlbmQsCisJCS5yZXN1bWUgPSBhdDkxX2kyc19yZXN1bWUsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBBVDkxX0kyU19SQVRFUywKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gQVQ5MV9JMlNfUkFURVMsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLH0sCisJCS5vcHMgPSB7CisJCQkuc3RhcnR1cCA9IGF0OTFfaTJzX3N0YXJ0dXAsCisJCQkuc2h1dGRvd24gPSBhdDkxX2kyc19zaHV0ZG93biwKKwkJCS5wcmVwYXJlID0gYXQ5MV9pMnNfcHJlcGFyZSwKKwkJCS5od19wYXJhbXMgPSBhdDkxX2kyc19od19wYXJhbXMsfSwKKwkJLmRhaV9vcHMgPSB7CisJCQkuc2V0X3N5c2NsayA9IGF0OTFfaTJzX3NldF9kYWlfc3lzY2xrLAorCQkJLnNldF9mbXQgPSBhdDkxX2kyc19zZXRfZGFpX2ZtdCwKKwkJCS5zZXRfY2xrZGl2ID0gYXQ5MV9pMnNfc2V0X2RhaV9jbGtkaXYsfSwKKwkJLnByaXZhdGVfZGF0YSA9ICZzc2NfaW5mb1syXS5zc2MsCisJfSwKKyNlbmRpZgorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwoYXQ5MV9pMnNfZGFpKTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJGcmFuayBNYW5kYXJpbm8sIGZtYW5kYXJpbm9AZW5kcmVsaWEuY29tLCB3d3cuZW5kcmVsaWEuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFUOTEgSTJTIEFTb0MgSW50ZXJmYWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXQ5MS9hdDkxLWkycy5oIGIvc291bmQvc29jL2F0OTEvYXQ5MS1pMnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGE4NzViCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2F0OTEvYXQ5MS1pMnMuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogYXQ5MS1pMnMuaCAtIEFMU0EgSTJTIGludGVyZmFjZSBmb3IgdGhlIEF0bWVsIEFUOTEgU29DCisgKgorICogQXV0aG9yOglGcmFuayBNYW5kYXJpbm8gPGZtYW5kYXJpbm9AZW5kcmVsaWEuY29tPgorICoJCUVuZHJlbGlhIFRlY2hub2xvZ2llcyBJbmMuCisgKiBDcmVhdGVkOglKYW4gOSwgMjAwNworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfQVQ5MV9JMlNfSAorI2RlZmluZSBfQVQ5MV9JMlNfSAorCisvKiBJMlMgc3lzdGVtIGNsb2NrIGlkcyAqLworI2RlZmluZSBBVDkxX1NZU0NMS19NQ0sJCTAgLyogU1NDIHVzZXMgQVQ5MSBNQ0sgYXMgc3lzdGVtIGNsb2NrICovCisKKy8qIEkyUyBkaXZpZGVyIGlkcyAqLworI2RlZmluZSBBVDkxU1NDX0NNUl9ESVYJCTAgLyogTUNLIGRpdmlkZXIgZm9yIEJDTEsgKi8KKyNkZWZpbmUgQVQ5MVNTQ19UQ01SX1BFUklPRAkxIC8qIEJDTEsgZGl2aWRlciBmb3IgdHJhbnNtaXQgRlMgKi8KKyNkZWZpbmUgQVQ5MVNTQ19SQ01SX1BFUklPRAkyIC8qIEJDTEsgZGl2aWRlciBmb3IgcmVjZWl2ZSBGUyAqLworCitleHRlcm4gc3RydWN0IHNuZF9zb2NfY3B1X2RhaSBhdDkxX2kyc19kYWlbXTsKKworI2VuZGlmIC8qIF9BVDkxX0kyU19IICovCisKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdDkxL2F0OTEtcGNtLmMgYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLXBjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OGIxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLXBjbS5jCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogYXQ5MS1wY20uYyAtLSBBTFNBIFBDTSBpbnRlcmZhY2UgZm9yIHRoZSBBdG1lbCBBVDkxIFNvQworICoKKyAqIEF1dGhvcjoJRnJhbmsgTWFuZGFyaW5vIDxmbWFuZGFyaW5vQGVuZHJlbGlhLmNvbT4KKyAqCQlFbmRyZWxpYSBUZWNobm9sb2dpZXMgSW5jLgorICogQ3JlYXRlZDoJTWFyIDMsIDIwMDYKKyAqCisgKiBCYXNlZCBvbiBweGEyeHgtcGNtLmMgYnk6CisgKgorICogQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiBDcmVhdGVkOglOb3YgMzAsIDIwMDQKKyAqIENvcHlyaWdodDoJKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfc3NjLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9wZGMuaD4KKworI2luY2x1ZGUgImF0OTEtcGNtLmgiCisKKyNpZiAwCisjZGVmaW5lCURCRyh4Li4uKQlwcmludGsoS0VSTl9JTkZPICJhdDkxLXBjbTogIiB4KQorI2Vsc2UKKyNkZWZpbmUJREJHKHguLi4pCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIGF0OTFfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUEFVU0UsCisJLmZvcm1hdHMJCT0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnBlcmlvZF9ieXRlc19taW4JPSAzMiwKKwkucGVyaW9kX2J5dGVzX21heAk9IDgxOTIsCisJLnBlcmlvZHNfbWluCQk9IDIsCisJLnBlcmlvZHNfbWF4CQk9IDEwMjQsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSAzMiAqIDEwMjQsCit9OworCitzdHJ1Y3QgYXQ5MV9ydW50aW1lX2RhdGEgeworCXN0cnVjdCBhdDkxX3BjbV9kbWFfcGFyYW1zICpwYXJhbXM7CisJZG1hX2FkZHJfdCBkbWFfYnVmZmVyOwkJCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZG1hIGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgZG1hX2J1ZmZlcl9lbmQ7CQkvKiBmaXJzdCBhZGRyZXNzIGJleW9uZCBETUEgYnVmZmVyICovCisJc2l6ZV90IHBlcmlvZF9zaXplOworCWRtYV9hZGRyX3QgcGVyaW9kX3B0cjsJCQkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIG5leHQgcGVyaW9kICovCisJdTMyIHBkY194cHJfc2F2ZTsJCQkvKiBQREMgcmVnaXN0ZXIgc2F2ZSAqLworCXUzMiBwZGNfeGNyX3NhdmU7CisJdTMyIHBkY194bnByX3NhdmU7CisJdTMyIHBkY194bmNyX3NhdmU7Cit9OworCitzdGF0aWMgdm9pZCBhdDkxX3BjbV9kbWFfaXJxKHUzMiBzc2Nfc3IsCisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGF0OTFfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0OTFfcGNtX2RtYV9wYXJhbXMgKnBhcmFtcyA9IHBydGQtPnBhcmFtczsKKwlzdGF0aWMgaW50IGNvdW50ID0gMDsKKworCWNvdW50Kys7CisKKwlpZiAoc3NjX3NyICYgcGFyYW1zLT5tYXNrLT5zc2NfZW5kYnVmKSB7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJImF0OTEtcGNtOiBidWZmZXIgJXMgb24gJXMgKFNTQ19TUj0lI3gsIGNvdW50PSVkKVxuIiwKKwkJCXN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sKKwkJCQk/ICJ1bmRlcnJ1biIgOiAib3ZlcnJ1biIsCisJCQlwYXJhbXMtPm5hbWUsIHNzY19zciwgY291bnQpOworCisJCS8qIHJlLXN0YXJ0IHRoZSBQREMgKi8KKwkJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfUERDX1BUQ1IsIHBhcmFtcy0+bWFzay0+cGRjX2Rpc2FibGUpOworCisJCXBydGQtPnBlcmlvZF9wdHIgKz0gcHJ0ZC0+cGVyaW9kX3NpemU7CisJCWlmIChwcnRkLT5wZXJpb2RfcHRyID49IHBydGQtPmRtYV9idWZmZXJfZW5kKSB7CisJCQlwcnRkLT5wZXJpb2RfcHRyID0gcHJ0ZC0+ZG1hX2J1ZmZlcjsKKwkJfQorCisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eHByLCBwcnRkLT5wZXJpb2RfcHRyKTsKKwkJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54Y3IsCisJCQkJcHJ0ZC0+cGVyaW9kX3NpemUgLyBwYXJhbXMtPnBkY194ZmVyX3NpemUpOworCisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBBVDkxX1BEQ19QVENSLCBwYXJhbXMtPm1hc2stPnBkY19lbmFibGUpOworCX0KKworCWlmIChzc2Nfc3IgJiBwYXJhbXMtPm1hc2stPnNzY19lbmR4KSB7CisKKwkJLyogTG9hZCB0aGUgUERDIG5leHQgcG9pbnRlciBhbmQgY291bnRlciByZWdpc3RlcnMgKi8KKwkJcHJ0ZC0+cGVyaW9kX3B0ciArPSBwcnRkLT5wZXJpb2Rfc2l6ZTsKKwkJaWYgKHBydGQtPnBlcmlvZF9wdHIgPj0gcHJ0ZC0+ZG1hX2J1ZmZlcl9lbmQpIHsKKwkJCXBydGQtPnBlcmlvZF9wdHIgPSBwcnRkLT5kbWFfYnVmZmVyOworCQl9CisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eG5wciwgcHJ0ZC0+cGVyaW9kX3B0cik7CisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eG5jciwKKwkJCQlwcnRkLT5wZXJpb2Rfc2l6ZSAvIHBhcmFtcy0+cGRjX3hmZXJfc2l6ZSk7CisJfQorCisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IGF0OTFfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBhdDkxX3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisKKwkvKiB0aGlzIG1heSBnZXQgY2FsbGVkIHNldmVyYWwgdGltZXMgYnkgb3NzIGVtdWxhdGlvbgorCSAqIHdpdGggZGlmZmVyZW50IHBhcmFtcyAqLworCisJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKKwlydW50aW1lLT5kbWFfYnl0ZXMgPSBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyk7CisKKwlwcnRkLT5wYXJhbXMgPSBydGQtPmRhaS0+Y3B1X2RhaS0+ZG1hX2RhdGE7CisJcHJ0ZC0+cGFyYW1zLT5kbWFfaW50cl9oYW5kbGVyID0gYXQ5MV9wY21fZG1hX2lycTsKKworCXBydGQtPmRtYV9idWZmZXIgPSBydW50aW1lLT5kbWFfYWRkcjsKKwlwcnRkLT5kbWFfYnVmZmVyX2VuZCA9IHJ1bnRpbWUtPmRtYV9hZGRyICsgcnVudGltZS0+ZG1hX2J5dGVzOworCXBydGQtPnBlcmlvZF9zaXplID0gcGFyYW1zX3BlcmlvZF9ieXRlcyhwYXJhbXMpOworCisJREJHKCJod19wYXJhbXM6IERNQSBmb3IgJXMgaW5pdGlhbGl6ZWQgKGRtYV9ieXRlcz0lZCwgcGVyaW9kX3NpemU9JWQpXG4iLAorCQlwcnRkLT5wYXJhbXMtPm5hbWUsIHJ1bnRpbWUtPmRtYV9ieXRlcywgcHJ0ZC0+cGVyaW9kX3NpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0OTFfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGF0OTFfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0OTFfcGNtX2RtYV9wYXJhbXMgKnBhcmFtcyA9IHBydGQtPnBhcmFtczsKKworCWlmIChwYXJhbXMgIT0gTlVMTCkgeworCQlhdDkxX3NzY193cml0ZShwYXJhbXMtPnNzY19iYXNlICsgQVQ5MV9QRENfUFRDUiwgcGFyYW1zLT5tYXNrLT5wZGNfZGlzYWJsZSk7CisJCXBydGQtPnBhcmFtcy0+ZG1hX2ludHJfaGFuZGxlciA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXQ5MV9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXQ5MV9wY21fZG1hX3BhcmFtcyAqcGFyYW1zID0gcHJ0ZC0+cGFyYW1zOworCisJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfU1NDX0lEUiwKKwkJCXBhcmFtcy0+bWFzay0+c3NjX2VuZHggfCBwYXJhbXMtPm1hc2stPnNzY19lbmRidWYpOworCisJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfUERDX1BUQ1IsIHBhcmFtcy0+bWFzay0+cGRjX2Rpc2FibGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0OTFfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYXQ5MV9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXQ5MV9wY21fZG1hX3BhcmFtcyAqcGFyYW1zID0gcHJ0ZC0+cGFyYW1zOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlwcnRkLT5wZXJpb2RfcHRyID0gcHJ0ZC0+ZG1hX2J1ZmZlcjsKKworCQlhdDkxX3NzY193cml0ZShwYXJhbXMtPnNzY19iYXNlICsgcGFyYW1zLT5wZGMtPnhwciwgcHJ0ZC0+cGVyaW9kX3B0cik7CisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eGNyLAorCQkJCXBydGQtPnBlcmlvZF9zaXplIC8gcGFyYW1zLT5wZGNfeGZlcl9zaXplKTsKKworCQlwcnRkLT5wZXJpb2RfcHRyICs9IHBydGQtPnBlcmlvZF9zaXplOworCQlhdDkxX3NzY193cml0ZShwYXJhbXMtPnNzY19iYXNlICsgcGFyYW1zLT5wZGMtPnhucHIsIHBydGQtPnBlcmlvZF9wdHIpOworCQlhdDkxX3NzY193cml0ZShwYXJhbXMtPnNzY19iYXNlICsgcGFyYW1zLT5wZGMtPnhuY3IsCisJCQkJcHJ0ZC0+cGVyaW9kX3NpemUgLyBwYXJhbXMtPnBkY194ZmVyX3NpemUpOworCisJCURCRygidHJpZ2dlcjogcGVyaW9kX3B0cj0lbHgsIHhwcj0lbHgsIHhjcj0lbGQsIHhucHI9JWx4LCB4bmNyPSVsZFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKSBwcnRkLT5wZXJpb2RfcHRyLAorCQkJYXQ5MV9zc2NfcmVhZChwYXJhbXMtPnNzY19iYXNlICsgcGFyYW1zLT5wZGMtPnhwciksCisJCQlhdDkxX3NzY19yZWFkKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eGNyKSwKKwkJCWF0OTFfc3NjX3JlYWQocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54bnByKSwKKwkJCWF0OTFfc3NjX3JlYWQocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54bmNyKSk7CisKKwkJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfU1NDX0lFUiwKKwkJCXBhcmFtcy0+bWFzay0+c3NjX2VuZHggfCBwYXJhbXMtPm1hc2stPnNzY19lbmRidWYpOworCisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBBVDkxX1BEQ19QVENSLCBwYXJhbXMtPm1hc2stPnBkY19lbmFibGUpOworCisJCURCRygic3I9JWx4IGltcj0lbHhcbiIsIGF0OTFfc3NjX3JlYWQocGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfU1NDX1NSKSwKKwkJCQkJYXQ5MV9zc2NfcmVhZChwYXJhbXMtPnNzY19iYXNlICsgQVQ5MV9TU0NfSUVSKSk7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBBVDkxX1BEQ19QVENSLCBwYXJhbXMtPm1hc2stPnBkY19kaXNhYmxlKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBBVDkxX1BEQ19QVENSLCBwYXJhbXMtPm1hc2stPnBkY19lbmFibGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IGF0OTFfcGNtX3BvaW50ZXIoCisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgYXQ5MV9ydW50aW1lX2RhdGEgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0OTFfcGNtX2RtYV9wYXJhbXMgKnBhcmFtcyA9IHBydGQtPnBhcmFtczsKKwlkbWFfYWRkcl90IHB0cjsKKwlzbmRfcGNtX3VmcmFtZXNfdCB4OworCisJcHRyID0gKGRtYV9hZGRyX3QpIGF0OTFfc3NjX3JlYWQocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54cHIpOworCXggPSBieXRlc190b19mcmFtZXMocnVudGltZSwgcHRyIC0gcHJ0ZC0+ZG1hX2J1ZmZlcik7CisKKwlpZiAoeCA9PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJeCA9IDA7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBhdDkxX3J1bnRpbWVfZGF0YSAqcHJ0ZDsKKwlpbnQgcmV0ID0gMDsKKworCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmYXQ5MV9wY21faGFyZHdhcmUpOworCisJLyogZW5zdXJlIHRoYXQgYnVmZmVyIHNpemUgaXMgYSBtdWx0aXBsZSBvZiBwZXJpb2Qgc2l6ZSAqLworCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlwcnRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF0OTFfcnVudGltZV9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBydGQgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gcHJ0ZDsKKworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0OTFfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhdDkxX3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJa2ZyZWUocHJ0ZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJcmV0dXJuIGRtYV9tbWFwX3dyaXRlY29tYmluZShzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LCB2bWEsCisJCQkJICAgICBydW50aW1lLT5kbWFfYXJlYSwKKwkJCQkgICAgIHJ1bnRpbWUtPmRtYV9hZGRyLAorCQkJCSAgICAgcnVudGltZS0+ZG1hX2J5dGVzKTsKK30KKworc3RydWN0IHNuZF9wY21fb3BzIGF0OTFfcGNtX29wcyA9IHsKKwkub3BlbgkJPSBhdDkxX3BjbV9vcGVuLAorCS5jbG9zZQkJPSBhdDkxX3BjbV9jbG9zZSwKKwkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcwk9IGF0OTFfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZQk9IGF0OTFfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUJPSBhdDkxX3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyCT0gYXQ5MV9wY21fdHJpZ2dlciwKKwkucG9pbnRlcgk9IGF0OTFfcGNtX3BvaW50ZXIsCisJLm1tYXAJCT0gYXQ5MV9wY21fbW1hcCwKK307CisKK3N0YXRpYyBpbnQgYXQ5MV9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihzdHJ1Y3Qgc25kX3BjbSAqcGNtLAorCWludCBzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW07CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOworCXNpemVfdCBzaXplID0gYXQ5MV9wY21faGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heDsKKworCWJ1Zi0+ZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CisJYnVmLT5kZXYuZGV2ID0gcGNtLT5jYXJkLT5kZXY7CisJYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWJ1Zi0+YXJlYSA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUocGNtLT5jYXJkLT5kZXYsIHNpemUsCisJCQkJCSAgICZidWYtPmFkZHIsIEdGUF9LRVJORUwpOworCisJREJHKCJwcmVhbGxvY2F0ZV9kbWFfYnVmZmVyOiBhcmVhPSVwLCBhZGRyPSVwLCBzaXplPSVkXG4iLAorCQkodm9pZCAqKSBidWYtPmFyZWEsCisJCSh2b2lkICopIGJ1Zi0+YWRkciwKKwkJc2l6ZSk7CisKKwlpZiAoIWJ1Zi0+YXJlYSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlidWYtPmJ5dGVzID0gc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU2NCBhdDkxX3BjbV9kbWFtYXNrID0gMHhmZmZmZmZmZjsKKworc3RhdGljIGludCBhdDkxX3BjbV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLAorCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqZGFpLCBzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCWludCByZXQgPSAwOworCisJaWYgKCFjYXJkLT5kZXYtPmRtYV9tYXNrKQorCQljYXJkLT5kZXYtPmRtYV9tYXNrID0gJmF0OTFfcGNtX2RtYW1hc2s7CisJaWYgKCFjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrKQorCQljYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZjsKKworCWlmIChkYWktPnBsYXliYWNrLmNoYW5uZWxzX21pbikgeworCQlyZXQgPSBhdDkxX3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKKwkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKGRhaS0+Y2FwdHVyZS5jaGFubmVsc19taW4pIHsKKwkJcmV0ID0gYXQ5MV9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCisJCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhdDkxX3BjbV9mcmVlX2RtYV9idWZmZXJzKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWY7CisJaW50IHN0cmVhbTsKKworCWZvciAoc3RyZWFtID0gMDsgc3RyZWFtIDwgMjsgc3RyZWFtKyspIHsKKwkJc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW3N0cmVhbV0uc3Vic3RyZWFtOworCQlpZiAoIXN1YnN0cmVhbSkKKwkJCWNvbnRpbnVlOworCisJCWJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJCWlmICghYnVmLT5hcmVhKQorCQkJY29udGludWU7CisKKwkJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKHBjbS0+Y2FyZC0+ZGV2LCBidWYtPmJ5dGVzLAorCQkJCSAgICAgIGJ1Zi0+YXJlYSwgYnVmLT5hZGRyKTsKKwkJYnVmLT5hcmVhID0gTlVMTDsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYXQ5MV9wY21fc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gZGFpLT5ydW50aW1lOworCXN0cnVjdCBhdDkxX3J1bnRpbWVfZGF0YSAqcHJ0ZDsKKwlzdHJ1Y3QgYXQ5MV9wY21fZG1hX3BhcmFtcyAqcGFyYW1zOworCisJaWYgKCFydW50aW1lKQorCQlyZXR1cm4gMDsKKworCXBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJcGFyYW1zID0gcHJ0ZC0+cGFyYW1zOworCisJLyogZGlzYWJsZSB0aGUgUERDIGFuZCBzYXZlIHRoZSBQREMgcmVnaXN0ZXJzICovCisKKwlhdDkxX3NzY193cml0ZShwYXJhbXMtPnNzY19iYXNlICsgQVQ5MV9QRENfUFRDUiwgcGFyYW1zLT5tYXNrLT5wZGNfZGlzYWJsZSk7CisKKwlwcnRkLT5wZGNfeHByX3NhdmUgID0gYXQ5MV9zc2NfcmVhZChwYXJhbXMtPnNzY19iYXNlICsgcGFyYW1zLT5wZGMtPnhwcik7CisJcHJ0ZC0+cGRjX3hjcl9zYXZlICA9IGF0OTFfc3NjX3JlYWQocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54Y3IpOworCXBydGQtPnBkY194bnByX3NhdmUgPSBhdDkxX3NzY19yZWFkKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eG5wcik7CisJcHJ0ZC0+cGRjX3huY3Jfc2F2ZSA9IGF0OTFfc3NjX3JlYWQocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54bmNyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0OTFfcGNtX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gZGFpLT5ydW50aW1lOworCXN0cnVjdCBhdDkxX3J1bnRpbWVfZGF0YSAqcHJ0ZDsKKwlzdHJ1Y3QgYXQ5MV9wY21fZG1hX3BhcmFtcyAqcGFyYW1zOworCisJaWYgKCFydW50aW1lKQorCQlyZXR1cm4gMDsKKworCXBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJcGFyYW1zID0gcHJ0ZC0+cGFyYW1zOworCisJLyogcmVzdG9yZSB0aGUgUERDIHJlZ2lzdGVycyBhbmQgZW5hYmxlIHRoZSBQREMgKi8KKwlhdDkxX3NzY193cml0ZShwYXJhbXMtPnNzY19iYXNlICsgcGFyYW1zLT5wZGMtPnhwciwgIHBydGQtPnBkY194cHJfc2F2ZSk7CisJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54Y3IsICBwcnRkLT5wZGNfeGNyX3NhdmUpOworCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eG5wciwgcHJ0ZC0+cGRjX3hucHJfc2F2ZSk7CisJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54bmNyLCBwcnRkLT5wZGNfeG5jcl9zYXZlKTsKKworCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBBVDkxX1BEQ19QVENSLCBwYXJhbXMtPm1hc2stPnBkY19lbmFibGUpOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYXQ5MV9wY21fc3VzcGVuZAlOVUxMCisjZGVmaW5lIGF0OTFfcGNtX3Jlc3VtZQkJTlVMTAorI2VuZGlmCisKK3N0cnVjdCBzbmRfc29jX3BsYXRmb3JtIGF0OTFfc29jX3BsYXRmb3JtID0geworCS5uYW1lCQk9ICJhdDkxLWF1ZGlvIiwKKwkucGNtX29wcyAJPSAmYXQ5MV9wY21fb3BzLAorCS5wY21fbmV3CT0gYXQ5MV9wY21fbmV3LAorCS5wY21fZnJlZQk9IGF0OTFfcGNtX2ZyZWVfZG1hX2J1ZmZlcnMsCisJLnN1c3BlbmQJPSBhdDkxX3BjbV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXQ5MV9wY21fcmVzdW1lLAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwoYXQ5MV9zb2NfcGxhdGZvcm0pOworCitNT0RVTEVfQVVUSE9SKCJGcmFuayBNYW5kYXJpbm8gPGZtYW5kYXJpbm9AZW5kcmVsaWEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdG1lbCBBVDkxIFBDTSBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdDkxL2F0OTEtcGNtLmggYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLXBjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDBmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLXBjbS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBhdDkxLXBjbS5oIC0gQUxTQSBQQ00gaW50ZXJmYWNlIGZvciB0aGUgQXRtZWwgQVQ5MSBTb0MKKyAqCisgKiBBdXRob3I6CUZyYW5rIE1hbmRhcmlubyA8Zm1hbmRhcmlub0BlbmRyZWxpYS5jb20+CisgKgkJRW5kcmVsaWEgVGVjaG5vbG9naWVzIEluYy4KKyAqIENyZWF0ZWQ6CU1hciAzLCAyMDA2CisgKgorICogQmFzZWQgb24gcHhhMnh4LXBjbS5oIGJ5OgorICoKKyAqIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogQ3JlYXRlZDoJTm92IDMwLCAyMDA0CisgKiBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0FUOTFfUENNX0gKKyNkZWZpbmUgX0FUOTFfUENNX0gKKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKK3N0cnVjdCBhdDkxX3NzY19wZXJpcGggeworCXZvaWQgX19pb21lbQkqYmFzZTsKKwl1MzIJCXBpZDsKK307CisKKy8qCisgKiBSZWdpc3RlcnMgYW5kIHN0YXR1cyBiaXRzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5IHRoZSBQQ00gZHJpdmVyLgorICovCitzdHJ1Y3QgYXQ5MV9wZGNfcmVncyB7CisJdW5zaWduZWQgaW50CXhwcjsJCS8qIFBEQyByZWN2L3RyYW5zIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQJeGNyOwkJLyogUERDIHJlY3YvdHJhbnMgY291bnRlciAqLworCXVuc2lnbmVkIGludAl4bnByOwkJLyogUERDIG5leHQgcmVjdi90cmFucyBwb2ludGVyICovCisJdW5zaWduZWQgaW50CXhuY3I7CQkvKiBQREMgbmV4dCByZWN2L3RyYW5zIGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQJcHRjcjsJCS8qIFBEQyB0cmFuc2ZlciBjb250cm9sICovCit9OworCitzdHJ1Y3QgYXQ5MV9zc2NfbWFzayB7CisJdTMyCXNzY19lbmFibGU7CQkvKiBTU0MgcmVjdi90cmFucyBlbmFibGUgKi8KKwl1MzIJc3NjX2Rpc2FibGU7CQkvKiBTU0MgcmVjdi90cmFucyBkaXNhYmxlICovCisJdTMyCXNzY19lbmR4OwkJLyogU1NDIEVORFRYIG9yIEVORFJYICovCisJdTMyCXNzY19lbmRidWY7CQkvKiBTU0MgVFhCVUZFIG9yIFJYQlVGRiAqLworCXUzMglwZGNfZW5hYmxlOwkJLyogUERDIHJlY3YvdHJhbnMgZW5hYmxlICovCisJdTMyCXBkY19kaXNhYmxlOwkJLyogUERDIHJlY3YvdHJhbnMgZGlzYWJsZSAqLworfTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlLCBzaGFyZWQgYmV0d2VlbiB0aGUgUENNIGRyaXZlciBhbmQgdGhlIGludGVyZmFjZSwKKyAqIGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgUENNIGRyaXZlciB0byBwZXJmb3JtIHRoZQorICogUERDIERNQSBvcGVyYXRpb24uICBBbGwgZmllbGRzIGV4Y2VwdCBkbWFfaW50cl9oYW5kbGVyKCkgYXJlIGluaXRpYWxpemVkCisgKiBieSB0aGUgaW50ZXJmYWNlLiAgVGhlIGRtc19pbnRyX2hhbmRsZXIoKSBwb2ludGVyIGlzIHNldCBieSB0aGUgUENNCisgKiBkcml2ZXIgYW5kIGNhbGxlZCBieSB0aGUgaW50ZXJmYWNlIFNTQyBpbnRlcnJ1cHQgaGFuZGxlciBpZiBpdCBpcworICogbm9uLU5VTEwuCisgKi8KK3N0cnVjdCBhdDkxX3BjbV9kbWFfcGFyYW1zIHsKKwljaGFyICpuYW1lOwkJCS8qIHN0cmVhbSBpZGVudGlmaWVyICovCisJaW50IHBkY194ZmVyX3NpemU7CQkvKiBQREMgY291bnRlciBpbmNyZW1lbnQgaW4gYnl0ZXMgKi8KKwl2b2lkIF9faW9tZW0gKnNzY19iYXNlOwkJLyogU1NDIGJhc2UgYWRkcmVzcyAqLworCXN0cnVjdCBhdDkxX3BkY19yZWdzICpwZGM7IC8qIFBEQyByZWNlaXZlIG9yIHRyYW5zbWl0IHJlZ2lzdGVycyAqLworCXN0cnVjdCBhdDkxX3NzY19tYXNrICptYXNrOy8qIFNTQyAmIFBEQyBzdGF0dXMgYml0cyAqLworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXZvaWQgKCpkbWFfaW50cl9oYW5kbGVyKSh1MzIsIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKTsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSBhdDkxX3NvY19wbGF0Zm9ybTsKKworI2RlZmluZSBhdDkxX3NzY19yZWFkKGEpCSgodW5zaWduZWQgbG9uZykgX19yYXdfcmVhZGwoYSkpCisjZGVmaW5lIGF0OTFfc3NjX3dyaXRlKGEsdikJX19yYXdfd3JpdGVsKCh2KSwoYSkpCisKKyNlbmRpZiAvKiBfQVQ5MV9QQ01fSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0OTEvZXRpX2IxX3dtODczMS5jIGIvc291bmQvc29jL2F0OTEvZXRpX2IxX3dtODczMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzlkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYXQ5MS9ldGlfYjFfd204NzMxLmMKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgKiBldGlfYjFfd204NzMxICAtLSAgU29DIGF1ZGlvIGZvciBBVDkxUk05MjAwLWJhc2VkIEVuZHJlbGlhIEVUSV9CMSBib2FyZC4KKyAqCisgKiBBdXRob3I6CUZyYW5rIE1hbmRhcmlubyA8Zm1hbmRhcmlub0BlbmRyZWxpYS5jb20+CisgKgkJRW5kcmVsaWEgVGVjaG5vbG9naWVzIEluYy4KKyAqIENyZWF0ZWQ6CU1hciAyOSwgMjAwNgorICoKKyAqIEJhc2VkIG9uIGNvcmdpLmMgYnk6CisgKgorICogQ29weXJpZ2h0IDIwMDUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqIENvcHlyaWdodCAyMDA1IE9wZW5lZGhhbmQgTHRkLgorICoKKyAqIEF1dGhvcnM6IExpYW0gR2lyZHdvb2QgPGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbT4KKyAqICAgICAgICAgIFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9waW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisKKyNpbmNsdWRlICIuLi9jb2RlY3Mvd204NzMxLmgiCisjaW5jbHVkZSAiYXQ5MS1wY20uaCIKKyNpbmNsdWRlICJhdDkxLWkycy5oIgorCisjaWYgMAorI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKEtFUk5fSU5GTyAiZXRpX2IxX3dtODczMTogIiB4KQorI2Vsc2UKKyNkZWZpbmUJREJHKHguLi4pCisjZW5kaWYKKworI2RlZmluZSBBVDkxX1BJT19URjEJKDEgPDwgKEFUOTFfUElOX1BCNiAtIFBJTl9CQVNFKSAlIDMyKQorI2RlZmluZSBBVDkxX1BJT19USzEJKDEgPDwgKEFUOTFfUElOX1BCNyAtIFBJTl9CQVNFKSAlIDMyKQorI2RlZmluZSBBVDkxX1BJT19URDEJKDEgPDwgKEFUOTFfUElOX1BCOCAtIFBJTl9CQVNFKSAlIDMyKQorI2RlZmluZSBBVDkxX1BJT19SRDEJKDEgPDwgKEFUOTFfUElOX1BCOSAtIFBJTl9CQVNFKSAlIDMyKQorI2RlZmluZSBBVDkxX1BJT19SSzEJKDEgPDwgKEFUOTFfUElOX1BCMTAgLSBQSU5fQkFTRSkgJSAzMikKKyNkZWZpbmUgQVQ5MV9QSU9fUkYxCSgxIDw8IChBVDkxX1BJTl9QQjExIC0gUElOX0JBU0UpICUgMzIpCisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpwY2sxX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrICpwbGxiX2NsazsKKworCitzdGF0aWMgaW50IGV0aV9iMV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+ZGFpLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IHJ0ZC0+ZGFpLT5jcHVfZGFpOworCWludCByZXQ7CisKKwkvKiBjcHUgY2xvY2sgaXMgdGhlIEFUOTEgbWFzdGVyIGNsb2NrIHNlbnQgdG8gdGhlIFNTQyAqLworCXJldCA9IGNwdV9kYWktPmRhaV9vcHMuc2V0X3N5c2NsayhjcHVfZGFpLCBBVDkxX1NZU0NMS19NQ0ssCisJCTYwMDAwMDAwLCBTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGNvZGVjIHN5c3RlbSBjbG9jayBpcyBzdXBwbGllZCBieSBQQ0sxLCBzZXQgdG8gMTJNSHogKi8KKwlyZXQgPSBjb2RlY19kYWktPmRhaV9vcHMuc2V0X3N5c2Nsayhjb2RlY19kYWksIFdNODczMV9TWVNDTEssCisJCTEyMDAwMDAwLCBTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFN0YXJ0IFBDSzEgY2xvY2suICovCisJY2xrX2VuYWJsZShwY2sxX2Nsayk7CisJREJHKCJwY2sxIHN0YXJ0ZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV0aV9iMV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwkvKiBTdG9wIFBDSzEgY2xvY2suICovCisJY2xrX2Rpc2FibGUocGNrMV9jbGspOworCURCRygicGNrMSBzdG9wcGVkXG4iKTsKK30KKworc3RhdGljIGludCBldGlfYjFfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+ZGFpLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IHJ0ZC0+ZGFpLT5jcHVfZGFpOworCWludCByZXQ7CisKKyNpZmRlZiBDT05GSUdfU05EX0FUOTFfU09DX0VUSV9TTEFWRQorCXVuc2lnbmVkIGludCByYXRlOworCWludCBjbXJfZGl2LCBwZXJpb2Q7CisKKwkvKiBzZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb24gKi8KKwlyZXQgPSBjb2RlY19kYWktPmRhaV9vcHMuc2V0X2ZtdChjb2RlY19kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8CisJCVNORF9TT0NfREFJRk1UX05CX05GIHwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBzZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gY3B1X2RhaS0+ZGFpX29wcy5zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8CisJCVNORF9TT0NfREFJRk1UX05CX05GIHwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFRoZSBTU0MgY2xvY2sgZGl2aWRlcnMgZGVwZW5kIG9uIHRoZSBzYW1wbGUgcmF0ZS4gIFRoZSBDTVIuRElWCisJICogZmllbGQgZGl2aWRlcyB0aGUgc3lzdGVtIG1hc3RlciBjbG9jayBNQ0sgdG8gZHJpdmUgdGhlIFNTQyBUSworCSAqIHNpZ25hbCB3aGljaCBwcm92aWRlcyB0aGUgY29kZWMgQkNMSy4gIFRoZSBUQ01SLlBFUklPRCBhbmQKKwkgKiBSQ01SLlBFUklPRCBmaWVsZHMgZnVydGhlciBkaXZpZGUgdGhlIEJDTEsgc2lnbmFsIHRvIGRyaXZlCisJICogdGhlIFNTQyBURiBhbmQgUkYgc2lnbmFscyB3aGljaCBwcm92aWRlIHRoZSBjb2RlYyBEQUNMUkMgYW5kCisJICogQURDTFJDIGNsb2Nrcy4KKwkgKgorCSAqIFRoZSBkaXZpZGVycyB3ZXJlIGRldGVybWluZWQgdGhyb3VnaCB0cmlhbCBhbmQgZXJyb3IsIHdoZXJlIGEKKwkgKiBDTVIuRElWIHZhbHVlIGlzIGNob3NlbiBzdWNoIHRoYXQgdGhlIHJlc3VsdGluZyBCQ0xLIHZhbHVlIGlzCisJICogZGl2aXNpYmxlLCBvciBhbG1vc3QgZGl2aXNpYmxlLCBieSAoMiAqIHNhbXBsZSByYXRlKSwgYW5kIHRoZW4KKwkgKiB0aGUgVENNUi5QRVJJT0Qgb3IgUkNNUi5QRVJJT0QgaXMgQkNMSyAvICgyICogc2FtcGxlIHJhdGUpIC0gMS4KKwkgKi8KKwlyYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgODAwMDoKKwkJY21yX2RpdiA9IDI1OwkvKiBCQ0xLID0gNjBNSHovKDIqMjUpID0gMS4yTUh6ICovCisJCXBlcmlvZCA9IDc0OwkvKiBMUkMgPSBCQ0xLLygyKig3NCsxKSkgPSA4MDAwSHogKi8KKwkJYnJlYWs7CisJY2FzZSAzMjAwMDoKKwkJY21yX2RpdiA9IDc7CS8qIEJDTEsgPSA2ME1Iei8oMio3KSB+PSA0LjI4NTcxNDI4TUh6ICovCisJCXBlcmlvZCA9IDY2OwkvKiBMUkMgPSBCQ0xLLygyKig2NisxKSkgPSAzMTk4Mi45NDJIeiAqLworCQlicmVhazsKKwljYXNlIDQ4MDAwOgorCQljbXJfZGl2ID0gMTM7CS8qIEJDTEsgPSA2ME1Iei8oMioxMykgfj0gMi4zMDc2OTIzTUh6ICovCisJCXBlcmlvZCA9IDIzOwkvKiBMUkMgPSBCQ0xLLygyKigyMysxKSkgPSA0ODA3Ni45MjNIeiAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ1bnN1cHBvcnRlZCByYXRlICVkIG9uIEVUSS1CMSBib2FyZFxuIiwgcmF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHNldCB0aGUgTUNLIGRpdmlkZXIgZm9yIEJDTEsgKi8KKwlyZXQgPSBjcHVfZGFpLT5kYWlfb3BzLnNldF9jbGtkaXYoY3B1X2RhaSwgQVQ5MVNTQ19DTVJfRElWLCBjbXJfZGl2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCS8qIHNldCB0aGUgQkNMSyBkaXZpZGVyIGZvciBEQUNMUkMgKi8KKwkJcmV0ID0gY3B1X2RhaS0+ZGFpX29wcy5zZXRfY2xrZGl2KGNwdV9kYWksCisJCQkJCQlBVDkxU1NDX1RDTVJfUEVSSU9ELCBwZXJpb2QpOworCX0gZWxzZSB7CisJCS8qIHNldCB0aGUgQkNMSyBkaXZpZGVyIGZvciBBRENMUkMgKi8KKwkJcmV0ID0gY3B1X2RhaS0+ZGFpX29wcy5zZXRfY2xrZGl2KGNwdV9kYWksCisJCQkJCQlBVDkxU1NDX1JDTVJfUEVSSU9ELCBwZXJpb2QpOworCX0KKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworI2Vsc2UgLyogQ09ORklHX1NORF9BVDkxX1NPQ19FVElfU0xBVkUgKi8KKwkvKgorCSAqIENvZGVjIGluIE1hc3RlciBNb2RlLgorCSAqLworCisJLyogc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gY29kZWNfZGFpLT5kYWlfb3BzLnNldF9mbXQoY29kZWNfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IGNwdV9kYWktPmRhaV9vcHMuc2V0X2ZtdChjcHVfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisjZW5kaWYgLyogQ09ORklHX1NORF9BVDkxX1NPQ19FVElfU0xBVkUgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGV0aV9iMV9vcHMgPSB7CisJLnN0YXJ0dXAgPSBldGlfYjFfc3RhcnR1cCwKKwkuaHdfcGFyYW1zID0gZXRpX2IxX2h3X3BhcmFtcywKKwkuc2h1dGRvd24gPSBldGlfYjFfc2h1dGRvd24sCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBldGlfYjFfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX01JQygiSW50IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIkV4dCBTcGsiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppbnRlcmNvbltdWzNdID0geworCisJLyogc3BlYWtlciBjb25uZWN0ZWQgdG8gTEhQT1VUICovCisJeyJFeHQgU3BrIiwgTlVMTCwgIkxIUE9VVCJ9LAorCisJLyogbWljIGlzIGNvbm5lY3RlZCB0byBNaWMgSmFjaywgd2l0aCBXTTg3MzEgTWljIEJpYXMgKi8KKwl7Ik1JQ0lOIiwgTlVMTCwgIk1pYyBCaWFzIn0sCisJeyJNaWMgQmlhcyIsIE5VTEwsICJJbnQgTWljIn0sCisKKwkvKiB0ZXJtaW5hdG9yICovCisJe05VTEwsIE5VTEwsIE5VTEx9LAorfTsKKworLyoKKyAqIExvZ2ljIGZvciBhIHdtODczMSBhcyBjb25uZWN0ZWQgb24gYSBFbmRyZWxpYSBFVEktQjEgYm9hcmQuCisgKi8KK3N0YXRpYyBpbnQgZXRpX2IxX3dtODczMV9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaTsKKworCURCRygiZXRpX2IxX3dtODczMV9pbml0KCkgY2FsbGVkXG4iKTsKKworCS8qIEFkZCBzcGVjaWZpYyB3aWRnZXRzICovCisJZm9yKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldGlfYjFfZGFwbV93aWRnZXRzKTsgaSsrKSB7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbChjb2RlYywgJmV0aV9iMV9kYXBtX3dpZGdldHNbaV0pOworCX0KKworCS8qIFNldCB1cCBzcGVjaWZpYyBhdWRpbyBwYXRoIGludGVyY29ubmVjdHMgKi8KKwlmb3IoaSA9IDA7IGludGVyY29uW2ldWzBdICE9IE5VTEw7IGkrKykgeworCQlzbmRfc29jX2RhcG1fY29ubmVjdF9pbnB1dChjb2RlYywgaW50ZXJjb25baV1bMF0sCisJCQlpbnRlcmNvbltpXVsxXSwgaW50ZXJjb25baV1bMl0pOworCX0KKworCS8qIG5vdCBjb25uZWN0ZWQgKi8KKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiUkxJTkVJTiIsIDApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJMTElORUlOIiwgMCk7CisKKwkvKiBhbHdheXMgY29ubmVjdGVkICovCisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkludCBNaWMiLCAxKTsKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiRXh0IFNwayIsIDEpOworCisJc25kX3NvY19kYXBtX3N5bmNfZW5kcG9pbnRzKGNvZGVjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgZXRpX2IxX2RhaSA9IHsKKwkubmFtZSA9ICJXTTg3MzEiLAorCS5zdHJlYW1fbmFtZSA9ICJXTTg3MzEiLAorCS5jcHVfZGFpID0gJmF0OTFfaTJzX2RhaVsxXSwKKwkuY29kZWNfZGFpID0gJndtODczMV9kYWksCisJLmluaXQgPSBldGlfYjFfd204NzMxX2luaXQsCisJLm9wcyA9ICZldGlfYjFfb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX21hY2hpbmUgc25kX3NvY19tYWNoaW5lX2V0aV9iMSA9IHsKKwkubmFtZSA9ICJFVElfQjEiLAorCS5kYWlfbGluayA9ICZldGlfYjFfZGFpLAorCS5udW1fbGlua3MgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCB3bTg3MzFfc2V0dXBfZGF0YSBldGlfYjFfd204NzMxX3NldHVwID0geworCS5pMmNfYWRkcmVzcyA9IDB4MWEsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlIGV0aV9iMV9zbmRfZGV2ZGF0YSA9IHsKKwkubWFjaGluZSA9ICZzbmRfc29jX21hY2hpbmVfZXRpX2IxLAorCS5wbGF0Zm9ybSA9ICZhdDkxX3NvY19wbGF0Zm9ybSwKKwkuY29kZWNfZGV2ID0gJnNvY19jb2RlY19kZXZfd204NzMxLAorCS5jb2RlY19kYXRhID0gJmV0aV9iMV93bTg3MzFfc2V0dXAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZXRpX2IxX3NuZF9kZXZpY2U7CisKK3N0YXRpYyBpbnQgX19pbml0IGV0aV9iMV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwl1MzIgc3NjX3Bpb19saW5lczsKKwlzdHJ1Y3QgYXQ5MV9zc2NfcGVyaXBoICpzc2MgPSBldGlfYjFfZGFpLmNwdV9kYWktPnByaXZhdGVfZGF0YTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKEFUOTFSTTkyMDBfQkFTRV9TU0MxLCBTWl8xNkssICJzb2MtYXVkaW8iKSkgeworCQlEQkcoIlNTQzEgbWVtb3J5IHJlZ2lvbiBpcyBidXN5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzc2MtPmJhc2UgPSBpb3JlbWFwKEFUOTFSTTkyMDBfQkFTRV9TU0MxLCBTWl8xNkspOworCWlmICghc3NjLT5iYXNlKSB7CisJCURCRygiU1NDMSBtZW1vcnkgaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfcmVsZWFzZV9tZW07CisJfQorCisJc3NjLT5waWQgPSBBVDkxUk05MjAwX0lEX1NTQzE7CisKKwlldGlfYjFfc25kX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgLTEpOworCWlmICghZXRpX2IxX3NuZF9kZXZpY2UpIHsKKwkJREJHKCJwbGF0Zm9ybSBkZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfaW9fdW5tYXA7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZXRpX2IxX3NuZF9kZXZpY2UsICZldGlfYjFfc25kX2RldmRhdGEpOworCWV0aV9iMV9zbmRfZGV2ZGF0YS5kZXYgPSAmZXRpX2IxX3NuZF9kZXZpY2UtPmRldjsKKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoZXRpX2IxX3NuZF9kZXZpY2UpOworCWlmIChyZXQpIHsKKwkJREJHKCJwbGF0Zm9ybSBkZXZpY2UgYWRkIGZhaWxlZFxuIik7CisJCXBsYXRmb3JtX2RldmljZV9wdXQoZXRpX2IxX3NuZF9kZXZpY2UpOworCQlnb3RvIGZhaWxfaW9fdW5tYXA7CisJfQorCisgCXNzY19waW9fbGluZXMgPSBBVDkxX1BJT19URjEgfCBBVDkxX1BJT19USzEgfCBBVDkxX1BJT19URDEKKwkJCXwgQVQ5MV9QSU9fUkQxIC8qIHwgQVQ5MV9QSU9fUksxICovIHwgQVQ5MV9QSU9fUkYxOworCisJLyogUmVzZXQgYWxsIFBJTyByZWdpc3RlcnMgYW5kIGFzc2lnbiBsaW5lcyB0byBwZXJpcGhlcmFsIEEgKi8KKyAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9CICsgUElPX1BEUiwgIHNzY19waW9fbGluZXMpOworIAlhdDkxX3N5c193cml0ZShBVDkxX1BJT0IgKyBQSU9fT0RSLCAgc3NjX3Bpb19saW5lcyk7CisgCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQiArIFBJT19JRkRSLCBzc2NfcGlvX2xpbmVzKTsKKyAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9CICsgUElPX0NPRFIsIHNzY19waW9fbGluZXMpOworIAlhdDkxX3N5c193cml0ZShBVDkxX1BJT0IgKyBQSU9fSURSLCAgc3NjX3Bpb19saW5lcyk7CisgCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQiArIFBJT19NRERSLCBzc2NfcGlvX2xpbmVzKTsKKyAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9CICsgUElPX1BVRFIsIHNzY19waW9fbGluZXMpOworIAlhdDkxX3N5c193cml0ZShBVDkxX1BJT0IgKyBQSU9fQVNSLCAgc3NjX3Bpb19saW5lcyk7CisgCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQiArIFBJT19PV0RSLCBzc2NfcGlvX2xpbmVzKTsKKworCS8qCisJICogU2V0IFBDSzEgcGFyZW50IHRvIFBMTEIgYW5kIGl0cyByYXRlIHRvIDEyIE1oei4KKwkgKi8KKwlwbGxiX2NsayA9IGNsa19nZXQoTlVMTCwgInBsbGIiKTsKKwlwY2sxX2NsayA9IGNsa19nZXQoTlVMTCwgInBjazEiKTsKKworCWNsa19zZXRfcGFyZW50KHBjazFfY2xrLCBwbGxiX2Nsayk7CisJY2xrX3NldF9yYXRlKHBjazFfY2xrLCAxMjAwMDAwMCk7CisKKwlEQkcoIk1DTEsgcmF0ZSAlbHVIelxuIiwgY2xrX2dldF9yYXRlKHBjazFfY2xrKSk7CisKKwkvKiBhc3NpZ24gdGhlIEdQSU8gcGluIHRvIFBDSzEgKi8KKwlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTI0LCAwKTsKKworI2lmZGVmIENPTkZJR19TTkRfQVQ5MV9TT0NfRVRJX1NMQVZFCisJcHJpbnRrKEtFUk5fSU5GTyAiZXRpX2IxX3dtODczMTogQ29kZWMgaW4gU2xhdmUgTW9kZVxuIik7CisjZWxzZQorCXByaW50ayhLRVJOX0lORk8gImV0aV9iMV93bTg3MzE6IENvZGVjIGluIE1hc3RlciBNb2RlXG4iKTsKKyNlbmRpZgorCXJldHVybiByZXQ7CisKK2ZhaWxfaW9fdW5tYXA6CisJaW91bm1hcChzc2MtPmJhc2UpOworZmFpbF9yZWxlYXNlX21lbToKKwlyZWxlYXNlX21lbV9yZWdpb24oQVQ5MVJNOTIwMF9CQVNFX1NTQzEsIFNaXzE2Syk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV0aV9iMV9leGl0KHZvaWQpCit7CisJc3RydWN0IGF0OTFfc3NjX3BlcmlwaCAqc3NjID0gZXRpX2IxX2RhaS5jcHVfZGFpLT5wcml2YXRlX2RhdGE7CisKKwljbGtfcHV0KHBjazFfY2xrKTsKKwljbGtfcHV0KHBsbGJfY2xrKTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGV0aV9iMV9zbmRfZGV2aWNlKTsKKworCWlvdW5tYXAoc3NjLT5iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oQVQ5MVJNOTIwMF9CQVNFX1NTQzEsIFNaXzE2Syk7Cit9CisKK21vZHVsZV9pbml0KGV0aV9iMV9pbml0KTsKK21vZHVsZV9leGl0KGV0aV9iMV9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJGcmFuayBNYW5kYXJpbm8gPGZtYW5kYXJpbm9AZW5kcmVsaWEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBFVEktQjEtV004NzMxIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhYzI2OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZwpAQCAtMCwwICsxLDE1IEBACitjb25maWcgU05EX1NPQ19BQzk3X0NPREVDCisJdHJpc3RhdGUKKwlkZXBlbmRzIFNORF9TT0MKKworY29uZmlnIFNORF9TT0NfV004NzMxCisJdHJpc3RhdGUKKwlkZXBlbmRzIFNORF9TT0MKKworY29uZmlnIFNORF9TT0NfV004NzUwCisJdHJpc3RhdGUKKwlkZXBlbmRzIFNORF9TT0MKKworY29uZmlnIFNORF9TT0NfV005NzEyCisJdHJpc3RhdGUKKwlkZXBlbmRzIFNORF9TT0MKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNDlhNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorc25kLXNvYy1hYzk3LW9ianMgOj0gYWM5Ny5vCitzbmQtc29jLXdtODczMS1vYmpzIDo9IHdtODczMS5vCitzbmQtc29jLXdtODc1MC1vYmpzIDo9IHdtODc1MC5vCitzbmQtc29jLXdtOTcxMi1vYmpzIDo9IHdtOTcxMi5vCisKK29iai0kKENPTkZJR19TTkRfU09DX0FDOTdfQ09ERUMpCSs9IHNuZC1zb2MtYWM5Ny5vCitvYmotJChDT05GSUdfU05EX1NPQ19XTTg3MzEpCSs9IHNuZC1zb2Mtd204NzMxLm8KK29iai0kKENPTkZJR19TTkRfU09DX1dNODc1MCkJKz0gc25kLXNvYy13bTg3NTAubworb2JqLSQoQ09ORklHX1NORF9TT0NfV005NzEyKQkrPSBzbmQtc29jLXdtOTcxMi5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FjOTcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YmM1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FjOTcuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIGFjOTcuYyAgLS0gIEFMU0EgU29jIEFDOTcgY29kZWMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKKyAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMTd0aCBPY3QgMjAwNSAgIEluaXRpYWwgdmVyc2lvbi4KKyAqCisgKiBHZW5lcmljIEFDOTcgc3VwcG9ydC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjZGVmaW5lIEFDOTdfVkVSU0lPTiAiMC42IgorCitzdGF0aWMgaW50IGFjOTdfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHJ0ZC0+c29jZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwlpbnQgcmVnID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spID8KKwkJICBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSA6IEFDOTdfUENNX0xSX0FEQ19SQVRFOworCXJldHVybiBzbmRfYWM5N19zZXRfcmF0ZShjb2RlYy0+YWM5NywgcmVnLCBydW50aW1lLT5yYXRlKTsKK30KKworI2RlZmluZSBTVERfQUM5N19SQVRFUyAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHxcCisJCVNORFJWX1BDTV9SQVRFXzIyMDUwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCkKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSBhYzk3X2RhaSA9IHsKKwkubmFtZSA9ICJBQzk3IEhpRmkiLAorCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkFDOTcgUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFNURF9BQzk3X1JBVEVTLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLH0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJBQzk3IENhcHR1cmUiLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFNURF9BQzk3X1JBVEVTLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLH0sCisJLm9wcyA9IHsKKwkJLnByZXBhcmUgPSBhYzk3X3ByZXBhcmUsfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWM5N19yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgcmVnKQoreworCXJldHVybiBzb2NfYWM5N19vcHMucmVhZChjb2RlYy0+YWM5NywgcmVnKTsKK30KKworc3RhdGljIGludCBhYzk3X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwl1bnNpZ25lZCBpbnQgdmFsKQoreworCXNvY19hYzk3X29wcy53cml0ZShjb2RlYy0+YWM5NywgcmVnLCB2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjOTdfc29jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHNuZF9hYzk3X2J1cyAqYWM5N19idXM7CisJc3RydWN0IHNuZF9hYzk3X3RlbXBsYXRlIGFjOTdfdGVtcGxhdGU7CisJaW50IHJldCA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICJBQzk3IFNvQyBBdWRpbyBDb2RlYyAlc1xuIiwgQUM5N19WRVJTSU9OKTsKKworCXNvY2Rldi0+Y29kZWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyksIEdGUF9LRVJORUwpOworCWlmIChzb2NkZXYtPmNvZGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwltdXRleF9pbml0KCZjb2RlYy0+bXV0ZXgpOworCisJY29kZWMtPm5hbWUgPSAiQUM5NyI7CisJY29kZWMtPm93bmVyID0gVEhJU19NT0RVTEU7CisJY29kZWMtPmRhaSA9ICZhYzk3X2RhaTsKKwljb2RlYy0+bnVtX2RhaSA9IDE7CisJY29kZWMtPndyaXRlID0gYWM5N193cml0ZTsKKwljb2RlYy0+cmVhZCA9IGFjOTdfcmVhZDsKKwlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fd2lkZ2V0cyk7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5kYXBtX3BhdGhzKTsKKworCS8qIHJlZ2lzdGVyIHBjbXMgKi8KKwlyZXQgPSBzbmRfc29jX25ld19wY21zKHNvY2RldiwgU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEpOworCWlmKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJLyogYWRkIGNvZGVjIGFzIGJ1cyBkZXZpY2UgZm9yIHN0YW5kYXJkIGFjOTcgKi8KKwlyZXQgPSBzbmRfYWM5N19idXMoY29kZWMtPmNhcmQsIDAsICZzb2NfYWM5N19vcHMsIE5VTEwsICZhYzk3X2J1cyk7CisJaWYocmV0IDwgMCkKKwkJZ290byBidXNfZXJyOworCisJbWVtc2V0KCZhYzk3X3RlbXBsYXRlLCAwLCBzaXplb2Yoc3RydWN0IHNuZF9hYzk3X3RlbXBsYXRlKSk7CisJcmV0ID0gc25kX2FjOTdfbWl4ZXIoYWM5N19idXMsICZhYzk3X3RlbXBsYXRlLCAmY29kZWMtPmFjOTcpOworCWlmKHJldCA8IDApCisJCWdvdG8gYnVzX2VycjsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChzb2NkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGJ1c19lcnI7CisJcmV0dXJuIDA7CisKK2J1c19lcnI6CisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKworZXJyOgorCWtmcmVlKHNvY2Rldi0+Y29kZWMtPnJlZ19jYWNoZSk7CisJa2ZyZWUoc29jZGV2LT5jb2RlYyk7CisJc29jZGV2LT5jb2RlYyA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhYzk3X3NvY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwlpZihjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CisJa2ZyZWUoc29jZGV2LT5jb2RlYy0+cmVnX2NhY2hlKTsKKwlrZnJlZShzb2NkZXYtPmNvZGVjKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl9hYzk3PSB7CisJLnByb2JlID0gCWFjOTdfc29jX3Byb2JlLAorCS5yZW1vdmUgPSAJYWM5N19zb2NfcmVtb3ZlLAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwoc29jX2NvZGVjX2Rldl9hYzk3KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTb2MgR2VuZXJpYyBBQzk3IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hYzk3LmggYi9zb3VuZC9zb2MvY29kZWNzL2FjOTcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzBkZGZjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9hYzk3LmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGxpbnV4L3NvdW5kL2NvZGVjcy9hYzk3LmggLS0gQUxTQSBTb0MgTGF5ZXIKKyAqCisgKiBBdXRob3I6CQlMaWFtIEdpcmR3b29kCisgKiBDcmVhdGVkOgkJRGVjIDFzdCAyMDA1CisgKiBDb3B5cmlnaHQ6CVdvbGZzb24gTWljcm9lbGVjdHJvbmljcy4gUExDLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1NORF9TT0NfQUM5N19ICisjZGVmaW5lIF9fTElOVVhfU05EX1NPQ19BQzk3X0gKKworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X2FjOTc7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhMGI1MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKQEAgLTAsMCArMSw3NTggQEAKKy8qCisgKiB3bTg3MzEuYyAgLS0gIFdNODczMSBBTFNBIFNvQyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3I6IFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgorICoKKyAqIEJhc2VkIG9uIHdtODc1My5jIGJ5IExpYW0gR2lyZHdvb2QKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgIndtODczMS5oIgorCisjZGVmaW5lIEFVRElPX05BTUUgIndtODczMSIKKyNkZWZpbmUgV004NzMxX1ZFUlNJT04gIjAuMTMiCisKKy8qCisgKiBEZWJ1ZworICovCisKKyNkZWZpbmUgV004NzMxX0RFQlVHIDAKKworI2lmZGVmIFdNODczMV9ERUJVRworI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBBVURJT19OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX0VSUiBBVURJT19OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9JTkZPIEFVRElPX05BTUUgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX1dBUk5JTkcgQVVESU9fTkFNRSAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl93bTg3MzE7CisKKy8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLworc3RydWN0IHdtODczMV9wcml2IHsKKwl1bnNpZ25lZCBpbnQgc3lzY2xrOworfTsKKworLyoKKyAqIHdtODczMSByZWdpc3RlciBjYWNoZQorICogV2UgY2FuJ3QgcmVhZCB0aGUgV004NzMxIHJlZ2lzdGVyIHNwYWNlIHdoZW4gd2UgYXJlCisgKiB1c2luZyAyIHdpcmUgZm9yIGRldmljZSBjb250cm9sLCBzbyB3ZSBjYWNoZSB0aGVtIGluc3RlYWQuCisgKiBUaGVyZSBpcyBubyBwb2ludCBpbiBjYWNoaW5nIHRoZSByZXNldCByZWdpc3RlcgorICovCitzdGF0aWMgY29uc3QgdTE2IHdtODczMV9yZWdbV004NzMxX0NBQ0hFUkVHTlVNXSA9IHsKKyAgICAweDAwOTcsIDB4MDA5NywgMHgwMDc5LCAweDAwNzksCisgICAgMHgwMDBhLCAweDAwMDgsIDB4MDA5ZiwgMHgwMDBhLAorICAgIDB4MDAwMCwgMHgwMDAwCit9OworCisvKgorICogcmVhZCB3bTg3MzEgcmVnaXN0ZXIgY2FjaGUKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgd204NzMxX3JlYWRfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgcmVnKQoreworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCWlmIChyZWcgPT0gV004NzMxX1JFU0VUKQorCQlyZXR1cm4gMDsKKwlpZiAocmVnID49IFdNODczMV9DQUNIRVJFR05VTSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBjYWNoZVtyZWddOworfQorCisvKgorICogd3JpdGUgd204NzMxIHJlZ2lzdGVyIGNhY2hlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3bTg3MzFfd3JpdGVfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1MTYgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisJaWYgKHJlZyA+PSBXTTg3MzFfQ0FDSEVSRUdOVU0pCisJCXJldHVybjsKKwljYWNoZVtyZWddID0gdmFsdWU7Cit9CisKKy8qCisgKiB3cml0ZSB0byB0aGUgV004NzMxIHJlZ2lzdGVyIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgd204NzMxX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwl1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdTggZGF0YVsyXTsKKworCS8qIGRhdGEgaXMKKwkgKiAgIEQxNS4uRDkgV004NzMxIHJlZ2lzdGVyIG9mZnNldAorCSAqICAgRDguLi5EMCByZWdpc3RlciBkYXRhCisJICovCisJZGF0YVswXSA9IChyZWcgPDwgMSkgfCAoKHZhbHVlID4+IDgpICYgMHgwMDAxKTsKKwlkYXRhWzFdID0gdmFsdWUgJiAweDAwZmY7CisKKwl3bTg3MzFfd3JpdGVfcmVnX2NhY2hlIChjb2RlYywgcmVnLCB2YWx1ZSk7CisJaWYgKGNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKSA9PSAyKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtRUlPOworfQorCisjZGVmaW5lIHdtODczMV9yZXNldChjKQl3bTg3MzFfd3JpdGUoYywgV004NzMxX1JFU0VULCAwKQorCitzdGF0aWMgY29uc3QgY2hhciAqd204NzMxX2lucHV0X3NlbGVjdFtdID0geyJMaW5lIEluIiwgIk1pYyJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODczMV9kZWVtcGhbXSA9IHsiTm9uZSIsICIzMktoeiIsICI0NC4xS2h6IiwgIjQ4S2h6In07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204NzMxX2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEUoV004NzMxX0FQQU5BLCAyLCAyLCB3bTg3MzFfaW5wdXRfc2VsZWN0KSwKKwlTT0NfRU5VTV9TSU5HTEUoV004NzMxX0FQRElHSSwgMSwgNCwgd204NzMxX2RlZW1waCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzMxX3NuZF9jb250cm9sc1tdID0geworCitTT0NfRE9VQkxFX1IoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCBXTTg3MzFfTE9VVDFWLCBXTTg3MzFfUk9VVDFWLAorCTAsIDEyNywgMCksCitTT0NfRE9VQkxFX1IoIk1hc3RlciBQbGF5YmFjayBaQyBTd2l0Y2giLCBXTTg3MzFfTE9VVDFWLCBXTTg3MzFfUk9VVDFWLAorCTcsIDEsIDApLAorCitTT0NfRE9VQkxFX1IoIkNhcHR1cmUgVm9sdW1lIiwgV004NzMxX0xJTlZPTCwgV004NzMxX1JJTlZPTCwgMCwgMzEsIDApLAorU09DX0RPVUJMRV9SKCJMaW5lIENhcHR1cmUgU3dpdGNoIiwgV004NzMxX0xJTlZPTCwgV004NzMxX1JJTlZPTCwgNywgMSwgMSksCisKK1NPQ19TSU5HTEUoIk1pYyBCb29zdCAoKzIwZEIpIiwgV004NzMxX0FQQU5BLCAwLCAxLCAwKSwKK1NPQ19TSU5HTEUoIkNhcHR1cmUgTWljIFN3aXRjaCIsIFdNODczMV9BUEFOQSwgMSwgMSwgMSksCisKK1NPQ19TSU5HTEUoIlNpZGV0b25lIFBsYXliYWNrIFZvbHVtZSIsIFdNODczMV9BUEFOQSwgNiwgMywgMSksCisKK1NPQ19TSU5HTEUoIkFEQyBIaWdoIFBhc3MgRmlsdGVyIFN3aXRjaCIsIFdNODczMV9BUERJR0ksIDAsIDEsIDEpLAorU09DX1NJTkdMRSgiU3RvcmUgREMgT2Zmc2V0IFN3aXRjaCIsIFdNODczMV9BUERJR0ksIDQsIDEsIDApLAorCitTT0NfRU5VTSgiUGxheWJhY2sgRGUtZW1waGFzaXMiLCB3bTg3MzFfZW51bVsxXSksCit9OworCisvKiBhZGQgbm9uIGRhcG0gY29udHJvbHMgKi8KK3N0YXRpYyBpbnQgd204NzMxX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGVyciwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMV9zbmRfY29udHJvbHMpOyBpKyspIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZCwKKwkJCQlzbmRfc29jX2NuZXcoJndtODczMV9zbmRfY29udHJvbHNbaV0sY29kZWMsIE5VTEwpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogT3V0cHV0IE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzMxX291dHB1dF9taXhlcl9jb250cm9sc1tdID0geworU09DX0RBUE1fU0lOR0xFKCJMaW5lIEJ5cGFzcyBTd2l0Y2giLCBXTTg3MzFfQVBBTkEsIDMsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJNaWMgU2lkZXRvbmUgU3dpdGNoIiwgV004NzMxX0FQQU5BLCA1LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiSGlGaSBQbGF5YmFjayBTd2l0Y2giLCBXTTg3MzFfQVBBTkEsIDQsIDEsIDApLAorfTsKKworLyogSW5wdXQgbXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzMxX2lucHV0X211eF9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJJbnB1dCBTZWxlY3QiLCB3bTg3MzFfZW51bVswXSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3MzFfZGFwbV93aWRnZXRzW10gPSB7CitTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBNaXhlciIsIFdNODczMV9QV1IsIDQsIDEsCisJJndtODczMV9vdXRwdXRfbWl4ZXJfY29udHJvbHNbMF0sCisJQVJSQVlfU0laRSh3bTg3MzFfb3V0cHV0X21peGVyX2NvbnRyb2xzKSksCitTTkRfU09DX0RBUE1fREFDKCJEQUMiLCAiSGlGaSBQbGF5YmFjayIsIFdNODczMV9QV1IsIDMsIDEpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiTE9VVCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiTEhQT1VUIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJST1VUIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJSSFBPVVQiKSwKK1NORF9TT0NfREFQTV9BREMoIkFEQyIsICJIaUZpIENhcHR1cmUiLCBXTTg3MzFfUFdSLCAyLCAxKSwKK1NORF9TT0NfREFQTV9NVVgoIklucHV0IE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJndtODczMV9pbnB1dF9tdXhfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX1BHQSgiTGluZSBJbnB1dCIsIFdNODczMV9QV1IsIDAsIDEsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX01JQ0JJQVMoIk1pYyBCaWFzIiwgV004NzMxX1BXUiwgMSwgMSksCitTTkRfU09DX0RBUE1fSU5QVVQoIk1JQ0lOIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIlJMSU5FSU4iKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiTExJTkVJTiIpLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmludGVyY29uW11bM10gPSB7CisJLyogb3V0cHV0IG1peGVyICovCisJeyJPdXRwdXQgTWl4ZXIiLCAiTGluZSBCeXBhc3MgU3dpdGNoIiwgIkxpbmUgSW5wdXQifSwKKwl7Ik91dHB1dCBNaXhlciIsICJIaUZpIFBsYXliYWNrIFN3aXRjaCIsICJEQUMifSwKKwl7Ik91dHB1dCBNaXhlciIsICJNaWMgU2lkZXRvbmUgU3dpdGNoIiwgIk1pYyBCaWFzIn0sCisKKwkvKiBvdXRwdXRzICovCisJeyJSSFBPVVQiLCBOVUxMLCAiT3V0cHV0IE1peGVyIn0sCisJeyJST1VUIiwgTlVMTCwgIk91dHB1dCBNaXhlciJ9LAorCXsiTEhQT1VUIiwgTlVMTCwgIk91dHB1dCBNaXhlciJ9LAorCXsiTE9VVCIsIE5VTEwsICJPdXRwdXQgTWl4ZXIifSwKKworCS8qIGlucHV0IG11eCAqLworCXsiSW5wdXQgTXV4IiwgIkxpbmUgSW4iLCAiTGluZSBJbnB1dCJ9LAorCXsiSW5wdXQgTXV4IiwgIk1pYyIsICJNaWMgQmlhcyJ9LAorCXsiQURDIiwgTlVMTCwgIklucHV0IE11eCJ9LAorCisJLyogaW5wdXRzICovCisJeyJMaW5lIElucHV0IiwgTlVMTCwgIkxMSU5FSU4ifSwKKwl7IkxpbmUgSW5wdXQiLCBOVUxMLCAiUkxJTkVJTiJ9LAorCXsiTWljIEJpYXMiLCBOVUxMLCAiTUlDSU4ifSwKKworCS8qIHRlcm1pbmF0b3IgKi8KKwl7TlVMTCwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgaW50IHdtODczMV9hZGRfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMV9kYXBtX3dpZGdldHMpOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9sKGNvZGVjLCAmd204NzMxX2RhcG1fd2lkZ2V0c1tpXSk7CisJfQorCisJLyogc2V0IHVwIGF1ZGlvIHBhdGggaW50ZXJjb25uZWN0cyAqLworCWZvcihpID0gMDsgaW50ZXJjb25baV1bMF0gIT0gTlVMTDsgaSsrKSB7CisJCXNuZF9zb2NfZGFwbV9jb25uZWN0X2lucHV0KGNvZGVjLCBpbnRlcmNvbltpXVswXSwKKwkJCWludGVyY29uW2ldWzFdLCBpbnRlcmNvbltpXVsyXSk7CisJfQorCisJc25kX3NvY19kYXBtX25ld193aWRnZXRzKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IF9jb2VmZl9kaXYgeworCXUzMiBtY2xrOworCXUzMiByYXRlOworCXUxNiBmczsKKwl1OCBzcjo0OworCXU4IGJvc3I6MTsKKwl1OCB1c2I6MTsKK307CisKKy8qIGNvZGVjIG1jbGsgY2xvY2sgZGl2aWRlciBjb2VmZmljaWVudHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgX2NvZWZmX2RpdiBjb2VmZl9kaXZbXSA9IHsKKwkvKiA0OGsgKi8KKwl7MTIyODgwMDAsIDQ4MDAwLCAyNTYsIDB4MCwgMHgwLCAweDB9LAorCXsxODQzMjAwMCwgNDgwMDAsIDM4NCwgMHgwLCAweDEsIDB4MH0sCisJezEyMDAwMDAwLCA0ODAwMCwgMjUwLCAweDAsIDB4MCwgMHgxfSwKKworCS8qIDMyayAqLworCXsxMjI4ODAwMCwgMzIwMDAsIDM4NCwgMHg2LCAweDAsIDB4MH0sCisJezE4NDMyMDAwLCAzMjAwMCwgNTc2LCAweDYsIDB4MSwgMHgwfSwKKwl7MTIwMDAwMDAsIDMyMDAwLCAzNzUsIDB4NiwgMHgwLCAweDF9LAorCisJLyogOGsgKi8KKwl7MTIyODgwMDAsIDgwMDAsIDE1MzYsIDB4MywgMHgwLCAweDB9LAorCXsxODQzMjAwMCwgODAwMCwgMjMwNCwgMHgzLCAweDEsIDB4MH0sCisJezExMjg5NjAwLCA4MDAwLCAxNDA4LCAweGIsIDB4MCwgMHgwfSwKKwl7MTY5MzQ0MDAsIDgwMDAsIDIxMTIsIDB4YiwgMHgxLCAweDB9LAorCXsxMjAwMDAwMCwgODAwMCwgMTUwMCwgMHgzLCAweDAsIDB4MX0sCisKKwkvKiA5NmsgKi8KKwl7MTIyODgwMDAsIDk2MDAwLCAxMjgsIDB4NywgMHgwLCAweDB9LAorCXsxODQzMjAwMCwgOTYwMDAsIDE5MiwgMHg3LCAweDEsIDB4MH0sCisJezEyMDAwMDAwLCA5NjAwMCwgMTI1LCAweDcsIDB4MCwgMHgxfSwKKworCS8qIDQ0LjFrICovCisJezExMjg5NjAwLCA0NDEwMCwgMjU2LCAweDgsIDB4MCwgMHgwfSwKKwl7MTY5MzQ0MDAsIDQ0MTAwLCAzODQsIDB4OCwgMHgxLCAweDB9LAorCXsxMjAwMDAwMCwgNDQxMDAsIDI3MiwgMHg4LCAweDEsIDB4MX0sCisKKwkvKiA4OC4yayAqLworCXsxMTI4OTYwMCwgODgyMDAsIDEyOCwgMHhmLCAweDAsIDB4MH0sCisJezE2OTM0NDAwLCA4ODIwMCwgMTkyLCAweGYsIDB4MSwgMHgwfSwKKwl7MTIwMDAwMDAsIDg4MjAwLCAxMzYsIDB4ZiwgMHgxLCAweDF9LAorfTsKKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2NvZWZmKGludCBtY2xrLCBpbnQgcmF0ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZWZmX2Rpdik7IGkrKykgeworCQlpZiAoY29lZmZfZGl2W2ldLnJhdGUgPT0gcmF0ZSAmJiBjb2VmZl9kaXZbaV0ubWNsayA9PSBtY2xrKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODczMV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlzdHJ1Y3Qgd204NzMxX3ByaXYgKndtODczMSA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJdTE2IGlmYWNlID0gd204NzMxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3MzFfSUZBQ0UpICYgMHhmZmYzOworCWludCBpID0gZ2V0X2NvZWZmKHdtODczMS0+c3lzY2xrLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwl1MTYgc3JhdGUgPSAoY29lZmZfZGl2W2ldLnNyIDw8IDIpIHwKKwkJKGNvZWZmX2RpdltpXS5ib3NyIDw8IDEpIHwgY29lZmZfZGl2W2ldLnVzYjsKKworCXdtODczMV93cml0ZShjb2RlYywgV004NzMxX1NSQVRFLCBzcmF0ZSk7CisKKwkvKiBiaXQgc2l6ZSAqLworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyMF8zTEU6CisJCWlmYWNlIHw9IDB4MDAwNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJaWZhY2UgfD0gMHgwMDA4OworCQlicmVhazsKKwl9CisKKwl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9JRkFDRSwgaWZhY2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODczMV9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCisJLyogc2V0IGFjdGl2ZSAqLworCXdtODczMV93cml0ZShjb2RlYywgV004NzMxX0FDVElWRSwgMHgwMDAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3bTg3MzFfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCS8qIGRlYWN0aXZhdGUgKi8KKwlpZiAoIWNvZGVjLT5hY3RpdmUpIHsKKwkJdWRlbGF5KDUwKTsKKwkJd204NzMxX3dyaXRlKGNvZGVjLCBXTTg3MzFfQUNUSVZFLCAweDApOworCX0KK30KKworc3RhdGljIGludCB3bTg3MzFfbXV0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwl1MTYgbXV0ZV9yZWcgPSB3bTg3MzFfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODczMV9BUERJR0kpICYgMHhmZmY3OworCisJaWYgKG11dGUpCisJCXdtODczMV93cml0ZShjb2RlYywgV004NzMxX0FQRElHSSwgbXV0ZV9yZWcgfCAweDgpOworCWVsc2UKKwkJd204NzMxX3dyaXRlKGNvZGVjLCBXTTg3MzFfQVBESUdJLCBtdXRlX3JlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzMxX3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpLAorCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXN0cnVjdCB3bTg3MzFfcHJpdiAqd204NzMxID0gY29kZWMtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoZnJlcSkgeworCWNhc2UgMTEyODk2MDA6CisJY2FzZSAxMjAwMDAwMDoKKwljYXNlIDEyMjg4MDAwOgorCWNhc2UgMTY5MzQ0MDA6CisJY2FzZSAxODQzMjAwMDoKKwkJd204NzMxLT5zeXNjbGsgPSBmcmVxOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworc3RhdGljIGludCB3bTg3MzFfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWksCisJCXVuc2lnbmVkIGludCBmbXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwl1MTYgaWZhY2UgPSAwOworCisJLyogc2V0IG1hc3Rlci9zbGF2ZSBhdWRpbyBpbnRlcmZhY2UgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQlpZmFjZSB8PSAweDAwNDA7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogaW50ZXJmYWNlIGZvcm1hdCAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJaWZhY2UgfD0gMHgwMDAyOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQlpZmFjZSB8PSAweDAwMDE7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CisJCWlmYWNlIHw9IDB4MDAwMzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKKwkJaWZhY2UgfD0gMHgwMDEzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjbG9jayBpbnZlcnNpb24gKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9JRjoKKwkJaWZhY2UgfD0gMHgwMDkwOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQlpZmFjZSB8PSAweDAwODA7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfSUY6CisJCWlmYWNlIHw9IDB4MDAxMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc2V0IGlmYWNlICovCisJd204NzMxX3dyaXRlKGNvZGVjLCBXTTg3MzFfSUZBQ0UsIGlmYWNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg3MzFfZGFwbV9ldmVudChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBldmVudCkKK3sKKwl1MTYgcmVnID0gd204NzMxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3MzFfUFdSKSAmIDB4ZmY3ZjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMDogLyogZnVsbCBPbiAqLworCQkvKiB2cmVmL21pZCwgb3NjIG9uLCBkYWMgdW5tdXRlICovCisJCXdtODczMV93cml0ZShjb2RlYywgV004NzMxX1BXUiwgcmVnKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDE6IC8qIHBhcnRpYWwgT24gKi8KKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMjogLyogcGFydGlhbCBPbiAqLworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2hvdDogLyogT2ZmLCB3aXRoIHBvd2VyICovCisJCS8qIGV2ZXJ5dGhpbmcgb2ZmIGV4Y2VwdCB2cmVmL3ZtaWQsICovCisJCXdtODczMV93cml0ZShjb2RlYywgV004NzMxX1BXUiwgcmVnIHwgMHgwMDQwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDNjb2xkOiAvKiBPZmYsIHdpdGhvdXQgcG93ZXIgKi8KKwkJLyogZXZlcnl0aGluZyBvZmYsIGRhYyBtdXRlLCBpbmFjdGl2ZSAqLworCQl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9BQ1RJVkUsIDB4MCk7CisJCXdtODczMV93cml0ZShjb2RlYywgV004NzMxX1BXUiwgMHhmZmZmKTsKKwkJYnJlYWs7CisJfQorCWNvZGVjLT5kYXBtX3N0YXRlID0gZXZlbnQ7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgV004NzMxX1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfFwKKwkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8XAorCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHxcCisJCVNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODgyMDAgfFwKKwkJU05EUlZfUENNX1JBVEVfOTYwMDApCisKKyNkZWZpbmUgV004NzMxX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHxcCisJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpCisKK3N0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSB3bTg3MzFfZGFpID0geworCS5uYW1lID0gIldNODczMSIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFdNODczMV9SQVRFUywKKwkJLmZvcm1hdHMgPSBXTTg3MzFfRk9STUFUUyx9LAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV004NzMxX1JBVEVTLAorCQkuZm9ybWF0cyA9IFdNODczMV9GT1JNQVRTLH0sCisJLm9wcyA9IHsKKwkJLnByZXBhcmUgPSB3bTg3MzFfcGNtX3ByZXBhcmUsCisJCS5od19wYXJhbXMgPSB3bTg3MzFfaHdfcGFyYW1zLAorCQkuc2h1dGRvd24gPSB3bTg3MzFfc2h1dGRvd24sCisJfSwKKwkuZGFpX29wcyA9IHsKKwkJLmRpZ2l0YWxfbXV0ZSA9IHdtODczMV9tdXRlLAorCQkuc2V0X3N5c2NsayA9IHdtODczMV9zZXRfZGFpX3N5c2NsaywKKwkJLnNldF9mbXQgPSB3bTg3MzFfc2V0X2RhaV9mbXQsCisJfQorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHdtODczMV9kYWkpOworCitzdGF0aWMgaW50IHdtODczMV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9BQ1RJVkUsIDB4MCk7CisJd204NzMxX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EM2NvbGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODczMV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IGk7CisJdTggZGF0YVsyXTsKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKworCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzMxX3JlZyk7IGkrKykgeworCQlkYXRhWzBdID0gKGkgPDwgMSkgfCAoKGNhY2hlW2ldID4+IDgpICYgMHgwMDAxKTsKKwkJZGF0YVsxXSA9IGNhY2hlW2ldICYgMHgwMGZmOworCQljb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMik7CisJfQorCXdtODczMV9kYXBtX2V2ZW50KGNvZGVjLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOworCXdtODczMV9kYXBtX2V2ZW50KGNvZGVjLCBjb2RlYy0+c3VzcGVuZF9kYXBtX3N0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIFdNODczMSBkcml2ZXIKKyAqIHJlZ2lzdGVyIHRoZSBtaXhlciBhbmQgZHNwIGludGVyZmFjZXMgd2l0aCB0aGUga2VybmVsCisgKi8KK3N0YXRpYyBpbnQgd204NzMxX2luaXQoc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlpbnQgcmVnLCByZXQgPSAwOworCisJY29kZWMtPm5hbWUgPSAiV004NzMxIjsKKwljb2RlYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwljb2RlYy0+cmVhZCA9IHdtODczMV9yZWFkX3JlZ19jYWNoZTsKKwljb2RlYy0+d3JpdGUgPSB3bTg3MzFfd3JpdGU7CisJY29kZWMtPmRhcG1fZXZlbnQgPSB3bTg3MzFfZGFwbV9ldmVudDsKKwljb2RlYy0+ZGFpID0gJndtODczMV9kYWk7CisJY29kZWMtPm51bV9kYWkgPSAxOworCWNvZGVjLT5yZWdfY2FjaGVfc2l6ZSA9IHNpemVvZih3bTg3MzFfcmVnKTsKKwljb2RlYy0+cmVnX2NhY2hlID0ga21lbWR1cCh3bTg3MzFfcmVnLCBzaXplb2Yod204NzMxX3JlZyksIEdGUF9LRVJORUwpOworCWlmIChjb2RlYy0+cmVnX2NhY2hlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJd204NzMxX3Jlc2V0KGNvZGVjKTsKKworCS8qIHJlZ2lzdGVyIHBjbXMgKi8KKwlyZXQgPSBzbmRfc29jX25ld19wY21zKHNvY2RldiwgU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAid204NzMxOiBmYWlsZWQgdG8gY3JlYXRlIHBjbXNcbiIpOworCQlnb3RvIHBjbV9lcnI7CisJfQorCisJLyogcG93ZXIgb24gZGV2aWNlICovCisJd204NzMxX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CisKKwkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICovCisJcmVnID0gd204NzMxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3MzFfTE9VVDFWKTsKKwl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9MT1VUMVYsIHJlZyB8IDB4MDEwMCk7CisJcmVnID0gd204NzMxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3MzFfUk9VVDFWKTsKKwl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9ST1VUMVYsIHJlZyB8IDB4MDEwMCk7CisJcmVnID0gd204NzMxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3MzFfTElOVk9MKTsKKwl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9MSU5WT0wsIHJlZyB8IDB4MDEwMCk7CisJcmVnID0gd204NzMxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3MzFfUklOVk9MKTsKKwl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9SSU5WT0wsIHJlZyB8IDB4MDEwMCk7CisKKwl3bTg3MzFfYWRkX2NvbnRyb2xzKGNvZGVjKTsKKwl3bTg3MzFfYWRkX3dpZGdldHMoY29kZWMpOworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChzb2NkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAid204NzMxOiBmYWlsZWQgdG8gcmVnaXN0ZXIgY2FyZFxuIik7CisJCWdvdG8gY2FyZF9lcnI7CisJfQorCisJcmV0dXJuIHJldDsKKworY2FyZF9lcnI6CisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlzbmRfc29jX2RhcG1fZnJlZShzb2NkZXYpOworcGNtX2VycjoKKwlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlICp3bTg3MzFfc29jZGV2OworCisjaWYgZGVmaW5lZCAoQ09ORklHX0kyQykgfHwgZGVmaW5lZCAoQ09ORklHX0kyQ19NT0RVTEUpCisKKy8qCisgKiBXTTg3MzEgMiB3aXJlIGFkZHJlc3MgaXMgZGV0ZXJtaW5lZCBieSBHUElPNQorICogc3RhdGUgZHVyaW5nIHBvd2VydXAuCisgKiAgICBsb3cgID0gMHgxYQorICogICAgaGlnaCA9IDB4MWIKKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMCwgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogTWFnaWMgZGVmaW5pdGlvbiBvZiBhbGwgb3RoZXIgdmFyaWFibGVzIGFuZCB0aGluZ3MgKi8KK0kyQ19DTElFTlRfSU5TTU9EOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzMxX2kyY19kcml2ZXI7CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOworCisvKiBJZiB0aGUgaTJjIGxheWVyIHdlcmVuJ3Qgc28gYnJva2VuLCB3ZSBjb3VsZCBwYXNzIHRoaXMga2luZCBvZiBkYXRhCisgICBhcm91bmQgKi8KKworc3RhdGljIGludCB3bTg3MzFfY29kZWNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSB3bTg3MzFfc29jZGV2OworCXN0cnVjdCB3bTg3MzFfc2V0dXBfZGF0YSAqc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOworCWludCByZXQ7CisKKwlpZiAoYWRkciAhPSBzZXR1cC0+aTJjX2FkZHJlc3MpCisJCXJldHVybiAtRU5PREVWOworCisJY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOworCWNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKKworCWkyYyA9IGttZW1kdXAoJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKGNsaWVudF90ZW1wbGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChpMmMgPT0gTlVMTCkgeworCQlrZnJlZShjb2RlYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBjb2RlYyk7CisJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGkyYzsKKworCXJldCA9IGkyY19hdHRhY2hfY2xpZW50KGkyYyk7CisJaWYgKHJldCA8IDApIHsKKwkJZXJyKCJmYWlsZWQgdG8gYXR0YWNoIGNvZGVjIGF0IGFkZHIgJXhcbiIsIGFkZHIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSB3bTg3MzFfaW5pdChzb2NkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWVycigiZmFpbGVkIHRvIGluaXRpYWxpc2UgV004NzMxXG4iKTsKKwkJZ290byBlcnI7CisJfQorCXJldHVybiByZXQ7CisKK2VycjoKKwlrZnJlZShjb2RlYyk7CisJa2ZyZWUoaTJjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdtODczMV9pMmNfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMqIGNvZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODczMV9pMmNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHdtODczMV9jb2RlY19wcm9iZSk7Cit9CisKKy8qIGNvcmdpIGkyYyBjb2RlYyBjb250cm9sIGxheWVyICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzMxX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiV004NzMxIEkyQyBDb2RlYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLmlkID0gICAgICAgICAgICAgSTJDX0RSSVZFUklEX1dNODczMSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSB3bTg3MzFfaTJjX2F0dGFjaCwKKwkuZGV0YWNoX2NsaWVudCA9ICB3bTg3MzFfaTJjX2RldGFjaCwKKwkuY29tbWFuZCA9ICAgICAgICBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKKwkubmFtZSA9ICAgIldNODczMSIsCisJLmRyaXZlciA9ICZ3bTg3MzFfaTJjX2RyaXZlciwKK307CisjZW5kaWYKKworc3RhdGljIGludCB3bTg3MzFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB3bTg3MzFfc2V0dXBfZGF0YSAqc2V0dXA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB3bTg3MzFfcHJpdiAqd204NzMxOworCWludCByZXQgPSAwOworCisJaW5mbygiV004NzMxIEF1ZGlvIENvZGVjICVzIiwgV004NzMxX1ZFUlNJT04pOworCisJc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CisJY29kZWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyksIEdGUF9LRVJORUwpOworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdtODczMSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bTg3MzFfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICh3bTg3MzEgPT0gTlVMTCkgeworCQlrZnJlZShjb2RlYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNvZGVjLT5wcml2YXRlX2RhdGEgPSB3bTg3MzE7CisJc29jZGV2LT5jb2RlYyA9IGNvZGVjOworCW11dGV4X2luaXQoJmNvZGVjLT5tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5kYXBtX3dpZGdldHMpOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV9wYXRocyk7CisKKwl3bTg3MzFfc29jZGV2ID0gc29jZGV2OworI2lmIGRlZmluZWQgKENPTkZJR19JMkMpIHx8IGRlZmluZWQgKENPTkZJR19JMkNfTU9EVUxFKQorCWlmIChzZXR1cC0+aTJjX2FkZHJlc3MpIHsKKwkJbm9ybWFsX2kyY1swXSA9IHNldHVwLT5pMmNfYWRkcmVzczsKKwkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOworCQlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204NzMxX2kyY19kcml2ZXIpOworCQlpZiAocmV0ICE9IDApCisJCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFkZCBpMmMgZHJpdmVyIik7CisJfQorI2Vsc2UKKwkvKiBBZGQgb3RoZXIgaW50ZXJmYWNlcyBoZXJlICovCisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKiBwb3dlciBkb3duIGNoaXAgKi8KK3N0YXRpYyBpbnQgd204NzMxX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCWlmIChjb2RlYy0+Y29udHJvbF9kYXRhKQorCQl3bTg3MzFfZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QzY29sZCk7CisKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworCXNuZF9zb2NfZGFwbV9mcmVlKHNvY2Rldik7CisjaWYgZGVmaW5lZCAoQ09ORklHX0kyQykgfHwgZGVmaW5lZCAoQ09ORklHX0kyQ19NT0RVTEUpCisJaTJjX2RlbF9kcml2ZXIoJndtODczMV9pMmNfZHJpdmVyKTsKKyNlbmRpZgorCWtmcmVlKGNvZGVjLT5wcml2YXRlX2RhdGEpOworCWtmcmVlKGNvZGVjKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl93bTg3MzEgPSB7CisJLnByb2JlID0gCXdtODczMV9wcm9iZSwKKwkucmVtb3ZlID0gCXdtODczMV9yZW1vdmUsCisJLnN1c3BlbmQgPSAJd204NzMxX3N1c3BlbmQsCisJLnJlc3VtZSA9CXdtODczMV9yZXN1bWUsCit9OworCitFWFBPUlRfU1lNQk9MX0dQTChzb2NfY29kZWNfZGV2X3dtODczMSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBXTTg3MzEgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJSaWNoYXJkIFB1cmRpZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjYWI2YQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIHdtODczMS5oICAtLSAgV004NzMxIFNvYyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3I6IFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgorICoKKyAqIEJhc2VkIG9uIHdtODc1My5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9XTTg3MzFfSAorI2RlZmluZSBfV004NzMxX0gKKworLyogV004NzMxIHJlZ2lzdGVyIHNwYWNlICovCisKKyNkZWZpbmUgV004NzMxX0xJTlZPTCAgIDB4MDAKKyNkZWZpbmUgV004NzMxX1JJTlZPTCAgIDB4MDEKKyNkZWZpbmUgV004NzMxX0xPVVQxViAgIDB4MDIKKyNkZWZpbmUgV004NzMxX1JPVVQxViAgIDB4MDMKKyNkZWZpbmUgV004NzMxX0FQQU5BICAgIDB4MDQKKyNkZWZpbmUgV004NzMxX0FQRElHSSAgIDB4MDUKKyNkZWZpbmUgV004NzMxX1BXUiAgICAgIDB4MDYKKyNkZWZpbmUgV004NzMxX0lGQUNFICAgIDB4MDcKKyNkZWZpbmUgV004NzMxX1NSQVRFICAgIDB4MDgKKyNkZWZpbmUgV004NzMxX0FDVElWRSAgIDB4MDkKKyNkZWZpbmUgV004NzMxX1JFU0VUCTB4MGYKKworI2RlZmluZSBXTTg3MzFfQ0FDSEVSRUdOVU0gCTEwCisKKyNkZWZpbmUgV004NzMxX1NZU0NMSwkwCisjZGVmaW5lIFdNODczMV9EQUkJCTAKKworc3RydWN0IHdtODczMV9zZXR1cF9kYXRhIHsKKwl1bnNpZ25lZCBzaG9ydCBpMmNfYWRkcmVzczsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgd204NzMxX2RhaTsKK2V4dGVybiBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl93bTg3MzE7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3M2U4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKQEAgLTAsMCArMSwxMDQ5IEBACisvKgorICogd204NzUwLmMgLS0gV004NzUwIEFMU0EgU29DIGF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDA1IE9wZW5lZGhhbmQgTHRkLgorICoKKyAqIEF1dGhvcjogUmljaGFyZCBQdXJkaWUgPHJpY2hhcmRAb3BlbmVkaGFuZC5jb20+CisgKgorICogQmFzZWQgb24gV004NzUzLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgIndtODc1MC5oIgorCisjZGVmaW5lIEFVRElPX05BTUUgIldNODc1MCIKKyNkZWZpbmUgV004NzUwX1ZFUlNJT04gIjAuMTIiCisKKy8qCisgKiBEZWJ1ZworICovCisKKyNkZWZpbmUgV004NzUwX0RFQlVHIDAKKworI2lmZGVmIFdNODc1MF9ERUJVRworI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBBVURJT19OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX0VSUiBBVURJT19OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9JTkZPIEFVRElPX05BTUUgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX1dBUk5JTkcgQVVESU9fTkFNRSAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorCisvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCB3bTg3NTBfcHJpdiB7CisJdW5zaWduZWQgaW50IHN5c2NsazsKK307CisKKy8qCisgKiB3bTg3NTAgcmVnaXN0ZXIgY2FjaGUKKyAqIFdlIGNhbid0IHJlYWQgdGhlIFdNODc1MCByZWdpc3RlciBzcGFjZSB3aGVuIHdlCisgKiBhcmUgdXNpbmcgMiB3aXJlIGZvciBkZXZpY2UgY29udHJvbCwgc28gd2UgY2FjaGUgdGhlbSBpbnN0ZWFkLgorICovCitzdGF0aWMgY29uc3QgdTE2IHdtODc1MF9yZWdbXSA9IHsKKwkweDAwOTcsIDB4MDA5NywgMHgwMDc5LCAweDAwNzksICAvKiAgMCAqLworCTB4MDAwMCwgMHgwMDA4LCAweDAwMDAsIDB4MDAwYSwgIC8qICA0ICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDBmZiwgMHgwMGZmLCAgLyogIDggKi8KKwkweDAwMGYsIDB4MDAwZiwgMHgwMDAwLCAweDAwMDAsICAvKiAxMiAqLworCTB4MDAwMCwgMHgwMDdiLCAweDAwMDAsIDB4MDAzMiwgIC8qIDE2ICovCisJMHgwMDAwLCAweDAwYzMsIDB4MDBjMywgMHgwMGMwLCAgLyogMjAgKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsICAvKiAyNCAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgIC8qIDI4ICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDA1MCwgMHgwMDUwLCAgLyogMzIgKi8KKwkweDAwNTAsIDB4MDA1MCwgMHgwMDUwLCAweDAwNTAsICAvKiAzNiAqLworCTB4MDA3OSwgMHgwMDc5LCAweDAwNzksICAgICAgICAgIC8qIDQwICovCit9OworCisvKgorICogcmVhZCB3bTg3NTAgcmVnaXN0ZXIgY2FjaGUKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgd204NzUwX3JlYWRfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgcmVnKQoreworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCWlmIChyZWcgPiBXTTg3NTBfQ0FDSEVfUkVHTlVNKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGNhY2hlW3JlZ107Cit9CisKKy8qCisgKiB3cml0ZSB3bTg3NTAgcmVnaXN0ZXIgY2FjaGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdtODc1MF93cml0ZV9yZWdfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwlpZiAocmVnID4gV004NzUwX0NBQ0hFX1JFR05VTSkKKwkJcmV0dXJuOworCWNhY2hlW3JlZ10gPSB2YWx1ZTsKK30KKworc3RhdGljIGludCB3bTg3NTBfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1OCBkYXRhWzJdOworCisJLyogZGF0YSBpcworCSAqICAgRDE1Li5EOSBXTTg3NTMgcmVnaXN0ZXIgb2Zmc2V0CisJICogICBEOC4uLkQwIHJlZ2lzdGVyIGRhdGEKKwkgKi8KKwlkYXRhWzBdID0gKHJlZyA8PCAxKSB8ICgodmFsdWUgPj4gOCkgJiAweDAwMDEpOworCWRhdGFbMV0gPSB2YWx1ZSAmIDB4MDBmZjsKKworCXdtODc1MF93cml0ZV9yZWdfY2FjaGUgKGNvZGVjLCByZWcsIHZhbHVlKTsKKwlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpID09IDIpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKKyNkZWZpbmUgd204NzUwX3Jlc2V0KGMpCXdtODc1MF93cml0ZShjLCBXTTg3NTBfUkVTRVQsIDApCisKKy8qCisgKiBXTTg3NTAgQ29udHJvbHMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1MF9iYXNzW10gPSB7IkxpbmVhciBDb250cm9sIiwgIkFkYXB0aXZlIEJvb3N0In07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUwX2Jhc3NfZmlsdGVyW10gPSB7ICIxMzBIeiBAIDQ4a0h6IiwgIjIwMEh6IEAgNDhrSHoiIH07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUwX3RyZWJsZVtdID0geyI4a0h6IiwgIjRrSHoifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTBfM2RfbGNbXSA9IHsiMjAwSHoiLCAiNTAwSHoifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTBfM2RfdWNbXSA9IHsiMi4ya0h6IiwgIjEuNWtIeiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1MF8zZF9mdW5jW10gPSB7IkNhcHR1cmUiLCAiUGxheWJhY2sifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTBfYWxjX2Z1bmNbXSA9IHsiT2ZmIiwgIlJpZ2h0IiwgIkxlZnQiLCAiU3RlcmVvIn07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUwX25nX3R5cGVbXSA9IHsiQ29uc3RhbnQgUEdBIEdhaW4iLAorCSJNdXRlIEFEQyBPdXRwdXQifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTBfbGluZV9tdXhbXSA9IHsiTGluZSAxIiwgIkxpbmUgMiIsICJMaW5lIDMiLCAiUEdBIiwKKwkiRGlmZmVyZW50aWFsIn07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUwX3BnYV9zZWxbXSA9IHsiTGluZSAxIiwgIkxpbmUgMiIsICJMaW5lIDMiLAorCSJEaWZmZXJlbnRpYWwifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTBfb3V0M1tdID0geyJWUkVGIiwgIlJPVVQxICsgVm9sIiwgIk1vbm9PdXQiLAorCSJST1VUMSJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1MF9kaWZmX3NlbFtdID0geyJMaW5lIDEiLCAiTGluZSAyIn07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUwX2FkY3BvbFtdID0geyJOb3JtYWwiLCAiTCBJbnZlcnQiLCAiUiBJbnZlcnQiLAorCSJMICsgUiBJbnZlcnQifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTBfZGVlbXBoW10gPSB7Ik5vbmUiLCAiMzJLaHoiLCAiNDQuMUtoeiIsICI0OEtoeiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1MF9tb25vX211eFtdID0geyJTdGVyZW8iLCAiTW9ubyAoTGVmdCkiLAorCSJNb25vIChSaWdodCkiLCAiRGlnaXRhbCBNb25vIn07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204NzUwX2VudW1bXSA9IHsKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfQkFTUywgNywgMiwgd204NzUwX2Jhc3MpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1MF9CQVNTLCA2LCAyLCB3bTg3NTBfYmFzc19maWx0ZXIpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1MF9UUkVCTEUsIDYsIDIsIHdtODc1MF90cmVibGUpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1MF8zRCwgNSwgMiwgd204NzUwXzNkX2xjKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfM0QsIDYsIDIsIHdtODc1MF8zZF91YyksCitTT0NfRU5VTV9TSU5HTEUoV004NzUwXzNELCA3LCAyLCB3bTg3NTBfM2RfZnVuYyksCitTT0NfRU5VTV9TSU5HTEUoV004NzUwX0FMQzEsIDcsIDQsIHdtODc1MF9hbGNfZnVuYyksCitTT0NfRU5VTV9TSU5HTEUoV004NzUwX05HQVRFLCAxLCAyLCB3bTg3NTBfbmdfdHlwZSksCitTT0NfRU5VTV9TSU5HTEUoV004NzUwX0xPVVRNMSwgMCwgNSwgd204NzUwX2xpbmVfbXV4KSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfUk9VVE0xLCAwLCA1LCB3bTg3NTBfbGluZV9tdXgpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1MF9MQURDSU4sIDYsIDQsIHdtODc1MF9wZ2Ffc2VsKSwgLyogMTAgKi8KK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfUkFEQ0lOLCA2LCA0LCB3bTg3NTBfcGdhX3NlbCksCitTT0NfRU5VTV9TSU5HTEUoV004NzUwX0FEQ1RMMiwgNywgNCwgd204NzUwX291dDMpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1MF9BRENJTiwgOCwgMiwgd204NzUwX2RpZmZfc2VsKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfQURDREFDLCA1LCA0LCB3bTg3NTBfYWRjcG9sKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfQURDREFDLCAxLCA0LCB3bTg3NTBfZGVlbXBoKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfQURDSU4sIDYsIDQsIHdtODc1MF9tb25vX211eCksIC8qIDE2ICovCisKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NTBfc25kX2NvbnRyb2xzW10gPSB7CisKK1NPQ19ET1VCTEVfUigiQ2FwdHVyZSBWb2x1bWUiLCBXTTg3NTBfTElOVk9MLCBXTTg3NTBfUklOVk9MLCAwLCA2MywgMCksCitTT0NfRE9VQkxFX1IoIkNhcHR1cmUgWkMgU3dpdGNoIiwgV004NzUwX0xJTlZPTCwgV004NzUwX1JJTlZPTCwgNiwgMSwgMCksCitTT0NfRE9VQkxFX1IoIkNhcHR1cmUgU3dpdGNoIiwgV004NzUwX0xJTlZPTCwgV004NzUwX1JJTlZPTCwgNywgMSwgMSksCisKK1NPQ19ET1VCTEVfUigiSGVhZHBob25lIFBsYXliYWNrIFpDIFN3aXRjaCIsIFdNODc1MF9MT1VUMVYsCisJV004NzUwX1JPVVQxViwgNywgMSwgMCksCitTT0NfRE9VQkxFX1IoIlNwZWFrZXIgUGxheWJhY2sgWkMgU3dpdGNoIiwgV004NzUwX0xPVVQyViwKKwlXTTg3NTBfUk9VVDJWLCA3LCAxLCAwKSwKKworU09DX0VOVU0oIlBsYXliYWNrIERlLWVtcGhhc2lzIiwgd204NzUwX2VudW1bMTVdKSwKKworU09DX0VOVU0oIkNhcHR1cmUgUG9sYXJpdHkiLCB3bTg3NTBfZW51bVsxNF0pLAorU09DX1NJTkdMRSgiUGxheWJhY2sgNmRCIEF0dGVudWF0ZSIsIFdNODc1MF9BRENEQUMsIDcsIDEsIDApLAorU09DX1NJTkdMRSgiQ2FwdHVyZSA2ZEIgQXR0ZW51YXRlIiwgV004NzUwX0FEQ0RBQywgOCwgMSwgMCksCisKK1NPQ19ET1VCTEVfUigiUENNIFZvbHVtZSIsIFdNODc1MF9MREFDLCBXTTg3NTBfUkRBQywgMCwgMjU1LCAwKSwKKworU09DX0VOVU0oIkJhc3MgQm9vc3QiLCB3bTg3NTBfZW51bVswXSksCitTT0NfRU5VTSgiQmFzcyBGaWx0ZXIiLCB3bTg3NTBfZW51bVsxXSksCitTT0NfU0lOR0xFKCJCYXNzIFZvbHVtZSIsIFdNODc1MF9CQVNTLCAwLCAxNSwgMSksCisKK1NPQ19TSU5HTEUoIlRyZWJsZSBWb2x1bWUiLCBXTTg3NTBfVFJFQkxFLCAwLCAxNSwgMCksCitTT0NfRU5VTSgiVHJlYmxlIEN1dC1vZmYiLCB3bTg3NTBfZW51bVsyXSksCisKK1NPQ19TSU5HTEUoIjNEIFN3aXRjaCIsIFdNODc1MF8zRCwgMCwgMSwgMCksCitTT0NfU0lOR0xFKCIzRCBWb2x1bWUiLCBXTTg3NTBfM0QsIDEsIDE1LCAwKSwKK1NPQ19FTlVNKCIzRCBMb3dlciBDdXQtb2ZmIiwgd204NzUwX2VudW1bM10pLAorU09DX0VOVU0oIjNEIFVwcGVyIEN1dC1vZmYiLCB3bTg3NTBfZW51bVs0XSksCitTT0NfRU5VTSgiM0QgTW9kZSIsIHdtODc1MF9lbnVtWzVdKSwKKworU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgVGFyZ2V0IFZvbHVtZSIsIFdNODc1MF9BTEMxLCAwLCA3LCAwKSwKK1NPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIE1heCBWb2x1bWUiLCBXTTg3NTBfQUxDMSwgNCwgNywgMCksCitTT0NfRU5VTSgiQUxDIENhcHR1cmUgRnVuY3Rpb24iLCB3bTg3NTBfZW51bVs2XSksCitTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBaQyBTd2l0Y2giLCBXTTg3NTBfQUxDMiwgNywgMSwgMCksCitTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBIb2xkIFRpbWUiLCBXTTg3NTBfQUxDMiwgMCwgMTUsIDApLAorU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgRGVjYXkgVGltZSIsIFdNODc1MF9BTEMzLCA0LCAxNSwgMCksCitTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBBdHRhY2sgVGltZSIsIFdNODc1MF9BTEMzLCAwLCAxNSwgMCksCitTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBORyBUaHJlc2hvbGQiLCBXTTg3NTBfTkdBVEUsIDMsIDMxLCAwKSwKK1NPQ19FTlVNKCJBTEMgQ2FwdHVyZSBORyBUeXBlIiwgd204NzUwX2VudW1bNF0pLAorU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgTkcgU3dpdGNoIiwgV004NzUwX05HQVRFLCAwLCAxLCAwKSwKKworU09DX1NJTkdMRSgiTGVmdCBBREMgQ2FwdHVyZSBWb2x1bWUiLCBXTTg3NTBfTEFEQywgMCwgMjU1LCAwKSwKK1NPQ19TSU5HTEUoIlJpZ2h0IEFEQyBDYXB0dXJlIFZvbHVtZSIsIFdNODc1MF9SQURDLCAwLCAyNTUsIDApLAorCitTT0NfU0lOR0xFKCJaQyBUaW1lb3V0IFN3aXRjaCIsIFdNODc1MF9BRENUTDEsIDAsIDEsIDApLAorU09DX1NJTkdMRSgiUGxheWJhY2sgSW52ZXJ0IFN3aXRjaCIsIFdNODc1MF9BRENUTDEsIDEsIDEsIDApLAorCitTT0NfU0lOR0xFKCJSaWdodCBTcGVha2VyIFBsYXliYWNrIEludmVydCBTd2l0Y2giLCBXTTg3NTBfQURDVEwyLCA0LCAxLCAwKSwKKworLyogVW5pbXBsZW1lbnRlZCAqLworLyogQURDREFDIEJpdCAwIC0gQURDSFBEICovCisvKiBBRENEQUMgQml0IDQgLSBIUE9SICovCisvKiBBRENUTDEgQml0IDIsMyAtIERBVFNFTCAqLworLyogQURDVEwxIEJpdCA0LDUgLSBETU9OT01JWCAqLworLyogQURDVEwxIEJpdCA2LDcgLSBWU0VMICovCisvKiBBRENUTDIgQml0IDIgLSBMUkNNICovCisvKiBBRENUTDIgQml0IDMgLSBUUkkgKi8KKy8qIEFEQ1RMMyBCaXQgNSAtIEhQRkxSRU4gKi8KKy8qIEFEQ1RMMyBCaXQgNiAtIFZST0kgKi8KKy8qIEFEQ1RMMyBCaXQgNyw4IC0gQURDTFJNICovCisvKiBBRENJTiBCaXQgNCAtIExEQ00gKi8KKy8qIEFEQ0lOIEJpdCA1IC0gUkRDTSAqLworCitTT0NfRE9VQkxFX1IoIk1pYyBCb29zdCIsIFdNODc1MF9MQURDSU4sIFdNODc1MF9SQURDSU4sIDQsIDMsIDApLAorCitTT0NfRE9VQkxFX1IoIkJ5cGFzcyBMZWZ0IFBsYXliYWNrIFZvbHVtZSIsIFdNODc1MF9MT1VUTTEsCisJV004NzUwX0xPVVRNMiwgNCwgNywgMSksCitTT0NfRE9VQkxFX1IoIkJ5cGFzcyBSaWdodCBQbGF5YmFjayBWb2x1bWUiLCBXTTg3NTBfUk9VVE0xLAorCVdNODc1MF9ST1VUTTIsIDQsIDcsIDEpLAorU09DX0RPVUJMRV9SKCJCeXBhc3MgTW9ubyBQbGF5YmFjayBWb2x1bWUiLCBXTTg3NTBfTU9VVE0xLAorCVdNODc1MF9NT1VUTTIsIDQsIDcsIDEpLAorCitTT0NfU0lOR0xFKCJNb25vIFBsYXliYWNrIFpDIFN3aXRjaCIsIFdNODc1MF9NT1VUViwgNywgMSwgMCksCisKK1NPQ19ET1VCTEVfUigiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIFdNODc1MF9MT1VUMVYsIFdNODc1MF9ST1VUMVYsCisJMCwgMTI3LCAwKSwKK1NPQ19ET1VCTEVfUigiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCBXTTg3NTBfTE9VVDJWLCBXTTg3NTBfUk9VVDJWLAorCTAsIDEyNywgMCksCisKK1NPQ19TSU5HTEUoIk1vbm8gUGxheWJhY2sgVm9sdW1lIiwgV004NzUwX01PVVRWLCAwLCAxMjcsIDApLAorCit9OworCisvKiBhZGQgbm9uIGRhcG0gY29udHJvbHMgKi8KK3N0YXRpYyBpbnQgd204NzUwX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGVyciwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODc1MF9zbmRfY29udHJvbHMpOyBpKyspIHsKKwkJZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmNhcmQsCisJCQkJc25kX3NvY19jbmV3KCZ3bTg3NTBfc25kX2NvbnRyb2xzW2ldLGNvZGVjLCBOVUxMKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEQVBNIENvbnRyb2xzCisgKi8KKworLyogTGVmdCBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODc1MF9sZWZ0X21peGVyX2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIlBsYXliYWNrIFN3aXRjaCIsIFdNODc1MF9MT1VUTTEsIDgsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJMZWZ0IEJ5cGFzcyBTd2l0Y2giLCBXTTg3NTBfTE9VVE0xLCA3LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiUmlnaHQgUGxheWJhY2sgU3dpdGNoIiwgV004NzUwX0xPVVRNMiwgOCwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IEJ5cGFzcyBTd2l0Y2giLCBXTTg3NTBfTE9VVE0yLCA3LCAxLCAwKSwKK307CisKKy8qIFJpZ2h0IE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUwX3JpZ2h0X21peGVyX2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIkxlZnQgUGxheWJhY2sgU3dpdGNoIiwgV004NzUwX1JPVVRNMSwgOCwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkxlZnQgQnlwYXNzIFN3aXRjaCIsIFdNODc1MF9ST1VUTTEsIDcsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJQbGF5YmFjayBTd2l0Y2giLCBXTTg3NTBfUk9VVE0yLCA4LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiUmlnaHQgQnlwYXNzIFN3aXRjaCIsIFdNODc1MF9ST1VUTTIsIDcsIDEsIDApLAorfTsKKworLyogTW9ubyBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODc1MF9tb25vX21peGVyX2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIkxlZnQgUGxheWJhY2sgU3dpdGNoIiwgV004NzUwX01PVVRNMSwgOCwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkxlZnQgQnlwYXNzIFN3aXRjaCIsIFdNODc1MF9NT1VUTTEsIDcsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJSaWdodCBQbGF5YmFjayBTd2l0Y2giLCBXTTg3NTBfTU9VVE0yLCA4LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiUmlnaHQgQnlwYXNzIFN3aXRjaCIsIFdNODc1MF9NT1VUTTIsIDcsIDEsIDApLAorfTsKKworLyogTGVmdCBMaW5lIE11eCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODc1MF9sZWZ0X2xpbmVfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTBfZW51bVs4XSk7CisKKy8qIFJpZ2h0IExpbmUgTXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUwX3JpZ2h0X2xpbmVfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTBfZW51bVs5XSk7CisKKy8qIExlZnQgUEdBIE11eCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODc1MF9sZWZ0X3BnYV9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODc1MF9lbnVtWzEwXSk7CisKKy8qIFJpZ2h0IFBHQSBNdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NTBfcmlnaHRfcGdhX2NvbnRyb2xzID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204NzUwX2VudW1bMTFdKTsKKworLyogT3V0IDMgTXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUwX291dDNfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTBfZW51bVsxMl0pOworCisvKiBEaWZmZXJlbnRpYWwgTXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUwX2RpZmZtdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTBfZW51bVsxM10pOworCisvKiBNb25vIEFEQyBNdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NTBfbW9ub211eF9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODc1MF9lbnVtWzE2XSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3NTBfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX01JWEVSKCJMZWZ0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmd204NzUwX2xlZnRfbWl4ZXJfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUod204NzUwX2xlZnRfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJpZ2h0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmd204NzUwX3JpZ2h0X21peGVyX2NvbnRyb2xzWzBdLAorCQlBUlJBWV9TSVpFKHdtODc1MF9yaWdodF9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiTW9ubyBNaXhlciIsIFdNODc1MF9QV1IyLCAyLCAwLAorCQkmd204NzUwX21vbm9fbWl4ZXJfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUod204NzUwX21vbm9fbWl4ZXJfY29udHJvbHMpKSwKKworCVNORF9TT0NfREFQTV9QR0EoIlJpZ2h0IE91dCAyIiwgV004NzUwX1BXUjIsIDMsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkxlZnQgT3V0IDIiLCBXTTg3NTBfUFdSMiwgNCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiUmlnaHQgT3V0IDEiLCBXTTg3NTBfUFdSMiwgNSwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiTGVmdCBPdXQgMSIsIFdNODc1MF9QV1IyLCA2LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fREFDKCJSaWdodCBEQUMiLCAiUmlnaHQgUGxheWJhY2siLCBXTTg3NTBfUFdSMiwgNywgMCksCisJU05EX1NPQ19EQVBNX0RBQygiTGVmdCBEQUMiLCAiTGVmdCBQbGF5YmFjayIsIFdNODc1MF9QV1IyLCA4LCAwKSwKKworCVNORF9TT0NfREFQTV9NSUNCSUFTKCJNaWMgQmlhcyIsIFdNODc1MF9QV1IxLCAxLCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJSaWdodCBBREMiLCAiUmlnaHQgQ2FwdHVyZSIsIFdNODc1MF9QV1IxLCAyLCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJMZWZ0IEFEQyIsICJMZWZ0IENhcHR1cmUiLCBXTTg3NTBfUFdSMSwgMywgMCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJMZWZ0IFBHQSBNdXgiLCBXTTg3NTBfUFdSMSwgNSwgMCwKKwkJJndtODc1MF9sZWZ0X3BnYV9jb250cm9scyksCisJU05EX1NPQ19EQVBNX01VWCgiUmlnaHQgUEdBIE11eCIsIFdNODc1MF9QV1IxLCA0LCAwLAorCQkmd204NzUwX3JpZ2h0X3BnYV9jb250cm9scyksCisJU05EX1NPQ19EQVBNX01VWCgiTGVmdCBMaW5lIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJndtODc1MF9sZWZ0X2xpbmVfY29udHJvbHMpLAorCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IExpbmUgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmd204NzUwX3JpZ2h0X2xpbmVfY29udHJvbHMpLAorCisJU05EX1NPQ19EQVBNX01VWCgiT3V0MyBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZ3bTg3NTBfb3V0M19jb250cm9scyksCisJU05EX1NPQ19EQVBNX1BHQSgiT3V0IDMiLCBXTTg3NTBfUFdSMiwgMSwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiTW9ubyBPdXQgMSIsIFdNODc1MF9QV1IyLCAyLCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9NVVgoIkRpZmZlcmVudGlhbCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ3bTg3NTBfZGlmZm11eF9jb250cm9scyksCisJU05EX1NPQ19EQVBNX01VWCgiTGVmdCBBREMgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmd204NzUwX21vbm9tdXhfY29udHJvbHMpLAorCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IEFEQyBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ3bTg3NTBfbW9ub211eF9jb250cm9scyksCisKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMSIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlJPVVQxIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiTE9VVDIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJST1VUMiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIk1PTk8iKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJPVVQzIiksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTlBVVDEiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTlBVVDIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTlBVVDMiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIlJJTlBVVDEiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIlJJTlBVVDIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIlJJTlBVVDMiKSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphdWRpb19tYXBbXVszXSA9IHsKKwkvKiBsZWZ0IG1peGVyICovCisJeyJMZWZ0IE1peGVyIiwgIlBsYXliYWNrIFN3aXRjaCIsICJMZWZ0IERBQyJ9LAorCXsiTGVmdCBNaXhlciIsICJMZWZ0IEJ5cGFzcyBTd2l0Y2giLCAiTGVmdCBMaW5lIE11eCJ9LAorCXsiTGVmdCBNaXhlciIsICJSaWdodCBQbGF5YmFjayBTd2l0Y2giLCAiUmlnaHQgREFDIn0sCisJeyJMZWZ0IE1peGVyIiwgIlJpZ2h0IEJ5cGFzcyBTd2l0Y2giLCAiUmlnaHQgTGluZSBNdXgifSwKKworCS8qIHJpZ2h0IG1peGVyICovCisJeyJSaWdodCBNaXhlciIsICJMZWZ0IFBsYXliYWNrIFN3aXRjaCIsICJMZWZ0IERBQyJ9LAorCXsiUmlnaHQgTWl4ZXIiLCAiTGVmdCBCeXBhc3MgU3dpdGNoIiwgIkxlZnQgTGluZSBNdXgifSwKKwl7IlJpZ2h0IE1peGVyIiwgIlBsYXliYWNrIFN3aXRjaCIsICJSaWdodCBEQUMifSwKKwl7IlJpZ2h0IE1peGVyIiwgIlJpZ2h0IEJ5cGFzcyBTd2l0Y2giLCAiUmlnaHQgTGluZSBNdXgifSwKKworCS8qIGxlZnQgb3V0IDEgKi8KKwl7IkxlZnQgT3V0IDEiLCBOVUxMLCAiTGVmdCBNaXhlciJ9LAorCXsiTE9VVDEiLCBOVUxMLCAiTGVmdCBPdXQgMSJ9LAorCisJLyogbGVmdCBvdXQgMiAqLworCXsiTGVmdCBPdXQgMiIsIE5VTEwsICJMZWZ0IE1peGVyIn0sCisJeyJMT1VUMiIsIE5VTEwsICJMZWZ0IE91dCAyIn0sCisKKwkvKiByaWdodCBvdXQgMSAqLworCXsiUmlnaHQgT3V0IDEiLCBOVUxMLCAiUmlnaHQgTWl4ZXIifSwKKwl7IlJPVVQxIiwgTlVMTCwgIlJpZ2h0IE91dCAxIn0sCisKKwkvKiByaWdodCBvdXQgMiAqLworCXsiUmlnaHQgT3V0IDIiLCBOVUxMLCAiUmlnaHQgTWl4ZXIifSwKKwl7IlJPVVQyIiwgTlVMTCwgIlJpZ2h0IE91dCAyIn0sCisKKwkvKiBtb25vIG1peGVyICovCisJeyJNb25vIE1peGVyIiwgIkxlZnQgUGxheWJhY2sgU3dpdGNoIiwgIkxlZnQgREFDIn0sCisJeyJNb25vIE1peGVyIiwgIkxlZnQgQnlwYXNzIFN3aXRjaCIsICJMZWZ0IExpbmUgTXV4In0sCisJeyJNb25vIE1peGVyIiwgIlJpZ2h0IFBsYXliYWNrIFN3aXRjaCIsICJSaWdodCBEQUMifSwKKwl7Ik1vbm8gTWl4ZXIiLCAiUmlnaHQgQnlwYXNzIFN3aXRjaCIsICJSaWdodCBMaW5lIE11eCJ9LAorCisJLyogbW9ubyBvdXQgKi8KKwl7Ik1vbm8gT3V0IDEiLCBOVUxMLCAiTW9ubyBNaXhlciJ9LAorCXsiTU9OTzEiLCBOVUxMLCAiTW9ubyBPdXQgMSJ9LAorCisJLyogb3V0IDMgKi8KKwl7Ik91dDMgTXV4IiwgIlZSRUYiLCAiVlJFRiJ9LAorCXsiT3V0MyBNdXgiLCAiUk9VVDEgKyBWb2wiLCAiUk9VVDEifSwKKwl7Ik91dDMgTXV4IiwgIlJPVVQxIiwgIlJpZ2h0IE1peGVyIn0sCisJeyJPdXQzIE11eCIsICJNb25vT3V0IiwgIk1PTk8xIn0sCisJeyJPdXQgMyIsIE5VTEwsICJPdXQzIE11eCJ9LAorCXsiT1VUMyIsIE5VTEwsICJPdXQgMyJ9LAorCisJLyogTGVmdCBMaW5lIE11eCAqLworCXsiTGVmdCBMaW5lIE11eCIsICJMaW5lIDEiLCAiTElOUFVUMSJ9LAorCXsiTGVmdCBMaW5lIE11eCIsICJMaW5lIDIiLCAiTElOUFVUMiJ9LAorCXsiTGVmdCBMaW5lIE11eCIsICJMaW5lIDMiLCAiTElOUFVUMyJ9LAorCXsiTGVmdCBMaW5lIE11eCIsICJQR0EiLCAiTGVmdCBQR0EgTXV4In0sCisJeyJMZWZ0IExpbmUgTXV4IiwgIkRpZmZlcmVudGlhbCIsICJEaWZmZXJlbnRpYWwgTXV4In0sCisKKwkvKiBSaWdodCBMaW5lIE11eCAqLworCXsiUmlnaHQgTGluZSBNdXgiLCAiTGluZSAxIiwgIlJJTlBVVDEifSwKKwl7IlJpZ2h0IExpbmUgTXV4IiwgIkxpbmUgMiIsICJSSU5QVVQyIn0sCisJeyJSaWdodCBMaW5lIE11eCIsICJMaW5lIDMiLCAiUklOUFVUMyJ9LAorCXsiUmlnaHQgTGluZSBNdXgiLCAiUEdBIiwgIlJpZ2h0IFBHQSBNdXgifSwKKwl7IlJpZ2h0IExpbmUgTXV4IiwgIkRpZmZlcmVudGlhbCIsICJEaWZmZXJlbnRpYWwgTXV4In0sCisKKwkvKiBMZWZ0IFBHQSBNdXggKi8KKwl7IkxlZnQgUEdBIE11eCIsICJMaW5lIDEiLCAiTElOUFVUMSJ9LAorCXsiTGVmdCBQR0EgTXV4IiwgIkxpbmUgMiIsICJMSU5QVVQyIn0sCisJeyJMZWZ0IFBHQSBNdXgiLCAiTGluZSAzIiwgIkxJTlBVVDMifSwKKwl7IkxlZnQgUEdBIE11eCIsICJEaWZmZXJlbnRpYWwiLCAiRGlmZmVyZW50aWFsIE11eCJ9LAorCisJLyogUmlnaHQgUEdBIE11eCAqLworCXsiUmlnaHQgUEdBIE11eCIsICJMaW5lIDEiLCAiUklOUFVUMSJ9LAorCXsiUmlnaHQgUEdBIE11eCIsICJMaW5lIDIiLCAiUklOUFVUMiJ9LAorCXsiUmlnaHQgUEdBIE11eCIsICJMaW5lIDMiLCAiUklOUFVUMyJ9LAorCXsiUmlnaHQgUEdBIE11eCIsICJEaWZmZXJlbnRpYWwiLCAiRGlmZmVyZW50aWFsIE11eCJ9LAorCisJLyogRGlmZmVyZW50aWFsIE11eCAqLworCXsiRGlmZmVyZW50aWFsIE11eCIsICJMaW5lIDEiLCAiTElOUFVUMSJ9LAorCXsiRGlmZmVyZW50aWFsIE11eCIsICJMaW5lIDEiLCAiUklOUFVUMSJ9LAorCXsiRGlmZmVyZW50aWFsIE11eCIsICJMaW5lIDIiLCAiTElOUFVUMiJ9LAorCXsiRGlmZmVyZW50aWFsIE11eCIsICJMaW5lIDIiLCAiUklOUFVUMiJ9LAorCisJLyogTGVmdCBBREMgTXV4ICovCisJeyJMZWZ0IEFEQyBNdXgiLCAiU3RlcmVvIiwgIkxlZnQgUEdBIE11eCJ9LAorCXsiTGVmdCBBREMgTXV4IiwgIk1vbm8gKExlZnQpIiwgIkxlZnQgUEdBIE11eCJ9LAorCXsiTGVmdCBBREMgTXV4IiwgIkRpZ2l0YWwgTW9ubyIsICJMZWZ0IFBHQSBNdXgifSwKKworCS8qIFJpZ2h0IEFEQyBNdXggKi8KKwl7IlJpZ2h0IEFEQyBNdXgiLCAiU3RlcmVvIiwgIlJpZ2h0IFBHQSBNdXgifSwKKwl7IlJpZ2h0IEFEQyBNdXgiLCAiTW9ubyAoUmlnaHQpIiwgIlJpZ2h0IFBHQSBNdXgifSwKKwl7IlJpZ2h0IEFEQyBNdXgiLCAiRGlnaXRhbCBNb25vIiwgIlJpZ2h0IFBHQSBNdXgifSwKKworCS8qIEFEQyAqLworCXsiTGVmdCBBREMiLCBOVUxMLCAiTGVmdCBBREMgTXV4In0sCisJeyJSaWdodCBBREMiLCBOVUxMLCAiUmlnaHQgQURDIE11eCJ9LAorCisJLyogdGVybWluYXRvciAqLworCXtOVUxMLCBOVUxMLCBOVUxMfSwKK307CisKK3N0YXRpYyBpbnQgd204NzUwX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzUwX2RhcG1fd2lkZ2V0cyk7IGkrKykgeworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2woY29kZWMsICZ3bTg3NTBfZGFwbV93aWRnZXRzW2ldKTsKKwl9CisKKwkvKiBzZXQgdXAgYXVkaW8gcGF0aCBhdWRpb19tYXBuZWN0cyAqLworCWZvcihpID0gMDsgYXVkaW9fbWFwW2ldWzBdICE9IE5VTEw7IGkrKykgeworCQlzbmRfc29jX2RhcG1fY29ubmVjdF9pbnB1dChjb2RlYywgYXVkaW9fbWFwW2ldWzBdLAorCQkJYXVkaW9fbWFwW2ldWzFdLCBhdWRpb19tYXBbaV1bMl0pOworCX0KKworCXNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cyhjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBfY29lZmZfZGl2IHsKKwl1MzIgbWNsazsKKwl1MzIgcmF0ZTsKKwl1MTYgZnM7CisJdTggc3I6NTsKKwl1OCB1c2I6MTsKK307CisKKy8qIGNvZGVjIGhpZmkgbWNsayBjbG9jayBkaXZpZGVyIGNvZWZmaWNpZW50cyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBfY29lZmZfZGl2IGNvZWZmX2RpdltdID0geworCS8qIDhrICovCisJezEyMjg4MDAwLCA4MDAwLCAxNTM2LCAweDYsIDB4MH0sCisJezExMjg5NjAwLCA4MDAwLCAxNDA4LCAweDE2LCAweDB9LAorCXsxODQzMjAwMCwgODAwMCwgMjMwNCwgMHg3LCAweDB9LAorCXsxNjkzNDQwMCwgODAwMCwgMjExMiwgMHgxNywgMHgwfSwKKwl7MTIwMDAwMDAsIDgwMDAsIDE1MDAsIDB4NiwgMHgxfSwKKworCS8qIDExLjAyNWsgKi8KKwl7MTEyODk2MDAsIDExMDI1LCAxMDI0LCAweDE4LCAweDB9LAorCXsxNjkzNDQwMCwgMTEwMjUsIDE1MzYsIDB4MTksIDB4MH0sCisJezEyMDAwMDAwLCAxMTAyNSwgMTA4OCwgMHgxOSwgMHgxfSwKKworCS8qIDE2ayAqLworCXsxMjI4ODAwMCwgMTYwMDAsIDc2OCwgMHhhLCAweDB9LAorCXsxODQzMjAwMCwgMTYwMDAsIDExNTIsIDB4YiwgMHgwfSwKKwl7MTIwMDAwMDAsIDE2MDAwLCA3NTAsIDB4YSwgMHgxfSwKKworCS8qIDIyLjA1ayAqLworCXsxMTI4OTYwMCwgMjIwNTAsIDUxMiwgMHgxYSwgMHgwfSwKKwl7MTY5MzQ0MDAsIDIyMDUwLCA3NjgsIDB4MWIsIDB4MH0sCisJezEyMDAwMDAwLCAyMjA1MCwgNTQ0LCAweDFiLCAweDF9LAorCisJLyogMzJrICovCisJezEyMjg4MDAwLCAzMjAwMCwgMzg0LCAweGMsIDB4MH0sCisJezE4NDMyMDAwLCAzMjAwMCwgNTc2LCAweGQsIDB4MH0sCisJezEyMDAwMDAwLCAzMjAwMCwgMzc1LCAweGEsIDB4MX0sCisKKwkvKiA0NC4xayAqLworCXsxMTI4OTYwMCwgNDQxMDAsIDI1NiwgMHgxMCwgMHgwfSwKKwl7MTY5MzQ0MDAsIDQ0MTAwLCAzODQsIDB4MTEsIDB4MH0sCisJezEyMDAwMDAwLCA0NDEwMCwgMjcyLCAweDExLCAweDF9LAorCisJLyogNDhrICovCisJezEyMjg4MDAwLCA0ODAwMCwgMjU2LCAweDAsIDB4MH0sCisJezE4NDMyMDAwLCA0ODAwMCwgMzg0LCAweDEsIDB4MH0sCisJezEyMDAwMDAwLCA0ODAwMCwgMjUwLCAweDAsIDB4MX0sCisKKwkvKiA4OC4yayAqLworCXsxMTI4OTYwMCwgODgyMDAsIDEyOCwgMHgxZSwgMHgwfSwKKwl7MTY5MzQ0MDAsIDg4MjAwLCAxOTIsIDB4MWYsIDB4MH0sCisJezEyMDAwMDAwLCA4ODIwMCwgMTM2LCAweDFmLCAweDF9LAorCisJLyogOTZrICovCisJezEyMjg4MDAwLCA5NjAwMCwgMTI4LCAweGUsIDB4MH0sCisJezE4NDMyMDAwLCA5NjAwMCwgMTkyLCAweGYsIDB4MH0sCisJezEyMDAwMDAwLCA5NjAwMCwgMTI1LCAweGUsIDB4MX0sCit9OworCitzdGF0aWMgaW5saW5lIGludCBnZXRfY29lZmYoaW50IG1jbGssIGludCByYXRlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29lZmZfZGl2KTsgaSsrKSB7CisJCWlmIChjb2VmZl9kaXZbaV0ucmF0ZSA9PSByYXRlICYmIGNvZWZmX2RpdltpXS5tY2xrID09IG1jbGspCisJCQlyZXR1cm4gaTsKKwl9CisKKwlwcmludGsoS0VSTl9FUlIgIndtODc1MDogY291bGQgbm90IGdldCBjb2VmZiBmb3IgbWNsayAlZCBAIHJhdGUgJWRcbiIsCisJCW1jbGssIHJhdGUpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHdtODc1MF9zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSwKKwkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgd204NzUwX3ByaXYgKndtODc1MCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGZyZXEpIHsKKwljYXNlIDExMjg5NjAwOgorCWNhc2UgMTIwMDAwMDA6CisJY2FzZSAxMjI4ODAwMDoKKwljYXNlIDE2OTM0NDAwOgorCWNhc2UgMTg0MzIwMDA6CisJCXdtODc1MC0+c3lzY2xrID0gZnJlcTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHdtODc1MF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSwKKwkJdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXUxNiBpZmFjZSA9IDA7CisKKwkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWlmYWNlID0gMHgwMDQwOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGludGVyZmFjZSBmb3JtYXQgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWlmYWNlIHw9IDB4MDAwMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJaWZhY2UgfD0gMHgwMDAxOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQlpZmFjZSB8PSAweDAwMDM7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCWlmYWNlIHw9IDB4MDAxMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2xvY2sgaW52ZXJzaW9uICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6CisJCWlmYWNlIHw9IDB4MDA5MDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJaWZhY2UgfD0gMHgwMDgwOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQlpZmFjZSB8PSAweDAwMTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX0lGQUNFLCBpZmFjZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzUwX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlzdHJ1Y3Qgd204NzUwX3ByaXYgKndtODc1MCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJdTE2IGlmYWNlID0gd204NzUwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTBfSUZBQ0UpICYgMHgxZjM7CisJdTE2IHNyYXRlID0gd204NzUwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTBfU1JBVEUpICYgMHgxYzA7CisJaW50IGNvZWZmID0gZ2V0X2NvZWZmKHdtODc1MC0+c3lzY2xrLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKworCS8qIGJpdCBzaXplICovCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJaWZhY2UgfD0gMHgwMDA0OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQlpZmFjZSB8PSAweDAwMDg7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCWlmYWNlIHw9IDB4MDAwYzsKKwkJYnJlYWs7CisJfQorCisJLyogc2V0IGlmYWNlICYgc3JhdGUgKi8KKwl3bTg3NTBfd3JpdGUoY29kZWMsIFdNODc1MF9JRkFDRSwgaWZhY2UpOworCWlmIChjb2VmZiA+PSAwKQorCQl3bTg3NTBfd3JpdGUoY29kZWMsIFdNODc1MF9TUkFURSwgc3JhdGUgfAorCQkJKGNvZWZmX2Rpdltjb2VmZl0uc3IgPDwgMSkgfCBjb2VmZl9kaXZbY29lZmZdLnVzYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg3NTBfbXV0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwl1MTYgbXV0ZV9yZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9BRENEQUMpICYgMHhmZmY3OworCisJaWYgKG11dGUpCisJCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX0FEQ0RBQywgbXV0ZV9yZWcgfCAweDgpOworCWVsc2UKKwkJd204NzUwX3dyaXRlKGNvZGVjLCBXTTg3NTBfQURDREFDLCBtdXRlX3JlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzUwX2RhcG1fZXZlbnQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZXZlbnQpCit7CisJdTE2IHB3cl9yZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9QV1IxKSAmIDB4ZmUzZTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMDogLyogZnVsbCBPbiAqLworCQkvKiBzZXQgdm1pZCB0byA1MGsgYW5kIHVubXV0ZSBkYWMgKi8KKwkJd204NzUwX3dyaXRlKGNvZGVjLCBXTTg3NTBfUFdSMSwgcHdyX3JlZyB8IDB4MDBjMCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfQ1RMX1BPV0VSX0QxOiAvKiBwYXJ0aWFsIE9uICovCisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDI6IC8qIHBhcnRpYWwgT24gKi8KKwkJLyogc2V0IHZtaWQgdG8gNWsgZm9yIHF1aWNrIHBvd2VyIHVwICovCisJCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX1BXUjEsIHB3cl9yZWcgfCAweDAxYzEpOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2hvdDogLyogT2ZmLCB3aXRoIHBvd2VyICovCisJCS8qIG11dGUgZGFjIGFuZCBzZXQgdm1pZCB0byA1MDBrLCBlbmFibGUgVlJFRiAqLworCQl3bTg3NTBfd3JpdGUoY29kZWMsIFdNODc1MF9QV1IxLCBwd3JfcmVnIHwgMHgwMTQxKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDNjb2xkOiAvKiBPZmYsIHdpdGhvdXQgcG93ZXIgKi8KKwkJd204NzUwX3dyaXRlKGNvZGVjLCBXTTg3NTBfUFdSMSwgMHgwMDAxKTsKKwkJYnJlYWs7CisJfQorCWNvZGVjLT5kYXBtX3N0YXRlID0gZXZlbnQ7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgV004NzUwX1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfFwKKwkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgXAorCQlTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzg4MjAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDApCisKKyNkZWZpbmUgV004NzUwX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHxcCisJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpCisKK3N0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSB3bTg3NTBfZGFpID0geworCS5uYW1lID0gIldNODc1MCIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFdNODc1MF9SQVRFUywKKwkJLmZvcm1hdHMgPSBXTTg3NTBfRk9STUFUUyx9LAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV004NzUwX1JBVEVTLAorCQkuZm9ybWF0cyA9IFdNODc1MF9GT1JNQVRTLH0sCisJLm9wcyA9IHsKKwkJLmh3X3BhcmFtcyA9IHdtODc1MF9wY21faHdfcGFyYW1zLAorCX0sCisJLmRhaV9vcHMgPSB7CisJCS5kaWdpdGFsX211dGUgPSB3bTg3NTBfbXV0ZSwKKwkJLnNldF9mbXQgPSB3bTg3NTBfc2V0X2RhaV9mbXQsCisJCS5zZXRfc3lzY2xrID0gd204NzUwX3NldF9kYWlfc3lzY2xrLAorCX0sCit9OworRVhQT1JUX1NZTUJPTF9HUEwod204NzUwX2RhaSk7CisKK3N0YXRpYyB2b2lkIHdtODc1MF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNuZF9zb2NfY29kZWMsIGRlbGF5ZWRfd29yay53b3JrKTsKKwl3bTg3NTBfZGFwbV9ldmVudChjb2RlYywgY29kZWMtPmRhcG1fc3RhdGUpOworfQorCitzdGF0aWMgaW50IHdtODc1MF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwl3bTg3NTBfZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QzY29sZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzUwX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlpbnQgaTsKKwl1OCBkYXRhWzJdOworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCisJLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg3NTBfcmVnKTsgaSsrKSB7CisJCWlmIChpID09IFdNODc1MF9SRVNFVCkKKwkJCWNvbnRpbnVlOworCQlkYXRhWzBdID0gKGkgPDwgMSkgfCAoKGNhY2hlW2ldID4+IDgpICYgMHgwMDAxKTsKKwkJZGF0YVsxXSA9IGNhY2hlW2ldICYgMHgwMGZmOworCQljb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMik7CisJfQorCisJd204NzUwX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CisKKwkvKiBjaGFyZ2Ugd204NzUwIGNhcHMgKi8KKwlpZiAoY29kZWMtPnN1c3BlbmRfZGFwbV9zdGF0ZSA9PSBTTkRSVl9DVExfUE9XRVJfRDApIHsKKwkJd204NzUwX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EMik7CisJCWNvZGVjLT5kYXBtX3N0YXRlID0gU05EUlZfQ1RMX1BPV0VSX0QwOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogaW5pdGlhbGlzZSB0aGUgV004NzUwIGRyaXZlcgorICogcmVnaXN0ZXIgdGhlIG1peGVyIGFuZCBkc3AgaW50ZXJmYWNlcyB3aXRoIHRoZSBrZXJuZWwKKyAqLworc3RhdGljIGludCB3bTg3NTBfaW5pdChzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCWludCByZWcsIHJldCA9IDA7CisKKwljb2RlYy0+bmFtZSA9ICJXTTg3NTAiOworCWNvZGVjLT5vd25lciA9IFRISVNfTU9EVUxFOworCWNvZGVjLT5yZWFkID0gd204NzUwX3JlYWRfcmVnX2NhY2hlOworCWNvZGVjLT53cml0ZSA9IHdtODc1MF93cml0ZTsKKwljb2RlYy0+ZGFwbV9ldmVudCA9IHdtODc1MF9kYXBtX2V2ZW50OworCWNvZGVjLT5kYWkgPSAmd204NzUwX2RhaTsKKwljb2RlYy0+bnVtX2RhaSA9IDE7CisJY29kZWMtPnJlZ19jYWNoZV9zaXplID0gc2l6ZW9mKHdtODc1MF9yZWcpOworCWNvZGVjLT5yZWdfY2FjaGUgPSBrbWVtZHVwKHdtODc1MF9yZWcsIHNpemVvZih3bTg3NTBfcmVnKSwgR0ZQX0tSRU5FTCk7CisJaWYgKGNvZGVjLT5yZWdfY2FjaGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3bTg3NTBfcmVzZXQoY29kZWMpOworCisJLyogcmVnaXN0ZXIgcGNtcyAqLworCXJldCA9IHNuZF9zb2NfbmV3X3BjbXMoc29jZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3bTg3NTA6IGZhaWxlZCB0byBjcmVhdGUgcGNtc1xuIik7CisJCWdvdG8gcGNtX2VycjsKKwl9CisKKwkvKiBjaGFyZ2Ugb3V0cHV0IGNhcHMgKi8KKwl3bTg3NTBfZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QyKTsKKwljb2RlYy0+ZGFwbV9zdGF0ZSA9IFNORFJWX0NUTF9QT1dFUl9EM2hvdDsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCisJLyogc2V0IHRoZSB1cGRhdGUgYml0cyAqLworCXJlZyA9IHdtODc1MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUwX0xEQUMpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX0xEQUMsIHJlZyB8IDB4MDEwMCk7CisJcmVnID0gd204NzUwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTBfUkRBQyk7CisJd204NzUwX3dyaXRlKGNvZGVjLCBXTTg3NTBfUkRBQywgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9MT1VUMVYpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX0xPVVQxViwgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9ST1VUMVYpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX1JPVVQxViwgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9MT1VUMlYpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX0xPVVQyViwgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9ST1VUMlYpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX1JPVVQyViwgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9MSU5WT0wpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX0xJTlZPTCwgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9SSU5WT0wpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX1JJTlZPTCwgcmVnIHwgMHgwMTAwKTsKKworCXdtODc1MF9hZGRfY29udHJvbHMoY29kZWMpOworCXdtODc1MF9hZGRfd2lkZ2V0cyhjb2RlYyk7CisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKHNvY2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3bTg3NTA6IGZhaWxlZCB0byByZWdpc3RlciBjYXJkXG4iKTsKKwkJZ290byBjYXJkX2VycjsKKwl9CisJcmV0dXJuIHJldDsKKworY2FyZF9lcnI6CisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlzbmRfc29jX2RhcG1fZnJlZShzb2NkZXYpOworcGNtX2VycjoKKwlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBJZiB0aGUgaTJjIGxheWVyIHdlcmVuJ3Qgc28gYnJva2VuLCB3ZSBjb3VsZCBwYXNzIHRoaXMga2luZCBvZiBkYXRhCisgICBhcm91bmQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKndtODc1MF9zb2NkZXY7CisKKyNpZiBkZWZpbmVkIChDT05GSUdfSTJDKSB8fCBkZWZpbmVkIChDT05GSUdfSTJDX01PRFVMRSkKKworLyoKKyAqIFdNODczMSAyIHdpcmUgYWRkcmVzcyBpcyBkZXRlcm1pbmVkIGJ5IEdQSU81CisgKiBzdGF0ZSBkdXJpbmcgcG93ZXJ1cC4KKyAqICAgIGxvdyAgPSAweDFhCisgKiAgICBoaWdoID0gMHgxYgorICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAwLCBJMkNfQ0xJRU5UX0VORCB9OworCisvKiBNYWdpYyBkZWZpbml0aW9uIG9mIGFsbCBvdGhlciB2YXJpYWJsZXMgYW5kIHRoaW5ncyAqLworSTJDX0NMSUVOVF9JTlNNT0Q7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTg3NTBfaTJjX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7CisKK3N0YXRpYyBpbnQgd204NzUwX2NvZGVjX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gd204NzUwX3NvY2RldjsKKwlzdHJ1Y3Qgd204NzUwX3NldHVwX2RhdGEgKnNldHVwID0gc29jZGV2LT5jb2RlY19kYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYzsKKwlpbnQgcmV0OworCisJaWYgKGFkZHIgIT0gc2V0dXAtPmkyY19hZGRyZXNzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKKwljbGllbnRfdGVtcGxhdGUuYWRkciA9IGFkZHI7CisKKwlpMmMgPSBrbWVtZHVwKCZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihjbGllbnRfdGVtcGxhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaTJjID09IE5VTEwpIHsKKwkJa2ZyZWUoY29kZWMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgY29kZWMpOworCWNvZGVjLT5jb250cm9sX2RhdGEgPSBpMmM7CisKKwlyZXQgPSBpMmNfYXR0YWNoX2NsaWVudChpMmMpOworCWlmIChyZXQgPCAwKSB7CisJCWVycigiZmFpbGVkIHRvIGF0dGFjaCBjb2RlYyBhdCBhZGRyICV4XG4iLCBhZGRyKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gd204NzUwX2luaXQoc29jZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCWVycigiZmFpbGVkIHRvIGluaXRpYWxpc2UgV004NzUwXG4iKTsKKwkJZ290byBlcnI7CisJfQorCXJldHVybiByZXQ7CisKK2VycjoKKwlrZnJlZShjb2RlYyk7CisJa2ZyZWUoaTJjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdtODc1MF9pMmNfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODc1MF9pMmNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHdtODc1MF9jb2RlY19wcm9iZSk7Cit9CisKKy8qIGNvcmdpIGkyYyBjb2RlYyBjb250cm9sIGxheWVyICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzUwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiV004NzUwIEkyQyBDb2RlYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLmlkID0gICAgICAgICAgICAgSTJDX0RSSVZFUklEX1dNODc1MCwKKwkuYXR0YWNoX2FkYXB0ZXIgPSB3bTg3NTBfaTJjX2F0dGFjaCwKKwkuZGV0YWNoX2NsaWVudCA9ICB3bTg3NTBfaTJjX2RldGFjaCwKKwkuY29tbWFuZCA9ICAgICAgICBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKKwkubmFtZSA9ICAgIldNODc1MCIsCisJLmRyaXZlciA9ICZ3bTg3NTBfaTJjX2RyaXZlciwKK307CisjZW5kaWYKKworc3RhdGljIGludCB3bTg3NTBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB3bTg3NTBfc2V0dXBfZGF0YSAqc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB3bTg3NTBfcHJpdiAqd204NzUwOworCWludCByZXQgPSAwOworCisJaW5mbygiV004NzUwIEF1ZGlvIENvZGVjICVzIiwgV004NzUwX1ZFUlNJT04pOworCWNvZGVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zb2NfY29kZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29kZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3bTg3NTAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd204NzUwX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAod204NzUwID09IE5VTEwpIHsKKwkJa2ZyZWUoY29kZWMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljb2RlYy0+cHJpdmF0ZV9kYXRhID0gd204NzUwOworCXNvY2Rldi0+Y29kZWMgPSBjb2RlYzsKKwltdXRleF9pbml0KCZjb2RlYy0+bXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV93aWRnZXRzKTsKKwlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fcGF0aHMpOworCXdtODc1MF9zb2NkZXYgPSBzb2NkZXY7CisJSU5JVF9ERUxBWUVEX1dPUksoJmNvZGVjLT5kZWxheWVkX3dvcmssIHdtODc1MF93b3JrKTsKKwkKKyNpZiBkZWZpbmVkIChDT05GSUdfSTJDKSB8fCBkZWZpbmVkIChDT05GSUdfSTJDX01PRFVMRSkKKwlpZiAoc2V0dXAtPmkyY19hZGRyZXNzKSB7CisJCW5vcm1hbF9pMmNbMF0gPSBzZXR1cC0+aTJjX2FkZHJlc3M7CisJCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKKwkJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJndtODc1MF9pMmNfZHJpdmVyKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhZGQgaTJjIGRyaXZlciIpOworCX0KKyNlbHNlCisJCS8qIEFkZCBvdGhlciBpbnRlcmZhY2VzIGhlcmUgKi8KKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZm9yY2VzIGFueSBkZWxheWVkIHdvcmsgdG8gYmUgcXVldWVkIGFuZCBydW4uCisgKi8KK3N0YXRpYyBpbnQgcnVuX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yaykKK3sKKwlpbnQgcmV0OworCisJLyogY2FuY2VsIGFueSB3b3JrIHdhaXRpbmcgdG8gYmUgcXVldWVkLiAqLworCXJldCA9IGNhbmNlbF9kZWxheWVkX3dvcmsoZHdvcmspOworCisJLyogaWYgdGhlcmUgd2FzIGFueSB3b3JrIHdhaXRpbmcgdGhlbiB3ZSBydW4gaXQgbm93IGFuZAorCSAqIHdhaXQgZm9yIGl0J3MgY29tcGxldGlvbiAqLworCWlmIChyZXQpIHsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKGR3b3JrLCAwKTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogcG93ZXIgZG93biBjaGlwICovCitzdGF0aWMgaW50IHdtODc1MF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwlpZiAoY29kZWMtPmNvbnRyb2xfZGF0YSkKKwkJd204NzUwX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EM2NvbGQpOworCXJ1bl9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmspOworCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CisJc25kX3NvY19kYXBtX2ZyZWUoc29jZGV2KTsKKyNpZiBkZWZpbmVkIChDT05GSUdfSTJDKSB8fCBkZWZpbmVkIChDT05GSUdfSTJDX01PRFVMRSkKKwlpMmNfZGVsX2RyaXZlcigmd204NzUwX2kyY19kcml2ZXIpOworI2VuZGlmCisJa2ZyZWUoY29kZWMtPnByaXZhdGVfZGF0YSk7CisJa2ZyZWUoY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3dtODc1MCA9IHsKKwkucHJvYmUgPSAJd204NzUwX3Byb2JlLAorCS5yZW1vdmUgPSAJd204NzUwX3JlbW92ZSwKKwkuc3VzcGVuZCA9IAl3bTg3NTBfc3VzcGVuZCwKKwkucmVzdW1lID0Jd204NzUwX3Jlc3VtZSwKK307CisKK0VYUE9SVF9TWU1CT0xfR1BMKHNvY19jb2RlY19kZXZfd204NzUwKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFdNODc1MCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmggYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5N2E1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3I6IFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgorICoKKyAqIEJhc2VkIG9uIFdNODc1My5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfV004NzUwX0gKKyNkZWZpbmUgX1dNODc1MF9ICisKKy8qIFdNODc1MCByZWdpc3RlciBzcGFjZSAqLworCisjZGVmaW5lIFdNODc1MF9MSU5WT0wgICAgMHgwMAorI2RlZmluZSBXTTg3NTBfUklOVk9MICAgIDB4MDEKKyNkZWZpbmUgV004NzUwX0xPVVQxViAgICAweDAyCisjZGVmaW5lIFdNODc1MF9ST1VUMVYgICAgMHgwMworI2RlZmluZSBXTTg3NTBfQURDREFDICAgIDB4MDUKKyNkZWZpbmUgV004NzUwX0lGQUNFICAgICAweDA3CisjZGVmaW5lIFdNODc1MF9TUkFURSAgICAgMHgwOAorI2RlZmluZSBXTTg3NTBfTERBQyAgICAgIDB4MGEKKyNkZWZpbmUgV004NzUwX1JEQUMgICAgICAweDBiCisjZGVmaW5lIFdNODc1MF9CQVNTICAgICAgMHgwYworI2RlZmluZSBXTTg3NTBfVFJFQkxFICAgIDB4MGQKKyNkZWZpbmUgV004NzUwX1JFU0VUICAgICAweDBmCisjZGVmaW5lIFdNODc1MF8zRCAgICAgICAgMHgxMAorI2RlZmluZSBXTTg3NTBfQUxDMSAgICAgIDB4MTEKKyNkZWZpbmUgV004NzUwX0FMQzIgICAgICAweDEyCisjZGVmaW5lIFdNODc1MF9BTEMzICAgICAgMHgxMworI2RlZmluZSBXTTg3NTBfTkdBVEUgICAgIDB4MTQKKyNkZWZpbmUgV004NzUwX0xBREMgICAgICAweDE1CisjZGVmaW5lIFdNODc1MF9SQURDICAgICAgMHgxNgorI2RlZmluZSBXTTg3NTBfQURDVEwxICAgIDB4MTcKKyNkZWZpbmUgV004NzUwX0FEQ1RMMiAgICAweDE4CisjZGVmaW5lIFdNODc1MF9QV1IxICAgICAgMHgxOQorI2RlZmluZSBXTTg3NTBfUFdSMiAgICAgIDB4MWEKKyNkZWZpbmUgV004NzUwX0FEQ1RMMyAgICAweDFiCisjZGVmaW5lIFdNODc1MF9BRENJTiAgICAgMHgxZgorI2RlZmluZSBXTTg3NTBfTEFEQ0lOICAgIDB4MjAKKyNkZWZpbmUgV004NzUwX1JBRENJTiAgICAweDIxCisjZGVmaW5lIFdNODc1MF9MT1VUTTEgICAgMHgyMgorI2RlZmluZSBXTTg3NTBfTE9VVE0yICAgIDB4MjMKKyNkZWZpbmUgV004NzUwX1JPVVRNMSAgICAweDI0CisjZGVmaW5lIFdNODc1MF9ST1VUTTIgICAgMHgyNQorI2RlZmluZSBXTTg3NTBfTU9VVE0xICAgIDB4MjYKKyNkZWZpbmUgV004NzUwX01PVVRNMiAgICAweDI3CisjZGVmaW5lIFdNODc1MF9MT1VUMlYgICAgMHgyOAorI2RlZmluZSBXTTg3NTBfUk9VVDJWICAgIDB4MjkKKyNkZWZpbmUgV004NzUwX01PVVRWICAgICAweDJhCisKKyNkZWZpbmUgV004NzUwX0NBQ0hFX1JFR05VTSAweDJhCisKKyNkZWZpbmUgV004NzUwX1NZU0NMSwkwCisKK3N0cnVjdCB3bTg3NTBfc2V0dXBfZGF0YSB7CisJdW5zaWduZWQgc2hvcnQgaTJjX2FkZHJlc3M7Cit9OworCitleHRlcm4gc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpIHdtODc1MF9kYWk7CitleHRlcm4gc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlIHNvY19jb2RlY19kZXZfd204NzUwOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTY0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jCkBAIC0wLDAgKzEsNzcxIEBACisvKgorICogd205NzEyLmMgIC0tICBBTFNBIFNvYyBXTTk3MTIgY29kZWMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDA2IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKKyAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgNHRoIEZlYiAyMDA2ICAgSW5pdGlhbCB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisKKyNkZWZpbmUgV005NzEyX1ZFUlNJT04gIjAuNCIKKworc3RhdGljIHVuc2lnbmVkIGludCBhYzk3X3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXVuc2lnbmVkIGludCByZWcpOworc3RhdGljIGludCBhYzk3X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworLyoKKyAqIFdNOTcxMiByZWdpc3RlciBjYWNoZQorICovCitzdGF0aWMgY29uc3QgdTE2IHdtOTcxMl9yZWdbXSA9IHsKKwkweDYxNzQsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIC8vIDYKKwkweGYwZjAsIDB4YWFhMCwgMHhjMDA4LCAweDY4MDgsIC8vIGUKKwkweGU4MDgsIDB4YWFhMCwgMHhhZDAwLCAweDgwMDAsIC8vIDE2CisJMHhlODA4LCAweDMwMDAsIDB4ODAwMCwgMHgwMDAwLCAvLyAxZQorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwZiwgLy8gMjYKKwkweDA0MDUsIDB4MDQxMCwgMHhiYjgwLCAweGJiODAsIC8vIDJlCisJMHgwMDAwLCAweGJiODAsIDB4MDAwMCwgMHgwMDAwLCAvLyAzNgorCTB4MDAwMCwgMHgyMDAwLCAweDAwMDAsIDB4MDAwMCwgLy8gM2UKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIC8vIDQ2CisJMHgwMDAwLCAweDAwMDAsIDB4ZjgzZSwgMHhmZmZmLCAvLyA0ZQorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ZjgzZSwgLy8gNTYKKwkweDAwMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIC8vIDVlCisJMHhiMDMyLCAweDNlMDAsIDB4MDAwMCwgMHgwMDAwLCAvLyA2NgorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgLy8gNmUKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDYsIC8vIDc2CisJMHgwMDAxLCAweDAwMDAsIDB4NTc0ZCwgMHg0YzEyLCAvLyA3ZQorCTB4MDAwMCwgMHgwMDAwIC8vIHZpcnR1YWwgaHAgbWl4ZXJzCit9OworCisvKiB2aXJ0dWFsIEhQIG1peGVycyByZWdzICovCisjZGVmaW5lIEhQTF9NSVhFUgkweDgwCisjZGVmaW5lIEhQUl9NSVhFUgkweDgyCisKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MTJfYWxjX3NlbGVjdFtdID0geyJOb25lIiwgIkxlZnQiLCAiUmlnaHQiLCAiU3RlcmVvIn07CitzdGF0aWMgY29uc3QgY2hhciAqd205NzEyX2FsY19tdXhbXSA9IHsiU3RlcmVvIiwgIkxlZnQiLCAiUmlnaHQiLCAiTm9uZSJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtOTcxMl9vdXQzX3NyY1tdID0geyJMZWZ0IiwgIlZSRUYiLCAiTGVmdCArIFJpZ2h0IiwKKwkiTW9ubyJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtOTcxMl9zcGtfc3JjW10gPSB7IlNwZWFrZXIgTWl4IiwgIkhlYWRwaG9uZSBNaXgifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MTJfcmVjX2FkY1tdID0geyJTdGVyZW8iLCAiTGVmdCIsICJSaWdodCIsICJNdXRlIn07CitzdGF0aWMgY29uc3QgY2hhciAqd205NzEyX2Jhc2VbXSA9IHsiTGluZWFyIENvbnRyb2wiLCAiQWRhcHRpdmUgQm9vc3QifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MTJfcmVjX2dhaW5bXSA9IHsiKzEuNWRCIFN0ZXBzIiwgIiswLjc1ZEIgU3RlcHMifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MTJfbWljW10gPSB7Ik1pYyAxIiwgIkRpZmZlcmVudGlhbCIsICJNaWMgMiIsCisJIlN0ZXJlbyJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtOTcxMl9yZWNfc2VsW10gPSB7Ik1pYyIsICJOQyIsICJOQyIsICJTcGVha2VyIE1peGVyIiwKKwkiTGluZSIsICJIZWFkcGhvbmUgTWl4ZXIiLCAiUGhvbmUgTWl4ZXIiLCAiUGhvbmUifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MTJfbmdfdHlwZVtdID0geyJDb25zdGFudCBHYWluIiwgIk11dGUifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MTJfZGlmZl9zZWxbXSA9IHsiTWljIiwgIkxpbmUifTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTk3MTJfZW51bVtdID0geworU09DX0VOVU1fU0lOR0xFKEFDOTdfUENJX1NWSUQsIDE0LCA0LCB3bTk3MTJfYWxjX3NlbGVjdCksCitTT0NfRU5VTV9TSU5HTEUoQUM5N19WSURFTywgMTIsIDQsIHdtOTcxMl9hbGNfbXV4KSwKK1NPQ19FTlVNX1NJTkdMRShBQzk3X0FVWCwgOSwgNCwgd205NzEyX291dDNfc3JjKSwKK1NPQ19FTlVNX1NJTkdMRShBQzk3X0FVWCwgOCwgMiwgd205NzEyX3Nwa19zcmMpLAorU09DX0VOVU1fU0lOR0xFKEFDOTdfUkVDX1NFTCwgMTIsIDQsIHdtOTcxMl9yZWNfYWRjKSwKK1NPQ19FTlVNX1NJTkdMRShBQzk3X01BU1RFUl9UT05FLCAxNSwgMiwgd205NzEyX2Jhc2UpLAorU09DX0VOVU1fRE9VQkxFKEFDOTdfUkVDX0dBSU4sIDE0LCA2LCAyLCB3bTk3MTJfcmVjX2dhaW4pLAorU09DX0VOVU1fU0lOR0xFKEFDOTdfTUlDLCA1LCA0LCB3bTk3MTJfbWljKSwKK1NPQ19FTlVNX1NJTkdMRShBQzk3X1JFQ19TRUwsIDgsIDgsIHdtOTcxMl9yZWNfc2VsKSwKK1NPQ19FTlVNX1NJTkdMRShBQzk3X1JFQ19TRUwsIDAsIDgsIHdtOTcxMl9yZWNfc2VsKSwKK1NPQ19FTlVNX1NJTkdMRShBQzk3X1BDSV9TVklELCA1LCAyLCB3bTk3MTJfbmdfdHlwZSksCitTT0NfRU5VTV9TSU5HTEUoMHg1YywgOCwgMiwgd205NzEyX2RpZmZfc2VsKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfc25kX2FjOTdfY29udHJvbHNbXSA9IHsKK1NPQ19ET1VCTEUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgQUM5N19NQVNURVIsIDgsIDAsIDMxLCAxKSwKK1NPQ19TSU5HTEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgQUM5N19NQVNURVIsIDE1LCAxLCAxKSwKK1NPQ19ET1VCTEUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCBBQzk3X0hFQURQSE9ORSwgOCwgMCwgMzEsIDEpLAorU09DX1NJTkdMRSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIEFDOTdfSEVBRFBIT05FLDE1LCAxLCAxKSwKKworU09DX1NJTkdMRSgiU3BlYWtlciBQbGF5YmFjayBaQyBTd2l0Y2giLCBBQzk3X01BU1RFUiwgNywgMSwgMCksCitTT0NfU0lOR0xFKCJTcGVha2VyIFBsYXliYWNrIEludmVydCBTd2l0Y2giLCBBQzk3X01BU1RFUiwgNiwgMSwgMCksCitTT0NfU0lOR0xFKCJIZWFkcGhvbmUgUGxheWJhY2sgWkMgU3dpdGNoIiwgQUM5N19IRUFEUEhPTkUsIDcsIDEsIDApLAorU09DX1NJTkdMRSgiTW9ubyBQbGF5YmFjayBaQyBTd2l0Y2giLCBBQzk3X01BU1RFUl9NT05PLCA3LCAxLCAwKSwKK1NPQ19TSU5HTEUoIk1vbm8gUGxheWJhY2sgVm9sdW1lIiwgQUM5N19NQVNURVJfTU9OTywgMCwgMzEsIDApLAorCitTT0NfU0lOR0xFKCJBTEMgVGFyZ2V0IFZvbHVtZSIsIEFDOTdfQ09ERUNfQ0xBU1NfUkVWLCAxMiwgMTUsIDApLAorU09DX1NJTkdMRSgiQUxDIEhvbGQgVGltZSIsIEFDOTdfQ09ERUNfQ0xBU1NfUkVWLCA4LCAxNSwgMCksCitTT0NfU0lOR0xFKCJBTEMgRGVjYXkgVGltZSIsIEFDOTdfQ09ERUNfQ0xBU1NfUkVWLCA0LCAxNSwgMCksCitTT0NfU0lOR0xFKCJBTEMgQXR0YWNrIFRpbWUiLCBBQzk3X0NPREVDX0NMQVNTX1JFViwgMCwgMTUsIDApLAorU09DX0VOVU0oIkFMQyBGdW5jdGlvbiIsIHdtOTcxMl9lbnVtWzBdKSwKK1NPQ19TSU5HTEUoIkFMQyBNYXggVm9sdW1lIiwgQUM5N19QQ0lfU1ZJRCwgMTEsIDcsIDApLAorU09DX1NJTkdMRSgiQUxDIFpDIFRpbWVvdXQiLCBBQzk3X1BDSV9TVklELCA5LCAzLCAxKSwKK1NPQ19TSU5HTEUoIkFMQyBaQyBTd2l0Y2giLCBBQzk3X1BDSV9TVklELCA4LCAxLCAwKSwKK1NPQ19TSU5HTEUoIkFMQyBORyBTd2l0Y2giLCBBQzk3X1BDSV9TVklELCA3LCAxLCAwKSwKK1NPQ19FTlVNKCJBTEMgTkcgVHlwZSIsIHdtOTcxMl9lbnVtWzEwXSksCitTT0NfU0lOR0xFKCJBTEMgTkcgVGhyZXNob2xkIiwgQUM5N19QQ0lfU1ZJRCwgMCwgMzEsIDEpLAorCitTT0NfU0lOR0xFKCJNaWMgSGVhZHBob25lICBWb2x1bWUiLCBBQzk3X1ZJREVPLCAxMiwgNywgMSksCitTT0NfU0lOR0xFKCJBTEMgSGVhZHBob25lIFZvbHVtZSIsIEFDOTdfVklERU8sIDcsIDcsIDEpLAorCitTT0NfU0lOR0xFKCJPdXQzIFN3aXRjaCIsIEFDOTdfQVVYLCAxNSwgMSwgMSksCitTT0NfU0lOR0xFKCJPdXQzIFpDIFN3aXRjaCIsIEFDOTdfQVVYLCA3LCAxLCAxKSwKK1NPQ19TSU5HTEUoIk91dDMgVm9sdW1lIiwgQUM5N19BVVgsIDAsIDMxLCAxKSwKKworU09DX1NJTkdMRSgiUENCZWVwIEJ5cGFzcyBIZWFkcGhvbmUgVm9sdW1lIiwgQUM5N19QQ19CRUVQLCAxMiwgNywgMSksCitTT0NfU0lOR0xFKCJQQ0JlZXAgQnlwYXNzIFNwZWFrZXIgVm9sdW1lIiwgQUM5N19QQ19CRUVQLCA4LCA3LCAxKSwKK1NPQ19TSU5HTEUoIlBDQmVlcCBCeXBhc3MgUGhvbmUgVm9sdW1lIiwgQUM5N19QQ19CRUVQLCA0LCA3LCAxKSwKKworU09DX1NJTkdMRSgiQXV4IFBsYXliYWNrIEhlYWRwaG9uZSBWb2x1bWUiLCBBQzk3X0NELCAxMiwgNywgMSksCitTT0NfU0lOR0xFKCJBdXggUGxheWJhY2sgU3BlYWtlciBWb2x1bWUiLCBBQzk3X0NELCA4LCA3LCAxKSwKK1NPQ19TSU5HTEUoIkF1eCBQbGF5YmFjayBQaG9uZSBWb2x1bWUiLCBBQzk3X0NELCA0LCA3LCAxKSwKKworU09DX1NJTkdMRSgiUGhvbmUgVm9sdW1lIiwgQUM5N19QSE9ORSwgMCwgMTUsIDApLAorU09DX0RPVUJMRSgiTGluZSBDYXB0dXJlIFZvbHVtZSIsIEFDOTdfTElORSwgOCwgMCwgMzEsIDEpLAorCitTT0NfU0lOR0xFKCJDYXB0dXJlIDIwZEIgQm9vc3QgU3dpdGNoIiwgQUM5N19SRUNfU0VMLCAxNCwgMSwgMCksCitTT0NfU0lOR0xFKCJDYXB0dXJlIHRvIFBob25lIDIwZEIgQm9vc3QgU3dpdGNoIiwgQUM5N19SRUNfU0VMLCAxMSwgMSwgMSksCisKK1NPQ19TSU5HTEUoIjNEIFVwcGVyIEN1dC1vZmYgU3dpdGNoIiwgQUM5N18zRF9DT05UUk9MLCA1LCAxLCAxKSwKK1NPQ19TSU5HTEUoIjNEIExvd2VyIEN1dC1vZmYgU3dpdGNoIiwgQUM5N18zRF9DT05UUk9MLCA0LCAxLCAxKSwKK1NPQ19TSU5HTEUoIjNEIFBsYXliYWNrIFZvbHVtZSIsIEFDOTdfM0RfQ09OVFJPTCwgMCwgMTUsIDApLAorCitTT0NfRU5VTSgiQmFzcyBDb250cm9sIiwgd205NzEyX2VudW1bNV0pLAorU09DX1NJTkdMRSgiQmFzcyBDdXQtb2ZmIFN3aXRjaCIsIEFDOTdfTUFTVEVSX1RPTkUsIDEyLCAxLCAxKSwKK1NPQ19TSU5HTEUoIlRvbmUgQ3V0LW9mZiBTd2l0Y2giLCBBQzk3X01BU1RFUl9UT05FLCA0LCAxLCAxKSwKK1NPQ19TSU5HTEUoIlBsYXliYWNrIEF0dGVudWF0ZSAoLTZkQikgU3dpdGNoIiwgQUM5N19NQVNURVJfVE9ORSwgNiwgMSwgMCksCitTT0NfU0lOR0xFKCJCYXNzIFZvbHVtZSIsIEFDOTdfTUFTVEVSX1RPTkUsIDgsIDE1LCAwKSwKK1NPQ19TSU5HTEUoIlRyZWJsZSBWb2x1bWUiLCBBQzk3X01BU1RFUl9UT05FLCAwLCAxNSwgMCksCisKK1NPQ19TSU5HTEUoIkNhcHR1cmUgQURDIFN3aXRjaCIsIEFDOTdfUkVDX0dBSU4sIDE1LCAxLCAxKSwKK1NPQ19FTlVNKCJDYXB0dXJlIFZvbHVtZSBTdGVwcyIsIHdtOTcxMl9lbnVtWzZdKSwKK1NPQ19ET1VCTEUoIkNhcHR1cmUgVm9sdW1lIiwgQUM5N19SRUNfR0FJTiwgOCwgMCwgNjMsIDEpLAorU09DX1NJTkdMRSgiQ2FwdHVyZSBaQyBTd2l0Y2giLCBBQzk3X1JFQ19HQUlOLCA3LCAxLCAwKSwKKworU09DX1NJTkdMRSgiTWljIDEgVm9sdW1lIiwgQUM5N19NSUMsIDgsIDMxLCAxKSwKK1NPQ19TSU5HTEUoIk1pYyAyIFZvbHVtZSIsIEFDOTdfTUlDLCAwLCAzMSwgMSksCitTT0NfU0lOR0xFKCJNaWMgMjBkQiBCb29zdCBTd2l0Y2giLCBBQzk3X01JQywgNywgMSwgMCksCit9OworCisvKiBhZGQgbm9uIGRhcG0gY29udHJvbHMgKi8KK3N0YXRpYyBpbnQgd205NzEyX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGVyciwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtOTcxMl9zbmRfYWM5N19jb250cm9scyk7IGkrKykgeworCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZCwKKwkJCQlzbmRfc29jX2NuZXcoJndtOTcxMl9zbmRfYWM5N19jb250cm9sc1tpXSxjb2RlYywgTlVMTCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCisvKiBXZSBoYXZlIHRvIGNyZWF0ZSBhIGZha2UgbGVmdCBhbmQgcmlnaHQgSFAgbWl4ZXJzIGJlY2F1c2UKKyAqIHRoZSBjb2RlYyBvbmx5IGhhcyBhIHNpbmdsZSBjb250cm9sIHRoYXQgaXMgc2hhcmVkIGJ5IGJvdGggY2hhbm5lbHMuCisgKiBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gZGV0ZXJtaW5lIHRoZSBhdWRpbyBwYXRoLgorICovCitzdGF0aWMgaW50IG1peGVyX2V2ZW50IChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywgaW50IGV2ZW50KQoreworCXUxNiBsLCByLCBiZWVwLCBsaW5lLCBwaG9uZSwgbWljLCBwY20sIGF1eDsKKworCWwgPSBhYzk3X3JlYWQody0+Y29kZWMsIEhQTF9NSVhFUik7CisJciA9IGFjOTdfcmVhZCh3LT5jb2RlYywgSFBSX01JWEVSKTsKKwliZWVwID0gYWM5N19yZWFkKHctPmNvZGVjLCBBQzk3X1BDX0JFRVApOworCW1pYyA9IGFjOTdfcmVhZCh3LT5jb2RlYywgQUM5N19WSURFTyk7CisJcGhvbmUgPSBhYzk3X3JlYWQody0+Y29kZWMsIEFDOTdfUEhPTkUpOworCWxpbmUgPSBhYzk3X3JlYWQody0+Y29kZWMsIEFDOTdfTElORSk7CisJcGNtID0gYWM5N19yZWFkKHctPmNvZGVjLCBBQzk3X1BDTSk7CisJYXV4ID0gYWM5N19yZWFkKHctPmNvZGVjLCBBQzk3X0NEKTsKKworCWlmIChsICYgMHgxIHx8IHIgJiAweDEpCisJCWFjOTdfd3JpdGUody0+Y29kZWMsIEFDOTdfVklERU8sIG1pYyAmIDB4N2ZmZik7CisJZWxzZQorCQlhYzk3X3dyaXRlKHctPmNvZGVjLCBBQzk3X1ZJREVPLCBtaWMgfCAweDgwMDApOworCisJaWYgKGwgJiAweDIgfHwgciAmIDB4MikKKwkJYWM5N193cml0ZSh3LT5jb2RlYywgQUM5N19QQ00sIHBjbSAmIDB4N2ZmZik7CisJZWxzZQorCQlhYzk3X3dyaXRlKHctPmNvZGVjLCBBQzk3X1BDTSwgcGNtIHwgMHg4MDAwKTsKKworCWlmIChsICYgMHg0IHx8IHIgJiAweDQpCisJCWFjOTdfd3JpdGUody0+Y29kZWMsIEFDOTdfTElORSwgbGluZSAmIDB4N2ZmZik7CisJZWxzZQorCQlhYzk3X3dyaXRlKHctPmNvZGVjLCBBQzk3X0xJTkUsIGxpbmUgfCAweDgwMDApOworCisJaWYgKGwgJiAweDggfHwgciAmIDB4OCkKKwkJYWM5N193cml0ZSh3LT5jb2RlYywgQUM5N19QSE9ORSwgcGhvbmUgJiAweDdmZmYpOworCWVsc2UKKwkJYWM5N193cml0ZSh3LT5jb2RlYywgQUM5N19QSE9ORSwgcGhvbmUgfCAweDgwMDApOworCisJaWYgKGwgJiAweDEwIHx8IHIgJiAweDEwKQorCQlhYzk3X3dyaXRlKHctPmNvZGVjLCBBQzk3X0NELCBhdXggJiAweDdmZmYpOworCWVsc2UKKwkJYWM5N193cml0ZSh3LT5jb2RlYywgQUM5N19DRCwgYXV4IHwgMHg4MDAwKTsKKworCWlmIChsICYgMHgyMCB8fCByICYgMHgyMCkKKwkJYWM5N193cml0ZSh3LT5jb2RlYywgQUM5N19QQ19CRUVQLCBiZWVwICYgMHg3ZmZmKTsKKwllbHNlCisJCWFjOTdfd3JpdGUody0+Y29kZWMsIEFDOTdfUENfQkVFUCwgYmVlcCB8IDB4ODAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTGVmdCBIZWFkcGhvbmUgTWl4ZXJzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd205NzEyX2hwbF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiUENCZWVwIEJ5cGFzcyBTd2l0Y2giLCBIUExfTUlYRVIsIDUsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiQXV4IFBsYXliYWNrIFN3aXRjaCIsIEhQTF9NSVhFUiwgNCwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJQaG9uZSBCeXBhc3MgU3dpdGNoIiwgSFBMX01JWEVSLCAzLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkxpbmUgQnlwYXNzIFN3aXRjaCIsIEhQTF9NSVhFUiwgMiwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgSFBMX01JWEVSLCAxLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBTaWRldG9uZSBTd2l0Y2giLCBIUExfTUlYRVIsIDAsIDEsIDApLAorfTsKKworLyogUmlnaHQgSGVhZHBob25lIE1peGVycyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtOTcxMl9ocHJfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlBDQmVlcCBCeXBhc3MgU3dpdGNoIiwgSFBSX01JWEVSLCA1LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCBIUFJfTUlYRVIsIDQsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiUGhvbmUgQnlwYXNzIFN3aXRjaCIsIEhQUl9NSVhFUiwgMywgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJMaW5lIEJ5cGFzcyBTd2l0Y2giLCBIUFJfTUlYRVIsIDIsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIEhQUl9NSVhFUiwgMSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJNaWMgU2lkZXRvbmUgU3dpdGNoIiwgSFBSX01JWEVSLCAwLCAxLCAwKSwKK307CisKKy8qIFNwZWFrZXIgTWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfc3BlYWtlcl9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiUENCZWVwIEJ5cGFzcyBTd2l0Y2giLCBBQzk3X1BDX0JFRVAsIDExLCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X0NELCAxMSwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJQaG9uZSBCeXBhc3MgU3dpdGNoIiwgQUM5N19QSE9ORSwgMTQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTGluZSBCeXBhc3MgU3dpdGNoIiwgQUM5N19MSU5FLCAxNCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgQUM5N19QQ00sIDE0LCAxLCAxKSwKK307CisKKy8qIFBob25lIE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd205NzEyX3Bob25lX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJQQ0JlZXAgQnlwYXNzIFN3aXRjaCIsIEFDOTdfUENfQkVFUCwgNywgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJBdXggUGxheWJhY2sgU3dpdGNoIiwgQUM5N19DRCwgNywgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJMaW5lIEJ5cGFzcyBTd2l0Y2giLCBBQzk3X0xJTkUsIDEzLCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X1BDTSwgMTMsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTWljIDEgU2lkZXRvbmUgU3dpdGNoIiwgQUM5N19NSUMsIDE0LCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyAyIFNpZGV0b25lIFN3aXRjaCIsIEFDOTdfTUlDLCAxMywgMSwgMSksCit9OworCisvKiBBTEMgaGVhZHBob25lIG11eCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtOTcxMl9hbGNfbXV4X2NvbnRyb2xzID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd205NzEyX2VudW1bMV0pOworCisvKiBvdXQgMyBtdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfb3V0M19tdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTk3MTJfZW51bVsyXSk7CisKKy8qIHNwayBtdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfc3BrX211eF9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtOTcxMl9lbnVtWzNdKTsKKworLyogQ2FwdHVyZSB0byBQaG9uZSBtdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfY2FwdHVyZV9waG9uZV9tdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTk3MTJfZW51bVs0XSk7CisKKy8qIENhcHR1cmUgbGVmdCBzZWxlY3QgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfY2FwdHVyZV9zZWxlY3RsX2NvbnRyb2xzID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd205NzEyX2VudW1bOF0pOworCisvKiBDYXB0dXJlIHJpZ2h0IHNlbGVjdCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtOTcxMl9jYXB0dXJlX3NlbGVjdHJfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTk3MTJfZW51bVs5XSk7CisKKy8qIE1pYyBzZWxlY3QgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfbWljX3NyY19jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtOTcxMl9lbnVtWzddKTsKKworLyogZGlmZiBzZWxlY3QgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfZGlmZl9zZWxfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTk3MTJfZW51bVsxMV0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd205NzEyX2RhcG1fd2lkZ2V0c1tdID0geworU05EX1NPQ19EQVBNX01VWCgiQUxDIFNpZGV0b25lIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkmd205NzEyX2FsY19tdXhfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX01VWCgiT3V0MyBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJJndtOTcxMl9vdXQzX211eF9jb250cm9scyksCitTTkRfU09DX0RBUE1fTVVYKCJTcGVha2VyIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkmd205NzEyX3Nwa19tdXhfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX01VWCgiQ2FwdHVyZSBQaG9uZSBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJJndtOTcxMl9jYXB0dXJlX3Bob25lX211eF9jb250cm9scyksCitTTkRfU09DX0RBUE1fTVVYKCJMZWZ0IENhcHR1cmUgU2VsZWN0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZ3bTk3MTJfY2FwdHVyZV9zZWxlY3RsX2NvbnRyb2xzKSwKK1NORF9TT0NfREFQTV9NVVgoIlJpZ2h0IENhcHR1cmUgU2VsZWN0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZ3bTk3MTJfY2FwdHVyZV9zZWxlY3RyX2NvbnRyb2xzKSwKK1NORF9TT0NfREFQTV9NVVgoIk1pYyBTZWxlY3QgU291cmNlIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZ3bTk3MTJfbWljX3NyY19jb250cm9scyksCitTTkRfU09DX0RBUE1fTVVYKCJEaWZmZXJlbnRpYWwgU291cmNlIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZ3bTk3MTJfZGlmZl9zZWxfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX01JWEVSKCJBQzk3IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9NSVhFUl9FKCJMZWZ0IEhQIE1peGVyIiwgQUM5N19JTlRfUEFHSU5HLCA5LCAxLAorCSZ3bTk3MTJfaHBsX21peGVyX2NvbnRyb2xzWzBdLCBBUlJBWV9TSVpFKHdtOTcxMl9ocGxfbWl4ZXJfY29udHJvbHMpLAorCW1peGVyX2V2ZW50LCBTTkRfU09DX0RBUE1fUE9TVF9SRUcpLAorU05EX1NPQ19EQVBNX01JWEVSX0UoIlJpZ2h0IEhQIE1peGVyIiwgQUM5N19JTlRfUEFHSU5HLCA4LCAxLAorCSZ3bTk3MTJfaHByX21peGVyX2NvbnRyb2xzWzBdLCBBUlJBWV9TSVpFKHdtOTcxMl9ocHJfbWl4ZXJfY29udHJvbHMpLAorCSBtaXhlcl9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUkVHKSwKK1NORF9TT0NfREFQTV9NSVhFUigiUGhvbmUgTWl4ZXIiLCBBQzk3X0lOVF9QQUdJTkcsIDYsIDEsCisJJndtOTcxMl9waG9uZV9taXhlcl9jb250cm9sc1swXSwgQVJSQVlfU0laRSh3bTk3MTJfcGhvbmVfbWl4ZXJfY29udHJvbHMpKSwKK1NORF9TT0NfREFQTV9NSVhFUigiU3BlYWtlciBNaXhlciIsIEFDOTdfSU5UX1BBR0lORywgNywgMSwKKwkmd205NzEyX3NwZWFrZXJfbWl4ZXJfY29udHJvbHNbMF0sCisJQVJSQVlfU0laRSh3bTk3MTJfc3BlYWtlcl9taXhlcl9jb250cm9scykpLAorU05EX1NPQ19EQVBNX01JWEVSKCJNb25vIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9EQUMoIkxlZnQgREFDIiwgIkxlZnQgSGlGaSBQbGF5YmFjayIsIEFDOTdfSU5UX1BBR0lORywgMTQsIDEpLAorU05EX1NPQ19EQVBNX0RBQygiUmlnaHQgREFDIiwgIlJpZ2h0IEhpRmkgUGxheWJhY2siLCBBQzk3X0lOVF9QQUdJTkcsIDEzLCAxKSwKK1NORF9TT0NfREFQTV9EQUMoIkF1eCBEQUMiLCAiQXV4IFBsYXliYWNrIiwgU05EX1NPQ19OT1BNLCAwLCAwKSwKK1NORF9TT0NfREFQTV9BREMoIkxlZnQgQURDIiwgIkxlZnQgSGlGaSBDYXB0dXJlIiwgQUM5N19JTlRfUEFHSU5HLCAxMiwgMSksCitTTkRfU09DX0RBUE1fQURDKCJSaWdodCBBREMiLCAiUmlnaHQgSGlGaSBDYXB0dXJlIiwgQUM5N19JTlRfUEFHSU5HLCAxMSwgMSksCitTTkRfU09DX0RBUE1fUEdBKCJIZWFkcGhvbmUgUEdBIiwgQUM5N19JTlRfUEFHSU5HLCA0LCAxLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIlNwZWFrZXIgUEdBIiwgQUM5N19JTlRfUEFHSU5HLCAzLCAxLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIk91dCAzIFBHQSIsIEFDOTdfSU5UX1BBR0lORywgNSwgMSwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJMaW5lIFBHQSIsIEFDOTdfSU5UX1BBR0lORywgMiwgMSwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJQaG9uZSBQR0EiLCBBQzk3X0lOVF9QQUdJTkcsIDEsIDEsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiTWljIFBHQSIsIEFDOTdfSU5UX1BBR0lORywgMCwgMSwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEJpYXMiLCBBQzk3X0lOVF9QQUdJTkcsIDEwLCAxKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIk1PTk9PVVQiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIkhQT1VUTCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiSFBPVVRSIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMiIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiUk9VVDIiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIk9VVDMiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiTElORUlOTCIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJMSU5FSU5SIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIlBIT05FIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIlBDQkVFUCIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMxIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIk1JQzIiKSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphdWRpb19tYXBbXVszXSA9IHsKKwkvKiB2aXJ0dWFsIG1peGVyIC0gbWl4ZXMgbGVmdCAmIHJpZ2h0IGNoYW5uZWxzIGZvciBzcGsgYW5kIG1vbm8gKi8KKwl7IkFDOTcgTWl4ZXIiLCBOVUxMLCAiTGVmdCBEQUMifSwKKwl7IkFDOTcgTWl4ZXIiLCBOVUxMLCAiUmlnaHQgREFDIn0sCisKKwkvKiBMZWZ0IEhQIG1peGVyICovCisJeyJMZWZ0IEhQIE1peGVyIiwgIlBDQmVlcCBCeXBhc3MgU3dpdGNoIiwgIlBDQkVFUCJ9LAorCXsiTGVmdCBIUCBNaXhlciIsICJBdXggUGxheWJhY2sgU3dpdGNoIiwgICJBdXggREFDIn0sCisJeyJMZWZ0IEhQIE1peGVyIiwgIlBob25lIEJ5cGFzcyBTd2l0Y2giLCAgIlBob25lIFBHQSJ9LAorCXsiTGVmdCBIUCBNaXhlciIsICJMaW5lIEJ5cGFzcyBTd2l0Y2giLCAgICJMaW5lIFBHQSJ9LAorCXsiTGVmdCBIUCBNaXhlciIsICJQQ00gUGxheWJhY2sgU3dpdGNoIiwgICJMZWZ0IERBQyJ9LAorCXsiTGVmdCBIUCBNaXhlciIsICJNaWMgU2lkZXRvbmUgU3dpdGNoIiwgICJNaWMgUEdBIn0sCisJeyJMZWZ0IEhQIE1peGVyIiwgTlVMTCwgICJBTEMgU2lkZXRvbmUgTXV4In0sCisJLy97IlJpZ2h0IEhQIE1peGVyIiwgTlVMTCwgIkhQIE1peGVyIn0sCisKKwkvKiBSaWdodCBIUCBtaXhlciAqLworCXsiUmlnaHQgSFAgTWl4ZXIiLCAiUENCZWVwIEJ5cGFzcyBTd2l0Y2giLCAiUENCRUVQIn0sCisJeyJSaWdodCBIUCBNaXhlciIsICJBdXggUGxheWJhY2sgU3dpdGNoIiwgICJBdXggREFDIn0sCisJeyJSaWdodCBIUCBNaXhlciIsICJQaG9uZSBCeXBhc3MgU3dpdGNoIiwgICJQaG9uZSBQR0EifSwKKwl7IlJpZ2h0IEhQIE1peGVyIiwgIkxpbmUgQnlwYXNzIFN3aXRjaCIsICAgIkxpbmUgUEdBIn0sCisJeyJSaWdodCBIUCBNaXhlciIsICJQQ00gUGxheWJhY2sgU3dpdGNoIiwgICJSaWdodCBEQUMifSwKKwl7IlJpZ2h0IEhQIE1peGVyIiwgIk1pYyBTaWRldG9uZSBTd2l0Y2giLCAgIk1pYyBQR0EifSwKKwl7IlJpZ2h0IEhQIE1peGVyIiwgTlVMTCwgICJBTEMgU2lkZXRvbmUgTXV4In0sCisKKwkvKiBzcGVha2VyIG1peGVyICovCisJeyJTcGVha2VyIE1peGVyIiwgIlBDQmVlcCBCeXBhc3MgU3dpdGNoIiwgIlBDQkVFUCJ9LAorCXsiU3BlYWtlciBNaXhlciIsICJMaW5lIEJ5cGFzcyBTd2l0Y2giLCAgICJMaW5lIFBHQSJ9LAorCXsiU3BlYWtlciBNaXhlciIsICJQQ00gUGxheWJhY2sgU3dpdGNoIiwgICJBQzk3IE1peGVyIn0sCisJeyJTcGVha2VyIE1peGVyIiwgIlBob25lIEJ5cGFzcyBTd2l0Y2giLCAgIlBob25lIFBHQSJ9LAorCXsiU3BlYWtlciBNaXhlciIsICJBdXggUGxheWJhY2sgU3dpdGNoIiwgICJBdXggREFDIn0sCisKKwkvKiBQaG9uZSBtaXhlciAqLworCXsiUGhvbmUgTWl4ZXIiLCAiUENCZWVwIEJ5cGFzcyBTd2l0Y2giLCAgIlBDQkVFUCJ9LAorCXsiUGhvbmUgTWl4ZXIiLCAiTGluZSBCeXBhc3MgU3dpdGNoIiwgICAgIkxpbmUgUEdBIn0sCisJeyJQaG9uZSBNaXhlciIsICJBdXggUGxheWJhY2sgU3dpdGNoIiwgICAiQXV4IERBQyJ9LAorCXsiUGhvbmUgTWl4ZXIiLCAiUENNIFBsYXliYWNrIFN3aXRjaCIsICAgIkFDOTcgTWl4ZXIifSwKKwl7IlBob25lIE1peGVyIiwgIk1pYyAxIFNpZGV0b25lIFN3aXRjaCIsICJNaWMgUEdBIn0sCisJeyJQaG9uZSBNaXhlciIsICJNaWMgMiBTaWRldG9uZSBTd2l0Y2giLCAiTWljIFBHQSJ9LAorCisJLyogaW5wdXRzICovCisJeyJMaW5lIFBHQSIsIE5VTEwsICJMSU5FSU5MIn0sCisJeyJMaW5lIFBHQSIsIE5VTEwsICJMSU5FSU5SIn0sCisJeyJQaG9uZSBQR0EiLCBOVUxMLCAiUEhPTkUifSwKKwl7Ik1pYyBQR0EiLCBOVUxMLCAiTUlDMSJ9LAorCXsiTWljIFBHQSIsIE5VTEwsICJNSUMyIn0sCisKKwkvKiBsZWZ0IGNhcHR1cmUgc2VsZWN0b3IgKi8KKwl7IkxlZnQgQ2FwdHVyZSBTZWxlY3QiLCAiTWljIiwgIk1JQzEifSwKKwl7IkxlZnQgQ2FwdHVyZSBTZWxlY3QiLCAiU3BlYWtlciBNaXhlciIsICJTcGVha2VyIE1peGVyIn0sCisJeyJMZWZ0IENhcHR1cmUgU2VsZWN0IiwgIkxpbmUiLCAiTElORUlOTCJ9LAorCXsiTGVmdCBDYXB0dXJlIFNlbGVjdCIsICJIZWFkcGhvbmUgTWl4ZXIiLCAiTGVmdCBIUCBNaXhlciJ9LAorCXsiTGVmdCBDYXB0dXJlIFNlbGVjdCIsICJQaG9uZSBNaXhlciIsICJQaG9uZSBNaXhlciJ9LAorCXsiTGVmdCBDYXB0dXJlIFNlbGVjdCIsICJQaG9uZSIsICJQSE9ORSJ9LAorCisJLyogcmlnaHQgY2FwdHVyZSBzZWxlY3RvciAqLworCXsiUmlnaHQgQ2FwdHVyZSBTZWxlY3QiLCAiTWljIiwgIk1JQzIifSwKKwl7IlJpZ2h0IENhcHR1cmUgU2VsZWN0IiwgIlNwZWFrZXIgTWl4ZXIiLCAiU3BlYWtlciBNaXhlciJ9LAorCXsiUmlnaHQgQ2FwdHVyZSBTZWxlY3QiLCAiTGluZSIsICJMSU5FSU5SIn0sCisJeyJSaWdodCBDYXB0dXJlIFNlbGVjdCIsICJIZWFkcGhvbmUgTWl4ZXIiLCAiUmlnaHQgSFAgTWl4ZXIifSwKKwl7IlJpZ2h0IENhcHR1cmUgU2VsZWN0IiwgIlBob25lIE1peGVyIiwgIlBob25lIE1peGVyIn0sCisJeyJSaWdodCBDYXB0dXJlIFNlbGVjdCIsICJQaG9uZSIsICJQSE9ORSJ9LAorCisJLyogQUxDIFNpZGV0b25lICovCisJeyJBTEMgU2lkZXRvbmUgTXV4IiwgIlN0ZXJlbyIsICJMZWZ0IENhcHR1cmUgU2VsZWN0In0sCisJeyJBTEMgU2lkZXRvbmUgTXV4IiwgIlN0ZXJlbyIsICJSaWdodCBDYXB0dXJlIFNlbGVjdCJ9LAorCXsiQUxDIFNpZGV0b25lIE11eCIsICJMZWZ0IiwgIkxlZnQgQ2FwdHVyZSBTZWxlY3QifSwKKwl7IkFMQyBTaWRldG9uZSBNdXgiLCAiUmlnaHQiLCAiUmlnaHQgQ2FwdHVyZSBTZWxlY3QifSwKKworCS8qIEFEQydzICovCisJeyJMZWZ0IEFEQyIsIE5VTEwsICJMZWZ0IENhcHR1cmUgU2VsZWN0In0sCisJeyJSaWdodCBBREMiLCBOVUxMLCAiUmlnaHQgQ2FwdHVyZSBTZWxlY3QifSwKKworCS8qIG91dHB1dHMgKi8KKwl7Ik1PTk9PVVQiLCBOVUxMLCAiUGhvbmUgTWl4ZXIifSwKKwl7IkhQT1VUTCIsIE5VTEwsICJIZWFkcGhvbmUgUEdBIn0sCisJeyJIZWFkcGhvbmUgUEdBIiwgTlVMTCwgIkxlZnQgSFAgTWl4ZXIifSwKKwl7IkhQT1VUUiIsIE5VTEwsICJIZWFkcGhvbmUgUEdBIn0sCisJeyJIZWFkcGhvbmUgUEdBIiwgTlVMTCwgIlJpZ2h0IEhQIE1peGVyIn0sCisKKwkvKiBtb25vIGhwIG1peGVyICovCisJeyJNb25vIEhQIE1peGVyIiwgTlVMTCwgIkxlZnQgSFAgTWl4ZXIifSwKKwl7Ik1vbm8gSFAgTWl4ZXIiLCBOVUxMLCAiUmlnaHQgSFAgTWl4ZXIifSwKKworCS8qIE91dDMgTXV4ICovCisJeyJPdXQzIE11eCIsICJMZWZ0IiwgIkxlZnQgSFAgTWl4ZXIifSwKKwl7Ik91dDMgTXV4IiwgIk1vbm8iLCAiUGhvbmUgTWl4ZXIifSwKKwl7Ik91dDMgTXV4IiwgIkxlZnQgKyBSaWdodCIsICJNb25vIEhQIE1peGVyIn0sCisJeyJPdXQgMyBQR0EiLCBOVUxMLCAiT3V0MyBNdXgifSwKKwl7Ik9VVDMiLCBOVUxMLCAiT3V0IDMgUEdBIn0sCisKKwkvKiBzcGVha2VyIE11eCAqLworCXsiU3BlYWtlciBNdXgiLCAiU3BlYWtlciBNaXgiLCAiU3BlYWtlciBNaXhlciJ9LAorCXsiU3BlYWtlciBNdXgiLCAiSGVhZHBob25lIE1peCIsICJNb25vIEhQIE1peGVyIn0sCisJeyJTcGVha2VyIFBHQSIsIE5VTEwsICJTcGVha2VyIE11eCJ9LAorCXsiTE9VVDIiLCBOVUxMLCAiU3BlYWtlciBQR0EifSwKKwl7IlJPVVQyIiwgTlVMTCwgIlNwZWFrZXIgUEdBIn0sCisKKwl7TlVMTCwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgaW50IHdtOTcxMl9hZGRfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtOTcxMl9kYXBtX3dpZGdldHMpOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9sKGNvZGVjLCAmd205NzEyX2RhcG1fd2lkZ2V0c1tpXSk7CisJfQorCisJLyogc2V0IHVwIGF1ZGlvIHBhdGggYXVkaW9fbWFwbmVjdHMgKi8KKwlmb3IoaSA9IDA7IGF1ZGlvX21hcFtpXVswXSAhPSBOVUxMOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX2Nvbm5lY3RfaW5wdXQoY29kZWMsIGF1ZGlvX21hcFtpXVswXSwKKwkJCWF1ZGlvX21hcFtpXVsxXSwgYXVkaW9fbWFwW2ldWzJdKTsKKwl9CisKKwlzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFjOTdfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJdW5zaWduZWQgaW50IHJlZykKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKworCWlmIChyZWcgPT0gQUM5N19SRVNFVCB8fCByZWcgPT0gQUM5N19HUElPX1NUQVRVUyB8fAorCQlyZWcgPT0gQUM5N19WRU5ET1JfSUQxIHx8IHJlZyA9PSBBQzk3X1ZFTkRPUl9JRDIgfHwKKwkJcmVnID09IEFDOTdfUkVDX0dBSU4pCisJCXJldHVybiBzb2NfYWM5N19vcHMucmVhZChjb2RlYy0+YWM5NywgcmVnKTsKKwllbHNlIHsKKwkJcmVnID0gcmVnID4+IDE7CisKKwkJaWYgKHJlZyA+IChBUlJBWV9TSVpFKHdtOTcxMl9yZWcpKSkKKwkJCXJldHVybiAtRUlPOworCisJCXJldHVybiBjYWNoZVtyZWddOworCX0KK30KKworc3RhdGljIGludCBhYzk3X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwl1bnNpZ25lZCBpbnQgdmFsKQoreworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCisJc29jX2FjOTdfb3BzLndyaXRlKGNvZGVjLT5hYzk3LCByZWcsIHZhbCk7CisJcmVnID0gcmVnID4+IDE7CisJaWYgKHJlZyA8PSAoQVJSQVlfU0laRSh3bTk3MTJfcmVnKSkpCisJCWNhY2hlW3JlZ10gPSB2YWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYzk3X3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCWludCByZWc7CisJdTE2IHZyYTsKKworCXZyYSA9IGFjOTdfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCWFjOTdfd3JpdGUoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLCB2cmEgfCAweDEpOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXJlZyA9IEFDOTdfUENNX0ZST05UX0RBQ19SQVRFOworCWVsc2UKKwkJcmVnID0gQUM5N19QQ01fTFJfQURDX1JBVEU7CisKKwlyZXR1cm4gYWM5N193cml0ZShjb2RlYywgcmVnLCBydW50aW1lLT5yYXRlKTsKK30KKworc3RhdGljIGludCBhYzk3X2F1eF9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwl1MTYgdnJhLCB4c2xlOworCisJdnJhID0gYWM5N19yZWFkKGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisJYWM5N193cml0ZShjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIHZyYSB8IDB4MSk7CisJeHNsZSA9IGFjOTdfcmVhZChjb2RlYywgQUM5N19QQ0lfU0lEKTsKKwlhYzk3X3dyaXRlKGNvZGVjLCBBQzk3X1BDSV9TSUQsIHhzbGUgfCAweDgwMDApOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtICE9IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGFjOTdfd3JpdGUoY29kZWMsIEFDOTdfUENNX1NVUlJfREFDX1JBVEUsIHJ1bnRpbWUtPnJhdGUpOworfQorCisjZGVmaW5lIFdNOTcxMl9BQzk3X1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfFwKKwkJU05EUlZfUENNX1JBVEVfMjIwNTAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwKQorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgd205NzEyX2RhaVtdID0geworeworCS5uYW1lID0gIkFDOTcgSGlGaSIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiSGlGaSBQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV005NzEyX0FDOTdfUkFURVMsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkhpRmkgQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV005NzEyX0FDOTdfUkFURVMsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkub3BzID0geworCQkucHJlcGFyZSA9IGFjOTdfcHJlcGFyZSx9LAorfSwKK3sKKwkubmFtZSA9ICJBQzk3IEF1eCIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiQXV4IFBsYXliYWNrIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAxLAorCQkucmF0ZXMgPSBXTTk3MTJfQUM5N19SQVRFUywKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCS5vcHMgPSB7CisJCS5wcmVwYXJlID0gYWM5N19hdXhfcHJlcGFyZSx9LAorfQorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHdtOTcxMl9kYWkpOworCitzdGF0aWMgaW50IHdtOTcxMl9kYXBtX2V2ZW50KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGV2ZW50KQoreworCXUxNiByZWc7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDA6IC8qIGZ1bGwgT24gKi8KKwkJLyogbGlhbSAtIG1heWJlIGVuYWJsZSB0aGVybWFsIHNodXRkb3duICovCisJCXJlZyA9IGFjOTdfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9NSUQpICYgMHhkZmZmOworCQlhYzk3X3dyaXRlKGNvZGVjLCBBQzk3X0VYVEVOREVEX01JRCwgcmVnKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDE6IC8qIHBhcnRpYWwgT24gKi8KKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMjogLyogcGFydGlhbCBPbiAqLworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2hvdDogLyogT2ZmLCB3aXRoIHBvd2VyICovCisJCS8qIGVuYWJsZSBtYXN0ZXIgYmlhcyBhbmQgdm1pZCAqLworCQlyZWcgPSBhYzk3X3JlYWQoY29kZWMsIEFDOTdfRVhURU5ERURfTUlEKSAmIDB4YmJmZjsKKwkJYWM5N193cml0ZShjb2RlYywgQUM5N19FWFRFTkRFRF9NSUQsIHJlZyk7CisJCWFjOTdfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJET1dOLCAweDAwMDApOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2NvbGQ6IC8qIE9mZiwgd2l0aG91dCBwb3dlciAqLworCQkvKiBkaXNhYmxlIGV2ZXJ5dGhpbmcgaW5jbHVkaW5nIEFDIGxpbmsgKi8KKwkJYWM5N193cml0ZShjb2RlYywgQUM5N19FWFRFTkRFRF9NSUQsIDB4ZmZmZik7CisJCWFjOTdfd3JpdGUoY29kZWMsIEFDOTdfRVhURU5ERURfTVNUQVRVUywgMHhmZmZmKTsKKwkJYWM5N193cml0ZShjb2RlYywgQUM5N19QT1dFUkRPV04sIDB4ZmZmZik7CisJCWJyZWFrOworCX0KKwljb2RlYy0+ZGFwbV9zdGF0ZSA9IGV2ZW50OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtOTcxMl9yZXNldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCB0cnlfd2FybSkKK3sKKwlpZiAodHJ5X3dhcm0gJiYgc29jX2FjOTdfb3BzLndhcm1fcmVzZXQpIHsKKwkJc29jX2FjOTdfb3BzLndhcm1fcmVzZXQoY29kZWMtPmFjOTcpOworCQlpZiAoIShhYzk3X3JlYWQoY29kZWMsIDApICYgMHg4MDAwKSkKKwkJCXJldHVybiAxOworCX0KKworCXNvY19hYzk3X29wcy5yZXNldChjb2RlYy0+YWM5Nyk7CisJaWYgKGFjOTdfcmVhZChjb2RlYywgMCkgJiAweDgwMDApCisJCWdvdG8gZXJyOworCXJldHVybiAwOworCitlcnI6CisJcHJpbnRrKEtFUk5fRVJSICJXTTk3MTIgQUM5NyByZXNldCBmYWlsZWRcbiIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IHdtOTcxMl9zb2Nfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwl3bTk3MTJfZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QzY29sZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd205NzEyX3NvY19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IGksIHJldDsKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKworCXJldCA9IHdtOTcxMl9yZXNldChjb2RlYywgMSk7CisJaWYgKHJldCA8IDApeworCQlwcmludGsoS0VSTl9FUlIgImNvdWxkIG5vdCByZXNldCBBQzk3IGNvZGVjXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl3bTk3MTJfZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKKworCWlmIChyZXQgPT0gMCkgeworCQkvKiBTeW5jIHJlZ19jYWNoZSB3aXRoIHRoZSBoYXJkd2FyZSBhZnRlciBjb2xkIHJlc2V0ICovCisJCWZvciAoaSA9IDI7IGkgPCBBUlJBWV9TSVpFKHdtOTcxMl9yZWcpIDw8IDE7IGkrPTIpIHsKKwkJCWlmIChpID09IEFDOTdfSU5UX1BBR0lORyB8fCBpID09IEFDOTdfUE9XRVJET1dOIHx8CisJCQkJKGkgPiAweDU4ICYmIGkgIT0gMHg1YykpCisJCQkJY29udGludWU7CisJCQlzb2NfYWM5N19vcHMud3JpdGUoY29kZWMtPmFjOTcsIGksIGNhY2hlW2k+PjFdKTsKKwkJfQorCX0KKworCWlmIChjb2RlYy0+c3VzcGVuZF9kYXBtX3N0YXRlID09IFNORFJWX0NUTF9QT1dFUl9EMCkKKwkJd205NzEyX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdtOTcxMl9zb2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlpbnQgcmV0ID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gIldNOTcxMS9XTTk3MTIgU29DIEF1ZGlvIENvZGVjICVzXG4iLCBXTTk3MTJfVkVSU0lPTik7CisKKwlzb2NkZXYtPmNvZGVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zb2NfY29kZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc29jZGV2LT5jb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwljb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJbXV0ZXhfaW5pdCgmY29kZWMtPm11dGV4KTsKKworCWNvZGVjLT5yZWdfY2FjaGUgPQorCQlremFsbG9jKHNpemVvZih1MTYpICogQVJSQVlfU0laRSh3bTk3MTJfcmVnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNvZGVjLT5yZWdfY2FjaGUgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGNhY2hlX2VycjsKKwl9CisJbWVtY3B5KGNvZGVjLT5yZWdfY2FjaGUsIHdtOTcxMl9yZWcsIHNpemVvZih1MTYpICogQVJSQVlfU0laRSh3bTk3MTJfcmVnKSk7CisJY29kZWMtPnJlZ19jYWNoZV9zaXplID0gc2l6ZW9mKHUxNikgKiBBUlJBWV9TSVpFKHdtOTcxMl9yZWcpOworCWNvZGVjLT5yZWdfY2FjaGVfc3RlcCA9IDI7CisKKwljb2RlYy0+bmFtZSA9ICJXTTk3MTIiOworCWNvZGVjLT5vd25lciA9IFRISVNfTU9EVUxFOworCWNvZGVjLT5kYWkgPSB3bTk3MTJfZGFpOworCWNvZGVjLT5udW1fZGFpID0gQVJSQVlfU0laRSh3bTk3MTJfZGFpKTsKKwljb2RlYy0+d3JpdGUgPSBhYzk3X3dyaXRlOworCWNvZGVjLT5yZWFkID0gYWM5N19yZWFkOworCWNvZGVjLT5kYXBtX2V2ZW50ID0gd205NzEyX2RhcG1fZXZlbnQ7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5kYXBtX3dpZGdldHMpOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV9wYXRocyk7CisKKwlyZXQgPSBzbmRfc29jX25ld19hYzk3X2NvZGVjKGNvZGVjLCAmc29jX2FjOTdfb3BzLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIndtOTcxMjogZmFpbGVkIHRvIHJlZ2lzdGVyIEFDOTcgY29kZWNcbiIpOworCQlnb3RvIGNvZGVjX2VycjsKKwl9CisKKwkvKiByZWdpc3RlciBwY21zICovCisJcmV0ID0gc25kX3NvY19uZXdfcGNtcyhzb2NkZXYsIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBwY21fZXJyOworCisJcmV0ID0gd205NzEyX3Jlc2V0KGNvZGVjLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkFDOTcgbGluayBlcnJvclxuIik7CisJCWdvdG8gcmVzZXRfZXJyOworCX0KKworCS8qIHNldCBhbGMgbXV4IHRvIG5vbmUgKi8KKwlhYzk3X3dyaXRlKGNvZGVjLCBBQzk3X1ZJREVPLCBhYzk3X3JlYWQoY29kZWMsIEFDOTdfVklERU8pIHwgMHgzMDAwKTsKKworCXdtOTcxMl9kYXBtX2V2ZW50KGNvZGVjLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOworCXdtOTcxMl9hZGRfY29udHJvbHMoY29kZWMpOworCXdtOTcxMl9hZGRfd2lkZ2V0cyhjb2RlYyk7CisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKHNvY2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3bTk3MTI6IGZhaWxlZCB0byByZWdpc3RlciBjYXJkXG4iKTsKKwkJZ290byByZXNldF9lcnI7CisJfQorCisJcmV0dXJuIDA7CisKK3Jlc2V0X2VycjoKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworCitwY21fZXJyOgorCXNuZF9zb2NfZnJlZV9hYzk3X2NvZGVjKGNvZGVjKTsKKworY29kZWNfZXJyOgorCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOworCitjYWNoZV9lcnI6CisJa2ZyZWUoc29jZGV2LT5jb2RlYyk7CisJc29jZGV2LT5jb2RlYyA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bTk3MTJfc29jX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXNuZF9zb2NfZGFwbV9mcmVlKHNvY2Rldik7CisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlzbmRfc29jX2ZyZWVfYWM5N19jb2RlYyhjb2RlYyk7CisJa2ZyZWUoY29kZWMtPnJlZ19jYWNoZSk7CisJa2ZyZWUoY29kZWMpOworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl93bTk3MTIgPSB7CisJLnByb2JlID0gCXdtOTcxMl9zb2NfcHJvYmUsCisJLnJlbW92ZSA9IAl3bTk3MTJfc29jX3JlbW92ZSwKKwkuc3VzcGVuZCA9CXdtOTcxMl9zb2Nfc3VzcGVuZCwKKwkucmVzdW1lID0Jd205NzEyX3NvY19yZXN1bWUsCit9OworCitFWFBPUlRfU1lNQk9MX0dQTChzb2NfY29kZWNfZGV2X3dtOTcxMik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBXTTk3MTEvV005NzEyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTk3MTIuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5MTA1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIHdtOTcxMi5oICAtLSAgV005NzEyIFNvYyBBdWRpbyBkcml2ZXIKKyAqLworCisjaWZuZGVmIF9XTTk3MTJfSAorI2RlZmluZSBfV005NzEyX0gKKworI2RlZmluZSBXTTk3MTJfREFJX0FDOTdfSElGSQkwCisjZGVmaW5lIFdNOTcxMl9EQUlfQUM5N19BVVgJCTEKKworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSB3bTk3MTJfZGFpWzJdOworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3dtOTcxMjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL0tjb25maWcgYi9zb3VuZC9zb2MvcHhhL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5ZTFjOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9weGEvS2NvbmZpZwpAQCAtMCwwICsxLDYwIEBACittZW51ICJTb0MgQXVkaW8gZm9yIHRoZSBJbnRlbCBQWEEyeHgiCisKK2NvbmZpZyBTTkRfUFhBMlhYX1NPQworCXRyaXN0YXRlICJTb0MgQXVkaW8gZm9yIHRoZSBJbnRlbCBQWEEyeHggY2hpcCIKKwlkZXBlbmRzIG9uIEFSQ0hfUFhBICYmIFNORAorCXNlbGVjdCBTTkRfUENNCisJaGVscAorCSAgU2F5IFkgb3IgTSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgY29kZWNzIGF0dGFjaGVkIHRvCisJICB0aGUgUFhBMnh4IEFDOTcsIEkyUyBvciBTU1AgaW50ZXJmYWNlLiBZb3Ugd2lsbCBhbHNvIG5lZWQKKwkgIHRvIHNlbGVjdCB0aGUgYXVkaW8gaW50ZXJmYWNlcyB0byBzdXBwb3J0IGJlbG93LgorCitjb25maWcgU05EX1BYQTJYWF9BQzk3CisJdHJpc3RhdGUKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKworY29uZmlnIFNORF9QWEEyWFhfU09DX0FDOTcKKwl0cmlzdGF0ZQorCXNlbGVjdCBBQzk3X0JVUworCXNlbGVjdCBTTkRfU09DX0FDOTdfQlVTCisKK2NvbmZpZyBTTkRfUFhBMlhYX1NPQ19JMlMKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1BYQTJYWF9TT0NfQ09SR0kKKwl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFNoYXJwIFphdXJ1cyBTTC1DN3gwIgorCWRlcGVuZHMgb24gU05EX1BYQTJYWF9TT0MgJiYgUFhBX1NIQVJQX0M3eHgKKwlzZWxlY3QgU05EX1BYQTJYWF9TT0NfSTJTCisJc2VsZWN0IFNORF9TT0NfV004NzMxCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBTaGFycAorCSAgWmF1cnVzIFNMLUM3eDAgbW9kZWxzIChDb3JnaSwgU2hlcGhlcmQsIEh1c2t5KS4KKworY29uZmlnIFNORF9QWEEyWFhfU09DX1NQSVRaCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBTaGFycCBaYXVydXMgU0wtQ3h4MDAiCisJZGVwZW5kcyBvbiBTTkRfUFhBMlhYX1NPQyAmJiBQWEFfU0hBUlBfQ3h4MDAKKwlzZWxlY3QgU05EX1BYQTJYWF9TT0NfSTJTCisJc2VsZWN0IFNORF9TT0NfV004NzUwCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBTaGFycAorCSAgWmF1cnVzIFNMLUN4eDAwIG1vZGVscyAoU3BpdHosIEJvcnpvaSBhbmQgQWtpdGEpLgorCitjb25maWcgU05EX1BYQTJYWF9TT0NfUE9PRExFCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBQb29kbGUiCisJZGVwZW5kcyBvbiBTTkRfUFhBMlhYX1NPQyAmJiBNQUNIX1BPT0RMRQorCXNlbGVjdCBTTkRfUFhBMlhYX1NPQ19JMlMKKwlzZWxlY3QgU05EX1NPQ19XTTg3MzEKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIFNoYXJwCisJICBaYXVydXMgU0wtNTYwMCBtb2RlbCAoUG9vZGxlKS4KKworY29uZmlnIFNORF9QWEEyWFhfU09DX1RPU0EKKwl0cmlzdGF0ZSAiU29DIEFDOTcgQXVkaW8gc3VwcG9ydCBmb3IgVG9zYSIKKwlkZXBlbmRzIG9uIFNORF9QWEEyWFhfU09DICYmIE1BQ0hfVE9TQQorCXNlbGVjdCBTTkRfUFhBMlhYX1NPQ19BQzk3CisJc2VsZWN0IFNORF9TT0NfV005NzEyCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBTaGFycAorCSAgWmF1cnVzIFNMLUM2MDAweCBtb2RlbHMgKFRvc2EpLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL01ha2VmaWxlIGIvc291bmQvc29jL3B4YS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGUwZDZiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3B4YS9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACisjIFBYQSBQbGF0Zm9ybSBTdXBwb3J0CitzbmQtc29jLXB4YTJ4eC1vYmpzIDo9IHB4YTJ4eC1wY20ubworc25kLXNvYy1weGEyeHgtYWM5Ny1vYmpzIDo9IHB4YTJ4eC1hYzk3Lm8KK3NuZC1zb2MtcHhhMnh4LWkycy1vYmpzIDo9IHB4YTJ4eC1pMnMubworCitvYmotJChDT05GSUdfU05EX1BYQTJYWF9TT0MpICs9IHNuZC1zb2MtcHhhMnh4Lm8KK29iai0kKENPTkZJR19TTkRfUFhBMlhYX1NPQ19BQzk3KSArPSBzbmQtc29jLXB4YTJ4eC1hYzk3Lm8KK29iai0kKENPTkZJR19TTkRfUFhBMlhYX1NPQ19JMlMpICs9IHNuZC1zb2MtcHhhMnh4LWkycy5vCisKKyMgUFhBIE1hY2hpbmUgU3VwcG9ydAorc25kLXNvYy1jb3JnaS1vYmpzIDo9IGNvcmdpLm8KK3NuZC1zb2MtcG9vZGxlLW9ianMgOj0gcG9vZGxlLm8KK3NuZC1zb2MtdG9zYS1vYmpzIDo9IHRvc2Eubworc25kLXNvYy1zcGl0ei1vYmpzIDo9IHNwaXR6Lm8KKworb2JqLSQoQ09ORklHX1NORF9QWEEyWFhfU09DX0NPUkdJKSArPSBzbmQtc29jLWNvcmdpLm8KK29iai0kKENPTkZJR19TTkRfUFhBMlhYX1NPQ19QT09ETEUpICs9IHNuZC1zb2MtcG9vZGxlLm8KK29iai0kKENPTkZJR19TTkRfUFhBMlhYX1NPQ19UT1NBKSArPSBzbmQtc29jLXRvc2Eubworb2JqLSQoQ09ORklHX1NORF9QWEEyWFhfU09DX1NQSVRaKSArPSBzbmQtc29jLXNwaXR6Lm8KKwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9jb3JnaS5jIGIvc291bmQvc29jL3B4YS9jb3JnaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZTUxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcHhhL2NvcmdpLmMKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiBjb3JnaS5jICAtLSAgU29DIGF1ZGlvIGZvciBDb3JnaQorICoKKyAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3JzOiBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiAgICAgICAgICBSaWNoYXJkIFB1cmRpZSA8cmljaGFyZEBvcGVuZWRoYW5kLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMzB0aCBOb3YgMjAwNSAgIEluaXRpYWwgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3Njb29wLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NvcmdpLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXVkaW8uaD4KKworI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg3MzEuaCIKKyNpbmNsdWRlICJweGEyeHgtcGNtLmgiCisjaW5jbHVkZSAicHhhMnh4LWkycy5oIgorCisjZGVmaW5lIENPUkdJX0hQICAgICAgICAwCisjZGVmaW5lIENPUkdJX01JQyAgICAgICAxCisjZGVmaW5lIENPUkdJX0xJTkUgICAgICAyCisjZGVmaW5lIENPUkdJX0hFQURTRVQgICAzCisjZGVmaW5lIENPUkdJX0hQX09GRiAgICA0CisjZGVmaW5lIENPUkdJX1NQS19PTiAgICAwCisjZGVmaW5lIENPUkdJX1NQS19PRkYgICAxCisKKyAvKiBhdWRpbyBjbG9jayBpbiBIeiAtIHJvdW5kZWQgZnJvbSAxMi4yMzVNSHogKi8KKyNkZWZpbmUgQ09SR0lfQVVESU9fQ0xPQ0sgMTIyODgwMDAKKworc3RhdGljIGludCBjb3JnaV9qYWNrX2Z1bmM7CitzdGF0aWMgaW50IGNvcmdpX3Nwa19mdW5jOworCitzdGF0aWMgdm9pZCBjb3JnaV9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IHNwayA9IDAsIG1pYyA9IDAsIGxpbmUgPSAwLCBocCA9IDAsIGhzID0gMDsKKworCS8qIHNldCB1cCBqYWNrIGNvbm5lY3Rpb24gKi8KKwlzd2l0Y2ggKGNvcmdpX2phY2tfZnVuYykgeworCWNhc2UgQ09SR0lfSFA6CisJCWhwID0gMTsKKwkJLyogc2V0ID0gdW5tdXRlIGhlYWRwaG9uZSAqLworCQlzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfTVVURV9MKTsKKwkJc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfUik7CisJCWJyZWFrOworCWNhc2UgQ09SR0lfTUlDOgorCQltaWMgPSAxOworCQkvKiByZXNldCA9IG11dGUgaGVhZHBob25lICovCisJCXJlc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfTCk7CisJCXJlc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfUik7CisJCWJyZWFrOworCWNhc2UgQ09SR0lfTElORToKKwkJbGluZSA9IDE7CisJCXJlc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfTCk7CisJCXJlc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfUik7CisJCWJyZWFrOworCWNhc2UgQ09SR0lfSEVBRFNFVDoKKwkJaHMgPSAxOworCQltaWMgPSAxOworCQlyZXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NVVRFX0wpOworCQlzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfTVVURV9SKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGNvcmdpX3Nwa19mdW5jID09IENPUkdJX1NQS19PTikKKwkJc3BrID0gMTsKKworCS8qIHNldCB0aGUgZW5wb2ludHMgdG8gdGhlaXIgbmV3IGNvbm5ldGlvbiBzdGF0ZXMgKi8KKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiRXh0IFNwayIsIHNwayk7CisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk1pYyBKYWNrIiwgbWljKTsKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTGluZSBKYWNrIiwgbGluZSk7CisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgaHApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJIZWFkc2V0IEphY2siLCBocyk7CisKKwkvKiBzaWduYWwgYSBEQVBNIGV2ZW50ICovCisJc25kX3NvY19kYXBtX3N5bmNfZW5kcG9pbnRzKGNvZGVjKTsKK30KKworc3RhdGljIGludCBjb3JnaV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPnNvY2Rldi0+Y29kZWM7CisKKwkvKiBjaGVjayB0aGUgamFjayBzdGF0dXMgYXQgc3RyZWFtIHN0YXJ0dXAgKi8KKwljb3JnaV9leHRfY29udHJvbChjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHdlIG5lZWQgdG8gdW5tdXRlIHRoZSBIUCBhdCBzaHV0ZG93biBhcyB0aGUgbXV0ZSBidXJucyBwb3dlciBvbiBjb3JnaSAqLworc3RhdGljIGludCBjb3JnaV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5zb2NkZXYtPmNvZGVjOworCisJLyogc2V0ID0gdW5tdXRlIGhlYWRwaG9uZSAqLworCXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NVVRFX0wpOworCXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NVVRFX1IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcmdpX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWkgPSBydGQtPmRhaS0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKwl1bnNpZ25lZCBpbnQgY2xrID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCWNhc2UgODAwMDoKKwljYXNlIDE2MDAwOgorCWNhc2UgNDgwMDA6CisJY2FzZSA5NjAwMDoKKwkJY2xrID0gMTIyODgwMDA7CisJCWJyZWFrOworCWNhc2UgMTEwMjU6CisJY2FzZSAyMjA1MDoKKwljYXNlIDQ0MTAwOgorCQljbGsgPSAxMTI4OTYwMDsKKwkJYnJlYWs7CisJfQorCisJLyogc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gY29kZWNfZGFpLT5kYWlfb3BzLnNldF9mbXQoY29kZWNfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IGNwdV9kYWktPmRhaV9vcHMuc2V0X2ZtdChjcHVfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCisJcmV0ID0gY29kZWNfZGFpLT5kYWlfb3BzLnNldF9zeXNjbGsoY29kZWNfZGFpLCBXTTg3MzFfU1lTQ0xLLCBjbGssCisJCVNORF9TT0NfQ0xPQ0tfSU4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IHRoZSBJMlMgc3lzdGVtIGNsb2NrIGFzIGlucHV0ICh1bnVzZWQpICovCisJcmV0ID0gY3B1X2RhaS0+ZGFpX29wcy5zZXRfc3lzY2xrKGNwdV9kYWksIFBYQTJYWF9JMlNfU1lTQ0xLLCAwLAorCQlTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGNvcmdpX29wcyA9IHsKKwkuc3RhcnR1cCA9IGNvcmdpX3N0YXJ0dXAsCisJLmh3X3BhcmFtcyA9IGNvcmdpX2h3X3BhcmFtcywKKwkuc2h1dGRvd24gPSBjb3JnaV9zaHV0ZG93biwKK307CisKK3N0YXRpYyBpbnQgY29yZ2lfZ2V0X2phY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjb3JnaV9qYWNrX2Z1bmM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29yZ2lfc2V0X2phY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJaWYgKGNvcmdpX2phY2tfZnVuYyA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJcmV0dXJuIDA7CisKKwljb3JnaV9qYWNrX2Z1bmMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwljb3JnaV9leHRfY29udHJvbChjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY29yZ2lfZ2V0X3NwayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGNvcmdpX3Nwa19mdW5jOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcmdpX3NldF9zcGsoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWlmIChjb3JnaV9zcGtfZnVuYyA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJcmV0dXJuIDA7CisKKwljb3JnaV9zcGtfZnVuYyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWNvcmdpX2V4dF9jb250cm9sKGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjb3JnaV9hbXBfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCBldmVudCkKK3sKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKKwkJc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX0FQTV9PTik7CisJZWxzZQorCQlyZXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9BUE1fT04pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29yZ2lfbWljX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBpbnQgZXZlbnQpCit7CisJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCisJCXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NSUNfQklBUyk7CisJZWxzZQorCQlyZXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NSUNfQklBUyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogY29yZ2kgbWFjaGluZSBkYXBtIHdpZGdldHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3MzFfZGFwbV93aWRnZXRzW10gPSB7CitTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZSBKYWNrIiwgTlVMTCksCitTTkRfU09DX0RBUE1fTUlDKCJNaWMgSmFjayIsIGNvcmdpX21pY19ldmVudCksCitTTkRfU09DX0RBUE1fU1BLKCJFeHQgU3BrIiwgY29yZ2lfYW1wX2V2ZW50KSwKK1NORF9TT0NfREFQTV9MSU5FKCJMaW5lIEphY2siLCBOVUxMKSwKK1NORF9TT0NfREFQTV9IUCgiSGVhZHNldCBKYWNrIiwgTlVMTCksCit9OworCisvKiBDb3JnaSBtYWNoaW5lIGF1ZGlvIG1hcCAoY29ubmVjdGlvbnMgdG8gdGhlIGNvZGVjIHBpbnMpICovCitzdGF0aWMgY29uc3QgY2hhciAqYXVkaW9fbWFwW11bM10gPSB7CisKKwkvKiBoZWFkc2V0IEphY2sgIC0gaW4gPSBtaWNpbiwgb3V0ID0gTEhQT1VUKi8KKwl7IkhlYWRzZXQgSmFjayIsIE5VTEwsICJMSFBPVVQifSwKKworCS8qIGhlYWRwaG9uZSBjb25uZWN0ZWQgdG8gTEhQT1VUMSwgUkhQT1VUMSAqLworCXsiSGVhZHBob25lIEphY2siLCBOVUxMLCAiTEhQT1VUIn0sCisJeyJIZWFkcGhvbmUgSmFjayIsIE5VTEwsICJSSFBPVVQifSwKKworCS8qIHNwZWFrZXIgY29ubmVjdGVkIHRvIExPVVQsIFJPVVQgKi8KKwl7IkV4dCBTcGsiLCBOVUxMLCAiUk9VVCJ9LAorCXsiRXh0IFNwayIsIE5VTEwsICJMT1VUIn0sCisKKwkvKiBtaWMgaXMgY29ubmVjdGVkIHRvIE1JQ0lOICh2aWEgcmlnaHQgY2hhbm5lbCBvZiBoZWFkcGhvbmUgamFjaykgKi8KKwl7Ik1JQ0lOIiwgTlVMTCwgIk1pYyBKYWNrIn0sCisKKwkvKiBTYW1lIGFzIHRoZSBhYm92ZSBidXQgbm8gbWljIGJpYXMgZm9yIGxpbmUgc2lnbmFscyAqLworCXsiTUlDSU4iLCBOVUxMLCAiTGluZSBKYWNrIn0sCisKKwl7TlVMTCwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqamFja19mdW5jdGlvbltdID0geyJIZWFkcGhvbmUiLCAiTWljIiwgIkxpbmUiLCAiSGVhZHNldCIsCisJIk9mZiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKnNwa19mdW5jdGlvbltdID0geyJPbiIsICJPZmYifTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY29yZ2lfZW51bVtdID0geworCVNPQ19FTlVNX1NJTkdMRV9FWFQoNSwgamFja19mdW5jdGlvbiksCisJU09DX0VOVU1fU0lOR0xFX0VYVCgyLCBzcGtfZnVuY3Rpb24pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODczMV9jb3JnaV9jb250cm9sc1tdID0geworCVNPQ19FTlVNX0VYVCgiSmFjayBGdW5jdGlvbiIsIGNvcmdpX2VudW1bMF0sIGNvcmdpX2dldF9qYWNrLAorCQljb3JnaV9zZXRfamFjayksCisJU09DX0VOVU1fRVhUKCJTcGVha2VyIEZ1bmN0aW9uIiwgY29yZ2lfZW51bVsxXSwgY29yZ2lfZ2V0X3NwaywKKwkJY29yZ2lfc2V0X3NwayksCit9OworCisvKgorICogTG9naWMgZm9yIGEgd204NzMxIGFzIGNvbm5lY3RlZCBvbiBhIFNoYXJwIFNMLUM3eDAgRGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgY29yZ2lfd204NzMxX2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBpLCBlcnI7CisKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTExJTkVJTiIsIDApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJSTElORUlOIiwgMCk7CisKKwkvKiBBZGQgY29yZ2kgc3BlY2lmaWMgY29udHJvbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg3MzFfY29yZ2lfY29udHJvbHMpOyBpKyspIHsKKwkJZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmNhcmQsCisJCQlzbmRfc29jX2NuZXcoJndtODczMV9jb3JnaV9jb250cm9sc1tpXSxjb2RlYywgTlVMTCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogQWRkIGNvcmdpIHNwZWNpZmljIHdpZGdldHMgKi8KKwlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMV9kYXBtX3dpZGdldHMpOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9sKGNvZGVjLCAmd204NzMxX2RhcG1fd2lkZ2V0c1tpXSk7CisJfQorCisJLyogU2V0IHVwIGNvcmdpIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCisJZm9yKGkgPSAwOyBhdWRpb19tYXBbaV1bMF0gIT0gTlVMTDsgaSsrKSB7CisJCXNuZF9zb2NfZGFwbV9jb25uZWN0X2lucHV0KGNvZGVjLCBhdWRpb19tYXBbaV1bMF0sCisJCQlhdWRpb19tYXBbaV1bMV0sIGF1ZGlvX21hcFtpXVsyXSk7CisJfQorCisJc25kX3NvY19kYXBtX3N5bmNfZW5kcG9pbnRzKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworLyogY29yZ2kgZGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgY29yZ2lfZGFpID0geworCS5uYW1lID0gIldNODczMSIsCisJLnN0cmVhbV9uYW1lID0gIldNODczMSIsCisJLmNwdV9kYWkgPSAmcHhhX2kyc19kYWksCisJLmNvZGVjX2RhaSA9ICZ3bTg3MzFfZGFpLAorCS5pbml0ID0gY29yZ2lfd204NzMxX2luaXQsCisJLm9wcyA9ICZjb3JnaV9vcHMsCit9OworCisvKiBjb3JnaSBhdWRpbyBtYWNoaW5lIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX21hY2hpbmUgc25kX3NvY19tYWNoaW5lX2NvcmdpID0geworCS5uYW1lID0gIkNvcmdpIiwKKwkuZGFpX2xpbmsgPSAmY29yZ2lfZGFpLAorCS5udW1fbGlua3MgPSAxLAorfTsKKworLyogY29yZ2kgYXVkaW8gcHJpdmF0ZSBkYXRhICovCitzdGF0aWMgc3RydWN0IHdtODczMV9zZXR1cF9kYXRhIGNvcmdpX3dtODczMV9zZXR1cCA9IHsKKwkuaTJjX2FkZHJlc3MgPSAweDFiLAorfTsKKworLyogY29yZ2kgYXVkaW8gc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlIGNvcmdpX3NuZF9kZXZkYXRhID0geworCS5tYWNoaW5lID0gJnNuZF9zb2NfbWFjaGluZV9jb3JnaSwKKwkucGxhdGZvcm0gPSAmcHhhMnh4X3NvY19wbGF0Zm9ybSwKKwkuY29kZWNfZGV2ID0gJnNvY19jb2RlY19kZXZfd204NzMxLAorCS5jb2RlY19kYXRhID0gJmNvcmdpX3dtODczMV9zZXR1cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjb3JnaV9zbmRfZGV2aWNlOworCitzdGF0aWMgaW50IF9faW5pdCBjb3JnaV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghKG1hY2hpbmVfaXNfY29yZ2koKSB8fCBtYWNoaW5lX2lzX3NoZXBoZXJkKCkgfHwgbWFjaGluZV9pc19odXNreSgpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljb3JnaV9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7CisJaWYgKCFjb3JnaV9zbmRfZGV2aWNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGNvcmdpX3NuZF9kZXZpY2UsICZjb3JnaV9zbmRfZGV2ZGF0YSk7CisJY29yZ2lfc25kX2RldmRhdGEuZGV2ID0gJmNvcmdpX3NuZF9kZXZpY2UtPmRldjsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGNvcmdpX3NuZF9kZXZpY2UpOworCisJaWYgKHJldCkKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChjb3JnaV9zbmRfZGV2aWNlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb3JnaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoY29yZ2lfc25kX2RldmljZSk7Cit9CisKK21vZHVsZV9pbml0KGNvcmdpX2luaXQpOworbW9kdWxlX2V4aXQoY29yZ2lfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiUmljaGFyZCBQdXJkaWUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgQ29yZ2kiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcG9vZGxlLmMgYi9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTVjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogcG9vZGxlLmMgIC0tICBTb0MgYXVkaW8gZm9yIFBvb2RsZQorICoKKyAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3JzOiBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiAgICAgICAgICBSaWNoYXJkIFB1cmRpZSA8cmljaGFyZEBvcGVuZWRoYW5kLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2xvY29tby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9wb29kbGUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdWRpby5oPgorCisjaW5jbHVkZSAiLi4vY29kZWNzL3dtODczMS5oIgorI2luY2x1ZGUgInB4YTJ4eC1wY20uaCIKKyNpbmNsdWRlICJweGEyeHgtaTJzLmgiCisKKyNkZWZpbmUgUE9PRExFX0hQICAgICAgICAxCisjZGVmaW5lIFBPT0RMRV9IUF9PRkYgICAgMAorI2RlZmluZSBQT09ETEVfU1BLX09OICAgIDEKKyNkZWZpbmUgUE9PRExFX1NQS19PRkYgICAwCisKKyAvKiBhdWRpbyBjbG9jayBpbiBIeiAtIHJvdW5kZWQgZnJvbSAxMi4yMzVNSHogKi8KKyNkZWZpbmUgUE9PRExFX0FVRElPX0NMT0NLIDEyMjg4MDAwCisKK3N0YXRpYyBpbnQgcG9vZGxlX2phY2tfZnVuYzsKK3N0YXRpYyBpbnQgcG9vZGxlX3Nwa19mdW5jOworCitzdGF0aWMgdm9pZCBwb29kbGVfZXh0X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBzcGsgPSAwOworCisJLyogc2V0IHVwIGphY2sgY29ubmVjdGlvbiAqLworCWlmIChwb29kbGVfamFja19mdW5jID09IFBPT0RMRV9IUCkgeworCQkvKiBzZXQgPSB1bm11dGUgaGVhZHBob25lICovCisJCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCQlQT09ETEVfTE9DT01PX0dQSU9fTVVURV9MLCAxKTsKKwkJbG9jb21vX2dwaW9fd3JpdGUoJnBvb2RsZV9sb2NvbW9fZGV2aWNlLmRldiwKKwkJCVBPT0RMRV9MT0NPTU9fR1BJT19NVVRFX1IsIDEpOworCQlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiSGVhZHBob25lIEphY2siLCAxKTsKKwl9IGVsc2UgeworCQlsb2NvbW9fZ3Bpb193cml0ZSgmcG9vZGxlX2xvY29tb19kZXZpY2UuZGV2LAorCQkJUE9PRExFX0xPQ09NT19HUElPX01VVEVfTCwgMCk7CisJCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCQlQT09ETEVfTE9DT01PX0dQSU9fTVVURV9SLCAwKTsKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgMCk7CisJfQorCisJaWYgKHBvb2RsZV9zcGtfZnVuYyA9PSBQT09ETEVfU1BLX09OKQorCQlzcGsgPSAxOworCisJLyogc2V0IHRoZSBlbnBvaW50cyB0byB0aGVpciBuZXcgY29ubmV0aW9uIHN0YXRlcyAqLworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJFeHQgU3BrIiwgc3BrKTsKKworCS8qIHNpZ25hbCBhIERBUE0gZXZlbnQgKi8KKwlzbmRfc29jX2RhcG1fc3luY19lbmRwb2ludHMoY29kZWMpOworfQorCitzdGF0aWMgaW50IHBvb2RsZV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPnNvY2Rldi0+Y29kZWM7CisKKwkvKiBjaGVjayB0aGUgamFjayBzdGF0dXMgYXQgc3RyZWFtIHN0YXJ0dXAgKi8KKwlwb29kbGVfZXh0X2NvbnRyb2woY29kZWMpOworCXJldHVybiAwOworfQorCisvKiB3ZSBuZWVkIHRvIHVubXV0ZSB0aGUgSFAgYXQgc2h1dGRvd24gYXMgdGhlIG11dGUgYnVybnMgcG93ZXIgb24gcG9vZGxlICovCitzdGF0aWMgaW50IHBvb2RsZV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5zb2NkZXYtPmNvZGVjOworCisJLyogc2V0ID0gdW5tdXRlIGhlYWRwaG9uZSAqLworCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCVBPT0RMRV9MT0NPTU9fR1BJT19NVVRFX0wsIDEpOworCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCVBPT0RMRV9MT0NPTU9fR1BJT19NVVRFX1IsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvb2RsZV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpID0gcnRkLT5kYWktPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gcnRkLT5kYWktPmNwdV9kYWk7CisJdW5zaWduZWQgaW50IGNsayA9IDA7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwljYXNlIDgwMDA6CisJY2FzZSAxNjAwMDoKKwljYXNlIDQ4MDAwOgorCWNhc2UgOTYwMDA6CisJCWNsayA9IDEyMjg4MDAwOworCQlicmVhazsKKwljYXNlIDExMDI1OgorCWNhc2UgMjIwNTA6CisJY2FzZSA0NDEwMDoKKwkJY2xrID0gMTEyODk2MDA7CisJCWJyZWFrOworCX0KKworCS8qIHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IGNvZGVjX2RhaS0+ZGFpX29wcy5zZXRfZm10KGNvZGVjX2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTIHwKKwkJU05EX1NPQ19EQUlGTVRfTkJfTkYgfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb24gKi8KKwlyZXQgPSBjcHVfZGFpLT5kYWlfb3BzLnNldF9mbXQoY3B1X2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTIHwKKwkJU05EX1NPQ19EQUlGTVRfTkJfTkYgfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrIGZvciBEQUMgYW5kIEFEQyAqLworCXJldCA9IGNvZGVjX2RhaS0+ZGFpX29wcy5zZXRfc3lzY2xrKGNvZGVjX2RhaSwgV004NzMxX1NZU0NMSywgY2xrLAorCQlTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHNldCB0aGUgSTJTIHN5c3RlbSBjbG9jayBhcyBpbnB1dCAodW51c2VkKSAqLworCXJldCA9IGNwdV9kYWktPmRhaV9vcHMuc2V0X3N5c2NsayhjcHVfZGFpLCBQWEEyWFhfSTJTX1NZU0NMSywgMCwKKwkJU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBwb29kbGVfb3BzID0geworCS5zdGFydHVwID0gcG9vZGxlX3N0YXJ0dXAsCisJLmh3X3BhcmFtcyA9IHBvb2RsZV9od19wYXJhbXMsCisJLnNodXRkb3duID0gcG9vZGxlX3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBwb29kbGVfZ2V0X2phY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwb29kbGVfamFja19mdW5jOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvb2RsZV9zZXRfamFjayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJaWYgKHBvb2RsZV9qYWNrX2Z1bmMgPT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCXJldHVybiAwOworCisJcG9vZGxlX2phY2tfZnVuYyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXBvb2RsZV9leHRfY29udHJvbChjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcG9vZGxlX2dldF9zcGsoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwb29kbGVfc3BrX2Z1bmM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG9vZGxlX3NldF9zcGsoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWlmIChwb29kbGVfc3BrX2Z1bmMgPT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCXJldHVybiAwOworCisJcG9vZGxlX3Nwa19mdW5jID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJcG9vZGxlX2V4dF9jb250cm9sKGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwb29kbGVfYW1wX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBpbnQgZXZlbnQpCit7CisJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCisJCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCQlQT09ETEVfTE9DT01PX0dQSU9fQU1QX09OLCAwKTsKKwllbHNlCisJCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCQlQT09ETEVfTE9DT01PX0dQSU9fQU1QX09OLCAxKTsKKworCXJldHVybiAwOworfQorCisvKiBwb29kbGUgbWFjaGluZSBkYXBtIHdpZGdldHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3MzFfZGFwbV93aWRnZXRzW10gPSB7CitTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZSBKYWNrIiwgTlVMTCksCitTTkRfU09DX0RBUE1fU1BLKCJFeHQgU3BrIiwgcG9vZGxlX2FtcF9ldmVudCksCit9OworCisvKiBDb3JnaSBtYWNoaW5lIGF1ZGlvX21hcG5lY3Rpb25zIHRvIHRoZSBjb2RlYyBwaW5zICovCitzdGF0aWMgY29uc3QgY2hhciAqYXVkaW9fbWFwW11bM10gPSB7CisKKwkvKiBoZWFkcGhvbmUgY29ubmVjdGVkIHRvIExIUE9VVDEsIFJIUE9VVDEgKi8KKwl7IkhlYWRwaG9uZSBKYWNrIiwgTlVMTCwgIkxIUE9VVCJ9LAorCXsiSGVhZHBob25lIEphY2siLCBOVUxMLCAiUkhQT1VUIn0sCisKKwkvKiBzcGVha2VyIGNvbm5lY3RlZCB0byBMT1VULCBST1VUICovCisJeyJFeHQgU3BrIiwgTlVMTCwgIlJPVVQifSwKKwl7IkV4dCBTcGsiLCBOVUxMLCAiTE9VVCJ9LAorCisJe05VTEwsIE5VTEwsIE5VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmphY2tfZnVuY3Rpb25bXSA9IHsiT2ZmIiwgIkhlYWRwaG9uZSJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKnNwa19mdW5jdGlvbltdID0geyJPZmYiLCAiT24ifTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcG9vZGxlX2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIGphY2tfZnVuY3Rpb24pLAorCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgc3BrX2Z1bmN0aW9uKSwKK307CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgd204NzMxX3Bvb2RsZV9jb250cm9sc1tdID0geworCVNPQ19FTlVNX0VYVCgiSmFjayBGdW5jdGlvbiIsIHBvb2RsZV9lbnVtWzBdLCBwb29kbGVfZ2V0X2phY2ssCisJCXBvb2RsZV9zZXRfamFjayksCisJU09DX0VOVU1fRVhUKCJTcGVha2VyIEZ1bmN0aW9uIiwgcG9vZGxlX2VudW1bMV0sIHBvb2RsZV9nZXRfc3BrLAorCQlwb29kbGVfc2V0X3NwayksCit9OworCisvKgorICogTG9naWMgZm9yIGEgd204NzMxIGFzIGNvbm5lY3RlZCBvbiBhIFNoYXJwIFNMLUM3eDAgRGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgcG9vZGxlX3dtODczMV9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaSwgZXJyOworCisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkxMSU5FSU4iLCAwKTsKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiUkxJTkVJTiIsIDApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJNSUNJTiIsIDEpOworCisJLyogQWRkIHBvb2RsZSBzcGVjaWZpYyBjb250cm9scyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMV9wb29kbGVfY29udHJvbHMpOyBpKyspIHsKKwkJZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmNhcmQsCisJCQlzbmRfc29jX2NuZXcoJndtODczMV9wb29kbGVfY29udHJvbHNbaV0sY29kZWMsIE5VTEwpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIEFkZCBwb29kbGUgc3BlY2lmaWMgd2lkZ2V0cyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMV9kYXBtX3dpZGdldHMpOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9sKGNvZGVjLCAmd204NzMxX2RhcG1fd2lkZ2V0c1tpXSk7CisJfQorCisJLyogU2V0IHVwIHBvb2RsZSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLworCWZvciAoaSA9IDA7IGF1ZGlvX21hcFtpXVswXSAhPSBOVUxMOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX2Nvbm5lY3RfaW5wdXQoY29kZWMsIGF1ZGlvX21hcFtpXVswXSwKKwkJCWF1ZGlvX21hcFtpXVsxXSwgYXVkaW9fbWFwW2ldWzJdKTsKKwl9CisKKwlzbmRfc29jX2RhcG1fc3luY19lbmRwb2ludHMoY29kZWMpOworCXJldHVybiAwOworfQorCisvKiBwb29kbGUgZGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgcG9vZGxlX2RhaSA9IHsKKwkubmFtZSA9ICJXTTg3MzEiLAorCS5zdHJlYW1fbmFtZSA9ICJXTTg3MzEiLAorCS5jcHVfZGFpID0gJnB4YV9pMnNfZGFpLAorCS5jb2RlY19kYWkgPSAmd204NzMxX2RhaSwKKwkuaW5pdCA9IHBvb2RsZV93bTg3MzFfaW5pdCwKKwkub3BzID0gJnBvb2RsZV9vcHMsCit9OworCisvKiBwb29kbGUgYXVkaW8gbWFjaGluZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHNuZF9zb2NfbWFjaGluZV9wb29kbGUgPSB7CisJLm5hbWUgPSAiUG9vZGxlIiwKKwkuZGFpX2xpbmsgPSAmcG9vZGxlX2RhaSwKKwkubnVtX2xpbmtzID0gMSwKK307CisKKy8qIHBvb2RsZSBhdWRpbyBwcml2YXRlIGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3Qgd204NzMxX3NldHVwX2RhdGEgcG9vZGxlX3dtODczMV9zZXR1cCA9IHsKKwkuaTJjX2FkZHJlc3MgPSAweDFiLAorfTsKKworLyogcG9vZGxlIGF1ZGlvIHN1YnN5c3RlbSAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RldmljZSBwb29kbGVfc25kX2RldmRhdGEgPSB7CisJLm1hY2hpbmUgPSAmc25kX3NvY19tYWNoaW5lX3Bvb2RsZSwKKwkucGxhdGZvcm0gPSAmcHhhMnh4X3NvY19wbGF0Zm9ybSwKKwkuY29kZWNfZGV2ID0gJnNvY19jb2RlY19kZXZfd204NzMxLAorCS5jb2RlY19kYXRhID0gJnBvb2RsZV93bTg3MzFfc2V0dXAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcG9vZGxlX3NuZF9kZXZpY2U7CisKK3N0YXRpYyBpbnQgX19pbml0IHBvb2RsZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghbWFjaGluZV9pc19wb29kbGUoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlsb2NvbW9fZ3Bpb19zZXRfZGlyKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCVBPT0RMRV9MT0NPTU9fR1BJT19BTVBfT04sIDApOworCS8qIHNob3VsZCB3ZSBtdXRlIEhQIGF0IHN0YXJ0dXAgLSBidXJuaW5nIHBvd2VyID8qLworCWxvY29tb19ncGlvX3NldF9kaXIoJnBvb2RsZV9sb2NvbW9fZGV2aWNlLmRldiwKKwkJUE9PRExFX0xPQ09NT19HUElPX01VVEVfTCwgMCk7CisJbG9jb21vX2dwaW9fc2V0X2RpcigmcG9vZGxlX2xvY29tb19kZXZpY2UuZGV2LAorCQlQT09ETEVfTE9DT01PX0dQSU9fTVVURV9SLCAwKTsKKworCXBvb2RsZV9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7CisJaWYgKCFwb29kbGVfc25kX2RldmljZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwb29kbGVfc25kX2RldmljZSwgJnBvb2RsZV9zbmRfZGV2ZGF0YSk7CisJcG9vZGxlX3NuZF9kZXZkYXRhLmRldiA9ICZwb29kbGVfc25kX2RldmljZS0+ZGV2OworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQocG9vZGxlX3NuZF9kZXZpY2UpOworCisJaWYgKHJldCkKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChwb29kbGVfc25kX2RldmljZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcG9vZGxlX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihwb29kbGVfc25kX2RldmljZSk7Cit9CisKK21vZHVsZV9pbml0KHBvb2RsZV9pbml0KTsKK21vZHVsZV9leGl0KHBvb2RsZV9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJSaWNoYXJkIFB1cmRpZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBQb29kbGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcHhhMnh4LWFjOTcuYyBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LWFjOTcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmJiZWZmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3B4YS9weGEyeHgtYWM5Ny5jCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogbGludXgvc291bmQvcHhhMnh4LWFjOTcuYyAtLSBBQzk3IHN1cHBvcnQgZm9yIHRoZSBJbnRlbCBQWEEyeHggY2hpcC4KKyAqCisgKiBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqIENyZWF0ZWQ6CURlYyAwMiwgMjAwNAorICogQ29weXJpZ2h0OglNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXVkaW8uaD4KKworI2luY2x1ZGUgInB4YTJ4eC1wY20uaCIKKyNpbmNsdWRlICJweGEyeHgtYWM5Ny5oIgorCitzdGF0aWMgREVGSU5FX01VVEVYKGNhcl9tdXRleCk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZ3NyX3dxKTsKK3N0YXRpYyB2b2xhdGlsZSBsb25nIGdzcl9iaXRzOworCisvKgorICogQmV3YXJlIFBYQTI3eCBidWdzOgorICoKKyAqICAgbyBTbG90IDEyIHJlYWQgZnJvbSBtb2RlbSBzcGFjZSB3aWxsIGhhbmcgY29udHJvbGxlci4KKyAqICAgbyBDRE9ORSwgU0RPTkUgaW50ZXJydXB0IGZhaWxzIGFmdGVyIGFueSBzbG90IDEyIElPLgorICoKKyAqIFdlIHRoZXJlZm9yZSBoYXZlIGFuIGh5YnJpZCBhcHByb2FjaCBmb3Igd2FpdGluZyBvbiBTRE9ORSAoaW50ZXJydXB0IG9yCisgKiAxIGppZmZ5IHRpbWVvdXQgaWYgaW50ZXJydXB0IG5ldmVyIGNvbWVzKS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcHhhMnh4X2FjOTdfcmVhZChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsCisJdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXVuc2lnbmVkIHNob3J0IHZhbCA9IC0xOworCXZvbGF0aWxlIHUzMiAqcmVnX2FkZHI7CisKKwltdXRleF9sb2NrKCZjYXJfbXV0ZXgpOworCisJLyogc2V0IHVwIHByaW1hcnkgb3Igc2Vjb25kYXJ5IGNvZGVjL21vZGVtIHNwYWNlICovCisjaWZkZWYgQ09ORklHX1BYQTI3eAorCXJlZ19hZGRyID0gYWM5Ny0+bnVtID8gJlNBQ19SRUdfQkFTRSA6ICZQQUNfUkVHX0JBU0U7CisjZWxzZQorCWlmIChyZWcgPT0gQUM5N19HUElPX1NUQVRVUykKKwkJcmVnX2FkZHIgPSBhYzk3LT5udW0gPyAmU01DX1JFR19CQVNFIDogJlBNQ19SRUdfQkFTRTsKKwllbHNlCisJCXJlZ19hZGRyID0gYWM5Ny0+bnVtID8gJlNBQ19SRUdfQkFTRSA6ICZQQUNfUkVHX0JBU0U7CisjZW5kaWYKKwlyZWdfYWRkciArPSAocmVnID4+IDEpOworCisjaWZuZGVmIENPTkZJR19QWEEyN3gKKwlpZiAocmVnID09IEFDOTdfR1BJT19TVEFUVVMpIHsKKwkJLyogcmVhZCBmcm9tIGNvbnRyb2xsZXIgY2FjaGUgKi8KKwkJdmFsID0gKnJlZ19hZGRyOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKworCS8qIHN0YXJ0IHJlYWQgYWNjZXNzIGFjcm9zcyB0aGUgYWM5NyBsaW5rICovCisJR1NSID0gR1NSX0NET05FIHwgR1NSX1NET05FOworCWdzcl9iaXRzID0gMDsKKwl2YWwgPSAqcmVnX2FkZHI7CisKKwl3YWl0X2V2ZW50X3RpbWVvdXQoZ3NyX3dxLCAoR1NSIHwgZ3NyX2JpdHMpICYgR1NSX1NET05FLCAxKTsKKwlpZiAoISgoR1NSIHwgZ3NyX2JpdHMpICYgR1NSX1NET05FKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWFkIGVycm9yIChhYzk3X3JlZz0leCBHU1I9JSNseClcbiIsCisJCQkJX19GVU5DVElPTl9fLCByZWcsIEdTUiB8IGdzcl9iaXRzKTsKKwkJdmFsID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHZhbGlkIGRhdGEgbm93ICovCisJR1NSID0gR1NSX0NET05FIHwgR1NSX1NET05FOworCWdzcl9iaXRzID0gMDsKKwl2YWwgPSAqcmVnX2FkZHI7CisJLyogYnV0IHdlJ3ZlIGp1c3Qgc3RhcnRlZCBhbm90aGVyIGN5Y2xlLi4uICovCisJd2FpdF9ldmVudF90aW1lb3V0KGdzcl93cSwgKEdTUiB8IGdzcl9iaXRzKSAmIEdTUl9TRE9ORSwgMSk7CisKK291dDoJbXV0ZXhfdW5sb2NrKCZjYXJfbXV0ZXgpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHB4YTJ4eF9hYzk3X3dyaXRlKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLAorCXVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwl2b2xhdGlsZSB1MzIgKnJlZ19hZGRyOworCisJbXV0ZXhfbG9jaygmY2FyX211dGV4KTsKKworCS8qIHNldCB1cCBwcmltYXJ5IG9yIHNlY29uZGFyeSBjb2RlYy9tb2RlbSBzcGFjZSAqLworI2lmZGVmIENPTkZJR19QWEEyN3gKKwlyZWdfYWRkciA9IGFjOTctPm51bSA/ICZTQUNfUkVHX0JBU0UgOiAmUEFDX1JFR19CQVNFOworI2Vsc2UKKwlpZiAocmVnID09IEFDOTdfR1BJT19TVEFUVVMpCisJCXJlZ19hZGRyID0gYWM5Ny0+bnVtID8gJlNNQ19SRUdfQkFTRSA6ICZQTUNfUkVHX0JBU0U7CisJZWxzZQorCQlyZWdfYWRkciA9IGFjOTctPm51bSA/ICZTQUNfUkVHX0JBU0UgOiAmUEFDX1JFR19CQVNFOworI2VuZGlmCisJcmVnX2FkZHIgKz0gKHJlZyA+PiAxKTsKKworCUdTUiA9IEdTUl9DRE9ORSB8IEdTUl9TRE9ORTsKKwlnc3JfYml0cyA9IDA7CisJKnJlZ19hZGRyID0gdmFsOworCXdhaXRfZXZlbnRfdGltZW91dChnc3Jfd3EsIChHU1IgfCBnc3JfYml0cykgJiBHU1JfQ0RPTkUsIDEpOworCWlmICghKChHU1IgfCBnc3JfYml0cykgJiBHU1JfQ0RPTkUpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiB3cml0ZSBlcnJvciAoYWM5N19yZWc9JXggR1NSPSUjbHgpXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgcmVnLCBHU1IgfCBnc3JfYml0cyk7CisKKwltdXRleF91bmxvY2soJmNhcl9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHB4YTJ4eF9hYzk3X3dhcm1fcmVzZXQoc3RydWN0IHNuZF9hYzk3ICphYzk3KQoreworCWdzcl9iaXRzID0gMDsKKworI2lmZGVmIENPTkZJR19QWEEyN3gKKwkvKiB3YXJtIHJlc2V0IGJyb2tlbiBvbiBCdWx2ZXJkZSwKKwkgICBzbyBtYW51YWxseSBrZWVwIEFDOTcgcmVzZXQgaGlnaCAqLworCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19PVVQgfCBHUElPX0RGTFRfSElHSCk7CisJdWRlbGF5KDEwKTsKKwlHQ1IgfD0gR0NSX1dBUk1fUlNUOworCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19BTFRfRk5fMl9PVVQpOworCXVkZWxheSg1MDApOworI2Vsc2UKKwlHQ1IgfD0gR0NSX1dBUk1fUlNUIHwgR0NSX1BSSVJEWV9JRU4gfCBHQ1JfU0VDUkRZX0lFTjsKKwl3YWl0X2V2ZW50X3RpbWVvdXQoZ3NyX3dxLCBnc3JfYml0cyAmIChHU1JfUENSIHwgR1NSX1NDUiksIDEpOworI2VuZGlmCisKKwlpZiAoISgoR1NSIHwgZ3NyX2JpdHMpICYgKEdTUl9QQ1IgfCBHU1JfU0NSKSkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB3YXJtIHJlc2V0IHRpbWVvdXQgKEdTUj0lI2x4KVxuIiwKKwkJCQkgX19GVU5DVElPTl9fLCBnc3JfYml0cyk7CisKKwlHQ1IgJj0gfihHQ1JfUFJJUkRZX0lFTnxHQ1JfU0VDUkRZX0lFTik7CisJR0NSIHw9IEdDUl9TRE9ORV9JRXxHQ1JfQ0RPTkVfSUU7Cit9CisKK3N0YXRpYyB2b2lkIHB4YTJ4eF9hYzk3X2NvbGRfcmVzZXQoc3RydWN0IHNuZF9hYzk3ICphYzk3KQoreworCUdDUiAmPSAgR0NSX0NPTERfUlNUOyAgLyogY2xlYXIgZXZlcnl0aGluZyBidXQgbkNSU1QgKi8KKwlHQ1IgJj0gfkdDUl9DT0xEX1JTVDsgIC8qIHRoZW4gYXNzZXJ0IG5DUlNUICovCisKKwlnc3JfYml0cyA9IDA7CisjaWZkZWYgQ09ORklHX1BYQTI3eAorCS8qIFBYQTI3eCBEZXZlbG9wZXJzIE1hbnVhbCBzZWN0aW9uIDEzLjUuMi4yLjEgKi8KKwlweGFfc2V0X2NrZW4oMSA8PCAzMSwgMSk7CisJdWRlbGF5KDUpOworCXB4YV9zZXRfY2tlbigxIDw8IDMxLCAwKTsKKwlHQ1IgPSBHQ1JfQ09MRF9SU1Q7CisJdWRlbGF5KDUwKTsKKyNlbHNlCisJR0NSID0gR0NSX0NPTERfUlNUOworCUdDUiB8PSBHQ1JfQ0RPTkVfSUV8R0NSX1NET05FX0lFOworCXdhaXRfZXZlbnRfdGltZW91dChnc3Jfd3EsIGdzcl9iaXRzICYgKEdTUl9QQ1IgfCBHU1JfU0NSKSwgMSk7CisjZW5kaWYKKworCWlmICghKChHU1IgfCBnc3JfYml0cykgJiAoR1NSX1BDUiB8IEdTUl9TQ1IpKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbGQgcmVzZXQgdGltZW91dCAoR1NSPSUjbHgpXG4iLAorCQkJCSBfX0ZVTkNUSU9OX18sIGdzcl9iaXRzKTsKKworCUdDUiAmPSB+KEdDUl9QUklSRFlfSUVOfEdDUl9TRUNSRFlfSUVOKTsKKwlHQ1IgfD0gR0NSX1NET05FX0lFfEdDUl9DRE9ORV9JRTsKK30KKworc3RhdGljIGlycXJldHVybl90IHB4YTJ4eF9hYzk3X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJbG9uZyBzdGF0dXM7CisKKwlzdGF0dXMgPSBHU1I7CisJaWYgKHN0YXR1cykgeworCQlHU1IgPSBzdGF0dXM7CisJCWdzcl9iaXRzIHw9IHN0YXR1czsKKwkJd2FrZV91cCgmZ3NyX3dxKTsKKworI2lmZGVmIENPTkZJR19QWEEyN3gKKwkJLyogQWx0aG91Z2ggd2UgZG9uJ3QgdXNlIHRob3NlIHdlIHN0aWxsIG5lZWQgdG8gY2xlYXIgdGhlbQorCQkgICBzaW5jZSB0aGV5IHRlbmQgdG8gc3B1cmlvdXNseSB0cmlnZ2VyIHdoZW4gTU1DIGlzIHVzZWQKKwkJICAgKGhhcmR3YXJlIGJ1Zz8gZ28gZmlndXJlKS4uLiAqLworCQlNSVNSID0gTUlTUl9FT0M7CisJCVBJU1IgPSBQSVNSX0VPQzsKKwkJTUNTUiA9IE1DU1JfRU9DOworI2VuZGlmCisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgc29jX2FjOTdfb3BzID0geworCS5yZWFkCT0gcHhhMnh4X2FjOTdfcmVhZCwKKwkud3JpdGUJPSBweGEyeHhfYWM5N193cml0ZSwKKwkud2FybV9yZXNldAk9IHB4YTJ4eF9hYzk3X3dhcm1fcmVzZXQsCisJLnJlc2V0CT0gcHhhMnh4X2FjOTdfY29sZF9yZXNldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X3BjbV9kbWFfcGFyYW1zIHB4YTJ4eF9hYzk3X3BjbV9zdGVyZW9fb3V0ID0geworCS5uYW1lCQkJPSAiQUM5NyBQQ00gU3RlcmVvIG91dCIsCisJLmRldl9hZGRyCQk9IF9fUFJFRyhQQ0RSKSwKKwkuZHJjbXIJCQk9ICZEUkNNUlRYUENEUiwKKwkuZGNtZAkJCT0gRENNRF9JTkNTUkNBRERSIHwgRENNRF9GTE9XVFJHIHwKKwkJCQkgIERDTURfQlVSU1QzMiB8IERDTURfV0lEVEg0LAorfTsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgcHhhMnh4X2FjOTdfcGNtX3N0ZXJlb19pbiA9IHsKKwkubmFtZQkJCT0gIkFDOTcgUENNIFN0ZXJlbyBpbiIsCisJLmRldl9hZGRyCQk9IF9fUFJFRyhQQ0RSKSwKKwkuZHJjbXIJCQk9ICZEUkNNUlJYUENEUiwKKwkuZGNtZAkJCT0gRENNRF9JTkNUUkdBRERSIHwgRENNRF9GTE9XU1JDIHwKKwkJCQkgIERDTURfQlVSU1QzMiB8IERDTURfV0lEVEg0LAorfTsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgcHhhMnh4X2FjOTdfcGNtX2F1eF9tb25vX291dCA9IHsKKwkubmFtZQkJCT0gIkFDOTcgQXV4IFBDTSAoU2xvdCA1KSBNb25vIG91dCIsCisJLmRldl9hZGRyCQk9IF9fUFJFRyhNT0RSKSwKKwkuZHJjbXIJCQk9ICZEUkNNUlRYTU9EUiwKKwkuZGNtZAkJCT0gRENNRF9JTkNTUkNBRERSIHwgRENNRF9GTE9XVFJHIHwKKwkJCQkgIERDTURfQlVSU1QxNiB8IERDTURfV0lEVEgyLAorfTsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgcHhhMnh4X2FjOTdfcGNtX2F1eF9tb25vX2luID0geworCS5uYW1lCQkJPSAiQUM5NyBBdXggUENNIChTbG90IDUpIE1vbm8gaW4iLAorCS5kZXZfYWRkcgkJPSBfX1BSRUcoTU9EUiksCisJLmRyY21yCQkJPSAmRFJDTVJSWE1PRFIsCisJLmRjbWQJCQk9IERDTURfSU5DVFJHQUREUiB8IERDTURfRkxPV1NSQyB8CisJCQkJICBEQ01EX0JVUlNUMTYgfCBEQ01EX1dJRFRIMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X3BjbV9kbWFfcGFyYW1zIHB4YTJ4eF9hYzk3X3BjbV9taWNfbW9ub19pbiA9IHsKKwkubmFtZQkJCT0gIkFDOTcgTWljIFBDTSAoU2xvdCA2KSBNb25vIGluIiwKKwkuZGV2X2FkZHIJCT0gX19QUkVHKE1DRFIpLAorCS5kcmNtcgkJCT0gJkRSQ01SUlhNQ0RSLAorCS5kY21kCQkJPSBEQ01EX0lOQ1RSR0FERFIgfCBEQ01EX0ZMT1dTUkMgfAorCQkJCSAgRENNRF9CVVJTVDE2IHwgRENNRF9XSURUSDIsCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHB4YTJ4eF9hYzk3X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpkYWkpCit7CisJR0NSIHw9IEdDUl9BQ0xJTktfT0ZGOworCXB4YV9zZXRfY2tlbihDS0VOMl9BQzk3LCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGEyeHhfYWM5N19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpkYWkpCit7CisJcHhhX2dwaW9fbW9kZShHUElPMzFfU1lOQ19BQzk3X01EKTsKKwlweGFfZ3Bpb19tb2RlKEdQSU8zMF9TREFUQV9PVVRfQUM5N19NRCk7CisJcHhhX2dwaW9fbW9kZShHUElPMjhfQklUQ0xLX0FDOTdfTUQpOworCXB4YV9ncGlvX21vZGUoR1BJTzI5X1NEQVRBX0lOX0FDOTdfTUQpOworI2lmZGVmIENPTkZJR19QWEEyN3gKKwkvKiBVc2UgR1BJTyAxMTMgYXMgQUM5NyBSZXNldCBvbiBCdWx2ZXJkZSAqLworCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19BTFRfRk5fMl9PVVQpOworI2VuZGlmCisJcHhhX3NldF9ja2VuKENLRU4yX0FDOTcsIDEpOworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBweGEyeHhfYWM5N19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgcHhhMnh4X2FjOTdfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IHB4YTJ4eF9hYzk3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9BQzk3LCBweGEyeHhfYWM5N19pcnEsIElSUUZfRElTQUJMRUQsICJBQzk3IiwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJcHhhX2dwaW9fbW9kZShHUElPMzFfU1lOQ19BQzk3X01EKTsKKwlweGFfZ3Bpb19tb2RlKEdQSU8zMF9TREFUQV9PVVRfQUM5N19NRCk7CisJcHhhX2dwaW9fbW9kZShHUElPMjhfQklUQ0xLX0FDOTdfTUQpOworCXB4YV9ncGlvX21vZGUoR1BJTzI5X1NEQVRBX0lOX0FDOTdfTUQpOworI2lmZGVmIENPTkZJR19QWEEyN3gKKwkvKiBVc2UgR1BJTyAxMTMgYXMgQUM5NyBSZXNldCBvbiBCdWx2ZXJkZSAqLworCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19BTFRfRk5fMl9PVVQpOworI2VuZGlmCisJcHhhX3NldF9ja2VuKENLRU4yX0FDOTcsIDEpOworCXJldHVybiAwOworCisgZXJyOgorCWlmIChDS0VOICYgQ0tFTjJfQUM5NykgeworCQlHQ1IgfD0gR0NSX0FDTElOS19PRkY7CisJCWZyZWVfaXJxKElSUV9BQzk3LCBOVUxMKTsKKwkJcHhhX3NldF9ja2VuKENLRU4yX0FDOTcsIDApOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBweGEyeHhfYWM5N19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlHQ1IgfD0gR0NSX0FDTElOS19PRkY7CisJZnJlZV9pcnEoSVJRX0FDOTcsIE5VTEwpOworCXB4YV9zZXRfY2tlbihDS0VOMl9BQzk3LCAwKTsKK30KKworc3RhdGljIGludCBweGEyeHhfYWM5N19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQljcHVfZGFpLT5kbWFfZGF0YSA9ICZweGEyeHhfYWM5N19wY21fc3RlcmVvX291dDsKKwllbHNlCisJCWNwdV9kYWktPmRtYV9kYXRhID0gJnB4YTJ4eF9hYzk3X3BjbV9zdGVyZW9faW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGEyeHhfYWM5N19od19hdXhfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gcnRkLT5kYWktPmNwdV9kYWk7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJY3B1X2RhaS0+ZG1hX2RhdGEgPSAmcHhhMnh4X2FjOTdfcGNtX2F1eF9tb25vX291dDsKKwllbHNlCisJCWNwdV9kYWktPmRtYV9kYXRhID0gJnB4YTJ4eF9hYzk3X3BjbV9hdXhfbW9ub19pbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YTJ4eF9hYzk3X2h3X21pY19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlyZXR1cm4gLUVOT0RFVjsKKwllbHNlCisJCWNwdV9kYWktPmRtYV9kYXRhID0gJnB4YTJ4eF9hYzk3X3BjbV9taWNfbW9ub19pbjsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFBYQTJYWF9BQzk3X1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfFwKKwkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgXAorCQlTTkRSVl9QQ01fUkFURV80ODAwMCkKKworLyoKKyAqIFRoZXJlIGlzIG9ubHkgMSBwaHlzaWNhbCBBQzk3IGludGVyZmFjZSBmb3IgcHhhMnh4LCBidXQgaXQKKyAqIGhhcyBleHRyYSBmaWZvJ3MgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYXV4IERBQ3MgYW5kIEFEQ3MuCisgKi8KK3N0cnVjdCBzbmRfc29jX2NwdV9kYWkgcHhhX2FjOTdfZGFpW10gPSB7Cit7CisJLm5hbWUgPSAicHhhMnh4LWFjOTciLAorCS5pZCA9IDAsCisJLnR5cGUgPSBTTkRfU09DX0RBSV9BQzk3LAorCS5wcm9iZSA9IHB4YTJ4eF9hYzk3X3Byb2JlLAorCS5yZW1vdmUgPSBweGEyeHhfYWM5N19yZW1vdmUsCisJLnN1c3BlbmQgPSBweGEyeHhfYWM5N19zdXNwZW5kLAorCS5yZXN1bWUgPSBweGEyeHhfYWM5N19yZXN1bWUsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiQUM5NyBQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gUFhBMlhYX0FDOTdfUkFURVMsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkFDOTcgQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gUFhBMlhYX0FDOTdfUkFURVMsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkub3BzID0geworCQkuaHdfcGFyYW1zID0gcHhhMnh4X2FjOTdfaHdfcGFyYW1zLH0sCit9LAoreworCS5uYW1lID0gInB4YTJ4eC1hYzk3LWF1eCIsCisJLmlkID0gMSwKKwkudHlwZSA9IFNORF9TT0NfREFJX0FDOTcsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiQUM5NyBBdXggUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDEsCisJCS5yYXRlcyA9IFBYQTJYWF9BQzk3X1JBVEVTLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLH0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJBQzk3IEF1eCBDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAxLAorCQkucmF0ZXMgPSBQWEEyWFhfQUM5N19SQVRFUywKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCS5vcHMgPSB7CisJCS5od19wYXJhbXMgPSBweGEyeHhfYWM5N19od19hdXhfcGFyYW1zLH0sCit9LAoreworCS5uYW1lID0gInB4YTJ4eC1hYzk3LW1pYyIsCisJLmlkID0gMiwKKwkudHlwZSA9IFNORF9TT0NfREFJX0FDOTcsCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJBQzk3IE1pYyBDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAxLAorCQkucmF0ZXMgPSBQWEEyWFhfQUM5N19SQVRFUywKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCS5vcHMgPSB7CisJCS5od19wYXJhbXMgPSBweGEyeHhfYWM5N19od19taWNfcGFyYW1zLH0sCit9LAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwocHhhX2FjOTdfZGFpKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNvY19hYzk3X29wcyk7CisKK01PRFVMRV9BVVRIT1IoIk5pY29sYXMgUGl0cmUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUM5NyBkcml2ZXIgZm9yIHRoZSBJbnRlbCBQWEEyeHggY2hpcCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9weGEyeHgtYWM5Ny5oIGIvc291bmQvc29jL3B4YS9weGEyeHgtYWM5Ny5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNGI4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1hYzk3LmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIGxpbnV4L3NvdW5kL2FybS9weGEyeHgtYWM5Ny5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9QWEEyWFhfQUM5N19ICisjZGVmaW5lIF9QWEEyWFhfQUM5N19ICisKKy8qIHB4YTJ4eCBEQUkgSUQncyAqLworI2RlZmluZSBQWEEyWFhfREFJX0FDOTdfSElGSQkwCisjZGVmaW5lIFBYQTJYWF9EQUlfQUM5N19BVVgJCTEKKyNkZWZpbmUgUFhBMlhYX0RBSV9BQzk3X01JQwkJMgorCitleHRlcm4gc3RydWN0IHNuZF9zb2NfY3B1X2RhaSBweGFfYWM5N19kYWlbM107CisKKy8qIHBsYXRmb3JtIGRhdGEgKi8KK2V4dGVybiBzdHJ1Y3Qgc25kX2FjOTdfYnVzX29wcyBweGEyeHhfYWM5N19vcHM7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9weGEyeHgtaTJzLmMgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1pMnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVhNjEzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3B4YS9weGEyeHgtaTJzLmMKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBweGEyeHgtaTJzLmMgIC0tICBBTFNBIFNvYyBBdWRpbyBMYXllcgorICoKKyAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKKyAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMTJ0aCBBdWcgMjAwNSAgIEluaXRpYWwgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXVkaW8uaD4KKworI2luY2x1ZGUgInB4YTJ4eC1wY20uaCIKKyNpbmNsdWRlICJweGEyeHgtaTJzLmgiCisKK3N0cnVjdCBweGFfaTJzX3BvcnQgeworCXUzMiBzYWRpdjsKKwl1MzIgc2FjcjA7CisJdTMyIHNhY3IxOworCXUzMiBzYWltcjsKKwlpbnQgbWFzdGVyOworCXUzMiBmbXQ7Cit9Oworc3RhdGljIHN0cnVjdCBweGFfaTJzX3BvcnQgcHhhX2kyczsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgcHhhMnh4X2kyc19wY21fc3RlcmVvX291dCA9IHsKKwkubmFtZQkJCT0gIkkyUyBQQ00gU3RlcmVvIG91dCIsCisJLmRldl9hZGRyCQk9IF9fUFJFRyhTQURSKSwKKwkuZHJjbXIJCQk9ICZEUkNNUlRYU0FEUiwKKwkuZGNtZAkJCT0gRENNRF9JTkNTUkNBRERSIHwgRENNRF9GTE9XVFJHIHwKKwkJCQkgIERDTURfQlVSU1QzMiB8IERDTURfV0lEVEg0LAorfTsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgcHhhMnh4X2kyc19wY21fc3RlcmVvX2luID0geworCS5uYW1lCQkJPSAiSTJTIFBDTSBTdGVyZW8gaW4iLAorCS5kZXZfYWRkcgkJPSBfX1BSRUcoU0FEUiksCisJLmRyY21yCQkJPSAmRFJDTVJSWFNBRFIsCisJLmRjbWQJCQk9IERDTURfSU5DVFJHQUREUiB8IERDTURfRkxPV1NSQyB8CisJCQkJICBEQ01EX0JVUlNUMzIgfCBEQ01EX1dJRFRINCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X2dwaW8gZ3Bpb19idXNbXSA9IHsKKwl7IC8qIEkyUyBTb0MgU2xhdmUgKi8KKwkJLnJ4ID0gR1BJTzI5X1NEQVRBX0lOX0kyU19NRCwKKwkJLnR4ID0gR1BJTzMwX1NEQVRBX09VVF9JMlNfTUQsCisJCS5jbGsgPSBHUElPMjhfQklUQ0xLX0lOX0kyU19NRCwKKwkJLmZybSA9IEdQSU8zMV9TWU5DX0kyU19NRCwKKwl9LAorCXsgLyogSTJTIFNvQyBNYXN0ZXIgKi8KKyNpZmRlZiBDT05GSUdfUFhBMjd4CisJCS5zeXMgPSBHUElPMTEzX0kyU19TWVNDTEtfTUQsCisjZWxzZQorCQkuc3lzID0gR1BJTzMyX1NZU0NMS19JMlNfTUQsCisjZW5kaWYKKwkJLnJ4ID0gR1BJTzI5X1NEQVRBX0lOX0kyU19NRCwKKwkJLnR4ID0gR1BJTzMwX1NEQVRBX09VVF9JMlNfTUQsCisJCS5jbGsgPSBHUElPMjhfQklUQ0xLX09VVF9JMlNfTUQsCisJCS5mcm0gPSBHUElPMzFfU1lOQ19JMlNfTUQsCisJfSwKK307CisKK3N0YXRpYyBpbnQgcHhhMnh4X2kyc19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gcnRkLT5kYWktPmNwdV9kYWk7CisKKwlpZiAoIWNwdV9kYWktPmFjdGl2ZSkgeworCQlTQUNSMCB8PSBTQUNSMF9SU1Q7CisJCVNBQ1IwID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogd2FpdCBmb3IgSTJTIGNvbnRyb2xsZXIgdG8gYmUgcmVhZHkgKi8KK3N0YXRpYyBpbnQgcHhhX2kyc193YWl0KHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBmbHVzaCB0aGUgUnggRklGTyAqLworCWZvcihpID0gMDsgaSA8IDE2OyBpKyspCisJCVNBRFI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X2kyc19zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KQoreworCS8qIGludGVyZmFjZSBmb3JtYXQgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCXB4YV9pMnMuZm10ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCXB4YV9pMnMuZm10ID0gU0FDUjFfQU1TTDsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJcHhhX2kycy5tYXN0ZXIgPSAxOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRlM6CisJCXB4YV9pMnMubWFzdGVyID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YTJ4eF9pMnNfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSwKKwkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJaWYgKGNsa19pZCAhPSBQWEEyWFhfSTJTX1NZU0NMSykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocHhhX2kycy5tYXN0ZXIgJiYgZGlyID09IFNORF9TT0NfQ0xPQ0tfT1VUKQorCQlweGFfZ3Bpb19tb2RlKGdwaW9fYnVzW3B4YV9pMnMubWFzdGVyXS5zeXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X2kyc19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKworCXB4YV9ncGlvX21vZGUoZ3Bpb19idXNbcHhhX2kycy5tYXN0ZXJdLnJ4KTsKKwlweGFfZ3Bpb19tb2RlKGdwaW9fYnVzW3B4YV9pMnMubWFzdGVyXS50eCk7CisJcHhhX2dwaW9fbW9kZShncGlvX2J1c1tweGFfaTJzLm1hc3Rlcl0uZnJtKTsKKwlweGFfZ3Bpb19tb2RlKGdwaW9fYnVzW3B4YV9pMnMubWFzdGVyXS5jbGspOworCXB4YV9zZXRfY2tlbihDS0VOOF9JMlMsIDEpOworCXB4YV9pMnNfd2FpdCgpOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCWNwdV9kYWktPmRtYV9kYXRhID0gJnB4YTJ4eF9pMnNfcGNtX3N0ZXJlb19vdXQ7CisJZWxzZQorCQljcHVfZGFpLT5kbWFfZGF0YSA9ICZweGEyeHhfaTJzX3BjbV9zdGVyZW9faW47CisKKwkvKiBpcyBwb3J0IHVzZWQgYnkgYW5vdGhlciBzdHJlYW0gKi8KKwlpZiAoIShTQUNSMCAmIFNBQ1IwX0VOQikpIHsKKworCQlTQUNSMCA9IDA7CisJCVNBQ1IxID0gMDsKKwkJaWYgKHB4YV9pMnMubWFzdGVyKQorCQkJU0FDUjAgfD0gU0FDUjBfQkNLRDsKKworCQlTQUNSMCB8PSBTQUNSMF9SRlRIKDE0KSB8IFNBQ1IwX1RGVEgoMSk7CisJCVNBQ1IxIHw9IHB4YV9pMnMuZm10OworCX0KKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJU0FJTVIgfD0gU0FJTVJfVEZTOworCWVsc2UKKwkJU0FJTVIgfD0gU0FJTVJfUkZTOworCisJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CisJY2FzZSA4MDAwOgorCQlTQURJViA9IDB4NDg7CisJCWJyZWFrOworCWNhc2UgMTEwMjU6CisJCVNBRElWID0gMHgzNDsKKwkJYnJlYWs7CisJY2FzZSAxNjAwMDoKKwkJU0FESVYgPSAweDI0OworCQlicmVhazsKKwljYXNlIDIyMDUwOgorCQlTQURJViA9IDB4MWE7CisJCWJyZWFrOworCWNhc2UgNDQxMDA6CisJCVNBRElWID0gMHhkOworCQlicmVhazsKKwljYXNlIDQ4MDAwOgorCQlTQURJViA9IDB4YzsKKwkJYnJlYWs7CisJY2FzZSA5NjAwMDogLyogbm90IGluIG1hbnVhbCBhbmQgcG9zc2libHkgc2xpZ2h0bHkgaW5hY2N1cmF0ZSAqLworCQlTQURJViA9IDB4NjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X2kyc190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlTQUNSMCB8PSBTQUNSMF9FTkI7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBweGEyeHhfaTJzX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCVNBQ1IxIHw9IFNBQ1IxX0RSUEw7CisJCVNBSU1SICY9IH5TQUlNUl9URlM7CisJfSBlbHNlIHsKKwkJU0FDUjEgfD0gU0FDUjFfRFJFQzsKKwkJU0FJTVIgJj0gflNBSU1SX1JGUzsKKwl9CisKKwlpZiAoU0FDUjEgJiAoU0FDUjFfRFJFQyB8IFNBQ1IxX0RSUEwpKSB7CisJCVNBQ1IwICY9IH5TQUNSMF9FTkI7CisJCXB4YV9pMnNfd2FpdCgpOworCQlweGFfc2V0X2NrZW4oQ0tFTjhfSTJTLCAwKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcHhhMnh4X2kyc19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpkYWkpCit7CisJaWYgKCFkYWktPmFjdGl2ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBzdG9yZSByZWdpc3RlcnMgKi8KKwlweGFfaTJzLnNhY3IwID0gU0FDUjA7CisJcHhhX2kycy5zYWNyMSA9IFNBQ1IxOworCXB4YV9pMnMuc2FpbXIgPSBTQUlNUjsKKwlweGFfaTJzLnNhZGl2ID0gU0FESVY7CisKKwkvKiBkZWFjdGl2YXRlIGxpbmsgKi8KKwlTQUNSMCAmPSB+U0FDUjBfRU5COworCXB4YV9pMnNfd2FpdCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YTJ4eF9pMnNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqZGFpKQoreworCWlmICghZGFpLT5hY3RpdmUpCisJCXJldHVybiAwOworCisJcHhhX2kyc193YWl0KCk7CisKKwlTQUNSMCA9IHB4YV9pMnMuc2FjcjAgJj0gflNBQ1IwX0VOQjsKKwlTQUNSMSA9IHB4YV9pMnMuc2FjcjE7CisJU0FJTVIgPSBweGFfaTJzLnNhaW1yOworCVNBRElWID0gcHhhX2kycy5zYWRpdjsKKwlTQUNSMCB8PSBTQUNSMF9FTkI7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgcHhhMnh4X2kyc19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgcHhhMnh4X2kyc19yZXN1bWUJTlVMTAorI2VuZGlmCisKKyNkZWZpbmUgUFhBMlhYX0kyU19SQVRFUyAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHxcCisJCVNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfMjIwNTAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8IFwKKwkJU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCkKKworc3RydWN0IHNuZF9zb2NfY3B1X2RhaSBweGFfaTJzX2RhaSA9IHsKKwkubmFtZSA9ICJweGEyeHgtaTJzIiwKKwkuaWQgPSAwLAorCS50eXBlID0gU05EX1NPQ19EQUlfSTJTLAorCS5zdXNwZW5kID0gcHhhMnh4X2kyc19zdXNwZW5kLAorCS5yZXN1bWUgPSBweGEyeHhfaTJzX3Jlc3VtZSwKKwkucGxheWJhY2sgPSB7CisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gUFhBMlhYX0kyU19SQVRFUywKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCS5jYXB0dXJlID0geworCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFBYQTJYWF9JMlNfUkFURVMsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkub3BzID0geworCQkuc3RhcnR1cCA9IHB4YTJ4eF9pMnNfc3RhcnR1cCwKKwkJLnNodXRkb3duID0gcHhhMnh4X2kyc19zaHV0ZG93biwKKwkJLnRyaWdnZXIgPSBweGEyeHhfaTJzX3RyaWdnZXIsCisJCS5od19wYXJhbXMgPSBweGEyeHhfaTJzX2h3X3BhcmFtcyx9LAorCS5kYWlfb3BzID0geworCQkuc2V0X2ZtdCA9IHB4YTJ4eF9pMnNfc2V0X2RhaV9mbXQsCisJCS5zZXRfc3lzY2xrID0gcHhhMnh4X2kyc19zZXRfZGFpX3N5c2NsaywKKwl9LAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwocHhhX2kyc19kYWkpOworCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QsIGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbSwgd3d3LndvbGZzb25taWNyby5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTigicHhhMnh4IEkyUyBTb0MgSW50ZXJmYWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1pMnMuaCBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LWkycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNDg0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1pMnMuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogbGludXgvc291bmQvYXJtL3B4YTJ4eC1pMnMuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfUFhBMlhYX0kyU19ICisjZGVmaW5lIF9QWEEyWFhfSTJTX0gKKworLyogcHhhMnh4IERBSSBJRCdzICovCisjZGVmaW5lIFBYQTJYWF9EQUlfSTJTCQkJMAorCisvKiBJMlMgY2xvY2sgKi8KKyNkZWZpbmUgUFhBMlhYX0kyU19TWVNDTEsJCTAKKworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgcHhhX2kyc19kYWk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWU4ZmEzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBsaW51eC9zb3VuZC9hcm0vcHhhMnh4LXBjbS5jIC0tIEFMU0EgUENNIGludGVyZmFjZSBmb3IgdGhlIEludGVsIFBYQTJ4eCBjaGlwCisgKgorICogQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiBDcmVhdGVkOglOb3YgMzAsIDIwMDQKKyAqIENvcHlyaWdodDoJKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdWRpby5oPgorCisjaW5jbHVkZSAicHhhMnh4LXBjbS5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgcHhhMnh4X3BjbV9oYXJkd2FyZSA9IHsKKwkuaW5mbwkJCT0gU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX1JFU1VNRSwKKwkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCisJLnBlcmlvZF9ieXRlc19taW4JPSAzMiwKKwkucGVyaW9kX2J5dGVzX21heAk9IDgxOTIgLSAzMiwKKwkucGVyaW9kc19taW4JCT0gMSwKKwkucGVyaW9kc19tYXgJCT0gUEFHRV9TSVpFL3NpemVvZihweGFfZG1hX2Rlc2MpLAorCS5idWZmZXJfYnl0ZXNfbWF4CT0gMTI4ICogMTAyNCwKKwkuZmlmb19zaXplCQk9IDMyLAorfTsKKworc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgeworCWludCBkbWFfY2g7CisJc3RydWN0IHB4YTJ4eF9wY21fZG1hX3BhcmFtcyAqcGFyYW1zOworCXB4YV9kbWFfZGVzYyAqZG1hX2Rlc2NfYXJyYXk7CisJZG1hX2FkZHJfdCBkbWFfZGVzY19hcnJheV9waHlzOworfTsKKworc3RhdGljIHZvaWQgcHhhMnh4X3BjbV9kbWFfaXJxKGludCBkbWFfY2gsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGRldl9pZDsKKwlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCBkY3NyOworCisJZGNzciA9IERDU1IoZG1hX2NoKTsKKwlEQ1NSKGRtYV9jaCkgPSBkY3NyICYgfkRDU1JfU1RPUElSUUVOOworCisJaWYgKGRjc3IgJiBEQ1NSX0VORElOVFIpIHsKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCX0gZWxzZSB7CisJCXByaW50ayggS0VSTl9FUlIgIiVzOiBETUEgZXJyb3Igb24gY2hhbm5lbCAlZCAoRENTUj0lI3gpXG4iLAorCQkJcHJ0ZC0+cGFyYW1zLT5uYW1lLCBkbWFfY2gsIGRjc3IgKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHB4YTJ4eF9wY21fZG1hX3BhcmFtcyAqZG1hID0gcnRkLT5kYWktPmNwdV9kYWktPmRtYV9kYXRhOworCXNpemVfdCB0b3RzaXplID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpOworCXNpemVfdCBwZXJpb2QgPSBwYXJhbXNfcGVyaW9kX2J5dGVzKHBhcmFtcyk7CisJcHhhX2RtYV9kZXNjICpkbWFfZGVzYzsKKwlkbWFfYWRkcl90IGRtYV9idWZmX3BoeXMsIG5leHRfZGVzY19waHlzOworCWludCByZXQ7CisKKwkvKiByZXR1cm4gaWYgdGhpcyBpcyBhIGJ1ZmZlcmxlc3MgdHJhbnNmZXIgZS5nLgorCSAqIGNvZGVjIDwtLT4gQlQgY29kZWMgb3IgR1NNIG1vZGVtIC0tIGxnIEZJWE1FICovCisJIGlmICghZG1hKQorCSAJcmV0dXJuIDA7CisKKwkvKiB0aGlzIG1heSBnZXQgY2FsbGVkIHNldmVyYWwgdGltZXMgYnkgb3NzIGVtdWxhdGlvbgorCSAqIHdpdGggZGlmZmVyZW50IHBhcmFtcyAqLworCWlmIChwcnRkLT5wYXJhbXMgPT0gTlVMTCkgeworCQlwcnRkLT5wYXJhbXMgPSBkbWE7CisJCXJldCA9IHB4YV9yZXF1ZXN0X2RtYShwcnRkLT5wYXJhbXMtPm5hbWUsIERNQV9QUklPX0xPVywKKwkJCSAgICAgIHB4YTJ4eF9wY21fZG1hX2lycSwgc3Vic3RyZWFtKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlwcnRkLT5kbWFfY2ggPSByZXQ7CisJfSBlbHNlIGlmIChwcnRkLT5wYXJhbXMgIT0gZG1hKSB7CisJCXB4YV9mcmVlX2RtYShwcnRkLT5kbWFfY2gpOworCQlwcnRkLT5wYXJhbXMgPSBkbWE7CisJCXJldCA9IHB4YV9yZXF1ZXN0X2RtYShwcnRkLT5wYXJhbXMtPm5hbWUsIERNQV9QUklPX0xPVywKKwkJCSAgICAgIHB4YTJ4eF9wY21fZG1hX2lycSwgc3Vic3RyZWFtKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlwcnRkLT5kbWFfY2ggPSByZXQ7CisJfQorCisJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKKwlydW50aW1lLT5kbWFfYnl0ZXMgPSB0b3RzaXplOworCisJZG1hX2Rlc2MgPSBwcnRkLT5kbWFfZGVzY19hcnJheTsKKwluZXh0X2Rlc2NfcGh5cyA9IHBydGQtPmRtYV9kZXNjX2FycmF5X3BoeXM7CisJZG1hX2J1ZmZfcGh5cyA9IHJ1bnRpbWUtPmRtYV9hZGRyOworCWRvIHsKKwkJbmV4dF9kZXNjX3BoeXMgKz0gc2l6ZW9mKHB4YV9kbWFfZGVzYyk7CisJCWRtYV9kZXNjLT5kZGFkciA9IG5leHRfZGVzY19waHlzOworCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQkJZG1hX2Rlc2MtPmRzYWRyID0gZG1hX2J1ZmZfcGh5czsKKwkJCWRtYV9kZXNjLT5kdGFkciA9IHBydGQtPnBhcmFtcy0+ZGV2X2FkZHI7CisJCX0gZWxzZSB7CisJCQlkbWFfZGVzYy0+ZHNhZHIgPSBwcnRkLT5wYXJhbXMtPmRldl9hZGRyOworCQkJZG1hX2Rlc2MtPmR0YWRyID0gZG1hX2J1ZmZfcGh5czsKKwkJfQorCQlpZiAocGVyaW9kID4gdG90c2l6ZSkKKwkJCXBlcmlvZCA9IHRvdHNpemU7CisJCWRtYV9kZXNjLT5kY21kID0gcHJ0ZC0+cGFyYW1zLT5kY21kIHwgcGVyaW9kIHwgRENNRF9FTkRJUlFFTjsKKwkJZG1hX2Rlc2MrKzsKKwkJZG1hX2J1ZmZfcGh5cyArPSBwZXJpb2Q7CisJfSB3aGlsZSAodG90c2l6ZSAtPSBwZXJpb2QpOworCWRtYV9kZXNjWy0xXS5kZGFkciA9IHBydGQtPmRtYV9kZXNjX2FycmF5X3BoeXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGEyeHhfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWlmIChwcnRkICYmIHBydGQtPnBhcmFtcykKKwkJKnBydGQtPnBhcmFtcy0+ZHJjbXIgPSAwOworCisJaWYgKHBydGQtPmRtYV9jaCkgeworCQlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sIE5VTEwpOworCQlweGFfZnJlZV9kbWEocHJ0ZC0+ZG1hX2NoKTsKKwkJcHJ0ZC0+ZG1hX2NoID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGEyeHhfcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCURDU1IocHJ0ZC0+ZG1hX2NoKSAmPSB+RENTUl9SVU47CisJRENTUihwcnRkLT5kbWFfY2gpID0gMDsKKwlEQ01EKHBydGQtPmRtYV9jaCkgPSAwOworCSpwcnRkLT5wYXJhbXMtPmRyY21yID0gcHJ0ZC0+ZG1hX2NoIHwgRFJDTVJfTUFQVkxEOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCUREQURSKHBydGQtPmRtYV9jaCkgPSBwcnRkLT5kbWFfZGVzY19hcnJheV9waHlzOworCQlEQ1NSKHBydGQtPmRtYV9jaCkgPSBEQ1NSX1JVTjsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJRENTUihwcnRkLT5kbWFfY2gpICY9IH5EQ1NSX1JVTjsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJRENTUihwcnRkLT5kbWFfY2gpIHw9IERDU1JfUlVOOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCUREQURSKHBydGQtPmRtYV9jaCkgPSBwcnRkLT5kbWFfZGVzY19hcnJheV9waHlzOworCQlEQ1NSKHBydGQtPmRtYV9jaCkgfD0gRENTUl9SVU47CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QKK3B4YTJ4eF9wY21fcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJZG1hX2FkZHJfdCBwdHIgPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgPworCQkJIERTQURSKHBydGQtPmRtYV9jaCkgOiBEVEFEUihwcnRkLT5kbWFfY2gpOworCXNuZF9wY21fdWZyYW1lc190IHggPSBieXRlc190b19mcmFtZXMocnVudGltZSwgcHRyIC0gcnVudGltZS0+ZG1hX2FkZHIpOworCisJaWYgKHggPT0gcnVudGltZS0+YnVmZmVyX3NpemUpCisJCXggPSAwOworCXJldHVybiB4OworfQorCitzdGF0aWMgaW50IHB4YTJ4eF9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpwcnRkOworCWludCByZXQ7CisKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJnB4YTJ4eF9wY21faGFyZHdhcmUpOworCisJLyoKKwkgKiBGb3IgbXlzdGVyaW91cyByZWFzb25zIChhbmQgZGVzcGl0ZSB3aGF0IHRoZSBtYW51YWwgc2F5cykKKwkgKiBwbGF5YmFjayBzYW1wbGVzIGFyZSBsb3N0IGlmIHRoZSBETUEgY291bnQgaXMgbm90IGEgbXVsdGlwbGUKKwkgKiBvZiB0aGUgRE1BIGJ1cnN0IHNpemUuICBMZXQncyBhZGQgYSBydWxlIHRvIGVuZm9yY2UgdGhhdC4KKwkgKi8KKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLAorCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAzMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLAorCQlTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLCAzMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcHJ0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBydGQgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlwcnRkLT5kbWFfZGVzY19hcnJheSA9CisJCWRtYV9hbGxvY193cml0ZWNvbWJpbmUoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgUEFHRV9TSVpFLAorCQkJCSAgICAgICAmcHJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcnRkLT5kbWFfZGVzY19hcnJheSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjE7CisJfQorCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gcHJ0ZDsKKwlyZXR1cm4gMDsKKworIGVycjE6CisJa2ZyZWUocHJ0ZCk7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIFBBR0VfU0laRSwKKwkJCSAgICAgIHBydGQtPmRtYV9kZXNjX2FycmF5LCBwcnRkLT5kbWFfZGVzY19hcnJheV9waHlzKTsKKwlrZnJlZShwcnRkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGEyeHhfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlyZXR1cm4gZG1hX21tYXBfd3JpdGVjb21iaW5lKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIHZtYSwKKwkJCQkgICAgIHJ1bnRpbWUtPmRtYV9hcmVhLAorCQkJCSAgICAgcnVudGltZS0+ZG1hX2FkZHIsCisJCQkJICAgICBydW50aW1lLT5kbWFfYnl0ZXMpOworfQorCitzdHJ1Y3Qgc25kX3BjbV9vcHMgcHhhMnh4X3BjbV9vcHMgPSB7CisJLm9wZW4JCT0gcHhhMnh4X3BjbV9vcGVuLAorCS5jbG9zZQkJPSBweGEyeHhfcGNtX2Nsb3NlLAorCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zCT0gcHhhMnh4X3BjbV9od19wYXJhbXMsCisJLmh3X2ZyZWUJPSBweGEyeHhfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUJPSBweGEyeHhfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIJPSBweGEyeHhfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIJPSBweGEyeHhfcGNtX3BvaW50ZXIsCisJLm1tYXAJCT0gcHhhMnh4X3BjbV9tbWFwLAorfTsKKworc3RhdGljIGludCBweGEyeHhfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIoc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IHN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJc2l6ZV90IHNpemUgPSBweGEyeHhfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXg7CisJYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKKwlidWYtPmRldi5kZXYgPSBwY20tPmNhcmQtPmRldjsKKwlidWYtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJYnVmLT5hcmVhID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShwY20tPmNhcmQtPmRldiwgc2l6ZSwKKwkJCQkJICAgJmJ1Zi0+YWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYtPmFyZWEpCisJCXJldHVybiAtRU5PTUVNOworCWJ1Zi0+Ynl0ZXMgPSBzaXplOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBweGEyeHhfcGNtX2ZyZWVfZG1hX2J1ZmZlcnMoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZjsKKwlpbnQgc3RyZWFtOworCisJZm9yIChzdHJlYW0gPSAwOyBzdHJlYW0gPCAyOyBzdHJlYW0rKykgeworCQlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW07CisJCWlmICghc3Vic3RyZWFtKQorCQkJY29udGludWU7CisKKwkJYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKKwkJaWYgKCFidWYtPmFyZWEpCisJCQljb250aW51ZTsKKworCQlkbWFfZnJlZV93cml0ZWNvbWJpbmUocGNtLT5jYXJkLT5kZXYsIGJ1Zi0+Ynl0ZXMsCisJCQkJICAgICAgYnVmLT5hcmVhLCBidWYtPmFkZHIpOworCQlidWYtPmFyZWEgPSBOVUxMOworCX0KK30KKworc3RhdGljIHU2NCBweGEyeHhfcGNtX2RtYW1hc2sgPSBETUFfMzJCSVRfTUFTSzsKKworaW50IHB4YTJ4eF9wY21fbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpkYWksCisJc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY2FyZC0+ZGV2LT5kbWFfbWFzaykKKwkJY2FyZC0+ZGV2LT5kbWFfbWFzayA9ICZweGEyeHhfcGNtX2RtYW1hc2s7CisJaWYgKCFjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrKQorCQljYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gRE1BXzMyQklUX01BU0s7CisKKwlpZiAoZGFpLT5wbGF5YmFjay5jaGFubmVsc19taW4pIHsKKwkJcmV0ID0gcHhhMnh4X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKKwkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKGRhaS0+Y2FwdHVyZS5jaGFubmVsc19taW4pIHsKKwkJcmV0ID0gcHhhMnh4X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKKwkJCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBzbmRfc29jX3BsYXRmb3JtIHB4YTJ4eF9zb2NfcGxhdGZvcm0gPSB7CisJLm5hbWUJCT0gInB4YTJ4eC1hdWRpbyIsCisJLnBjbV9vcHMgCT0gJnB4YTJ4eF9wY21fb3BzLAorCS5wY21fbmV3CT0gcHhhMnh4X3BjbV9uZXcsCisJLnBjbV9mcmVlCT0gcHhhMnh4X3BjbV9mcmVlX2RtYV9idWZmZXJzLAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwocHhhMnh4X3NvY19wbGF0Zm9ybSk7CisKK01PRFVMRV9BVVRIT1IoIk5pY29sYXMgUGl0cmUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgUFhBMnh4IFBDTSBETUEgbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uaCBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YzljNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uaApAQCAtMCwwICsxLDM0IEBACisvKgorICogbGludXgvc291bmQvYXJtL3B4YTJ4eC1wY20uaCAtLSBBTFNBIFBDTSBpbnRlcmZhY2UgZm9yIHRoZSBJbnRlbCBQWEEyeHggY2hpcAorICoKKyAqIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogQ3JlYXRlZDoJTm92IDMwLCAyMDA0CisgKiBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1BYQTJYWF9QQ01fSAorI2RlZmluZSBfUFhBMlhYX1BDTV9ICisKK3N0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgeworCWNoYXIgKm5hbWU7CQkJLyogc3RyZWFtIGlkZW50aWZpZXIgKi8KKwl1MzIgZGNtZDsJCQkvKiBETUEgZGVzY3JpcHRvciBkY21kIGZpZWxkICovCisJdm9sYXRpbGUgdTMyICpkcmNtcjsJCS8qIHRoZSBETUEgcmVxdWVzdCBjaGFubmVsIHRvIHVzZSAqLworCXUzMiBkZXZfYWRkcjsJCQkvKiBkZXZpY2UgcGh5c2ljYWwgYWRkcmVzcyBmb3IgRE1BICovCit9OworCitzdHJ1Y3QgcHhhMnh4X2dwaW8geworCXUzMiBzeXM7CisJdTMyCXJ4OworCXUzMiB0eDsKKwl1MzIgY2xrOworCXUzMiBmcm07Cit9OworCisvKiBwbGF0Zm9ybSBkYXRhICovCitleHRlcm4gc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gcHhhMnh4X3NvY19wbGF0Zm9ybTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3NwaXR6LmMgYi9zb3VuZC9zb2MvcHhhL3NwaXR6LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlODIxMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9weGEvc3BpdHouYwpAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqIHNwaXR6LmMgIC0tICBTb0MgYXVkaW8gZm9yIFNoYXJwIFNMLUN4eDAwIG1vZGVscyBTcGl0eiwgQm9yem9pIGFuZCBBa2l0YQorICoKKyAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3JzOiBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiAgICAgICAgICBSaWNoYXJkIFB1cmRpZSA8cmljaGFyZEBvcGVuZWRoYW5kLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMzB0aCBOb3YgMjAwNSAgIEluaXRpYWwgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3Njb29wLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2FraXRhLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3BpdHouaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg3NTAuaCIKKyNpbmNsdWRlICJweGEyeHgtcGNtLmgiCisjaW5jbHVkZSAicHhhMnh4LWkycy5oIgorCisjZGVmaW5lIFNQSVRaX0hQICAgICAgICAwCisjZGVmaW5lIFNQSVRaX01JQyAgICAgICAxCisjZGVmaW5lIFNQSVRaX0xJTkUgICAgICAyCisjZGVmaW5lIFNQSVRaX0hFQURTRVQgICAzCisjZGVmaW5lIFNQSVRaX0hQX09GRiAgICA0CisjZGVmaW5lIFNQSVRaX1NQS19PTiAgICAwCisjZGVmaW5lIFNQSVRaX1NQS19PRkYgICAxCisKKyAvKiBhdWRpbyBjbG9jayBpbiBIeiAtIHJvdW5kZWQgZnJvbSAxMi4yMzVNSHogKi8KKyNkZWZpbmUgU1BJVFpfQVVESU9fQ0xPQ0sgMTIyODgwMDAKKworc3RhdGljIGludCBzcGl0el9qYWNrX2Z1bmM7CitzdGF0aWMgaW50IHNwaXR6X3Nwa19mdW5jOworCitzdGF0aWMgdm9pZCBzcGl0el9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaWYgKHNwaXR6X3Nwa19mdW5jID09IFNQSVRaX1NQS19PTikKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkV4dCBTcGsiLCAxKTsKKwllbHNlCisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJFeHQgU3BrIiwgMCk7CisKKwkvKiBzZXQgdXAgamFjayBjb25uZWN0aW9uICovCisJc3dpdGNoIChzcGl0el9qYWNrX2Z1bmMpIHsKKwljYXNlIFNQSVRaX0hQOgorCQkvKiBlbmFibGUgYW5kIHVubXV0ZSBocCBqYWNrLCBkaXNhYmxlIG1pYyBiaWFzICovCisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJIZWFkc2V0IEphY2siLCAwKTsKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk1pYyBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJMaW5lIEphY2siLCAwKTsKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgMSk7CisJCXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9NVVRFX0wpOworCQlzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9SKTsKKwkJYnJlYWs7CisJY2FzZSBTUElUWl9NSUM6CisJCS8qIGVuYWJsZSBtaWMgamFjayBhbmQgYmlhcywgbXV0ZSBocCAqLworCQlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiSGVhZHBob25lIEphY2siLCAwKTsKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRzZXQgSmFjayIsIDApOworCQlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTGluZSBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJNaWMgSmFjayIsIDEpOworCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9NVVRFX0wpOworCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9NVVRFX1IpOworCQlicmVhazsKKwljYXNlIFNQSVRaX0xJTkU6CisJCS8qIGVuYWJsZSBsaW5lIGphY2ssIGRpc2FibGUgbWljIGJpYXMgYW5kIG11dGUgaHAgKi8KKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJIZWFkc2V0IEphY2siLCAwKTsKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk1pYyBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJMaW5lIEphY2siLCAxKTsKKwkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9MKTsKKwkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9SKTsKKwkJYnJlYWs7CisJY2FzZSBTUElUWl9IRUFEU0VUOgorCQkvKiBlbmFibGUgYW5kIHVubXV0ZSBoZWFkc2V0IGphY2sgZW5hYmxlIG1pYyBiaWFzLCBtdXRlIEwgaHAgKi8KKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJNaWMgSmFjayIsIDEpOworCQlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTGluZSBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJIZWFkc2V0IEphY2siLCAxKTsKKwkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9MKTsKKwkJc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU1BJVFpfU0NQX01VVEVfUik7CisJCWJyZWFrOworCWNhc2UgU1BJVFpfSFBfT0ZGOgorCisJCS8qIGphY2sgcmVtb3ZlZCwgZXZlcnl0aGluZyBvZmYgKi8KKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJIZWFkc2V0IEphY2siLCAwKTsKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk1pYyBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJMaW5lIEphY2siLCAwKTsKKwkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9MKTsKKwkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9SKTsKKwkJYnJlYWs7CisJfQorCXNuZF9zb2NfZGFwbV9zeW5jX2VuZHBvaW50cyhjb2RlYyk7Cit9CisKK3N0YXRpYyBpbnQgc3BpdHpfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5zb2NkZXYtPmNvZGVjOworCisJLyogY2hlY2sgdGhlIGphY2sgc3RhdHVzIGF0IHN0cmVhbSBzdGFydHVwICovCisJc3BpdHpfZXh0X2NvbnRyb2woY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwaXR6X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWkgPSBydGQtPmRhaS0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKwl1bnNpZ25lZCBpbnQgY2xrID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCWNhc2UgODAwMDoKKwljYXNlIDE2MDAwOgorCWNhc2UgNDgwMDA6CisJY2FzZSA5NjAwMDoKKwkJY2xrID0gMTIyODgwMDA7CisJCWJyZWFrOworCWNhc2UgMTEwMjU6CisJY2FzZSAyMjA1MDoKKwljYXNlIDQ0MTAwOgorCQljbGsgPSAxMTI4OTYwMDsKKwkJYnJlYWs7CisJfQorCisJLyogc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gY29kZWNfZGFpLT5kYWlfb3BzLnNldF9mbXQoY29kZWNfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IGNwdV9kYWktPmRhaV9vcHMuc2V0X2ZtdChjcHVfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCisJcmV0ID0gY29kZWNfZGFpLT5kYWlfb3BzLnNldF9zeXNjbGsoY29kZWNfZGFpLCBXTTg3NTBfU1lTQ0xLLCBjbGssCisJCVNORF9TT0NfQ0xPQ0tfSU4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IHRoZSBJMlMgc3lzdGVtIGNsb2NrIGFzIGlucHV0ICh1bnVzZWQpICovCisJcmV0ID0gY3B1X2RhaS0+ZGFpX29wcy5zZXRfc3lzY2xrKGNwdV9kYWksIFBYQTJYWF9JMlNfU1lTQ0xLLCAwLAorCQlTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIHNwaXR6X29wcyA9IHsKKwkuc3RhcnR1cCA9IHNwaXR6X3N0YXJ0dXAsCisJLmh3X3BhcmFtcyA9IHNwaXR6X2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBpbnQgc3BpdHpfZ2V0X2phY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzcGl0el9qYWNrX2Z1bmM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BpdHpfc2V0X2phY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJaWYgKHNwaXR6X2phY2tfZnVuYyA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJcmV0dXJuIDA7CisKKwlzcGl0el9qYWNrX2Z1bmMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlzcGl0el9leHRfY29udHJvbChjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc3BpdHpfZ2V0X3NwayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNwaXR6X3Nwa19mdW5jOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwaXR6X3NldF9zcGsoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWlmIChzcGl0el9zcGtfZnVuYyA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJcmV0dXJuIDA7CisKKwlzcGl0el9zcGtfZnVuYyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXNwaXR6X2V4dF9jb250cm9sKGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzcGl0el9taWNfYmlhcyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywgaW50IGV2ZW50KQoreworCWlmIChtYWNoaW5lX2lzX2JvcnpvaSgpIHx8IG1hY2hpbmVfaXNfc3BpdHooKSkgeworCQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKKwkJCXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wMl9kZXZpY2UuZGV2LAorCQkJCVNQSVRaX1NDUDJfTUlDX0JJQVMpOworCQllbHNlCisJCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wMl9kZXZpY2UuZGV2LAorCQkJCVNQSVRaX1NDUDJfTUlDX0JJQVMpOworCX0KKworCWlmIChtYWNoaW5lX2lzX2FraXRhKCkpIHsKKwkJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCisJCQlha2l0YV9zZXRfaW9leHAoJmFraXRhaW9leHBfZGV2aWNlLmRldiwKKwkJCQlBS0lUQV9JT0VYUF9NSUNfQklBUyk7CisJCWVsc2UKKwkJCWFraXRhX3Jlc2V0X2lvZXhwKCZha2l0YWlvZXhwX2RldmljZS5kZXYsCisJCQkJQUtJVEFfSU9FWFBfTUlDX0JJQVMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogc3BpdHogbWFjaGluZSBkYXBtIHdpZGdldHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3NTBfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUgSmFjayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIk1pYyBKYWNrIiwgc3BpdHpfbWljX2JpYXMpLAorCVNORF9TT0NfREFQTV9TUEsoIkV4dCBTcGsiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTElORSgiTGluZSBKYWNrIiwgTlVMTCksCisKKwkvKiBoZWFkc2V0IGlzIGEgbWljIGFuZCBtb25vIGhlYWRwaG9uZSAqLworCVNORF9TT0NfREFQTV9IUCgiSGVhZHNldCBKYWNrIiwgTlVMTCksCit9OworCisvKiBTcGl0eiBtYWNoaW5lIGF1ZGlvX21hcCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmF1ZGlvX21hcFtdWzNdID0geworCisJLyogaGVhZHBob25lIGNvbm5lY3RlZCB0byBMT1VUMSwgUk9VVDEgKi8KKwl7IkhlYWRwaG9uZSBKYWNrIiwgTlVMTCwgIkxPVVQxIn0sCisJeyJIZWFkcGhvbmUgSmFjayIsIE5VTEwsICJST1VUMSJ9LAorCisJLyogaGVhZHNldCBjb25uZWN0ZWQgdG8gUk9VVDEgYW5kIExJTlBVVDEgd2l0aCBiaWFzIChkZWYgYmVsb3cpICovCisJeyJIZWFkc2V0IEphY2siLCBOVUxMLCAiUk9VVDEifSwKKworCS8qIGV4dCBzcGVha2VyIGNvbm5lY3RlZCB0byBMT1VUMiwgUk9VVDIgICovCisJeyJFeHQgU3BrIiwgTlVMTCAsICJST1VUMiJ9LAorCXsiRXh0IFNwayIsIE5VTEwgLCAiTE9VVDIifSwKKworCS8qIG1pYyBpcyBjb25uZWN0ZWQgdG8gaW5wdXQgMSAtIHdpdGggYmlhcyAqLworCXsiTElOUFVUMSIsIE5VTEwsICJNaWMgQmlhcyJ9LAorCXsiTWljIEJpYXMiLCBOVUxMLCAiTWljIEphY2sifSwKKworCS8qIGxpbmUgaXMgY29ubmVjdGVkIHRvIGlucHV0IDEgLSBubyBiaWFzICovCisJeyJMSU5QVVQxIiwgTlVMTCwgIkxpbmUgSmFjayJ9LAorCisJe05VTEwsIE5VTEwsIE5VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmphY2tfZnVuY3Rpb25bXSA9IHsiSGVhZHBob25lIiwgIk1pYyIsICJMaW5lIiwgIkhlYWRzZXQiLAorCSJPZmYifTsKK3N0YXRpYyBjb25zdCBjaGFyICpzcGtfZnVuY3Rpb25bXSA9IHsiT24iLCAiT2ZmIn07CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNwaXR6X2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDUsIGphY2tfZnVuY3Rpb24pLAorCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgc3BrX2Z1bmN0aW9uKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NTBfc3BpdHpfY29udHJvbHNbXSA9IHsKKwlTT0NfRU5VTV9FWFQoIkphY2sgRnVuY3Rpb24iLCBzcGl0el9lbnVtWzBdLCBzcGl0el9nZXRfamFjaywKKwkJc3BpdHpfc2V0X2phY2spLAorCVNPQ19FTlVNX0VYVCgiU3BlYWtlciBGdW5jdGlvbiIsIHNwaXR6X2VudW1bMV0sIHNwaXR6X2dldF9zcGssCisJCXNwaXR6X3NldF9zcGspLAorfTsKKworLyoKKyAqIExvZ2ljIGZvciBhIHdtODc1MCBhcyBjb25uZWN0ZWQgb24gYSBTaGFycCBTTC1DeHgwMCBEZXZpY2UKKyAqLworc3RhdGljIGludCBzcGl0el93bTg3NTBfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGksIGVycjsKKworCS8qIE5DIGNvZGVjIHBpbnMgKi8KKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiUklOUFVUMSIsIDApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJMSU5QVVQyIiwgMCk7CisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIlJJTlBVVDIiLCAwKTsKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTElOUFVUMyIsIDApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJSSU5QVVQzIiwgMCk7CisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk9VVDMiLCAwKTsKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTU9OTyIsIDApOworCisJLyogQWRkIHNwaXR6IHNwZWNpZmljIGNvbnRyb2xzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzUwX3NwaXR6X2NvbnRyb2xzKTsgaSsrKSB7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNvZGVjLT5jYXJkLAorCQkJc25kX3NvY19jbmV3KCZ3bTg3NTBfc3BpdHpfY29udHJvbHNbaV0sIGNvZGVjLCBOVUxMKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBBZGQgc3BpdHogc3BlY2lmaWMgd2lkZ2V0cyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODc1MF9kYXBtX3dpZGdldHMpOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9sKGNvZGVjLCAmd204NzUwX2RhcG1fd2lkZ2V0c1tpXSk7CisJfQorCisJLyogU2V0IHVwIHNwaXR6IHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCisJZm9yIChpID0gMDsgYXVkaW9fbWFwW2ldWzBdICE9IE5VTEw7IGkrKykgeworCQlzbmRfc29jX2RhcG1fY29ubmVjdF9pbnB1dChjb2RlYywgYXVkaW9fbWFwW2ldWzBdLAorCQkJYXVkaW9fbWFwW2ldWzFdLCBhdWRpb19tYXBbaV1bMl0pOworCX0KKworCXNuZF9zb2NfZGFwbV9zeW5jX2VuZHBvaW50cyhjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHNwaXR6IGRpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0+IENQVSAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHNwaXR6X2RhaSA9IHsKKwkubmFtZSA9ICJ3bTg3NTAiLAorCS5zdHJlYW1fbmFtZSA9ICJXTTg3NTAiLAorCS5jcHVfZGFpID0gJnB4YV9pMnNfZGFpLAorCS5jb2RlY19kYWkgPSAmd204NzUwX2RhaSwKKwkuaW5pdCA9IHNwaXR6X3dtODc1MF9pbml0LAorCS5vcHMgPSAmc3BpdHpfb3BzLAorfTsKKworLyogc3BpdHogYXVkaW8gbWFjaGluZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHNuZF9zb2NfbWFjaGluZV9zcGl0eiA9IHsKKwkubmFtZSA9ICJTcGl0eiIsCisJLmRhaV9saW5rID0gJnNwaXR6X2RhaSwKKwkubnVtX2xpbmtzID0gMSwKK307CisKKy8qIHNwaXR6IGF1ZGlvIHByaXZhdGUgZGF0YSAqLworc3RhdGljIHN0cnVjdCB3bTg3NTBfc2V0dXBfZGF0YSBzcGl0el93bTg3NTBfc2V0dXAgPSB7CisJLmkyY19hZGRyZXNzID0gMHgxYiwKK307CisKKy8qIHNwaXR6IGF1ZGlvIHN1YnN5c3RlbSAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RldmljZSBzcGl0el9zbmRfZGV2ZGF0YSA9IHsKKwkubWFjaGluZSA9ICZzbmRfc29jX21hY2hpbmVfc3BpdHosCisJLnBsYXRmb3JtID0gJnB4YTJ4eF9zb2NfcGxhdGZvcm0sCisJLmNvZGVjX2RldiA9ICZzb2NfY29kZWNfZGV2X3dtODc1MCwKKwkuY29kZWNfZGF0YSA9ICZzcGl0el93bTg3NTBfc2V0dXAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc3BpdHpfc25kX2RldmljZTsKKworc3RhdGljIGludCBfX2luaXQgc3BpdHpfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAoIShtYWNoaW5lX2lzX3NwaXR6KCkgfHwgbWFjaGluZV9pc19ib3J6b2koKSB8fCBtYWNoaW5lX2lzX2FraXRhKCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNwaXR6X3NuZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvYy1hdWRpbyIsIC0xKTsKKwlpZiAoIXNwaXR6X3NuZF9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoc3BpdHpfc25kX2RldmljZSwgJnNwaXR6X3NuZF9kZXZkYXRhKTsKKwlzcGl0el9zbmRfZGV2ZGF0YS5kZXYgPSAmc3BpdHpfc25kX2RldmljZS0+ZGV2OworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoc3BpdHpfc25kX2RldmljZSk7CisKKwlpZiAocmV0KQorCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNwaXR6X3NuZF9kZXZpY2UpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNwaXR6X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzcGl0el9zbmRfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoc3BpdHpfaW5pdCk7Cittb2R1bGVfZXhpdChzcGl0el9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmljaGFyZCBQdXJkaWUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgU3BpdHoiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvdG9zYS5jIGIvc291bmQvc29jL3B4YS90b3NhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwNGUzMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9weGEvdG9zYS5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogdG9zYS5jICAtLSAgU29DIGF1ZGlvIGZvciBUb3NhCisgKgorICogQ29weXJpZ2h0IDIwMDUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqIENvcHlyaWdodCAyMDA1IE9wZW5lZGhhbmQgTHRkLgorICoKKyAqIEF1dGhvcnM6IExpYW0gR2lyZHdvb2QgPGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbT4KKyAqICAgICAgICAgIFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAzMHRoIE5vdiAyMDA1ICAgSW5pdGlhbCB2ZXJzaW9uLgorICoKKyAqIEdQSU8ncworICogIDEgLSBKYWNrIEluc2VydGlvbgorICogIDUgLSBIb29rc3dpdGNoIChoZWFkc2V0IGFuc3dlci9oYW5nIHVwIHN3aXRjaCkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3RtaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXVkaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90b3NhLmg+CisKKyNpbmNsdWRlICIuLi9jb2RlY3Mvd205NzEyLmgiCisjaW5jbHVkZSAicHhhMnh4LXBjbS5oIgorI2luY2x1ZGUgInB4YTJ4eC1hYzk3LmgiCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHRvc2E7CisKKyNkZWZpbmUgVE9TQV9IUCAgICAgICAgMAorI2RlZmluZSBUT1NBX01JQ19JTlQgICAxCisjZGVmaW5lIFRPU0FfSEVBRFNFVCAgIDIKKyNkZWZpbmUgVE9TQV9IUF9PRkYgICAgMworI2RlZmluZSBUT1NBX1NQS19PTiAgICAwCisjZGVmaW5lIFRPU0FfU1BLX09GRiAgIDEKKworc3RhdGljIGludCB0b3NhX2phY2tfZnVuYzsKK3N0YXRpYyBpbnQgdG9zYV9zcGtfZnVuYzsKKworc3RhdGljIHZvaWQgdG9zYV9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IHNwayA9IDAsIG1pY19pbnQgPSAwLCBocCA9IDAsIGhzID0gMDsKKworCS8qIHNldCB1cCBqYWNrIGNvbm5lY3Rpb24gKi8KKwlzd2l0Y2ggKHRvc2FfamFja19mdW5jKSB7CisJY2FzZSBUT1NBX0hQOgorCQlocCA9IDE7CisJCWJyZWFrOworCWNhc2UgVE9TQV9NSUNfSU5UOgorCQltaWNfaW50ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBUT1NBX0hFQURTRVQ6CisJCWhzID0gMTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHRvc2Ffc3BrX2Z1bmMgPT0gVE9TQV9TUEtfT04pCisJCXNwayA9IDE7CisKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiU3BlYWtlciIsIHNwayk7CisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk1pYyAoSW50ZXJuYWwpIiwgbWljX2ludCk7CisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgaHApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJIZWFkc2V0IEphY2siLCBocyk7CisJc25kX3NvY19kYXBtX3N5bmNfZW5kcG9pbnRzKGNvZGVjKTsKK30KKworc3RhdGljIGludCB0b3NhX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+c29jZGV2LT5jb2RlYzsKKworCS8qIGNoZWNrIHRoZSBqYWNrIHN0YXR1cyBhdCBzdHJlYW0gc3RhcnR1cCAqLworCXRvc2FfZXh0X2NvbnRyb2woY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIHRvc2Ffb3BzID0geworCS5zdGFydHVwID0gdG9zYV9zdGFydHVwLAorfTsKKworc3RhdGljIGludCB0b3NhX2dldF9qYWNrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdG9zYV9qYWNrX2Z1bmM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9zYV9zZXRfamFjayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJaWYgKHRvc2FfamFja19mdW5jID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQlyZXR1cm4gMDsKKworCXRvc2FfamFja19mdW5jID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJdG9zYV9leHRfY29udHJvbChjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdG9zYV9nZXRfc3BrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdG9zYV9zcGtfZnVuYzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b3NhX3NldF9zcGsoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWlmICh0b3NhX3Nwa19mdW5jID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQlyZXR1cm4gMDsKKworCXRvc2Ffc3BrX2Z1bmMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwl0b3NhX2V4dF9jb250cm9sKGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworLyogdG9zYSBkYXBtIGV2ZW50IGhhbmRsZXJzICovCitzdGF0aWMgaW50IHRvc2FfaHBfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCBldmVudCkKK3sKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKKwkJc2V0X3RjNjM5M19ncGlvKCZ0YzYzOTNfZGV2aWNlLmRldixUT1NBX1RDNjM5M19MX01VVEUpOworCWVsc2UKKwkJcmVzZXRfdGM2MzkzX2dwaW8oJnRjNjM5M19kZXZpY2UuZGV2LFRPU0FfVEM2MzkzX0xfTVVURSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHRvc2EgbWFjaGluZSBkYXBtIHdpZGdldHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB0b3NhX2RhcG1fd2lkZ2V0c1tdID0geworU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUgSmFjayIsIHRvc2FfaHBfZXZlbnQpLAorU05EX1NPQ19EQVBNX0hQKCJIZWFkc2V0IEphY2siLCBOVUxMKSwKK1NORF9TT0NfREFQTV9NSUMoIk1pYyAoSW50ZXJuYWwpIiwgTlVMTCksCitTTkRfU09DX0RBUE1fU1BLKCJTcGVha2VyIiwgTlVMTCksCit9OworCisvKiB0b3NhIGF1ZGlvIG1hcCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmF1ZGlvX21hcFtdWzNdID0geworCisJLyogaGVhZHBob25lIGNvbm5lY3RlZCB0byBIUE9VVEwsIEhQT1VUUiAqLworCXsiSGVhZHBob25lIEphY2siLCBOVUxMLCAiSFBPVVRMIn0sCisJeyJIZWFkcGhvbmUgSmFjayIsIE5VTEwsICJIUE9VVFIifSwKKworCS8qIGV4dCBzcGVha2VyIGNvbm5lY3RlZCB0byBMT1VUMiwgUk9VVDIgKi8KKwl7IlNwZWFrZXIiLCBOVUxMLCAiTE9VVDIifSwKKwl7IlNwZWFrZXIiLCBOVUxMLCAiUk9VVDIifSwKKworCS8qIGludGVybmFsIG1pYyBpcyBjb25uZWN0ZWQgdG8gbWljMSwgbWljMiBkaWZmZXJlbnRpYWwgLSB3aXRoIGJpYXMgKi8KKwl7Ik1JQzEiLCBOVUxMLCAiTWljIEJpYXMifSwKKwl7Ik1JQzIiLCBOVUxMLCAiTWljIEJpYXMifSwKKwl7Ik1pYyBCaWFzIiwgTlVMTCwgIk1pYyAoSW50ZXJuYWwpIn0sCisKKwkvKiBoZWFkc2V0IGlzIGNvbm5lY3RlZCB0byBIUE9VVFIsIGFuZCBMSU5FSU5SIHdpdGggYmlhcyAqLworCXsiSGVhZHNldCBKYWNrIiwgTlVMTCwgIkhQT1VUUiJ9LAorCXsiTElORUlOUiIsIE5VTEwsICJNaWMgQmlhcyJ9LAorCXsiTWljIEJpYXMiLCBOVUxMLCAiSGVhZHNldCBKYWNrIn0sCisKKwl7TlVMTCwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqamFja19mdW5jdGlvbltdID0geyJIZWFkcGhvbmUiLCAiTWljIiwgIkxpbmUiLCAiSGVhZHNldCIsCisJIk9mZiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKnNwa19mdW5jdGlvbltdID0geyJPbiIsICJPZmYifTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdG9zYV9lbnVtW10gPSB7CisJU09DX0VOVU1fU0lOR0xFX0VYVCg1LCBqYWNrX2Z1bmN0aW9uKSwKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIHNwa19mdW5jdGlvbiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdG9zYV9jb250cm9sc1tdID0geworCVNPQ19FTlVNX0VYVCgiSmFjayBGdW5jdGlvbiIsIHRvc2FfZW51bVswXSwgdG9zYV9nZXRfamFjaywKKwkJdG9zYV9zZXRfamFjayksCisJU09DX0VOVU1fRVhUKCJTcGVha2VyIEZ1bmN0aW9uIiwgdG9zYV9lbnVtWzFdLCB0b3NhX2dldF9zcGssCisJCXRvc2Ffc2V0X3NwayksCit9OworCitzdGF0aWMgaW50IHRvc2FfYWM5N19pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaSwgZXJyOworCisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk9VVDMiLCAwKTsKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTU9OT09VVCIsIDApOworCisJLyogYWRkIHRvc2Egc3BlY2lmaWMgY29udHJvbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0b3NhX2NvbnRyb2xzKTsgaSsrKSB7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNvZGVjLT5jYXJkLAorCQkJCXNuZF9zb2NfY25ldygmdG9zYV9jb250cm9sc1tpXSxjb2RlYywgTlVMTCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogYWRkIHRvc2Egc3BlY2lmaWMgd2lkZ2V0cyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvc2FfZGFwbV93aWRnZXRzKTsgaSsrKSB7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbChjb2RlYywgJnRvc2FfZGFwbV93aWRnZXRzW2ldKTsKKwl9CisKKwkvKiBzZXQgdXAgdG9zYSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLworCWZvciAoaSA9IDA7IGF1ZGlvX21hcFtpXVswXSAhPSBOVUxMOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX2Nvbm5lY3RfaW5wdXQoY29kZWMsIGF1ZGlvX21hcFtpXVswXSwKKwkJCWF1ZGlvX21hcFtpXVsxXSwgYXVkaW9fbWFwW2ldWzJdKTsKKwl9CisKKwlzbmRfc29jX2RhcG1fc3luY19lbmRwb2ludHMoY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgdG9zYV9kYWlbXSA9IHsKK3sKKwkubmFtZSA9ICJBQzk3IiwKKwkuc3RyZWFtX25hbWUgPSAiQUM5NyBIaUZpIiwKKwkuY3B1X2RhaSA9ICZweGFfYWM5N19kYWlbUFhBMlhYX0RBSV9BQzk3X0hJRkldLAorCS5jb2RlY19kYWkgPSAmd205NzEyX2RhaVtXTTk3MTJfREFJX0FDOTdfSElGSV0sCisJLmluaXQgPSB0b3NhX2FjOTdfaW5pdCwKKwkub3BzID0gJnRvc2Ffb3BzLAorfSwKK3sKKwkubmFtZSA9ICJBQzk3IEF1eCIsCisJLnN0cmVhbV9uYW1lID0gIkFDOTcgQXV4IiwKKwkuY3B1X2RhaSA9ICZweGFfYWM5N19kYWlbUFhBMlhYX0RBSV9BQzk3X0FVWF0sCisJLmNvZGVjX2RhaSA9ICZ3bTk3MTJfZGFpW1dNOTcxMl9EQUlfQUM5N19BVVhdLAorCS5vcHMgPSAmdG9zYV9vcHMsCit9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX21hY2hpbmUgdG9zYSA9IHsKKwkubmFtZSA9ICJUb3NhIiwKKwkuZGFpX2xpbmsgPSB0b3NhX2RhaSwKKwkubnVtX2xpbmtzID0gQVJSQVlfU0laRSh0b3NhX2RhaSksCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlIHRvc2Ffc25kX2RldmRhdGEgPSB7CisJLm1hY2hpbmUgPSAmdG9zYSwKKwkucGxhdGZvcm0gPSAmcHhhMnh4X3NvY19wbGF0Zm9ybSwKKwkuY29kZWNfZGV2ID0gJnNvY19jb2RlY19kZXZfd205NzEyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRvc2Ffc25kX2RldmljZTsKKworc3RhdGljIGludCBfX2luaXQgdG9zYV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghbWFjaGluZV9pc190b3NhKCkpCisJCXJldHVybiAtRU5PREVWOworCisJdG9zYV9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7CisJaWYgKCF0b3NhX3NuZF9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEodG9zYV9zbmRfZGV2aWNlLCAmdG9zYV9zbmRfZGV2ZGF0YSk7CisJdG9zYV9zbmRfZGV2ZGF0YS5kZXYgPSAmdG9zYV9zbmRfZGV2aWNlLT5kZXY7CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZCh0b3NhX3NuZF9kZXZpY2UpOworCisJaWYgKHJldCkKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dCh0b3NhX3NuZF9kZXZpY2UpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRvc2FfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHRvc2Ffc25kX2RldmljZSk7Cit9CisKK21vZHVsZV9pbml0KHRvc2FfaW5pdCk7Cittb2R1bGVfZXhpdCh0b3NhX2V4aXQpOworCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9BVVRIT1IoIlJpY2hhcmQgUHVyZGllIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIFRvc2EiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtY29yZS5jIGIvc291bmQvc29jL3NvYy1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1MTlhZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCkBAIC0wLDAgKzEsMTU4NyBAQAorLyoKKyAqIHNvYy1jb3JlLmMgIC0tICBBTFNBIFNvQyBBdWRpbyBMYXllcgorICoKKyAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKKyAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqICAgICAgICAgd2l0aCBjb2RlLCBjb21tZW50cyBhbmQgaWRlYXMgZnJvbSA6LQorICogICAgICAgICBSaWNoYXJkIFB1cmRpZSA8cmljaGFyZEBvcGVuZWRoYW5kLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMTJ0aCBBdWcgMjAwNSAgIEluaXRpYWwgdmVyc2lvbi4KKyAqICAgIDI1dGggT2N0IDIwMDUgICBXb3JraW5nIENvZGVjLCBJbnRlcmZhY2UgYW5kIFBsYXRmb3JtIHJlZ2lzdHJhdGlvbi4KKyAqCisgKiAgVE9ETzoKKyAqICAgbyBBZGQgaHcgcnVsZXMgdG8gZW5mb3JjZSByYXRlcywgZXRjLgorICogICBvIE1vcmUgdGVzdGluZyB3aXRoIG90aGVyIGNvZGVjcy9tYWNoaW5lcy4KKyAqICAgbyBBZGQgbW9yZSBjb2RlY3MgYW5kIHBsYXRmb3JtcyB0byBlbnN1cmUgZ29vZCBBUEkgY292ZXJhZ2UuCisgKiAgIG8gU3VwcG9ydCBURE0gb24gUENNIGFuZCBJMlMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisKKy8qIGRlYnVnICovCisjZGVmaW5lIFNPQ19ERUJVRyAwCisjaWYgU09DX0RFQlVHCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKGZvcm1hdCwgIyMgYXJnKQorI2Vsc2UKKyNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKQorI2VuZGlmCisKK3N0YXRpYyBERUZJTkVfTVVURVgocGNtX211dGV4KTsKK3N0YXRpYyBERUZJTkVfTVVURVgoaW9fbXV0ZXgpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHNvY19wbV93YWl0cSk7CisKKy8qCisgKiBUaGlzIGlzIGEgdGltZW91dCB0byBkbyBhIERBUE0gcG93ZXJkb3duIGFmdGVyIGEgc3RyZWFtIGlzIGNsb3NlZCgpLgorICogSXQgY2FuIGJlIHVzZWQgdG8gZWxpbWluYXRlIHBvcHMgYmV0d2VlbiBkaWZmZXJlbnQgcGxheWJhY2sgc3RyZWFtcywgZS5nLgorICogYmV0d2VlbiB0d28gYXVkaW8gdHJhY2tzLgorICovCitzdGF0aWMgaW50IHBtZG93bl90aW1lID0gNTAwMDsKK21vZHVsZV9wYXJhbShwbWRvd25fdGltZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG1kb3duX3RpbWUsICJEQVBNIHN0cmVhbSBwb3dlcmRvd24gdGltZSAobXNlY3MpIik7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZvcmNlcyBhbnkgZGVsYXllZCB3b3JrIHRvIGJlIHF1ZXVlZCBhbmQgcnVuLgorICovCitzdGF0aWMgaW50IHJ1bl9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmspCit7CisJaW50IHJldDsKKworCS8qIGNhbmNlbCBhbnkgd29yayB3YWl0aW5nIHRvIGJlIHF1ZXVlZC4gKi8KKwlyZXQgPSBjYW5jZWxfZGVsYXllZF93b3JrKGR3b3JrKTsKKworCS8qIGlmIHRoZXJlIHdhcyBhbnkgd29yayB3YWl0aW5nIHRoZW4gd2UgcnVuIGl0IG5vdyBhbmQKKwkgKiB3YWl0IGZvciBpdCdzIGNvbXBsZXRpb24gKi8KKwlpZiAocmV0KSB7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yayhkd29yaywgMCk7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfU05EX1NPQ19BQzk3X0JVUworLyogdW5yZWdpc3RlciBhYzk3IGNvZGVjICovCitzdGF0aWMgaW50IHNvY19hYzk3X2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpZiAoY29kZWMtPmFjOTctPmRldi5idXMpCisJCWRldmljZV91bnJlZ2lzdGVyKCZjb2RlYy0+YWM5Ny0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogc3RvcCBubyBkZXYgcmVsZWFzZSB3YXJuaW5nICovCitzdGF0aWMgdm9pZCBzb2NfYWM5N19kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpe30KKworLyogcmVnaXN0ZXIgYWM5NyBjb2RlYyB0byBidXMgKi8KK3N0YXRpYyBpbnQgc29jX2FjOTdfZGV2X3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgZXJyOworCisJY29kZWMtPmFjOTctPmRldi5idXMgPSAmYWM5N19idXNfdHlwZTsKKwljb2RlYy0+YWM5Ny0+ZGV2LnBhcmVudCA9IE5VTEw7CisJY29kZWMtPmFjOTctPmRldi5yZWxlYXNlID0gc29jX2FjOTdfZGV2aWNlX3JlbGVhc2U7CisKKwlzbnByaW50Zihjb2RlYy0+YWM5Ny0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlZC0lZDolcyIsCisJCSBjb2RlYy0+Y2FyZC0+bnVtYmVyLCAwLCBjb2RlYy0+bmFtZSk7CisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZjb2RlYy0+YWM5Ny0+ZGV2KTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJDYW4ndCByZWdpc3RlciBhYzk3IGJ1c1xuIik7CisJCWNvZGVjLT5hYzk3LT5kZXYuYnVzID0gTlVMTDsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBnZXRfZGFpX25hbWUoaW50IHR5cGUpCit7CisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIFNORF9TT0NfREFJX0FDOTc6CisJCXJldHVybiAiQUM5NyI7CisJY2FzZSBTTkRfU09DX0RBSV9JMlM6CisJCXJldHVybiAiSTJTIjsKKwljYXNlIFNORF9TT0NfREFJX1BDTToKKwkJcmV0dXJuICJQQ00iOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIENhbGxlZCBieSBBTFNBIHdoZW4gYSBQQ00gc3Vic3RyZWFtIGlzIG9wZW5lZCwgdGhlIHJ1bnRpbWUtPmh3IHJlY29yZCBpcworICogdGhlbiBpbml0aWFsaXplZCBhbmQgYW55IHByaXZhdGUgZGF0YSBjYW4gYmUgYWxsb2NhdGVkLiBUaGlzIGFsc28gY2FsbHMKKyAqIHN0YXJ0dXAgZm9yIHRoZSBjcHUgREFJLCBwbGF0Zm9ybSwgbWFjaGluZSBhbmQgY29kZWMgREFJLgorICovCitzdGF0aWMgaW50IHNvY19wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICptYWNoaW5lID0gcnRkLT5kYWk7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc29jZGV2LT5wbGF0Zm9ybTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gbWFjaGluZS0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSA9IG1hY2hpbmUtPmNvZGVjX2RhaTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnBjbV9tdXRleCk7CisKKwkvKiBzdGFydHVwIHRoZSBhdWRpbyBzdWJzeXN0ZW0gKi8KKwlpZiAoY3B1X2RhaS0+b3BzLnN0YXJ0dXApIHsKKwkJcmV0ID0gY3B1X2RhaS0+b3BzLnN0YXJ0dXAoc3Vic3RyZWFtKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogY2FuJ3Qgb3BlbiBpbnRlcmZhY2UgJXNcbiIsCisJCQkJY3B1X2RhaS0+bmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChwbGF0Zm9ybS0+cGNtX29wcy0+b3BlbikgeworCQlyZXQgPSBwbGF0Zm9ybS0+cGNtX29wcy0+b3BlbihzdWJzdHJlYW0pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBjYW4ndCBvcGVuIHBsYXRmb3JtICVzXG4iLCBwbGF0Zm9ybS0+bmFtZSk7CisJCQlnb3RvIHBsYXRmb3JtX2VycjsKKwkJfQorCX0KKworCWlmIChjb2RlY19kYWktPm9wcy5zdGFydHVwKSB7CisJCXJldCA9IGNvZGVjX2RhaS0+b3BzLnN0YXJ0dXAoc3Vic3RyZWFtKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogY2FuJ3Qgb3BlbiBjb2RlYyAlc1xuIiwKKwkJCQljb2RlY19kYWktPm5hbWUpOworCQkJZ290byBjb2RlY19kYWlfZXJyOworCQl9CisJfQorCisJaWYgKG1hY2hpbmUtPm9wcyAmJiBtYWNoaW5lLT5vcHMtPnN0YXJ0dXApIHsKKwkJcmV0ID0gbWFjaGluZS0+b3BzLT5zdGFydHVwKHN1YnN0cmVhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6ICVzIHN0YXJ0dXAgZmFpbGVkXG4iLCBtYWNoaW5lLT5uYW1lKTsKKwkJCWdvdG8gbWFjaGluZV9lcnI7CisJCX0KKwl9CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjb2RlYyBhbmQgY3B1IERBSSdzIGFyZSBjb21wYXRpYmxlICovCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJcnVudGltZS0+aHcucmF0ZV9taW4gPQorCQkJbWF4KGNvZGVjX2RhaS0+cGxheWJhY2sucmF0ZV9taW4sIGNwdV9kYWktPnBsYXliYWNrLnJhdGVfbWluKTsKKwkJcnVudGltZS0+aHcucmF0ZV9tYXggPQorCQkJbWluKGNvZGVjX2RhaS0+cGxheWJhY2sucmF0ZV9tYXgsIGNwdV9kYWktPnBsYXliYWNrLnJhdGVfbWF4KTsKKwkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0KKwkJCW1heChjb2RlY19kYWktPnBsYXliYWNrLmNoYW5uZWxzX21pbiwKKwkJCQljcHVfZGFpLT5wbGF5YmFjay5jaGFubmVsc19taW4pOworCQlydW50aW1lLT5ody5jaGFubmVsc19tYXggPQorCQkJbWluKGNvZGVjX2RhaS0+cGxheWJhY2suY2hhbm5lbHNfbWF4LAorCQkJCWNwdV9kYWktPnBsYXliYWNrLmNoYW5uZWxzX21heCk7CisJCXJ1bnRpbWUtPmh3LmZvcm1hdHMgPQorCQkJY29kZWNfZGFpLT5wbGF5YmFjay5mb3JtYXRzICYgY3B1X2RhaS0+cGxheWJhY2suZm9ybWF0czsKKwkJcnVudGltZS0+aHcucmF0ZXMgPQorCQkJY29kZWNfZGFpLT5wbGF5YmFjay5yYXRlcyAmIGNwdV9kYWktPnBsYXliYWNrLnJhdGVzOworCX0gZWxzZSB7CisJCXJ1bnRpbWUtPmh3LnJhdGVfbWluID0KKwkJCW1heChjb2RlY19kYWktPmNhcHR1cmUucmF0ZV9taW4sIGNwdV9kYWktPmNhcHR1cmUucmF0ZV9taW4pOworCQlydW50aW1lLT5ody5yYXRlX21heCA9CisJCQltaW4oY29kZWNfZGFpLT5jYXB0dXJlLnJhdGVfbWF4LCBjcHVfZGFpLT5jYXB0dXJlLnJhdGVfbWF4KTsKKwkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0KKwkJCW1heChjb2RlY19kYWktPmNhcHR1cmUuY2hhbm5lbHNfbWluLAorCQkJCWNwdV9kYWktPmNhcHR1cmUuY2hhbm5lbHNfbWluKTsKKwkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0KKwkJCW1pbihjb2RlY19kYWktPmNhcHR1cmUuY2hhbm5lbHNfbWF4LAorCQkJCWNwdV9kYWktPmNhcHR1cmUuY2hhbm5lbHNfbWF4KTsKKwkJcnVudGltZS0+aHcuZm9ybWF0cyA9CisJCQljb2RlY19kYWktPmNhcHR1cmUuZm9ybWF0cyAmIGNwdV9kYWktPmNhcHR1cmUuZm9ybWF0czsKKwkJcnVudGltZS0+aHcucmF0ZXMgPQorCQkJY29kZWNfZGFpLT5jYXB0dXJlLnJhdGVzICYgY3B1X2RhaS0+Y2FwdHVyZS5yYXRlczsKKwl9CisKKwlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOworCWlmICghcnVudGltZS0+aHcucmF0ZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiAlcyA8LT4gJXMgTm8gbWF0Y2hpbmcgcmF0ZXNcbiIsCisJCQljb2RlY19kYWktPm5hbWUsIGNwdV9kYWktPm5hbWUpOworCQlnb3RvIG1hY2hpbmVfZXJyOworCX0KKwlpZiAoIXJ1bnRpbWUtPmh3LmZvcm1hdHMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiAlcyA8LT4gJXMgTm8gbWF0Y2hpbmcgZm9ybWF0c1xuIiwKKwkJCWNvZGVjX2RhaS0+bmFtZSwgY3B1X2RhaS0+bmFtZSk7CisJCWdvdG8gbWFjaGluZV9lcnI7CisJfQorCWlmICghcnVudGltZS0+aHcuY2hhbm5lbHNfbWluIHx8ICFydW50aW1lLT5ody5jaGFubmVsc19tYXgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiAlcyA8LT4gJXMgTm8gbWF0Y2hpbmcgY2hhbm5lbHNcbiIsCisJCQljb2RlY19kYWktPm5hbWUsIGNwdV9kYWktPm5hbWUpOworCQlnb3RvIG1hY2hpbmVfZXJyOworCX0KKworCWRiZygiYXNvYzogJXMgPC0+ICVzIGluZm86XG4iLGNvZGVjX2RhaS0+bmFtZSwgY3B1X2RhaS0+bmFtZSk7CisJZGJnKCJhc29jOiByYXRlIG1hc2sgMHgleFxuIiwgcnVudGltZS0+aHcucmF0ZXMpOworCWRiZygiYXNvYzogbWluIGNoICVkIG1heCBjaCAlZFxuIiwgcnVudGltZS0+aHcuY2hhbm5lbHNfbWluLAorCQlydW50aW1lLT5ody5jaGFubmVsc19tYXgpOworCWRiZygiYXNvYzogbWluIHJhdGUgJWQgbWF4IHJhdGUgJWRcbiIsIHJ1bnRpbWUtPmh3LnJhdGVfbWluLAorCQlydW50aW1lLT5ody5yYXRlX21heCk7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJY3B1X2RhaS0+cGxheWJhY2suYWN0aXZlID0gY29kZWNfZGFpLT5wbGF5YmFjay5hY3RpdmUgPSAxOworCWVsc2UKKwkJY3B1X2RhaS0+Y2FwdHVyZS5hY3RpdmUgPSBjb2RlY19kYWktPmNhcHR1cmUuYWN0aXZlID0gMTsKKwljcHVfZGFpLT5hY3RpdmUgPSBjb2RlY19kYWktPmFjdGl2ZSA9IDE7CisJY3B1X2RhaS0+cnVudGltZSA9IHJ1bnRpbWU7CisJc29jZGV2LT5jb2RlYy0+YWN0aXZlKys7CisJbXV0ZXhfdW5sb2NrKCZwY21fbXV0ZXgpOworCXJldHVybiAwOworCittYWNoaW5lX2VycjoKKwlpZiAobWFjaGluZS0+b3BzICYmIG1hY2hpbmUtPm9wcy0+c2h1dGRvd24pCisJCW1hY2hpbmUtPm9wcy0+c2h1dGRvd24oc3Vic3RyZWFtKTsKKworY29kZWNfZGFpX2VycjoKKwlpZiAocGxhdGZvcm0tPnBjbV9vcHMtPmNsb3NlKQorCQlwbGF0Zm9ybS0+cGNtX29wcy0+Y2xvc2Uoc3Vic3RyZWFtKTsKKworcGxhdGZvcm1fZXJyOgorCWlmIChjcHVfZGFpLT5vcHMuc2h1dGRvd24pCisJCWNwdV9kYWktPm9wcy5zaHV0ZG93bihzdWJzdHJlYW0pOworb3V0OgorCW11dGV4X3VubG9jaygmcGNtX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUG93ZXIgZG93biB0aGUgYXVkaW8gc3Vic3l0ZW0gcG1kb3duX3RpbWUgbXNlY3MgYWZ0ZXIgY2xvc2UgaXMgY2FsbGVkLgorICogVGhpcyBpcyB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIHBvcHMgb3IgY2xpY2tzIGluIGJldHdlZW4gYW55IG11c2ljIHRyYWNrcworICogZHVlIHRvIERBUE0gcG93ZXIgY3ljbGluZy4KKyAqLworc3RhdGljIHZvaWQgY2xvc2VfZGVsYXllZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc25kX3NvY19kZXZpY2UsIGRlbGF5ZWRfd29yay53b3JrKTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpOworCWludCBpOworCisJbXV0ZXhfbG9jaygmcGNtX211dGV4KTsKKwlmb3IoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX2RhaTsgaSsrKSB7CisJCWNvZGVjX2RhaSA9ICZjb2RlYy0+ZGFpW2ldOworCisJCWRiZygicG9wIHdxIGNoZWNraW5nOiAlcyBzdGF0dXM6ICVzIHdhaXRpbmc6ICVzXG4iLAorCQkJY29kZWNfZGFpLT5wbGF5YmFjay5zdHJlYW1fbmFtZSwKKwkJCWNvZGVjX2RhaS0+cGxheWJhY2suYWN0aXZlID8gImFjdGl2ZSIgOiAiaW5hY3RpdmUiLAorCQkJY29kZWNfZGFpLT5wb3Bfd2FpdCA/ICJ5ZXMiIDogIm5vIik7CisKKwkJLyogYXJlIHdlIHdhaXRpbmcgb24gdGhpcyBjb2RlYyBEQUkgc3RyZWFtICovCisJCWlmIChjb2RlY19kYWktPnBvcF93YWl0ID09IDEpIHsKKworCQkJY29kZWNfZGFpLT5wb3Bfd2FpdCA9IDA7CisJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGNvZGVjLCBjb2RlY19kYWktPnBsYXliYWNrLnN0cmVhbV9uYW1lLAorCQkJCVNORF9TT0NfREFQTV9TVFJFQU1fU1RPUCk7CisKKwkJCS8qIHBvd2VyIGRvd24gdGhlIGNvZGVjIHBvd2VyIGRvbWFpbiBpZiBubyBsb25nZXIgYWN0aXZlICovCisJCQlpZiAoY29kZWMtPmFjdGl2ZSA9PSAwKSB7CisJCQkJZGJnKCJwb3Agd3EgRDMgJXMgJXNcbiIsIGNvZGVjLT5uYW1lLAorCQkJCQljb2RlY19kYWktPnBsYXliYWNrLnN0cmVhbV9uYW1lKTsKKwkJIAkJaWYgKGNvZGVjLT5kYXBtX2V2ZW50KQorCQkJCQljb2RlYy0+ZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKKwkJCX0KKwkJfQorCX0KKwltdXRleF91bmxvY2soJnBjbV9tdXRleCk7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgQUxTQSB3aGVuIGEgUENNIHN1YnN0cmVhbSBpcyBjbG9zZWQuIFByaXZhdGUgZGF0YSBjYW4gYmUKKyAqIGZyZWVkIGhlcmUuIFRoZSBjcHUgREFJLCBjb2RlYyBEQUksIG1hY2hpbmUgYW5kIHBsYXRmb3JtIGFyZSBhbHNvCisgKiBzaHV0ZG93bi4KKyAqLworc3RhdGljIGludCBzb2NfY29kZWNfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKm1hY2hpbmUgPSBydGQtPmRhaTsKKwlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBzb2NkZXYtPnBsYXRmb3JtOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBtYWNoaW5lLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpID0gbWFjaGluZS0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwltdXRleF9sb2NrKCZwY21fbXV0ZXgpOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCWNwdV9kYWktPnBsYXliYWNrLmFjdGl2ZSA9IGNvZGVjX2RhaS0+cGxheWJhY2suYWN0aXZlID0gMDsKKwllbHNlCisJCWNwdV9kYWktPmNhcHR1cmUuYWN0aXZlID0gY29kZWNfZGFpLT5jYXB0dXJlLmFjdGl2ZSA9IDA7CisKKwlpZiAoY29kZWNfZGFpLT5wbGF5YmFjay5hY3RpdmUgPT0gMCAmJgorCQljb2RlY19kYWktPmNhcHR1cmUuYWN0aXZlID09IDApIHsKKwkJY3B1X2RhaS0+YWN0aXZlID0gY29kZWNfZGFpLT5hY3RpdmUgPSAwOworCX0KKwljb2RlYy0+YWN0aXZlLS07CisKKwlpZiAoY3B1X2RhaS0+b3BzLnNodXRkb3duKQorCQljcHVfZGFpLT5vcHMuc2h1dGRvd24oc3Vic3RyZWFtKTsKKworCWlmIChjb2RlY19kYWktPm9wcy5zaHV0ZG93bikKKwkJY29kZWNfZGFpLT5vcHMuc2h1dGRvd24oc3Vic3RyZWFtKTsKKworCWlmIChtYWNoaW5lLT5vcHMgJiYgbWFjaGluZS0+b3BzLT5zaHV0ZG93bikKKwkJbWFjaGluZS0+b3BzLT5zaHV0ZG93bihzdWJzdHJlYW0pOworCisJaWYgKHBsYXRmb3JtLT5wY21fb3BzLT5jbG9zZSkKKwkJcGxhdGZvcm0tPnBjbV9vcHMtPmNsb3NlKHN1YnN0cmVhbSk7CisJY3B1X2RhaS0+cnVudGltZSA9IE5VTEw7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQkvKiBzdGFydCBkZWxheWVkIHBvcCB3cSBoZXJlIGZvciBwbGF5YmFjayBzdHJlYW1zICovCisJCWNvZGVjX2RhaS0+cG9wX3dhaXQgPSAxOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnNvY2Rldi0+ZGVsYXllZF93b3JrLAorCQkJbXNlY3NfdG9famlmZmllcyhwbWRvd25fdGltZSkpOworCX0gZWxzZSB7CisJCS8qIGNhcHR1cmUgc3RyZWFtcyBjYW4gYmUgcG93ZXJlZCBkb3duIG5vdyAqLworCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGNvZGVjLAorCQkJY29kZWNfZGFpLT5jYXB0dXJlLnN0cmVhbV9uYW1lLCBTTkRfU09DX0RBUE1fU1RSRUFNX1NUT1ApOworCisJCWlmIChjb2RlYy0+YWN0aXZlID09IDAgJiYgY29kZWNfZGFpLT5wb3Bfd2FpdCA9PSAwKXsKKwkJCWlmIChjb2RlYy0+ZGFwbV9ldmVudCkKKwkJCQljb2RlYy0+ZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmcGNtX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlZCBieSBBTFNBIHdoZW4gdGhlIFBDTSBzdWJzdHJlYW0gaXMgcHJlcGFyZWQsIGNhbiBzZXQgZm9ybWF0LCBzYW1wbGUKKyAqIHJhdGUsIGV0Yy4gIFRoaXMgZnVuY3Rpb24gaXMgbm9uIGF0b21pYyBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywKKyAqIGl0IGNhbiByZWZlciB0byB0aGUgcnVudGltZSBpbmZvLgorICovCitzdGF0aWMgaW50IHNvY19wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqbWFjaGluZSA9IHJ0ZC0+ZGFpOworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNvY2Rldi0+cGxhdGZvcm07CisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IG1hY2hpbmUtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWkgPSBtYWNoaW5lLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnBjbV9tdXRleCk7CisKKwlpZiAobWFjaGluZS0+b3BzICYmIG1hY2hpbmUtPm9wcy0+cHJlcGFyZSkgeworCQlyZXQgPSBtYWNoaW5lLT5vcHMtPnByZXBhcmUoc3Vic3RyZWFtKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogbWFjaGluZSBwcmVwYXJlIGVycm9yXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKHBsYXRmb3JtLT5wY21fb3BzLT5wcmVwYXJlKSB7CisJCXJldCA9IHBsYXRmb3JtLT5wY21fb3BzLT5wcmVwYXJlKHN1YnN0cmVhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IHBsYXRmb3JtIHByZXBhcmUgZXJyb3JcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoY29kZWNfZGFpLT5vcHMucHJlcGFyZSkgeworCQlyZXQgPSBjb2RlY19kYWktPm9wcy5wcmVwYXJlKHN1YnN0cmVhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNvZGVjIERBSSBwcmVwYXJlIGVycm9yXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGNwdV9kYWktPm9wcy5wcmVwYXJlKSB7CisJCXJldCA9IGNwdV9kYWktPm9wcy5wcmVwYXJlKHN1YnN0cmVhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNwdSBEQUkgcHJlcGFyZSBlcnJvclxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIHdlIG9ubHkgd2FudCB0byBzdGFydCBhIERBUE0gcGxheWJhY2sgc3RyZWFtIGlmIHdlIGFyZSBub3Qgd2FpdGluZworCSAqIG9uIGFuIGV4aXN0aW5nIG9uZSBzdG9wcGluZyAqLworCWlmIChjb2RlY19kYWktPnBvcF93YWl0KSB7CisJCS8qIHdlIGFyZSB3YWl0aW5nIGZvciB0aGUgZGVsYXllZCB3b3JrIHRvIHN0YXJ0ICovCisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCQkJc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudChzb2NkZXYtPmNvZGVjLAorCQkJCQljb2RlY19kYWktPmNhcHR1cmUuc3RyZWFtX25hbWUsCisJCQkJCVNORF9TT0NfREFQTV9TVFJFQU1fU1RBUlQpOworCQllbHNlIHsKKwkJCWNvZGVjX2RhaS0+cG9wX3dhaXQgPSAwOworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmc29jZGV2LT5kZWxheWVkX3dvcmspOworCQkJaWYgKGNvZGVjX2RhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUpCisJCQkJY29kZWNfZGFpLT5kYWlfb3BzLmRpZ2l0YWxfbXV0ZShjb2RlY19kYWksIDApOworCQl9CisJfSBlbHNlIHsKKwkJLyogbm8gZGVsYXllZCB3b3JrIC0gZG8gd2UgbmVlZCB0byBwb3dlciB1cCBjb2RlYyAqLworCQlpZiAoY29kZWMtPmRhcG1fc3RhdGUgIT0gU05EUlZfQ1RMX1BPV0VSX0QwKSB7CisKKwkJCWlmIChjb2RlYy0+ZGFwbV9ldmVudCkKKwkJCQljb2RlYy0+ZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QxKTsKKworCQkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCQkJc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudChjb2RlYywKKwkJCQkJY29kZWNfZGFpLT5wbGF5YmFjay5zdHJlYW1fbmFtZSwKKwkJCQkJU05EX1NPQ19EQVBNX1NUUkVBTV9TVEFSVCk7CisJCQllbHNlCisJCQkJc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudChjb2RlYywKKwkJCQkJY29kZWNfZGFpLT5jYXB0dXJlLnN0cmVhbV9uYW1lLAorCQkJCQlTTkRfU09DX0RBUE1fU1RSRUFNX1NUQVJUKTsKKworCQkJaWYgKGNvZGVjLT5kYXBtX2V2ZW50KQorCQkJCWNvZGVjLT5kYXBtX2V2ZW50KGNvZGVjLCBTTkRSVl9DVExfUE9XRVJfRDApOworCQkJaWYgKGNvZGVjX2RhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUpCisJCQkJY29kZWNfZGFpLT5kYWlfb3BzLmRpZ2l0YWxfbXV0ZShjb2RlY19kYWksIDApOworCisJCX0gZWxzZSB7CisJCQkvKiBjb2RlYyBhbHJlYWR5IHBvd2VyZWQgLSBwb3dlciBvbiB3aWRnZXRzICovCisJCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGNvZGVjLAorCQkJCQljb2RlY19kYWktPnBsYXliYWNrLnN0cmVhbV9uYW1lLAorCQkJCQlTTkRfU09DX0RBUE1fU1RSRUFNX1NUQVJUKTsKKwkJCWVsc2UKKwkJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGNvZGVjLAorCQkJCQljb2RlY19kYWktPmNhcHR1cmUuc3RyZWFtX25hbWUsCisJCQkJCVNORF9TT0NfREFQTV9TVFJFQU1fU1RBUlQpOworCQkJaWYgKGNvZGVjX2RhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUpCisJCQkJY29kZWNfZGFpLT5kYWlfb3BzLmRpZ2l0YWxfbXV0ZShjb2RlY19kYWksIDApOworCQl9CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwY21fbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgQUxTQSB3aGVuIHRoZSBoYXJkd2FyZSBwYXJhbXMgYXJlIHNldCBieSBhcHBsaWNhdGlvbi4gVGhpcworICogZnVuY3Rpb24gY2FuIGFsc28gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFuZCBjYW4gYWxsb2NhdGUgYnVmZmVycworICogKHVzaW5nIHNuZF9wY21fbGliXyogKS4gSXQncyBub24tYXRvbWljLgorICovCitzdGF0aWMgaW50IHNvY19wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHJ0ZC0+c29jZGV2OworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICptYWNoaW5lID0gcnRkLT5kYWk7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc29jZGV2LT5wbGF0Zm9ybTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gbWFjaGluZS0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSA9IG1hY2hpbmUtPmNvZGVjX2RhaTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnBjbV9tdXRleCk7CisKKwlpZiAobWFjaGluZS0+b3BzICYmIG1hY2hpbmUtPm9wcy0+aHdfcGFyYW1zKSB7CisJCXJldCA9IG1hY2hpbmUtPm9wcy0+aHdfcGFyYW1zKHN1YnN0cmVhbSwgcGFyYW1zKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogbWFjaGluZSBod19wYXJhbXMgZmFpbGVkXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGNvZGVjX2RhaS0+b3BzLmh3X3BhcmFtcykgeworCQlyZXQgPSBjb2RlY19kYWktPm9wcy5od19wYXJhbXMoc3Vic3RyZWFtLCBwYXJhbXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBjYW4ndCBzZXQgY29kZWMgJXMgaHcgcGFyYW1zXG4iLAorCQkJCWNvZGVjX2RhaS0+bmFtZSk7CisJCQlnb3RvIGNvZGVjX2VycjsKKwkJfQorCX0KKworCWlmIChjcHVfZGFpLT5vcHMuaHdfcGFyYW1zKSB7CisJCXJldCA9IGNwdV9kYWktPm9wcy5od19wYXJhbXMoc3Vic3RyZWFtLCBwYXJhbXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBjYW4ndCBzZXQgaW50ZXJmYWNlICVzIGh3IHBhcmFtc1xuIiwKKwkJCQljcHVfZGFpLT5uYW1lKTsKKwkJCWdvdG8gaW50ZXJmYWNlX2VycjsKKwkJfQorCX0KKworCWlmIChwbGF0Zm9ybS0+cGNtX29wcy0+aHdfcGFyYW1zKSB7CisJCXJldCA9IHBsYXRmb3JtLT5wY21fb3BzLT5od19wYXJhbXMoc3Vic3RyZWFtLCBwYXJhbXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBjYW4ndCBzZXQgcGxhdGZvcm0gJXMgaHcgcGFyYW1zXG4iLAorCQkJCXBsYXRmb3JtLT5uYW1lKTsKKwkJCWdvdG8gcGxhdGZvcm1fZXJyOworCQl9CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwY21fbXV0ZXgpOworCXJldHVybiByZXQ7CisKK3BsYXRmb3JtX2VycjoKKwlpZiAoY3B1X2RhaS0+b3BzLmh3X2ZyZWUpCisJCWNwdV9kYWktPm9wcy5od19mcmVlKHN1YnN0cmVhbSk7CisKK2ludGVyZmFjZV9lcnI6CisJaWYgKGNvZGVjX2RhaS0+b3BzLmh3X2ZyZWUpCisJCWNvZGVjX2RhaS0+b3BzLmh3X2ZyZWUoc3Vic3RyZWFtKTsKKworY29kZWNfZXJyOgorCWlmKG1hY2hpbmUtPm9wcyAmJiBtYWNoaW5lLT5vcHMtPmh3X2ZyZWUpCisJCW1hY2hpbmUtPm9wcy0+aHdfZnJlZShzdWJzdHJlYW0pOworCisJbXV0ZXhfdW5sb2NrKCZwY21fbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGcmVlJ3MgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBod19wYXJhbXMsIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKKyAqLworc3RhdGljIGludCBzb2NfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKm1hY2hpbmUgPSBydGQtPmRhaTsKKwlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBzb2NkZXYtPnBsYXRmb3JtOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBtYWNoaW5lLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpID0gbWFjaGluZS0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwltdXRleF9sb2NrKCZwY21fbXV0ZXgpOworCisJLyogYXBwbHkgY29kZWMgZGlnaXRhbCBtdXRlICovCisJaWYgKCFjb2RlYy0+YWN0aXZlICYmIGNvZGVjX2RhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUpCisJCWNvZGVjX2RhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUoY29kZWNfZGFpLCAxKTsKKworCS8qIGZyZWUgYW55IG1hY2hpbmUgaHcgcGFyYW1zICovCisJaWYgKG1hY2hpbmUtPm9wcyAmJiBtYWNoaW5lLT5vcHMtPmh3X2ZyZWUpCisJCW1hY2hpbmUtPm9wcy0+aHdfZnJlZShzdWJzdHJlYW0pOworCisJLyogZnJlZSBhbnkgRE1BIHJlc291cmNlcyAqLworCWlmIChwbGF0Zm9ybS0+cGNtX29wcy0+aHdfZnJlZSkKKwkJcGxhdGZvcm0tPnBjbV9vcHMtPmh3X2ZyZWUoc3Vic3RyZWFtKTsKKworCS8qIG5vdyBmcmVlIGh3IHBhcmFtcyBmb3IgdGhlIERBSSdzICAqLworCWlmIChjb2RlY19kYWktPm9wcy5od19mcmVlKQorCQljb2RlY19kYWktPm9wcy5od19mcmVlKHN1YnN0cmVhbSk7CisKKwlpZiAoY3B1X2RhaS0+b3BzLmh3X2ZyZWUpCisJCWNwdV9kYWktPm9wcy5od19mcmVlKHN1YnN0cmVhbSk7CisKKwltdXRleF91bmxvY2soJnBjbV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29jX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHJ0ZC0+c29jZGV2OworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICptYWNoaW5lID0gcnRkLT5kYWk7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc29jZGV2LT5wbGF0Zm9ybTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gbWFjaGluZS0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSA9IG1hY2hpbmUtPmNvZGVjX2RhaTsKKwlpbnQgcmV0OworCisJaWYgKGNvZGVjX2RhaS0+b3BzLnRyaWdnZXIpIHsKKwkJcmV0ID0gY29kZWNfZGFpLT5vcHMudHJpZ2dlcihzdWJzdHJlYW0sIGNtZCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocGxhdGZvcm0tPnBjbV9vcHMtPnRyaWdnZXIpIHsKKwkJcmV0ID0gcGxhdGZvcm0tPnBjbV9vcHMtPnRyaWdnZXIoc3Vic3RyZWFtLCBjbWQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGNwdV9kYWktPm9wcy50cmlnZ2VyKSB7CisJCXJldCA9IGNwdV9kYWktPm9wcy50cmlnZ2VyKHN1YnN0cmVhbSwgY21kKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQVNvQyBQQ00gb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzb2NfcGNtX29wcyA9IHsKKwkub3BlbgkJPSBzb2NfcGNtX29wZW4sCisJLmNsb3NlCQk9IHNvY19jb2RlY19jbG9zZSwKKwkuaHdfcGFyYW1zCT0gc29jX3BjbV9od19wYXJhbXMsCisJLmh3X2ZyZWUJPSBzb2NfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUJPSBzb2NfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIJPSBzb2NfcGNtX3RyaWdnZXIsCit9OworCisjaWZkZWYgQ09ORklHX1BNCisvKiBwb3dlcnMgZG93biBhdWRpbyBzdWJzeXN0ZW0gZm9yIHN1c3BlbmQgKi8KK3N0YXRpYyBpbnQgc29jX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworIAlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworIAlzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lICptYWNoaW5lID0gc29jZGV2LT5tYWNoaW5lOworIAlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBzb2NkZXYtPnBsYXRmb3JtOworIAlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2UgKmNvZGVjX2RldiA9IHNvY2Rldi0+Y29kZWNfZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IGk7CisKKwkvKiBtdXRlIGFueSBhY3RpdmUgREFDJ3MgKi8KKwlmb3IoaSA9IDA7IGkgPCBtYWNoaW5lLT5udW1fbGlua3M7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmRhaSA9IG1hY2hpbmUtPmRhaV9saW5rW2ldLmNvZGVjX2RhaTsKKwkJaWYgKGRhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUgJiYgZGFpLT5wbGF5YmFjay5hY3RpdmUpCisJCQlkYWktPmRhaV9vcHMuZGlnaXRhbF9tdXRlKGRhaSwgMSk7CisJfQorCisJaWYgKG1hY2hpbmUtPnN1c3BlbmRfcHJlKQorCQltYWNoaW5lLT5zdXNwZW5kX3ByZShwZGV2LCBzdGF0ZSk7CisKKwlmb3IoaSA9IDA7IGkgPCBtYWNoaW5lLT5udW1fbGlua3M7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICAqY3B1X2RhaSA9IG1hY2hpbmUtPmRhaV9saW5rW2ldLmNwdV9kYWk7CisJCWlmIChjcHVfZGFpLT5zdXNwZW5kICYmIGNwdV9kYWktPnR5cGUgIT0gU05EX1NPQ19EQUlfQUM5NykKKwkJCWNwdV9kYWktPnN1c3BlbmQocGRldiwgY3B1X2RhaSk7CisJCWlmIChwbGF0Zm9ybS0+c3VzcGVuZCkKKwkJCXBsYXRmb3JtLT5zdXNwZW5kKHBkZXYsIGNwdV9kYWkpOworCX0KKworCS8qIGNsb3NlIGFueSB3YWl0aW5nIHN0cmVhbXMgYW5kIHNhdmUgc3RhdGUgKi8KKwlydW5fZGVsYXllZF93b3JrKCZzb2NkZXYtPmRlbGF5ZWRfd29yayk7CisJY29kZWMtPnN1c3BlbmRfZGFwbV9zdGF0ZSA9IGNvZGVjLT5kYXBtX3N0YXRlOworCisJZm9yKGkgPSAwOyBpIDwgY29kZWMtPm51bV9kYWk7IGkrKykgeworCQljaGFyICpzdHJlYW0gPSBjb2RlYy0+ZGFpW2ldLnBsYXliYWNrLnN0cmVhbV9uYW1lOworCQlpZiAoc3RyZWFtICE9IE5VTEwpCisJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGNvZGVjLCBzdHJlYW0sCisJCQkJU05EX1NPQ19EQVBNX1NUUkVBTV9TVVNQRU5EKTsKKwkJc3RyZWFtID0gY29kZWMtPmRhaVtpXS5jYXB0dXJlLnN0cmVhbV9uYW1lOworCQlpZiAoc3RyZWFtICE9IE5VTEwpCisJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGNvZGVjLCBzdHJlYW0sCisJCQkJU05EX1NPQ19EQVBNX1NUUkVBTV9TVVNQRU5EKTsKKwl9CisKKwlpZiAoY29kZWNfZGV2LT5zdXNwZW5kKQorCQljb2RlY19kZXYtPnN1c3BlbmQocGRldiwgc3RhdGUpOworCisJZm9yKGkgPSAwOyBpIDwgbWFjaGluZS0+bnVtX2xpbmtzOyBpKyspIHsKKwkJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IG1hY2hpbmUtPmRhaV9saW5rW2ldLmNwdV9kYWk7CisJCWlmIChjcHVfZGFpLT5zdXNwZW5kICYmIGNwdV9kYWktPnR5cGUgPT0gU05EX1NPQ19EQUlfQUM5NykKKwkJCWNwdV9kYWktPnN1c3BlbmQocGRldiwgY3B1X2RhaSk7CisJfQorCisJaWYgKG1hY2hpbmUtPnN1c3BlbmRfcG9zdCkKKwkJbWFjaGluZS0+c3VzcGVuZF9wb3N0KHBkZXYsIHN0YXRlKTsKKworCXJldHVybiAwOworfQorCisvKiBwb3dlcnMgdXAgYXVkaW8gc3Vic3lzdGVtIGFmdGVyIGEgc3VzcGVuZCAqLworc3RhdGljIGludCBzb2NfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisgCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisgCXN0cnVjdCBzbmRfc29jX21hY2hpbmUgKm1hY2hpbmUgPSBzb2NkZXYtPm1hY2hpbmU7CisgCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNvY2Rldi0+cGxhdGZvcm07CisgCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSAqY29kZWNfZGV2ID0gc29jZGV2LT5jb2RlY19kZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlpbnQgaTsKKworCWlmIChtYWNoaW5lLT5yZXN1bWVfcHJlKQorCQltYWNoaW5lLT5yZXN1bWVfcHJlKHBkZXYpOworCisJZm9yKGkgPSAwOyBpIDwgbWFjaGluZS0+bnVtX2xpbmtzOyBpKyspIHsKKwkJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IG1hY2hpbmUtPmRhaV9saW5rW2ldLmNwdV9kYWk7CisJCWlmIChjcHVfZGFpLT5yZXN1bWUgJiYgY3B1X2RhaS0+dHlwZSA9PSBTTkRfU09DX0RBSV9BQzk3KQorCQkJY3B1X2RhaS0+cmVzdW1lKHBkZXYsIGNwdV9kYWkpOworCX0KKworCWlmIChjb2RlY19kZXYtPnJlc3VtZSkKKwkJY29kZWNfZGV2LT5yZXN1bWUocGRldik7CisKKwlmb3IoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX2RhaTsgaSsrKSB7CisJCWNoYXIqIHN0cmVhbSA9IGNvZGVjLT5kYWlbaV0ucGxheWJhY2suc3RyZWFtX25hbWU7CisJCWlmIChzdHJlYW0gIT0gTlVMTCkKKwkJCXNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQoY29kZWMsIHN0cmVhbSwKKwkJCQlTTkRfU09DX0RBUE1fU1RSRUFNX1JFU1VNRSk7CisJCXN0cmVhbSA9IGNvZGVjLT5kYWlbaV0uY2FwdHVyZS5zdHJlYW1fbmFtZTsKKwkJaWYgKHN0cmVhbSAhPSBOVUxMKQorCQkJc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudChjb2RlYywgc3RyZWFtLAorCQkJCVNORF9TT0NfREFQTV9TVFJFQU1fUkVTVU1FKTsKKwl9CisKKwkvKiB1bm11dGUgYW55IGFjdGl2ZSBEQUMncyAqLworCWZvcihpID0gMDsgaSA8IG1hY2hpbmUtPm51bV9saW5rczsgaSsrKSB7CisJCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqZGFpID0gbWFjaGluZS0+ZGFpX2xpbmtbaV0uY29kZWNfZGFpOworCQlpZiAoZGFpLT5kYWlfb3BzLmRpZ2l0YWxfbXV0ZSAmJiBkYWktPnBsYXliYWNrLmFjdGl2ZSkKKwkJCWRhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUoZGFpLCAwKTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBtYWNoaW5lLT5udW1fbGlua3M7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gbWFjaGluZS0+ZGFpX2xpbmtbaV0uY3B1X2RhaTsKKwkJaWYgKGNwdV9kYWktPnJlc3VtZSAmJiBjcHVfZGFpLT50eXBlICE9IFNORF9TT0NfREFJX0FDOTcpCisJCQljcHVfZGFpLT5yZXN1bWUocGRldiwgY3B1X2RhaSk7CisJCWlmIChwbGF0Zm9ybS0+cmVzdW1lKQorCQkJcGxhdGZvcm0tPnJlc3VtZShwZGV2LCBjcHVfZGFpKTsKKwl9CisKKwlpZiAobWFjaGluZS0+cmVzdW1lX3Bvc3QpCisJCW1hY2hpbmUtPnJlc3VtZV9wb3N0KHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIHNvY19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgc29jX3Jlc3VtZQlOVUxMCisjZW5kaWYKKworLyogcHJvYmVzIGEgbmV3IHNvY2RldiAqLworc3RhdGljIGludCBzb2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMCwgaTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX21hY2hpbmUgKm1hY2hpbmUgPSBzb2NkZXYtPm1hY2hpbmU7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc29jZGV2LT5wbGF0Zm9ybTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2UgKmNvZGVjX2RldiA9IHNvY2Rldi0+Y29kZWNfZGV2OworCisJaWYgKG1hY2hpbmUtPnByb2JlKSB7CisJCXJldCA9IG1hY2hpbmUtPnByb2JlKHBkZXYpOworCQlpZihyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWFjaGluZS0+bnVtX2xpbmtzOyBpKyspIHsKKwkJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IG1hY2hpbmUtPmRhaV9saW5rW2ldLmNwdV9kYWk7CisJCWlmIChjcHVfZGFpLT5wcm9iZSkgeworCQkJcmV0ID0gY3B1X2RhaS0+cHJvYmUocGRldik7CisJCQlpZihyZXQgPCAwKQorCQkJCWdvdG8gY3B1X2RhaV9lcnI7CisJCX0KKwl9CisKKwlpZiAoY29kZWNfZGV2LT5wcm9iZSkgeworCQlyZXQgPSBjb2RlY19kZXYtPnByb2JlKHBkZXYpOworCQlpZihyZXQgPCAwKQorCQkJZ290byBjcHVfZGFpX2VycjsKKwl9CisKKwlpZiAocGxhdGZvcm0tPnByb2JlKSB7CisJCXJldCA9IHBsYXRmb3JtLT5wcm9iZShwZGV2KTsKKwkJaWYocmV0IDwgMCkKKwkJCWdvdG8gcGxhdGZvcm1fZXJyOworCX0KKworCS8qIERBUE0gc3RyZWFtIHdvcmsgKi8KKwlJTklUX0RFTEFZRURfV09SSygmc29jZGV2LT5kZWxheWVkX3dvcmssIGNsb3NlX2RlbGF5ZWRfd29yayk7CisJcmV0dXJuIDA7CisKK3BsYXRmb3JtX2VycjoKKwlpZiAoY29kZWNfZGV2LT5yZW1vdmUpCisJCWNvZGVjX2Rldi0+cmVtb3ZlKHBkZXYpOworCitjcHVfZGFpX2VycjoKKwlmb3IgKGktLTsgaSA+PSAwOyBpLS0pIHsKKwkJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IG1hY2hpbmUtPmRhaV9saW5rW2ldLmNwdV9kYWk7CisJCWlmIChjcHVfZGFpLT5yZW1vdmUpCisJCQljcHVfZGFpLT5yZW1vdmUocGRldik7CisJfQorCisJaWYgKG1hY2hpbmUtPnJlbW92ZSkKKwkJbWFjaGluZS0+cmVtb3ZlKHBkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworLyogcmVtb3ZlcyBhIHNvY2RldiAqLworc3RhdGljIGludCBzb2NfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGk7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lICptYWNoaW5lID0gc29jZGV2LT5tYWNoaW5lOworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNvY2Rldi0+cGxhdGZvcm07CisJc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlICpjb2RlY19kZXYgPSBzb2NkZXYtPmNvZGVjX2RldjsKKworCXJ1bl9kZWxheWVkX3dvcmsoJnNvY2Rldi0+ZGVsYXllZF93b3JrKTsKKworCWlmIChwbGF0Zm9ybS0+cmVtb3ZlKQorCQlwbGF0Zm9ybS0+cmVtb3ZlKHBkZXYpOworCisJaWYgKGNvZGVjX2Rldi0+cmVtb3ZlKQorCQljb2RlY19kZXYtPnJlbW92ZShwZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBtYWNoaW5lLT5udW1fbGlua3M7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gbWFjaGluZS0+ZGFpX2xpbmtbaV0uY3B1X2RhaTsKKwkJaWYgKGNwdV9kYWktPnJlbW92ZSkKKwkJCWNwdV9kYWktPnJlbW92ZShwZGV2KTsKKwl9CisKKwlpZiAobWFjaGluZS0+cmVtb3ZlKQorCQltYWNoaW5lLT5yZW1vdmUocGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyogQVNvQyBwbGF0Zm9ybSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNvY19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCQk9ICJzb2MtYXVkaW8iLAorCX0sCisJLnByb2JlCQk9IHNvY19wcm9iZSwKKwkucmVtb3ZlCQk9IHNvY19yZW1vdmUsCisJLnN1c3BlbmQJPSBzb2Nfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNvY19yZXN1bWUsCit9OworCisvKiBjcmVhdGUgYSBuZXcgcGNtICovCitzdGF0aWMgaW50IHNvY19uZXdfcGNtKHN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2LAorCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluaywgaW50IG51bSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpID0gZGFpX2xpbmstPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gZGFpX2xpbmstPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtOworCWNoYXIgbmV3X25hbWVbNjRdOworCWludCByZXQgPSAwLCBwbGF5YmFjayA9IDAsIGNhcHR1cmUgPSAwOworCisJcnRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocnRkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcnRkLT5kYWkgPSBkYWlfbGluazsKKwlydGQtPnNvY2RldiA9IHNvY2RldjsKKwljb2RlY19kYWktPmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCS8qIGNoZWNrIGNsaWVudCBhbmQgaW50ZXJmYWNlIGh3IGNhcGFiaWxpdGllcyAqLworCXNwcmludGYobmV3X25hbWUsICIlcyAlcy0lcy0lZCIsZGFpX2xpbmstPnN0cmVhbV9uYW1lLCBjb2RlY19kYWktPm5hbWUsCisJCWdldF9kYWlfbmFtZShjcHVfZGFpLT50eXBlKSwgbnVtKTsKKworCWlmIChjb2RlY19kYWktPnBsYXliYWNrLmNoYW5uZWxzX21pbikKKwkJcGxheWJhY2sgPSAxOworCWlmIChjb2RlY19kYWktPmNhcHR1cmUuY2hhbm5lbHNfbWluKQorCQljYXB0dXJlID0gMTsKKworCXJldCA9IHNuZF9wY21fbmV3KGNvZGVjLT5jYXJkLCBuZXdfbmFtZSwgY29kZWMtPnBjbV9kZXZzKyssIHBsYXliYWNrLAorCQljYXB0dXJlLCAmcGNtKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNhbid0IGNyZWF0ZSBwY20gZm9yIGNvZGVjICVzXG4iLCBjb2RlYy0+bmFtZSk7CisJCWtmcmVlKHJ0ZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcGNtLT5wcml2YXRlX2RhdGEgPSBydGQ7CisJc29jX3BjbV9vcHMubW1hcCA9IHNvY2Rldi0+cGxhdGZvcm0tPnBjbV9vcHMtPm1tYXA7CisJc29jX3BjbV9vcHMucG9pbnRlciA9IHNvY2Rldi0+cGxhdGZvcm0tPnBjbV9vcHMtPnBvaW50ZXI7CisJc29jX3BjbV9vcHMuaW9jdGwgPSBzb2NkZXYtPnBsYXRmb3JtLT5wY21fb3BzLT5pb2N0bDsKKwlzb2NfcGNtX29wcy5jb3B5ID0gc29jZGV2LT5wbGF0Zm9ybS0+cGNtX29wcy0+Y29weTsKKwlzb2NfcGNtX29wcy5zaWxlbmNlID0gc29jZGV2LT5wbGF0Zm9ybS0+cGNtX29wcy0+c2lsZW5jZTsKKwlzb2NfcGNtX29wcy5hY2sgPSBzb2NkZXYtPnBsYXRmb3JtLT5wY21fb3BzLT5hY2s7CisJc29jX3BjbV9vcHMucGFnZSA9IHNvY2Rldi0+cGxhdGZvcm0tPnBjbV9vcHMtPnBhZ2U7CisKKwlpZiAocGxheWJhY2spCisJCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzb2NfcGNtX29wcyk7CisKKwlpZiAoY2FwdHVyZSkKKwkJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc29jX3BjbV9vcHMpOworCisJcmV0ID0gc29jZGV2LT5wbGF0Zm9ybS0+cGNtX25ldyhjb2RlYy0+Y2FyZCwgY29kZWNfZGFpLCBwY20pOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogcGxhdGZvcm0gcGNtIGNvbnN0cnVjdG9yIGZhaWxlZFxuIik7CisJCWtmcmVlKHJ0ZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzb2NkZXYtPnBsYXRmb3JtLT5wY21fZnJlZTsKKwlwcmludGsoS0VSTl9JTkZPICJhc29jOiAlcyA8LT4gJXMgbWFwcGluZyBva1xuIiwgY29kZWNfZGFpLT5uYW1lLAorCQljcHVfZGFpLT5uYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBjb2RlYyByZWdpc3RlciBkdW1wICovCitzdGF0aWMgc3NpemVfdCBjb2RlY19yZWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKmRldmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkZXZkYXRhLT5jb2RlYzsKKwlpbnQgaSwgc3RlcCA9IDEsIGNvdW50ID0gMDsKKworCWlmICghY29kZWMtPnJlZ19jYWNoZV9zaXplKQorCQlyZXR1cm4gMDsKKworCWlmIChjb2RlYy0+cmVnX2NhY2hlX3N0ZXApCisJCXN0ZXAgPSBjb2RlYy0+cmVnX2NhY2hlX3N0ZXA7CisKKwljb3VudCArPSBzcHJpbnRmKGJ1ZiwgIiVzIHJlZ2lzdGVyc1xuIiwgY29kZWMtPm5hbWUpOworCWZvcihpID0gMDsgaSA8IGNvZGVjLT5yZWdfY2FjaGVfc2l6ZTsgaSArPSBzdGVwKQorCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiJTJ4OiAlNHhcbiIsIGksIGNvZGVjLT5yZWFkKGNvZGVjLCBpKSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoY29kZWNfcmVnLCAwNDQ0LCBjb2RlY19yZWdfc2hvdywgTlVMTCk7CisKKy8qKgorICogc25kX3NvY19uZXdfYWM5N19jb2RlYyAtIGluaXRhaWxpc2UgQUM5NyBkZXZpY2UKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqIEBvcHM6IEFDOTcgYnVzIG9wZXJhdGlvbnMKKyAqIEBudW06IEFDOTcgY29kZWMgbnVtYmVyCisgKgorICogSW5pdGlhbGlzZXMgQUM5NyBjb2RlYyByZXNvdXJjZXMgZm9yIHVzZSBieSBhZC1ob2MgZGV2aWNlcyBvbmx5LgorICovCitpbnQgc25kX3NvY19uZXdfYWM5N19jb2RlYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgKm9wcywgaW50IG51bSkKK3sKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworCisJY29kZWMtPmFjOTcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX2FjOTcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29kZWMtPmFjOTcgPT0gTlVMTCkgeworCQltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNvZGVjLT5hYzk3LT5idXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX2FjOTdfYnVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNvZGVjLT5hYzk3LT5idXMgPT0gTlVMTCkgeworCQlrZnJlZShjb2RlYy0+YWM5Nyk7CisJCWNvZGVjLT5hYzk3ID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljb2RlYy0+YWM5Ny0+YnVzLT5vcHMgPSBvcHM7CisJY29kZWMtPmFjOTctPm51bSA9IG51bTsKKwltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX25ld19hYzk3X2NvZGVjKTsKKworLyoqCisgKiBzbmRfc29jX2ZyZWVfYWM5N19jb2RlYyAtIGZyZWUgQUM5NyBjb2RlYyBkZXZpY2UKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqCisgKiBGcmVlcyBBQzk3IGNvZGVjIGRldmljZSByZXNvdXJjZXMuCisgKi8KK3ZvaWQgc25kX3NvY19mcmVlX2FjOTdfY29kZWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCW11dGV4X2xvY2soJmNvZGVjLT5tdXRleCk7CisJa2ZyZWUoY29kZWMtPmFjOTctPmJ1cyk7CisJa2ZyZWUoY29kZWMtPmFjOTcpOworCWNvZGVjLT5hYzk3ID0gTlVMTDsKKwltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2ZyZWVfYWM5N19jb2RlYyk7CisKKy8qKgorICogc25kX3NvY191cGRhdGVfYml0cyAtIHVwZGF0ZSBjb2RlYyByZWdpc3RlciBiaXRzCisgKiBAY29kZWM6IGF1ZGlvIGNvZGVjCisgKiBAcmVnOiBjb2RlYyByZWdpc3RlcgorICogQG1hc2s6IHJlZ2lzdGVyIG1hc2sKKyAqIEB2YWx1ZTogbmV3IHZhbHVlCisgKgorICogV3JpdGVzIG5ldyByZWdpc3RlciB2YWx1ZS4KKyAqCisgKiBSZXR1cm5zIDEgZm9yIGNoYW5nZSBlbHNlIDAuCisgKi8KK2ludCBzbmRfc29jX3VwZGF0ZV9iaXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCXVuc2lnbmVkIHNob3J0IG1hc2ssIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgc2hvcnQgb2xkLCBuZXc7CisKKwltdXRleF9sb2NrKCZpb19tdXRleCk7CisJb2xkID0gc25kX3NvY19yZWFkKGNvZGVjLCByZWcpOworCW5ldyA9IChvbGQgJiB+bWFzaykgfCB2YWx1ZTsKKwljaGFuZ2UgPSBvbGQgIT0gbmV3OworCWlmIChjaGFuZ2UpCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZywgbmV3KTsKKworCW11dGV4X3VubG9jaygmaW9fbXV0ZXgpOworCXJldHVybiBjaGFuZ2U7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3VwZGF0ZV9iaXRzKTsKKworLyoqCisgKiBzbmRfc29jX3Rlc3RfYml0cyAtIHRlc3QgcmVnaXN0ZXIgZm9yIGNoYW5nZQorICogQGNvZGVjOiBhdWRpbyBjb2RlYworICogQHJlZzogY29kZWMgcmVnaXN0ZXIKKyAqIEBtYXNrOiByZWdpc3RlciBtYXNrCisgKiBAdmFsdWU6IG5ldyB2YWx1ZQorICoKKyAqIFRlc3RzIGEgcmVnaXN0ZXIgd2l0aCBhIG5ldyB2YWx1ZSBhbmQgY2hlY2tzIGlmIHRoZSBuZXcgdmFsdWUgaXMKKyAqIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgdmFsdWUuCisgKgorICogUmV0dXJucyAxIGZvciBjaGFuZ2UgZWxzZSAwLgorICovCitpbnQgc25kX3NvY190ZXN0X2JpdHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkJdW5zaWduZWQgc2hvcnQgbWFzaywgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJaW50IGNoYW5nZTsKKwl1bnNpZ25lZCBzaG9ydCBvbGQsIG5ldzsKKworCW11dGV4X2xvY2soJmlvX211dGV4KTsKKwlvbGQgPSBzbmRfc29jX3JlYWQoY29kZWMsIHJlZyk7CisJbmV3ID0gKG9sZCAmIH5tYXNrKSB8IHZhbHVlOworCWNoYW5nZSA9IG9sZCAhPSBuZXc7CisJbXV0ZXhfdW5sb2NrKCZpb19tdXRleCk7CisKKwlyZXR1cm4gY2hhbmdlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY190ZXN0X2JpdHMpOworCisvKioKKyAqIHNuZF9zb2NfbmV3X3BjbXMgLSBjcmVhdGUgbmV3IHNvdW5kIGNhcmQgYW5kIHBjbXMKKyAqIEBzb2NkZXY6IHRoZSBTb0MgYXVkaW8gZGV2aWNlCisgKgorICogQ3JlYXRlIGEgbmV3IHNvdW5kIGNhcmQgYmFzZWQgdXBvbiB0aGUgY29kZWMgYW5kIGludGVyZmFjZSBwY21zLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgZWxzZSBlcnJvci4KKyAqLworaW50IHNuZF9zb2NfbmV3X3BjbXMoc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYsIGludCBpZHgsIGNvbnN0IGNoYXIgKnhpZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX21hY2hpbmUgKm1hY2hpbmUgPSBzb2NkZXYtPm1hY2hpbmU7CisJaW50IHJldCA9IDAsIGk7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworCisJLyogcmVnaXN0ZXIgYSBzb3VuZCBjYXJkICovCisJY29kZWMtPmNhcmQgPSBzbmRfY2FyZF9uZXcoaWR4LCB4aWQsIGNvZGVjLT5vd25lciwgMCk7CisJaWYgKCFjb2RlYy0+Y2FyZCkgeworCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNhbid0IGNyZWF0ZSBzb3VuZCBjYXJkIGZvciBjb2RlYyAlc1xuIiwKKwkJCWNvZGVjLT5uYW1lKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljb2RlYy0+Y2FyZC0+ZGV2ID0gc29jZGV2LT5kZXY7CisJY29kZWMtPmNhcmQtPnByaXZhdGVfZGF0YSA9IGNvZGVjOworCXN0cm5jcHkoY29kZWMtPmNhcmQtPmRyaXZlciwgY29kZWMtPm5hbWUsIHNpemVvZihjb2RlYy0+Y2FyZC0+ZHJpdmVyKSk7CisKKwkvKiBjcmVhdGUgdGhlIHBjbXMgKi8KKwlmb3IoaSA9IDA7IGkgPCBtYWNoaW5lLT5udW1fbGlua3M7IGkrKykgeworCQlyZXQgPSBzb2NfbmV3X3BjbShzb2NkZXYsICZtYWNoaW5lLT5kYWlfbGlua1tpXSwgaSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNhbid0IGNyZWF0ZSBwY20gJXNcbiIsCisJCQkJbWFjaGluZS0+ZGFpX2xpbmtbaV0uc3RyZWFtX25hbWUpOworCQkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmY29kZWMtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19uZXdfcGNtcyk7CisKKy8qKgorICogc25kX3NvY19yZWdpc3Rlcl9jYXJkIC0gcmVnaXN0ZXIgc291bmQgY2FyZAorICogQHNvY2RldjogdGhlIFNvQyBhdWRpbyBkZXZpY2UKKyAqCisgKiBSZWdpc3RlciBhIFNvQyBzb3VuZCBjYXJkLiBBbHNvIHJlZ2lzdGVycyBhbiBBQzk3IGRldmljZSBpZiB0aGUKKyAqIGNvZGVjIGlzIEFDOTcgZm9yIGFkIGhvYyBkZXZpY2VzLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgZWxzZSBlcnJvci4KKyAqLworaW50IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX21hY2hpbmUgKm1hY2hpbmUgPSBzb2NkZXYtPm1hY2hpbmU7CisJaW50IHJldCA9IDAsIGksIGFjOTcgPSAwLCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmY29kZWMtPm11dGV4KTsKKwlmb3IoaSA9IDA7IGkgPCBtYWNoaW5lLT5udW1fbGlua3M7IGkrKykgeworCQlpZiAoc29jZGV2LT5tYWNoaW5lLT5kYWlfbGlua1tpXS5pbml0KSB7CisJCQllcnIgPSBzb2NkZXYtPm1hY2hpbmUtPmRhaV9saW5rW2ldLmluaXQoY29kZWMpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGZhaWxlZCB0byBpbml0ICVzXG4iLAorCQkJCQlzb2NkZXYtPm1hY2hpbmUtPmRhaV9saW5rW2ldLnN0cmVhbV9uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlpZiAoc29jZGV2LT5tYWNoaW5lLT5kYWlfbGlua1tpXS5jcHVfZGFpLT50eXBlID09IFNORF9TT0NfREFJX0FDOTcpCisJCQlhYzk3ID0gMTsKKwl9CisJc25wcmludGYoY29kZWMtPmNhcmQtPnNob3J0bmFtZSwgc2l6ZW9mKGNvZGVjLT5jYXJkLT5zaG9ydG5hbWUpLAorCQkgIiVzIiwgbWFjaGluZS0+bmFtZSk7CisJc25wcmludGYoY29kZWMtPmNhcmQtPmxvbmduYW1lLCBzaXplb2YoY29kZWMtPmNhcmQtPmxvbmduYW1lKSwKKwkJICIlcyAoJXMpIiwgbWFjaGluZS0+bmFtZSwgY29kZWMtPm5hbWUpOworCisJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoY29kZWMtPmNhcmQpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogZmFpbGVkIHRvIHJlZ2lzdGVyIHNvdW5kY2FyZCBmb3IgY29kZWMgJXNcbiIsCisJCQkJY29kZWMtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKyNpZmRlZiBDT05GSUdfU05EX1NPQ19BQzk3X0JVUworCWlmIChhYzk3KSB7CisJCXJldCA9IHNvY19hYzk3X2Rldl9yZWdpc3Rlcihjb2RlYyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IEFDOTcgZGV2aWNlIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCQlzbmRfY2FyZF9mcmVlKGNvZGVjLT5jYXJkKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorI2VuZGlmCisKKwllcnIgPSBzbmRfc29jX2RhcG1fc3lzX2FkZChzb2NkZXYtPmRldik7CisJaWYgKGVyciA8IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFzb2M6IGZhaWxlZCB0byBhZGQgZGFwbSBzeXNmcyBlbnRyaWVzXG4iKTsKKworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShzb2NkZXYtPmRldiwgJmRldl9hdHRyX2NvZGVjX3JlZyk7CisJaWYgKGVyciA8IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFzb2M6IGZhaWxlZCB0byBhZGQgY29kZWMgc3lzZnMgZW50cmllc1xuIik7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3JlZ2lzdGVyX2NhcmQpOworCisvKioKKyAqIHNuZF9zb2NfZnJlZV9wY21zIC0gZnJlZSBzb3VuZCBjYXJkIGFuZCBwY21zCisgKiBAc29jZGV2OiB0aGUgU29DIGF1ZGlvIGRldmljZQorICoKKyAqIEZyZWVzIHNvdW5kIGNhcmQgYW5kIHBjbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb2NkZXYuCisgKiBBbHNvIHVucmVnaXN0ZXIgdGhlIGNvZGVjIGlmIGl0IGlzIGFuIEFDOTcgZGV2aWNlLgorICovCit2b2lkIHNuZF9zb2NfZnJlZV9wY21zKHN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworI2lmZGVmIENPTkZJR19TTkRfU09DX0FDOTdfQlVTCisJaWYgKGNvZGVjLT5hYzk3KQorCQlzb2NfYWM5N19kZXZfdW5yZWdpc3Rlcihjb2RlYyk7CisjZW5kaWYKKworCWlmIChjb2RlYy0+Y2FyZCkKKwkJc25kX2NhcmRfZnJlZShjb2RlYy0+Y2FyZCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKHNvY2Rldi0+ZGV2LCAmZGV2X2F0dHJfY29kZWNfcmVnKTsKKwltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2ZyZWVfcGNtcyk7CisKKy8qKgorICogc25kX3NvY19zZXRfcnVudGltZV9od3BhcmFtcyAtIHNldCB0aGUgcnVudGltZSBoYXJkd2FyZSBwYXJhbWV0ZXJzCisgKiBAc3Vic3RyZWFtOiB0aGUgcGNtIHN1YnN0cmVhbQorICogQGh3OiB0aGUgaGFyZHdhcmUgcGFyYW1ldGVycworICoKKyAqIFNldHMgdGhlIHN1YnN0cmVhbSBydW50aW1lIGhhcmR3YXJlIHBhcmFtZXRlcnMuCisgKi8KK2ludCBzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCWNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlICpodykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXJ1bnRpbWUtPmh3LmluZm8gPSBody0+aW5mbzsKKwlydW50aW1lLT5ody5mb3JtYXRzID0gaHctPmZvcm1hdHM7CisJcnVudGltZS0+aHcucGVyaW9kX2J5dGVzX21pbiA9IGh3LT5wZXJpb2RfYnl0ZXNfbWluOworCXJ1bnRpbWUtPmh3LnBlcmlvZF9ieXRlc19tYXggPSBody0+cGVyaW9kX2J5dGVzX21heDsKKwlydW50aW1lLT5ody5wZXJpb2RzX21pbiA9IGh3LT5wZXJpb2RzX21pbjsKKwlydW50aW1lLT5ody5wZXJpb2RzX21heCA9IGh3LT5wZXJpb2RzX21heDsKKwlydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4ID0gaHctPmJ1ZmZlcl9ieXRlc19tYXg7CisJcnVudGltZS0+aHcuZmlmb19zaXplID0gaHctPmZpZm9fc2l6ZTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMpOworCisvKioKKyAqIHNuZF9zb2NfY25ldyAtIGNyZWF0ZSBuZXcgY29udHJvbAorICogQF90ZW1wbGF0ZTogY29udHJvbCB0ZW1wbGF0ZQorICogQGRhdGE6IGNvbnRyb2wgcHJpdmF0ZSBkYXRhCisgKiBAbG5uZ19uYW1lOiBjb250cm9sIGxvbmcgbmFtZQorICoKKyAqIENyZWF0ZSBhIG5ldyBtaXhlciBjb250cm9sIGZyb20gYSB0ZW1wbGF0ZSBjb250cm9sLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgZWxzZSBlcnJvci4KKyAqLworc3RydWN0IHNuZF9rY29udHJvbCAqc25kX3NvY19jbmV3KGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpfdGVtcGxhdGUsCisJdm9pZCAqZGF0YSwgY2hhciAqbG9uZ19uYW1lKQoreworCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlbXBsYXRlOworCisJbWVtY3B5KCZ0ZW1wbGF0ZSwgX3RlbXBsYXRlLCBzaXplb2YodGVtcGxhdGUpKTsKKwlpZiAobG9uZ19uYW1lKQorCQl0ZW1wbGF0ZS5uYW1lID0gbG9uZ19uYW1lOworCXRlbXBsYXRlLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEU7CisJdGVtcGxhdGUuaW5kZXggPSAwOworCisJcmV0dXJuIHNuZF9jdGxfbmV3MSgmdGVtcGxhdGUsIGRhdGEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19jbmV3KTsKKworLyoqCisgKiBzbmRfc29jX2luZm9fZW51bV9kb3VibGUgLSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBpbmZvIGNhbGxiYWNrCisgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKKyAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKgorICogQ2FsbGJhY2sgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBhIGRvdWJsZSBlbnVtZXJhdGVkCisgKiBtaXhlciBjb250cm9sLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IGUtPnNoaWZ0X2wgPT0gZS0+c2hpZnRfciA/IDEgOiAyOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gZS0+bWFzazsKKworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gZS0+bWFzayAtIDEpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBlLT5tYXNrIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkJZS0+dGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX2VudW1fZG91YmxlKTsKKworLyoqCisgKiBzbmRfc29jX2dldF9lbnVtX2RvdWJsZSAtIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGdldCBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBkb3VibGUgZW51bWVyYXRlZCBtaXhlci4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2dldF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIHNob3J0IHZhbCwgYml0bWFzazsKKworCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXNrOyBiaXRtYXNrIDw8PSAxKQorCQk7CisJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBlLT5yZWcpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAodmFsID4+IGUtPnNoaWZ0X2wpICYgKGJpdG1hc2sgLSAxKTsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKQorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0KKwkJCSh2YWwgPj4gZS0+c2hpZnRfcikgJiAoYml0bWFzayAtIDEpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2dldF9lbnVtX2RvdWJsZSk7CisKKy8qKgorICogc25kX3NvY19wdXRfZW51bV9kb3VibGUgLSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBwdXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIGVudW1lcmF0ZWQgbWl4ZXIuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19wdXRfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJdW5zaWduZWQgc2hvcnQgbWFzaywgYml0bWFzazsKKworCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXNrOyBiaXRtYXNrIDw8PSAxKQorCQk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5tYXNrIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8PCBlLT5zaGlmdF9sOworCW1hc2sgPSAoYml0bWFzayAtIDEpIDw8IGUtPnNoaWZ0X2w7CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1hc2sgLSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXZhbCB8PSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdIDw8IGUtPnNoaWZ0X3I7CisJCW1hc2sgfD0gKGJpdG1hc2sgLSAxKSA8PCBlLT5zaGlmdF9yOworCX0KKworCXJldHVybiBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF9lbnVtX2RvdWJsZSk7CisKKy8qKgorICogc25kX3NvY19pbmZvX2VudW1fZXh0IC0gZXh0ZXJuYWwgZW51bWVyYXRlZCBzaW5nbGUgbWl4ZXIgaW5mbyBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXh0ZXJuYWwgZW51bWVyYXRlZAorICogc2luZ2xlIG1peGVyLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfaW5mb19lbnVtX2V4dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBlLT5tYXNrOworCisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiBlLT5tYXNrIC0gMSkKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IGUtPm1hc2sgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAorCQllLT50ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2luZm9fZW51bV9leHQpOworCisvKioKKyAqIHNuZF9zb2NfaW5mb192b2xzd19leHQgLSBleHRlcm5hbCBzaW5nbGUgbWl4ZXIgaW5mbyBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZXh0ZXJuYWwgbWl4ZXIgY29udHJvbC4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2luZm9fdm9sc3dfZXh0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJaW50IG1hc2sgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCXVpbmZvLT50eXBlID0KKwkJbWFzayA9PSAxID8gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOIDogU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBtYXNrOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX3ZvbHN3X2V4dCk7CisKKy8qKgorICogc25kX3NvY19pbmZvX2Jvb2xfZXh0IC0gZXh0ZXJuYWwgc2luZ2xlIGJvb2xlYW4gbWl4ZXIgaW5mbyBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgYm9vbGVhbiBleHRlcm5hbCBtaXhlciBjb250cm9sLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfaW5mb19ib29sX2V4dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX2Jvb2xfZXh0KTsKKworLyoqCisgKiBzbmRfc29jX2luZm9fdm9sc3cgLSBzaW5nbGUgbWl4ZXIgaW5mbyBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgbWl4ZXIgY29udHJvbC4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2luZm9fdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOworCisJdWluZm8tPnR5cGUgPQorCQltYXNrID09IDEgPyBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gc2hpZnQgPT0gcnNoaWZ0ID8gMSA6IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBtYXNrOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX3ZvbHN3KTsKKworLyoqCisgKiBzbmRfc29jX2dldF92b2xzdyAtIHNpbmdsZSBtaXhlciBnZXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIG1peGVyIGNvbnRyb2wuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19nZXRfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHgwZjsKKwlpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4MDE7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKKwlpZiAoc2hpZnQgIT0gcnNoaWZ0KQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9CisJCQkoc25kX3NvY19yZWFkKGNvZGVjLCByZWcpID4+IHJzaGlmdCkgJiBtYXNrOworCWlmIChpbnZlcnQpIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQkJbWFzayAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQlpZiAoc2hpZnQgIT0gcnNoaWZ0KQorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQorCQkJCW1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZ2V0X3ZvbHN3KTsKKworLyoqCisgKiBzbmRfc29jX3B1dF92b2xzdyAtIHNpbmdsZSBtaXhlciBwdXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIG1peGVyIGNvbnRyb2wuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19wdXRfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHgwZjsKKwlpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4MDE7CisJaW50IGVycjsKKwl1bnNpZ25lZCBzaG9ydCB2YWwsIHZhbDIsIHZhbF9tYXNrOworCisJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7CisJaWYgKGludmVydCkKKwkJdmFsID0gbWFzayAtIHZhbDsKKwl2YWxfbWFzayA9IG1hc2sgPDwgc2hpZnQ7CisJdmFsID0gdmFsIDw8IHNoaWZ0OworCWlmIChzaGlmdCAhPSByc2hpZnQpIHsKKwkJdmFsMiA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAmIG1hc2spOworCQlpZiAoaW52ZXJ0KQorCQkJdmFsMiA9IG1hc2sgLSB2YWwyOworCQl2YWxfbWFzayB8PSBtYXNrIDw8IHJzaGlmdDsKKwkJdmFsIHw9IHZhbDIgPDwgcnNoaWZ0OworCX0KKwllcnIgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWcsIHZhbF9tYXNrLCB2YWwpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF92b2xzdyk7CisKKy8qKgorICogc25kX3NvY19pbmZvX3ZvbHN3XzJyIC0gZG91YmxlIG1peGVyIGluZm8gY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGEgZG91YmxlIG1peGVyIGNvbnRyb2wgdGhhdAorICogc3BhbnMgMiBjb2RlYyByZWdpc3RlcnMuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19pbmZvX3ZvbHN3XzJyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTIpICYgMHhmZjsKKworCXVpbmZvLT50eXBlID0KKwkJbWFzayA9PSAxID8gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOIDogU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBtYXNrOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX3ZvbHN3XzJyKTsKKworLyoqCisgKiBzbmRfc29jX2dldF92b2xzd18yciAtIGRvdWJsZSBtaXhlciBnZXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIG1peGVyIGNvbnRyb2wgdGhhdCBzcGFucyAyIHJlZ2lzdGVycy4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2dldF92b2xzd18ycihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgcmVnMiA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTIpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDIwKSAmIDB4MDE7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9CisJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZzIpID4+IHNoaWZ0KSAmIG1hc2s7CisJaWYgKGludmVydCkgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCQltYXNrIC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0KKwkJCW1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZ2V0X3ZvbHN3XzJyKTsKKworLyoqCisgKiBzbmRfc29jX3B1dF92b2xzd18yciAtIGRvdWJsZSBtaXhlciBzZXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIG1peGVyIGNvbnRyb2wgdGhhdCBzcGFucyAyIHJlZ2lzdGVycy4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX3B1dF92b2xzd18ycihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgcmVnMiA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTIpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDIwKSAmIDB4MDE7CisJaW50IGVycjsKKwl1bnNpZ25lZCBzaG9ydCB2YWwsIHZhbDIsIHZhbF9tYXNrOworCisJdmFsX21hc2sgPSBtYXNrIDw8IHNoaWZ0OworCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIG1hc2spOworCXZhbDIgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiBtYXNrKTsKKworCWlmIChpbnZlcnQpIHsKKwkJdmFsID0gbWFzayAtIHZhbDsKKwkJdmFsMiA9IG1hc2sgLSB2YWwyOworCX0KKworCXZhbCA9IHZhbCA8PCBzaGlmdDsKKwl2YWwyID0gdmFsMiA8PCBzaGlmdDsKKworCWlmICgoZXJyID0gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCB2YWxfbWFzaywgdmFsKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnMiwgdmFsX21hc2ssIHZhbDIpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF92b2xzd18ycik7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9zb2NfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkFTb0MgdmVyc2lvbiAlc1xuIiwgU05EX1NPQ19WRVJTSU9OKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzb2NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgc25kX3NvY19leGl0KHZvaWQpCit7CisgCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzb2NfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc25kX3NvY19pbml0KTsKK21vZHVsZV9leGl0KHNuZF9zb2NfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCwgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tLCB3d3cud29sZnNvbm1pY3JvLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBDb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWRhcG0uYyBiL3NvdW5kL3NvYy9zb2MtZGFwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYWY4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwpAQCAtMCwwICsxLDEzMjMgQEAKKy8qCisgKiBzb2MtZGFwbS5jICAtLSAgQUxTQSBTb0MgRHluYW1pYyBBdWRpbyBQb3dlciBNYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IDIwMDUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAorICogICAgICAgICBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAxMnRoIEF1ZyAyMDA1ICAgSW5pdGlhbCB2ZXJzaW9uLgorICogICAgMjV0aCBPY3QgMjAwNSAgIEltcGxlbWVudGVkIHBhdGggcG93ZXIgZG9tYWluLgorICogICAgMTh0aCBEZWMgMjAwNSAgIEltcGxlbWVudGVkIG1hY2hpbmUgYW5kIHN0cmVhbSBsZXZlbCBwb3dlciBkb21haW4uCisgKgorICogIEZlYXR1cmVzOgorICogICAgbyBDaGFuZ2VzIHBvd2VyIHN0YXR1cyBvZiBpbnRlcm5hbCBjb2RlYyBibG9ja3MgZGVwZW5kaW5nIG9uIHRoZQorICogICAgICBkeW5hbWljIGNvbmZpZ3VyYXRpb24gb2YgY29kZWMgaW50ZXJuYWwgYXVkaW8gcGF0aHMgYW5kIGFjdGl2ZQorICogICAgICBEQUMncy9BREMncy4KKyAqICAgIG8gUGxhdGZvcm0gcG93ZXIgZG9tYWluIC0gY2FuIHN1cHBvcnQgZXh0ZXJuYWwgY29tcG9uZW50cyBpLmUuIGFtcHMgYW5kCisgKiAgICAgIG1pYy9tZWFkcGhvbmUgaW5zZXJ0aW9uIGV2ZW50cy4KKyAqICAgIG8gQXV0b21hdGljIE1pYyBCaWFzIHN1cHBvcnQKKyAqICAgIG8gSmFjayBpbnNlcnRpb24gcG93ZXIgZXZlbnQgaW5pdGlhdGlvbiAtIGUuZy4gaHAgaW5zZXJ0aW9uIHdpbGwgZW5hYmxlCisgKiAgICAgIHNpbmtzLCBkYWNzLCBldGMKKyAqICAgIG8gRGVsYXllZCBwb3dlcmRvd24gb2YgYXVkaW8gc3VzYnN5dGVtIHRvIHJlZHVjZSBwb3BzIGJldHdlZW4gYSBxdWljaworICogICAgICBkZXZpY2UgcmVvcGVuLgorICoKKyAqICBUb2RvOgorICogICAgbyBEQVBNIHBvd2VyIGNoYW5nZSBzZXF1ZW5jaW5nIC0gYWxsb3cgZm9yIGNvbmZpZ3VyYWJsZSBwZXIKKyAqICAgICAgY29kZWMgc2VxdWVuY2VzLgorICogICAgbyBTdXBwb3J0IGZvciBhbmFsb2d1ZSBiaWFzIG9wdGltaXNhdGlvbi4KKyAqICAgIG8gU3VwcG9ydCBmb3IgcmVkdWNlZCBjb2RlYyBvdmVyc2FtcGxpbmcgcmF0ZXMuCisgKiAgICBvIFN1cHBvcnQgZm9yIHJlZHVjZWQgY29kZWMgYmlhcyBjdXJyZW50cy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCisvKiBkZWJ1ZyAqLworI2RlZmluZSBEQVBNX0RFQlVHIDAKKyNpZiBEQVBNX0RFQlVHCisjZGVmaW5lIGR1bXBfZGFwbShjb2RlYywgYWN0aW9uKSBkYmdfZHVtcF9kYXBtKGNvZGVjLCBhY3Rpb24pCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKGZvcm1hdCwgIyMgYXJnKQorI2Vsc2UKKyNkZWZpbmUgZHVtcF9kYXBtKGNvZGVjLCBhY3Rpb24pCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikKKyNlbmRpZgorCisjZGVmaW5lIFBPUF9ERUJVRyAwCisjaWYgUE9QX0RFQlVHCisjZGVmaW5lIFBPUF9USU1FIDUwMCAvKiA1MDAgbXNlY3MgLSBjaGFuZ2UgaWYgcG9wIGRlYnVnIGlzIHRvbyBmYXN0ICovCisjZGVmaW5lIHBvcF93YWl0KHRpbWUpIHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKHRpbWUpKQorI2RlZmluZSBwb3BfZGJnKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoZm9ybWF0LCAjIyBhcmcpOyBwb3Bfd2FpdChQT1BfVElNRSkKKyNlbHNlCisjZGVmaW5lIHBvcF9kYmcoZm9ybWF0LCBhcmcuLi4pCisjZGVmaW5lIHBvcF93YWl0KHRpbWUpCisjZW5kaWYKKworLyogZGFwbSBwb3dlciBzZXF1ZW5jZXMgLSBtYWtlIHRoaXMgcGVyIGNvZGVjIGluIHRoZSBmdXR1cmUgKi8KK3N0YXRpYyBpbnQgZGFwbV91cF9zZXFbXSA9IHsKKwlzbmRfc29jX2RhcG1fcHJlLCBzbmRfc29jX2RhcG1fbWljYmlhcywgc25kX3NvY19kYXBtX21pYywKKwlzbmRfc29jX2RhcG1fbXV4LCBzbmRfc29jX2RhcG1fZGFjLCBzbmRfc29jX2RhcG1fbWl4ZXIsIHNuZF9zb2NfZGFwbV9wZ2EsCisJc25kX3NvY19kYXBtX2FkYywgc25kX3NvY19kYXBtX2hwLCBzbmRfc29jX2RhcG1fc3BrLCBzbmRfc29jX2RhcG1fcG9zdAorfTsKK3N0YXRpYyBpbnQgZGFwbV9kb3duX3NlcVtdID0geworCXNuZF9zb2NfZGFwbV9wcmUsIHNuZF9zb2NfZGFwbV9hZGMsIHNuZF9zb2NfZGFwbV9ocCwgc25kX3NvY19kYXBtX3NwaywKKwlzbmRfc29jX2RhcG1fcGdhLCBzbmRfc29jX2RhcG1fbWl4ZXIsIHNuZF9zb2NfZGFwbV9kYWMsIHNuZF9zb2NfZGFwbV9taWMsCisJc25kX3NvY19kYXBtX21pY2JpYXMsIHNuZF9zb2NfZGFwbV9tdXgsIHNuZF9zb2NfZGFwbV9wb3N0Cit9OworCitzdGF0aWMgaW50IGRhcG1fc3RhdHVzID0gMTsKK21vZHVsZV9wYXJhbShkYXBtX3N0YXR1cywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGFwbV9zdGF0dXMsICJlbmFibGUgRFBNIHN5c2ZzIGVudHJpZXMiKTsKKworLyogY3JlYXRlIGEgbmV3IGRhcG0gd2lkZ2V0ICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkYXBtX2NuZXdfd2lkZ2V0KAorCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpfd2lkZ2V0KQoreworCXJldHVybiBrbWVtZHVwKF93aWRnZXQsIHNpemVvZigqX3dpZGdldCksIEdGUF9LRVJORUwpOworfQorCisvKiBzZXQgdXAgaW5pdGlhbCBjb2RlYyBwYXRocyAqLworc3RhdGljIHZvaWQgZGFwbV9zZXRfcGF0aF9zdGF0dXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwLCBpbnQgaSkKK3sKKwlzd2l0Y2ggKHctPmlkKSB7CisJY2FzZSBzbmRfc29jX2RhcG1fc3dpdGNoOgorCWNhc2Ugc25kX3NvY19kYXBtX21peGVyOiB7CisJCWludCB2YWw7CisJCWludCByZWcgPSB3LT5rY29udHJvbHNbaV0ucHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJCWludCBzaGlmdCA9ICh3LT5rY29udHJvbHNbaV0ucHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJCWludCBtYXNrID0gKHctPmtjb250cm9sc1tpXS5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJCWludCBpbnZlcnQgPSAody0+a2NvbnRyb2xzW2ldLnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHgwMTsKKworCQl2YWwgPSBzbmRfc29jX3JlYWQody0+Y29kZWMsIHJlZyk7CisJCXZhbCA9ICh2YWwgPj4gc2hpZnQpICYgbWFzazsKKworCQlpZiAoKGludmVydCAmJiAhdmFsKSB8fCAoIWludmVydCAmJiB2YWwpKQorCQkJcC0+Y29ubmVjdCA9IDE7CisJCWVsc2UKKwkJCXAtPmNvbm5lY3QgPSAwOworCX0KKwlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9tdXg6IHsKKwkJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKXctPmtjb250cm9sc1tpXS5wcml2YXRlX3ZhbHVlOworCQlpbnQgdmFsLCBpdGVtLCBiaXRtYXNrOworCisJCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXNrOyBiaXRtYXNrIDw8PSAxKQorCQk7CisJCXZhbCA9IHNuZF9zb2NfcmVhZCh3LT5jb2RlYywgZS0+cmVnKTsKKwkJaXRlbSA9ICh2YWwgPj4gZS0+c2hpZnRfbCkgJiAoYml0bWFzayAtIDEpOworCisJCXAtPmNvbm5lY3QgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgZS0+bWFzazsgaSsrKSB7CisJCQlpZiAoIShzdHJjbXAocC0+bmFtZSwgZS0+dGV4dHNbaV0pKSAmJiBpdGVtID09IGkpCisJCQkJcC0+Y29ubmVjdCA9IDE7CisJCX0KKwl9CisJYnJlYWs7CisJLyogZG9lcyBub3QgZWZmZWN0IHJvdXRpbmcgLSBhbHdheXMgY29ubmVjdGVkICovCisJY2FzZSBzbmRfc29jX2RhcG1fcGdhOgorCWNhc2Ugc25kX3NvY19kYXBtX291dHB1dDoKKwljYXNlIHNuZF9zb2NfZGFwbV9hZGM6CisJY2FzZSBzbmRfc29jX2RhcG1faW5wdXQ6CisJY2FzZSBzbmRfc29jX2RhcG1fZGFjOgorCWNhc2Ugc25kX3NvY19kYXBtX21pY2JpYXM6CisJY2FzZSBzbmRfc29jX2RhcG1fdm1pZDoKKwkJcC0+Y29ubmVjdCA9IDE7CisJYnJlYWs7CisJLyogZG9lcyBlZmZlY3Qgcm91dGluZyAtIGR5bmFtaWNhbGx5IGNvbm5lY3RlZCAqLworCWNhc2Ugc25kX3NvY19kYXBtX2hwOgorCWNhc2Ugc25kX3NvY19kYXBtX21pYzoKKwljYXNlIHNuZF9zb2NfZGFwbV9zcGs6CisJY2FzZSBzbmRfc29jX2RhcG1fbGluZToKKwljYXNlIHNuZF9zb2NfZGFwbV9wcmU6CisJY2FzZSBzbmRfc29jX2RhcG1fcG9zdDoKKwkJcC0+Y29ubmVjdCA9IDA7CisJYnJlYWs7CisJfQorfQorCisvKiBjb25uZWN0IG11eCB3aWRnZXQgdG8gaXQncyBpbnRlcmNvbm5lY3RpbmcgYXVkaW8gcGF0aHMgKi8KK3N0YXRpYyBpbnQgZGFwbV9jb25uZWN0X211eChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNyYywgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmRlc3QsCisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoLCBjb25zdCBjaGFyICpjb250cm9sX25hbWUsCisJY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjb250cm9sKQoreworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBlLT5tYXNrOyBpKyspIHsKKwkJaWYgKCEoc3RyY21wKGNvbnRyb2xfbmFtZSwgZS0+dGV4dHNbaV0pKSkgeworCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3QsICZjb2RlYy0+ZGFwbV9wYXRocyk7CisJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zaW5rLCAmZGVzdC0+c291cmNlcyk7CisJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zb3VyY2UsICZzcmMtPnNpbmtzKTsKKwkJCXBhdGgtPm5hbWUgPSAoY2hhciopZS0+dGV4dHNbaV07CisJCQlkYXBtX3NldF9wYXRoX3N0YXR1cyhkZXN0LCBwYXRoLCAwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIGNvbm5lY3QgbWl4ZXIgd2lkZ2V0IHRvIGl0J3MgaW50ZXJjb25uZWN0aW5nIGF1ZGlvIHBhdGhzICovCitzdGF0aWMgaW50IGRhcG1fY29ubmVjdF9taXhlcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNyYywgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmRlc3QsCisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoLCBjb25zdCBjaGFyICpjb250cm9sX25hbWUpCit7CisJaW50IGk7CisKKwkvKiBzZWFyY2ggZm9yIG1peGVyIGtjb250cm9sICovCisJZm9yIChpID0gMDsgaSA8IGRlc3QtPm51bV9rY29udHJvbHM7IGkrKykgeworCQlpZiAoIXN0cmNtcChjb250cm9sX25hbWUsIGRlc3QtPmtjb250cm9sc1tpXS5uYW1lKSkgeworCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3QsICZjb2RlYy0+ZGFwbV9wYXRocyk7CisJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zaW5rLCAmZGVzdC0+c291cmNlcyk7CisJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zb3VyY2UsICZzcmMtPnNpbmtzKTsKKwkJCXBhdGgtPm5hbWUgPSBkZXN0LT5rY29udHJvbHNbaV0ubmFtZTsKKwkJCWRhcG1fc2V0X3BhdGhfc3RhdHVzKGRlc3QsIHBhdGgsIGkpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIHVwZGF0ZSBkYXBtIGNvZGVjIHJlZ2lzdGVyIGJpdHMgKi8KK3N0YXRpYyBpbnQgZGFwbV91cGRhdGVfYml0cyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0KQoreworCWludCBjaGFuZ2UsIHBvd2VyOworCXVuc2lnbmVkIHNob3J0IG9sZCwgbmV3OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHdpZGdldC0+Y29kZWM7CisKKwkvKiBjaGVjayBmb3IgdmFsaWQgd2lkZ2V0cyAqLworCWlmICh3aWRnZXQtPnJlZyA8IDAgfHwgd2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1faW5wdXQgfHwKKwkJd2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1fb3V0cHV0IHx8CisJCXdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2hwIHx8CisJCXdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX21pYyB8fAorCQl3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9saW5lIHx8CisJCXdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3NwaykKKwkJcmV0dXJuIDA7CisKKwlwb3dlciA9IHdpZGdldC0+cG93ZXI7CisJaWYgKHdpZGdldC0+aW52ZXJ0KQorCQlwb3dlciA9IChwb3dlciA/IDA6MSk7CisKKwlvbGQgPSBzbmRfc29jX3JlYWQoY29kZWMsIHdpZGdldC0+cmVnKTsKKwluZXcgPSAob2xkICYgfigweDEgPDwgd2lkZ2V0LT5zaGlmdCkpIHwgKHBvd2VyIDw8IHdpZGdldC0+c2hpZnQpOworCisJY2hhbmdlID0gb2xkICE9IG5ldzsKKwlpZiAoY2hhbmdlKSB7CisJCXBvcF9kYmcoInBvcCB0ZXN0ICVzIDogJXMgaW4gJWQgbXNcbiIsIHdpZGdldC0+bmFtZSwKKwkJCXdpZGdldC0+cG93ZXIgPyAib24iIDogIm9mZiIsIFBPUF9USU1FKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgd2lkZ2V0LT5yZWcsIG5ldyk7CisJCXBvcF93YWl0KFBPUF9USU1FKTsKKwl9CisJZGJnKCJyZWcgb2xkICV4IG5ldyAleCBjaGFuZ2UgJWRcbiIsIG9sZCwgbmV3LCBjaGFuZ2UpOworCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qIHJhbXBzIHRoZSB2b2x1bWUgdXAgb3IgZG93biB0byBtaW5pbWlzZSBwb3BzIGJlZm9yZSBvciBhZnRlciBhCisgKiBEQVBNIHBvd2VyIGV2ZW50ICovCitzdGF0aWMgaW50IGRhcG1fc2V0X3BnYShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0LCBpbnQgcG93ZXIpCit7CisJY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmsgPSB3aWRnZXQtPmtjb250cm9sczsKKworCWlmICh3aWRnZXQtPm11dGVkICYmICFwb3dlcikKKwkJcmV0dXJuIDA7CisJaWYgKCF3aWRnZXQtPm11dGVkICYmIHBvd2VyKQorCQlyZXR1cm4gMDsKKworCWlmICh3aWRnZXQtPm51bV9rY29udHJvbHMgJiYgaykgeworCQlpbnQgcmVnID0gay0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJCWludCBzaGlmdCA9IChrLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHgwZjsKKwkJaW50IG1hc2sgPSAoay0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCQlpbnQgaW52ZXJ0ID0gKGstPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHgwMTsKKworCQlpZiAocG93ZXIpIHsKKwkJCWludCBpOworCQkJLyogcG93ZXIgdXAgaGFzIGhhcHBlbmRlZCwgaW5jcmVhc2Ugdm9sdW1lIHRvIGxhc3QgbGV2ZWwgKi8KKwkJCWlmIChpbnZlcnQpIHsKKwkJCQlmb3IgKGkgPSBtYXNrOyBpID4gd2lkZ2V0LT5zYXZlZF92YWx1ZTsgaS0tKQorCQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKHdpZGdldC0+Y29kZWMsIHJlZywgbWFzaywgaSk7CisJCQl9IGVsc2UgeworCQkJCWZvciAoaSA9IDA7IGkgPCB3aWRnZXQtPnNhdmVkX3ZhbHVlOyBpKyspCisJCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMod2lkZ2V0LT5jb2RlYywgcmVnLCBtYXNrLCBpKTsKKwkJCX0KKwkJCXdpZGdldC0+bXV0ZWQgPSAwOworCQl9IGVsc2UgeworCQkJLyogcG93ZXIgZG93biBpcyBhYm91dCB0byBvY2N1ciwgZGVjcmVhc2Ugdm9sdW1lIHRvIG11dGUgKi8KKwkJCWludCB2YWwgPSBzbmRfc29jX3JlYWQod2lkZ2V0LT5jb2RlYywgcmVnKTsKKwkJCWludCBpID0gd2lkZ2V0LT5zYXZlZF92YWx1ZSA9ICh2YWwgPj4gc2hpZnQpICYgbWFzazsKKwkJCWlmIChpbnZlcnQpIHsKKwkJCQlmb3IgKDsgaSA8IG1hc2s7IGkrKykKKwkJCQkJc25kX3NvY191cGRhdGVfYml0cyh3aWRnZXQtPmNvZGVjLCByZWcsIG1hc2ssIGkpOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKDsgaSA+IDA7IGktLSkKKwkJCQkJc25kX3NvY191cGRhdGVfYml0cyh3aWRnZXQtPmNvZGVjLCByZWcsIG1hc2ssIGkpOworCQkJfQorCQkJd2lkZ2V0LT5tdXRlZCA9IDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGNyZWF0ZSBuZXcgZGFwbSBtaXhlciBjb250cm9sICovCitzdGF0aWMgaW50IGRhcG1fbmV3X21peGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKwljaGFyIG5hbWVbMzJdOworCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKKworCS8qIGFkZCBrY29udHJvbCAqLworCWZvciAoaSA9IDA7IGkgPCB3LT5udW1fa2NvbnRyb2xzOyBpKyspIHsKKworCQkvKiBtYXRjaCBuYW1lICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJnctPnNvdXJjZXMsIGxpc3Rfc2luaykgeworCisJCQkvKiBtaXhlci9tdXggcGF0aHMgbmFtZSBtdXN0IG1hdGNoIGNvbnRyb2wgbmFtZSAqLworCQkJaWYgKHBhdGgtPm5hbWUgIT0gKGNoYXIqKXctPmtjb250cm9sc1tpXS5uYW1lKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBhZGQgZGFwbSBjb250cm9sIHdpdGggbG9uZyBuYW1lICovCisJCQlzbnByaW50ZihuYW1lLCAzMiwgIiVzICVzIiwgdy0+bmFtZSwgdy0+a2NvbnRyb2xzW2ldLm5hbWUpOworCQkJcGF0aC0+bG9uZ19uYW1lID0ga3N0cmR1cCAobmFtZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAocGF0aC0+bG9uZ19uYW1lID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCXBhdGgtPmtjb250cm9sID0gc25kX3NvY19jbmV3KCZ3LT5rY29udHJvbHNbaV0sIHcsCisJCQkJcGF0aC0+bG9uZ19uYW1lKTsKKwkJCXJldCA9IHNuZF9jdGxfYWRkKGNvZGVjLT5jYXJkLCBwYXRoLT5rY29udHJvbCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogZmFpbGVkIHRvIGFkZCBkYXBtIGtjb250cm9sICVzXG4iLAorCQkJCQkJcGF0aC0+bG9uZ19uYW1lKTsKKwkJCQlrZnJlZShwYXRoLT5sb25nX25hbWUpOworCQkJCXBhdGgtPmxvbmdfbmFtZSA9IE5VTEw7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBjcmVhdGUgbmV3IGRhcG0gbXV4IGNvbnRyb2wgKi8KK3N0YXRpYyBpbnQgZGFwbV9uZXdfbXV4KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGggPSBOVUxMOworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sOworCWludCByZXQgPSAwOworCisJaWYgKCF3LT5udW1fa2NvbnRyb2xzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogbXV4ICVzIGhhcyBubyBjb250cm9sc1xuIiwgdy0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWtjb250cm9sID0gc25kX3NvY19jbmV3KCZ3LT5rY29udHJvbHNbMF0sIHcsIHctPm5hbWUpOworCXJldCA9IHNuZF9jdGxfYWRkKGNvZGVjLT5jYXJkLCBrY29udHJvbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmdy0+c291cmNlcywgbGlzdF9zaW5rKQorCQlwYXRoLT5rY29udHJvbCA9IGtjb250cm9sOworCisJcmV0dXJuIHJldDsKKworZXJyOgorCXByaW50ayhLRVJOX0VSUiAiYXNvYzogZmFpbGVkIHRvIGFkZCBrY29udHJvbCAlc1xuIiwgdy0+bmFtZSk7CisJcmV0dXJuIHJldDsKK30KKworLyogY3JlYXRlIG5ldyBkYXBtIHZvbHVtZSBjb250cm9sICovCitzdGF0aWMgaW50IGRhcG1fbmV3X3BnYShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCit7CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2w7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXctPm51bV9rY29udHJvbHMpCisJCXJldHVybiAtRUlOVkFMOworCisJa2NvbnRyb2wgPSBzbmRfc29jX2NuZXcoJnctPmtjb250cm9sc1swXSwgdywgdy0+bmFtZSk7CisJcmV0ID0gc25kX2N0bF9hZGQoY29kZWMtPmNhcmQsIGtjb250cm9sKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGZhaWxlZCB0byBhZGQga2NvbnRyb2wgJXNcbiIsIHctPm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIHJlc2V0ICd3YWxrZWQnIGJpdCBmb3IgZWFjaCBkYXBtIHBhdGggKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkYXBtX2NsZWFyX3dhbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNvZGVjLT5kYXBtX3BhdGhzLCBsaXN0KQorCQlwLT53YWxrZWQgPSAwOworfQorCisvKgorICogUmVjdXJzaXZlbHkgY2hlY2sgZm9yIGEgY29tcGxldGVkIHBhdGggdG8gYW4gYWN0aXZlIG9yIHBoeXNpY2FsbHkgY29ubmVjdGVkCisgKiBvdXRwdXQgd2lkZ2V0LiBSZXR1cm5zIG51bWJlciBvZiBjb21wbGV0ZSBwYXRocy4KKyAqLworc3RhdGljIGludCBpc19jb25uZWN0ZWRfb3V0cHV0X2VwKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOworCWludCBjb24gPSAwOworCisJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2FkYyAmJiB3aWRnZXQtPmFjdGl2ZSkKKwkJcmV0dXJuIDE7CisKKwlpZiAod2lkZ2V0LT5jb25uZWN0ZWQpIHsKKwkJLyogY29ubmVjdGVkIHBpbiA/ICovCisJCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9vdXRwdXQgJiYgIXdpZGdldC0+ZXh0KQorCQkJcmV0dXJuIDE7CisKKwkJLyogY29ubmVjdGVkIGphY2sgb3Igc3BrID8gKi8KKwkJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2hwIHx8IHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3NwayB8fAorCQkJd2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1fbGluZSkKKwkJCXJldHVybiAxOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJndpZGdldC0+c2lua3MsIGxpc3Rfc291cmNlKSB7CisJCWlmIChwYXRoLT53YWxrZWQpCisJCQljb250aW51ZTsKKworCQlpZiAocGF0aC0+c2luayAmJiBwYXRoLT5jb25uZWN0KSB7CisJCQlwYXRoLT53YWxrZWQgPSAxOworCQkJY29uICs9IGlzX2Nvbm5lY3RlZF9vdXRwdXRfZXAocGF0aC0+c2luayk7CisJCX0KKwl9CisKKwlyZXR1cm4gY29uOworfQorCisvKgorICogUmVjdXJzaXZlbHkgY2hlY2sgZm9yIGEgY29tcGxldGVkIHBhdGggdG8gYW4gYWN0aXZlIG9yIHBoeXNpY2FsbHkgY29ubmVjdGVkCisgKiBpbnB1dCB3aWRnZXQuIFJldHVybnMgbnVtYmVyIG9mIGNvbXBsZXRlIHBhdGhzLgorICovCitzdGF0aWMgaW50IGlzX2Nvbm5lY3RlZF9pbnB1dF9lcChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKKwlpbnQgY29uID0gMDsKKworCS8qIGFjdGl2ZSBzdHJlYW0gPyAqLworCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9kYWMgJiYgd2lkZ2V0LT5hY3RpdmUpCisJCXJldHVybiAxOworCisJaWYgKHdpZGdldC0+Y29ubmVjdGVkKSB7CisJCS8qIGNvbm5lY3RlZCBwaW4gPyAqLworCQlpZiAod2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1faW5wdXQgJiYgIXdpZGdldC0+ZXh0KQorCQkJcmV0dXJuIDE7CisKKwkJLyogY29ubmVjdGVkIFZNSUQvQmlhcyBmb3IgbG93ZXIgcG9wcyAqLworCQlpZiAod2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1fdm1pZCkKKwkJCXJldHVybiAxOworCisJCS8qIGNvbm5lY3RlZCBqYWNrID8gKi8KKwkJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX21pYyB8fCB3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9saW5lKQorCQkJcmV0dXJuIDE7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmd2lkZ2V0LT5zb3VyY2VzLCBsaXN0X3NpbmspIHsKKwkJaWYgKHBhdGgtPndhbGtlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwYXRoLT5zb3VyY2UgJiYgcGF0aC0+Y29ubmVjdCkgeworCQkJcGF0aC0+d2Fsa2VkID0gMTsKKwkJCWNvbiArPSBpc19jb25uZWN0ZWRfaW5wdXRfZXAocGF0aC0+c291cmNlKTsKKwkJfQorCX0KKworCXJldHVybiBjb247Cit9CisKKy8qCisgKiBTY2FuIGVhY2ggZGFwbSB3aWRnZXQgZm9yIGNvbXBsZXRlIGF1ZGlvIHBhdGguCisgKiBBIGNvbXBsZXRlIHBhdGggaXMgYSByb3V0ZSB0aGF0IGhhcyB2YWxpZCBlbmRwb2ludHMgaS5lLjotCisgKgorICogIG8gREFDIHRvIG91dHB1dCBwaW4uCisgKiAgbyBJbnB1dCBQaW4gdG8gQURDLgorICogIG8gSW5wdXQgcGluIHRvIE91dHB1dCBwaW4gKGJ5cGFzcywgc2lkZXRvbmUpCisgKiAgbyBEQUMgdG8gQURDIChsb29wYmFjaykuCisgKi8KK3N0YXRpYyBpbnQgZGFwbV9wb3dlcl93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3OworCWludCBpbiwgb3V0LCBpLCBjID0gMSwgKnNlcSA9IE5VTEwsIHJldCA9IDAsIHBvd2VyX2NoYW5nZSwgcG93ZXI7CisKKwkvKiBkbyB3ZSBoYXZlIGEgc2VxdWVuY2VkIHN0cmVhbSBldmVudCAqLworCWlmIChldmVudCA9PSBTTkRfU09DX0RBUE1fU1RSRUFNX1NUQVJUKSB7CisJCWMgPSBBUlJBWV9TSVpFKGRhcG1fdXBfc2VxKTsKKwkJc2VxID0gZGFwbV91cF9zZXE7CisJfSBlbHNlIGlmIChldmVudCA9PSBTTkRfU09DX0RBUE1fU1RSRUFNX1NUT1ApIHsKKwkJYyA9IEFSUkFZX1NJWkUoZGFwbV9kb3duX3NlcSk7CisJCXNlcSA9IGRhcG1fZG93bl9zZXE7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgYzsgaSsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNvZGVjLT5kYXBtX3dpZGdldHMsIGxpc3QpIHsKKworCQkJLyogaXMgd2lkZ2V0IGluIHN0cmVhbSBvcmRlciAqLworCQkJaWYgKHNlcSAmJiBzZXFbaV0gJiYgdy0+aWQgIT0gc2VxW2ldKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiB2bWlkIC0gbm8gYWN0aW9uICovCisJCQlpZiAody0+aWQgPT0gc25kX3NvY19kYXBtX3ZtaWQpCisJCQkJY29udGludWU7CisKKwkJCS8qIGFjdGl2ZSBBREMgKi8KKwkJCWlmICh3LT5pZCA9PSBzbmRfc29jX2RhcG1fYWRjICYmIHctPmFjdGl2ZSkgeworCQkJCWluID0gaXNfY29ubmVjdGVkX2lucHV0X2VwKHcpOworCQkJCWRhcG1fY2xlYXJfd2Fsayh3LT5jb2RlYyk7CisJCQkJdy0+cG93ZXIgPSAoaW4gIT0gMCkgPyAxIDogMDsKKwkJCQlkYXBtX3VwZGF0ZV9iaXRzKHcpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBhY3RpdmUgREFDICovCisJCQlpZiAody0+aWQgPT0gc25kX3NvY19kYXBtX2RhYyAmJiB3LT5hY3RpdmUpIHsKKwkJCQlvdXQgPSBpc19jb25uZWN0ZWRfb3V0cHV0X2VwKHcpOworCQkJCWRhcG1fY2xlYXJfd2Fsayh3LT5jb2RlYyk7CisJCQkJdy0+cG93ZXIgPSAob3V0ICE9IDApID8gMSA6IDA7CisJCQkJZGFwbV91cGRhdGVfYml0cyh3KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogcHJvZ3JhbW1hYmxlIGdhaW4vYXR0ZW51YXRpb24gKi8KKwkJCWlmICh3LT5pZCA9PSBzbmRfc29jX2RhcG1fcGdhKSB7CisJCQkJaW50IG9uOworCQkJCWluID0gaXNfY29ubmVjdGVkX2lucHV0X2VwKHcpOworCQkJCWRhcG1fY2xlYXJfd2Fsayh3LT5jb2RlYyk7CisJCQkJb3V0ID0gaXNfY29ubmVjdGVkX291dHB1dF9lcCh3KTsKKwkJCQlkYXBtX2NsZWFyX3dhbGsody0+Y29kZWMpOworCQkJCXctPnBvd2VyID0gb24gPSAob3V0ICE9IDAgJiYgaW4gIT0gMCkgPyAxIDogMDsKKworCQkJCWlmICghb24pCisJCQkJCWRhcG1fc2V0X3BnYSh3LCBvbik7IC8qIGxvd2VyIHZvbHVtZSB0byByZWR1Y2UgcG9wcyAqLworCQkJCWRhcG1fdXBkYXRlX2JpdHModyk7CisJCQkJaWYgKG9uKQorCQkJCQlkYXBtX3NldF9wZ2Eodywgb24pOyAvKiByZXN0b3JlIHZvbHVtZSBmcm9tIHplcm8gKi8KKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBwcmUgYW5kIHBvc3QgZXZlbnQgd2lkZ2V0cyAqLworCQkJaWYgKHctPmlkID09IHNuZF9zb2NfZGFwbV9wcmUpIHsKKwkJCQlpZiAoIXctPmV2ZW50KQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChldmVudCA9PSBTTkRfU09DX0RBUE1fU1RSRUFNX1NUQVJUKSB7CisJCQkJCXJldCA9IHctPmV2ZW50KHcsIFNORF9TT0NfREFQTV9QUkVfUE1VKTsKKwkJCQkJaWYgKHJldCA8IDApCisJCQkJCQlyZXR1cm4gcmV0OworCQkJCX0gZWxzZSBpZiAoZXZlbnQgPT0gU05EX1NPQ19EQVBNX1NUUkVBTV9TVE9QKSB7CisJCQkJCXJldCA9IHctPmV2ZW50KHcsIFNORF9TT0NfREFQTV9QUkVfUE1EKTsKKwkJCQkJaWYgKHJldCA8IDApCisJCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICh3LT5pZCA9PSBzbmRfc29jX2RhcG1fcG9zdCkgeworCQkJCWlmICghdy0+ZXZlbnQpCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKGV2ZW50ID09IFNORF9TT0NfREFQTV9TVFJFQU1fU1RBUlQpIHsKKwkJCQkJcmV0ID0gdy0+ZXZlbnQodywgU05EX1NPQ19EQVBNX1BPU1RfUE1VKTsKKwkJCQkJaWYgKHJldCA8IDApCisJCQkJCQlyZXR1cm4gcmV0OworCQkJCX0gZWxzZSBpZiAoZXZlbnQgPT0gU05EX1NPQ19EQVBNX1NUUkVBTV9TVE9QKSB7CisJCQkJCXJldCA9IHctPmV2ZW50KHcsIFNORF9TT0NfREFQTV9QT1NUX1BNRCk7CisJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIGFsbCBvdGhlciB3aWRnZXRzICovCisJCQlpbiA9IGlzX2Nvbm5lY3RlZF9pbnB1dF9lcCh3KTsKKwkJCWRhcG1fY2xlYXJfd2Fsayh3LT5jb2RlYyk7CisJCQlvdXQgPSBpc19jb25uZWN0ZWRfb3V0cHV0X2VwKHcpOworCQkJZGFwbV9jbGVhcl93YWxrKHctPmNvZGVjKTsKKwkJCXBvd2VyID0gKG91dCAhPSAwICYmIGluICE9IDApID8gMSA6IDA7CisJCQlwb3dlcl9jaGFuZ2UgPSAody0+cG93ZXIgPT0gcG93ZXIpID8gMDogMTsKKwkJCXctPnBvd2VyID0gcG93ZXI7CisKKwkJCS8qIGNhbGwgYW55IHBvd2VyIGNoYW5nZSBldmVudCBoYW5kbGVycyAqLworCQkJaWYgKHBvd2VyX2NoYW5nZSkgeworCQkJCWlmICh3LT5ldmVudCkgeworCQkJCQlkYmcoInBvd2VyICVzIGV2ZW50IGZvciAlcyBmbGFncyAleFxuIiwKKwkJCQkJCXctPnBvd2VyID8gIm9uIiA6ICJvZmYiLCB3LT5uYW1lLCB3LT5ldmVudF9mbGFncyk7CisJCQkJCWlmIChwb3dlcikgeworCQkJCQkJLyogcG93ZXIgdXAgZXZlbnQgKi8KKwkJCQkJCWlmICh3LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QUkVfUE1VKSB7CisJCQkJCQkJcmV0ID0gdy0+ZXZlbnQodywgU05EX1NPQ19EQVBNX1BSRV9QTVUpOworCQkJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQkJfQorCQkJCQkJZGFwbV91cGRhdGVfYml0cyh3KTsKKwkJCQkJCWlmICh3LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QT1NUX1BNVSl7CisJCQkJCQkJcmV0ID0gdy0+ZXZlbnQodywgU05EX1NPQ19EQVBNX1BPU1RfUE1VKTsKKwkJCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIHBvd2VyIGRvd24gZXZlbnQgKi8KKwkJCQkJCWlmICh3LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QUkVfUE1EKSB7CisJCQkJCQkJcmV0ID0gdy0+ZXZlbnQodywgU05EX1NPQ19EQVBNX1BSRV9QTUQpOworCQkJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQkJfQorCQkJCQkJZGFwbV91cGRhdGVfYml0cyh3KTsKKwkJCQkJCWlmICh3LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QT1NUX1BNRCkgeworCQkJCQkJCXJldCA9IHctPmV2ZW50KHcsIFNORF9TT0NfREFQTV9QT1NUX1BNRCk7CisJCQkJCQkJaWYgKHJldCA8IDApCisJCQkJCQkJCXJldHVybiByZXQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UKKwkJCQkJLyogbm8gZXZlbnQgaGFuZGxlciAqLworCQkJCQlkYXBtX3VwZGF0ZV9iaXRzKHcpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmIERBUE1fREVCVUcKK3N0YXRpYyB2b2lkIGRiZ19kdW1wX2RhcG0oc3RydWN0IHNuZF9zb2NfY29kZWMqIGNvZGVjLCBjb25zdCBjaGFyICphY3Rpb24pCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwID0gTlVMTDsKKwlpbnQgaW4sIG91dDsKKworCXByaW50aygiREFQTSAlcyAlc1xuIiwgY29kZWMtPm5hbWUsIGFjdGlvbik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZjb2RlYy0+ZGFwbV93aWRnZXRzLCBsaXN0KSB7CisKKwkJLyogb25seSBkaXNwbGF5IHdpZGdldHMgdGhhdCBlZmZlY3Qgcm91dGluZyAqLworCQlzd2l0Y2ggKHctPmlkKSB7CisJCWNhc2Ugc25kX3NvY19kYXBtX3ByZToKKwkJY2FzZSBzbmRfc29jX2RhcG1fcG9zdDoKKwkJY2FzZSBzbmRfc29jX2RhcG1fdm1pZDoKKwkJCWNvbnRpbnVlOworCQljYXNlIHNuZF9zb2NfZGFwbV9tdXg6CisJCWNhc2Ugc25kX3NvY19kYXBtX291dHB1dDoKKwkJY2FzZSBzbmRfc29jX2RhcG1faW5wdXQ6CisJCWNhc2Ugc25kX3NvY19kYXBtX3N3aXRjaDoKKwkJY2FzZSBzbmRfc29jX2RhcG1faHA6CisJCWNhc2Ugc25kX3NvY19kYXBtX21pYzoKKwkJY2FzZSBzbmRfc29jX2RhcG1fc3BrOgorCQljYXNlIHNuZF9zb2NfZGFwbV9saW5lOgorCQljYXNlIHNuZF9zb2NfZGFwbV9taWNiaWFzOgorCQljYXNlIHNuZF9zb2NfZGFwbV9kYWM6CisJCWNhc2Ugc25kX3NvY19kYXBtX2FkYzoKKwkJY2FzZSBzbmRfc29jX2RhcG1fcGdhOgorCQljYXNlIHNuZF9zb2NfZGFwbV9taXhlcjoKKwkJCWlmICh3LT5uYW1lKSB7CisJCQkJaW4gPSBpc19jb25uZWN0ZWRfaW5wdXRfZXAodyk7CisJCQkJZGFwbV9jbGVhcl93YWxrKHctPmNvZGVjKTsKKwkJCQlvdXQgPSBpc19jb25uZWN0ZWRfb3V0cHV0X2VwKHcpOworCQkJCWRhcG1fY2xlYXJfd2Fsayh3LT5jb2RlYyk7CisJCQkJcHJpbnRrKCIlczogJXMgIGluICVkIG91dCAlZFxuIiwgdy0+bmFtZSwKKwkJCQkJdy0+cG93ZXIgPyAiT24iOiJPZmYiLGluLCBvdXQpOworCisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmdy0+c291cmNlcywgbGlzdF9zaW5rKSB7CisJCQkJCWlmIChwLT5jb25uZWN0KQorCQkJCQkJcHJpbnRrKCIgaW4gICVzICVzXG4iLCBwLT5uYW1lID8gcC0+bmFtZSA6ICJzdGF0aWMiLAorCQkJCQkJCXAtPnNvdXJjZS0+bmFtZSk7CisJCQkJfQorCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnctPnNpbmtzLCBsaXN0X3NvdXJjZSkgeworCQkJCQlpZiAocC0+Y29ubmVjdCkKKwkJCQkJCXByaW50aygiIG91dCAlcyAlc1xuIiwgcC0+bmFtZSA/IHAtPm5hbWUgOiAic3RhdGljIiwKKwkJCQkJCQlwLT5zaW5rLT5uYW1lKTsKKwkJCQl9CisJCQl9CisJCWJyZWFrOworCQl9CisJfQorfQorI2VuZGlmCisKKy8qIHRlc3QgYW5kIHVwZGF0ZSB0aGUgcG93ZXIgc3RhdHVzIG9mIGEgbXV4IHdpZGdldCAqLworc3RhdGljIGludCBkYXBtX211eF91cGRhdGVfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCwKKwkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBtYXNrLAorCQkJCSBpbnQgdmFsLCBzdHJ1Y3Qgc29jX2VudW0qIGUpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOworCWludCBmb3VuZCA9IDA7CisKKwlpZiAod2lkZ2V0LT5pZCAhPSBzbmRfc29jX2RhcG1fbXV4KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghc25kX3NvY190ZXN0X2JpdHMod2lkZ2V0LT5jb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpKQorCQlyZXR1cm4gMDsKKworCS8qIGZpbmQgZGFwbSB3aWRnZXQgcGF0aCBhc3NvYyB3aXRoIGtjb250cm9sICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmd2lkZ2V0LT5jb2RlYy0+ZGFwbV9wYXRocywgbGlzdCkgeworCQlpZiAocGF0aC0+a2NvbnRyb2wgIT0ga2NvbnRyb2wpCisJCQljb250aW51ZTsKKworCQlpZiAoIXBhdGgtPm5hbWUgfHwgISBlLT50ZXh0c1t2YWxdKQorCQkJY29udGludWU7CisKKwkJZm91bmQgPSAxOworCQkvKiB3ZSBub3cgbmVlZCB0byBtYXRjaCB0aGUgc3RyaW5nIGluIHRoZSBlbnVtIHRvIHRoZSBwYXRoICovCisJCWlmICghKHN0cmNtcChwYXRoLT5uYW1lLCBlLT50ZXh0c1t2YWxdKSkpCisJCQlwYXRoLT5jb25uZWN0ID0gMTsgLyogbmV3IGNvbm5lY3Rpb24gKi8KKwkJZWxzZQorCQkJcGF0aC0+Y29ubmVjdCA9IDA7IC8qIG9sZCBjb25uZWN0aW9uIG11c3QgYmUgcG93ZXJlZCBkb3duICovCisJfQorCisJaWYgKGZvdW5kKQorCQlkYXBtX3Bvd2VyX3dpZGdldHMod2lkZ2V0LT5jb2RlYywgU05EX1NPQ19EQVBNX1NUUkVBTV9OT1ApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHRlc3QgYW5kIHVwZGF0ZSB0aGUgcG93ZXIgc3RhdHVzIG9mIGEgbWl4ZXIgd2lkZ2V0ICovCitzdGF0aWMgaW50IGRhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQsCisJCQkJICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCByZWcsCisJCQkJICAgaW50IHZhbF9tYXNrLCBpbnQgdmFsLCBpbnQgaW52ZXJ0KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKKwlpbnQgZm91bmQgPSAwOworCisJaWYgKHdpZGdldC0+aWQgIT0gc25kX3NvY19kYXBtX21peGVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghc25kX3NvY190ZXN0X2JpdHMod2lkZ2V0LT5jb2RlYywgcmVnLCB2YWxfbWFzaywgdmFsKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBmaW5kIGRhcG0gd2lkZ2V0IHBhdGggYXNzb2Mgd2l0aCBrY29udHJvbCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJndpZGdldC0+Y29kZWMtPmRhcG1fcGF0aHMsIGxpc3QpIHsKKwkJaWYgKHBhdGgtPmtjb250cm9sICE9IGtjb250cm9sKQorCQkJY29udGludWU7CisKKwkJLyogZm91bmQsIG5vdyBjaGVjayB0eXBlICovCisJCWZvdW5kID0gMTsKKwkJaWYgKHZhbCkKKwkJCS8qIG5ldyBjb25uZWN0aW9uICovCisJCQlwYXRoLT5jb25uZWN0ID0gaW52ZXJ0ID8gMDoxOworCQllbHNlCisJCQkvKiBvbGQgY29ubmVjdGlvbiBtdXN0IGJlIHBvd2VyZWQgZG93biAqLworCQkJcGF0aC0+Y29ubmVjdCA9IGludmVydCA/IDE6MDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGZvdW5kKQorCQlkYXBtX3Bvd2VyX3dpZGdldHMod2lkZ2V0LT5jb2RlYywgU05EX1NPQ19EQVBNX1NUUkVBTV9OT1ApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHNob3cgZGFwbSB3aWRnZXQgc3RhdHVzIGluIHN5cyBmcyAqLworc3RhdGljIHNzaXplX3QgZGFwbV93aWRnZXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKmRldmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkZXZkYXRhLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdzsKKwlpbnQgY291bnQgPSAwOworCWNoYXIgKnN0YXRlID0gIm5vdCBzZXQiOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmY29kZWMtPmRhcG1fd2lkZ2V0cywgbGlzdCkgeworCisJCS8qIG9ubHkgZGlzcGxheSB3aWRnZXRzIHRoYXQgYnVybm0gcG93ZXIgKi8KKwkJc3dpdGNoICh3LT5pZCkgeworCQljYXNlIHNuZF9zb2NfZGFwbV9ocDoKKwkJY2FzZSBzbmRfc29jX2RhcG1fbWljOgorCQljYXNlIHNuZF9zb2NfZGFwbV9zcGs6CisJCWNhc2Ugc25kX3NvY19kYXBtX2xpbmU6CisJCWNhc2Ugc25kX3NvY19kYXBtX21pY2JpYXM6CisJCWNhc2Ugc25kX3NvY19kYXBtX2RhYzoKKwkJY2FzZSBzbmRfc29jX2RhcG1fYWRjOgorCQljYXNlIHNuZF9zb2NfZGFwbV9wZ2E6CisJCWNhc2Ugc25kX3NvY19kYXBtX21peGVyOgorCQkJaWYgKHctPm5hbWUpCisJCQkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIiVzOiAlc1xuIiwKKwkJCQkJdy0+bmFtZSwgdy0+cG93ZXIgPyAiT24iOiJPZmYiKTsKKwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWJyZWFrOworCQl9CisJfQorCisJc3dpdGNoKGNvZGVjLT5kYXBtX3N0YXRlKXsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMDoKKwkJc3RhdGUgPSAiRDAiOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMToKKwkJc3RhdGUgPSAiRDEiOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMjoKKwkJc3RhdGUgPSAiRDIiOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2hvdDoKKwkJc3RhdGUgPSAiRDNob3QiOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2NvbGQ6CisJCXN0YXRlID0gIkQzY29sZCI7CisJCWJyZWFrOworCX0KKwljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiUE0gU3RhdGU6ICVzXG4iLCBzdGF0ZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihkYXBtX3dpZGdldCwgMDQ0NCwgZGFwbV93aWRnZXRfc2hvdywgTlVMTCk7CisKK2ludCBzbmRfc29jX2RhcG1fc3lzX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGFwbV9zdGF0dXMpCisJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kYXBtX3dpZGdldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzbmRfc29jX2RhcG1fc3lzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGRhcG1fc3RhdHVzKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGFwbV93aWRnZXQpOworfQorCisvKiBmcmVlIGFsbCBkYXBtIHdpZGdldHMgYW5kIHJlc291cmNlcyAqLworc3RhdGljIHZvaWQgZGFwbV9mcmVlX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCAqbmV4dF93OworCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcCwgKm5leHRfcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3LCBuZXh0X3csICZjb2RlYy0+ZGFwbV93aWRnZXRzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZ3LT5saXN0KTsKKwkJa2ZyZWUodyk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG5leHRfcCwgJmNvZGVjLT5kYXBtX3BhdGhzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZwLT5saXN0KTsKKwkJa2ZyZWUocC0+bG9uZ19uYW1lKTsKKwkJa2ZyZWUocCk7CisJfQorfQorCisvKioKKyAqIHNuZF9zb2NfZGFwbV9zeW5jX2VuZHBvaW50cyAtIHNjYW4gYW5kIHBvd2VyIGRhcG0gcGF0aHMKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqCisgKiBXYWxrcyBhbGwgZGFwbSBhdWRpbyBwYXRocyBhbmQgcG93ZXJzIHdpZGdldHMgYWNjb3JkaW5nIHRvIHRoZWlyCisgKiBzdHJlYW0gb3IgcGF0aCB1c2FnZS4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fc3luY19lbmRwb2ludHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBkYXBtX3Bvd2VyX3dpZGdldHMoY29kZWMsIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9zeW5jX2VuZHBvaW50cyk7CisKKy8qKgorICogc25kX3NvY19kYXBtX2Nvbm5lY3RfaW5wdXQgLSBjb25uZWN0IGRhcG0gd2lkZ2V0cworICogQGNvZGVjOiBhdWRpbyBjb2RlYworICogQHNpbms6IG5hbWUgb2YgdGFyZ2V0IHdpZGdldAorICogQGNvbnRyb2w6IG1peGVyIGNvbnRyb2wgbmFtZQorICogQHNvdXJjZTogbmFtZSBvZiBzb3VyY2UgbmFtZQorICoKKyAqIENvbm5lY3RzIDIgZGFwbSB3aWRnZXRzIHRvZ2V0aGVyIHZpYSBhIG5hbWVkIGF1ZGlvIHBhdGguIFRoZSBzaW5rIGlzCisgKiB0aGUgd2lkZ2V0IHJlY2VpdmluZyB0aGUgYXVkaW8gc2lnbmFsLCB3aGlsc3QgdGhlIHNvdXJjZSBpcyB0aGUgc2VuZGVyCisgKiBvZiB0aGUgYXVkaW8gc2lnbmFsLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBlbHNlIGVycm9yLgorICovCitpbnQgc25kX3NvY19kYXBtX2Nvbm5lY3RfaW5wdXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpzaW5rLAorCWNvbnN0IGNoYXIgKiBjb250cm9sLCBjb25zdCBjaGFyICpzb3VyY2UpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3c291cmNlID0gTlVMTCwgKndzaW5rID0gTlVMTCwgKnc7CisJaW50IHJldCA9IDA7CisKKwkvKiBmaW5kIHNyYyBhbmQgZGVzdCB3aWRnZXRzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmY29kZWMtPmRhcG1fd2lkZ2V0cywgbGlzdCkgeworCisJCWlmICghd3NpbmsgJiYgIShzdHJjbXAody0+bmFtZSwgc2luaykpKSB7CisJCQl3c2luayA9IHc7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXdzb3VyY2UgJiYgIShzdHJjbXAody0+bmFtZSwgc291cmNlKSkpIHsKKwkJCXdzb3VyY2UgPSB3OworCQl9CisJfQorCisJaWYgKHdzb3VyY2UgPT0gTlVMTCB8fCB3c2luayA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBhdGggPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCisJcGF0aC0+c291cmNlID0gd3NvdXJjZTsKKwlwYXRoLT5zaW5rID0gd3Npbms7CisJSU5JVF9MSVNUX0hFQUQoJnBhdGgtPmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZwYXRoLT5saXN0X3NvdXJjZSk7CisJSU5JVF9MSVNUX0hFQUQoJnBhdGgtPmxpc3Rfc2luayk7CisKKwkvKiBjaGVjayBmb3IgZXh0ZXJuYWwgd2lkZ2V0cyAqLworCWlmICh3c2luay0+aWQgPT0gc25kX3NvY19kYXBtX2lucHV0KSB7CisJCWlmICh3c291cmNlLT5pZCA9PSBzbmRfc29jX2RhcG1fbWljYmlhcyB8fAorCQkJd3NvdXJjZS0+aWQgPT0gc25kX3NvY19kYXBtX21pYyB8fAorCQkJd3NpbmstPmlkID09IHNuZF9zb2NfZGFwbV9saW5lKQorCQkJd3NpbmstPmV4dCA9IDE7CisJfQorCWlmICh3c291cmNlLT5pZCA9PSBzbmRfc29jX2RhcG1fb3V0cHV0KSB7CisJCWlmICh3c2luay0+aWQgPT0gc25kX3NvY19kYXBtX3NwayB8fAorCQkJd3NpbmstPmlkID09IHNuZF9zb2NfZGFwbV9ocCB8fAorCQkJd3NpbmstPmlkID09IHNuZF9zb2NfZGFwbV9saW5lKQorCQkJd3NvdXJjZS0+ZXh0ID0gMTsKKwl9CisKKwkvKiBjb25uZWN0IHN0YXRpYyBwYXRocyAqLworCWlmIChjb250cm9sID09IE5VTEwpIHsKKwkJbGlzdF9hZGQoJnBhdGgtPmxpc3QsICZjb2RlYy0+ZGFwbV9wYXRocyk7CisJCWxpc3RfYWRkKCZwYXRoLT5saXN0X3NpbmssICZ3c2luay0+c291cmNlcyk7CisJCWxpc3RfYWRkKCZwYXRoLT5saXN0X3NvdXJjZSwgJndzb3VyY2UtPnNpbmtzKTsKKwkJcGF0aC0+Y29ubmVjdCA9IDE7CisJCXJldHVybiAwOworCX0KKworCS8qIGNvbm5lY3QgZHluYW1pYyBwYXRocyAqLworCXN3aXRjaCh3c2luay0+aWQpIHsKKwljYXNlIHNuZF9zb2NfZGFwbV9hZGM6CisJY2FzZSBzbmRfc29jX2RhcG1fZGFjOgorCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKKwljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKKwljYXNlIHNuZF9zb2NfZGFwbV9vdXRwdXQ6CisJY2FzZSBzbmRfc29jX2RhcG1fbWljYmlhczoKKwljYXNlIHNuZF9zb2NfZGFwbV92bWlkOgorCWNhc2Ugc25kX3NvY19kYXBtX3ByZToKKwljYXNlIHNuZF9zb2NfZGFwbV9wb3N0OgorCQlsaXN0X2FkZCgmcGF0aC0+bGlzdCwgJmNvZGVjLT5kYXBtX3BhdGhzKTsKKwkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc2luaywgJndzaW5rLT5zb3VyY2VzKTsKKwkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc291cmNlLCAmd3NvdXJjZS0+c2lua3MpOworCQlwYXRoLT5jb25uZWN0ID0gMTsKKwkJcmV0dXJuIDA7CisJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgorCQlyZXQgPSBkYXBtX2Nvbm5lY3RfbXV4KGNvZGVjLCB3c291cmNlLCB3c2luaywgcGF0aCwgY29udHJvbCwKKwkJCSZ3c2luay0+a2NvbnRyb2xzWzBdKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZ290byBlcnI7CisJCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX3N3aXRjaDoKKwljYXNlIHNuZF9zb2NfZGFwbV9taXhlcjoKKwkJcmV0ID0gZGFwbV9jb25uZWN0X21peGVyKGNvZGVjLCB3c291cmNlLCB3c2luaywgcGF0aCwgY29udHJvbCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWdvdG8gZXJyOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9ocDoKKwljYXNlIHNuZF9zb2NfZGFwbV9taWM6CisJY2FzZSBzbmRfc29jX2RhcG1fbGluZToKKwljYXNlIHNuZF9zb2NfZGFwbV9zcGs6CisJCWxpc3RfYWRkKCZwYXRoLT5saXN0LCAmY29kZWMtPmRhcG1fcGF0aHMpOworCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zaW5rLCAmd3NpbmstPnNvdXJjZXMpOworCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zb3VyY2UsICZ3c291cmNlLT5zaW5rcyk7CisJCXBhdGgtPmNvbm5lY3QgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7CisKK2VycjoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJhc29jOiBubyBkYXBtIG1hdGNoIGZvciAlcyAtLT4gJXMgLS0+ICVzXG4iLCBzb3VyY2UsCisJCWNvbnRyb2wsIHNpbmspOworCWtmcmVlKHBhdGgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fY29ubmVjdF9pbnB1dCk7CisKKy8qKgorICogc25kX3NvY19kYXBtX25ld193aWRnZXRzIC0gYWRkIG5ldyBkYXBtIHdpZGdldHMKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqCisgKiBDaGVja3MgdGhlIGNvZGVjIGZvciBhbnkgbmV3IGRhcG0gd2lkZ2V0cyBhbmQgY3JlYXRlcyB0aGVtIGlmIGZvdW5kLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNvZGVjLT5kYXBtX3dpZGdldHMsIGxpc3QpCisJeworCQlpZiAody0+bmV3KQorCQkJY29udGludWU7CisKKwkJc3dpdGNoKHctPmlkKSB7CisJCWNhc2Ugc25kX3NvY19kYXBtX3N3aXRjaDoKKwkJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXI6CisJCQlkYXBtX25ld19taXhlcihjb2RlYywgdyk7CisJCQlicmVhazsKKwkJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgorCQkJZGFwbV9uZXdfbXV4KGNvZGVjLCB3KTsKKwkJCWJyZWFrOworCQljYXNlIHNuZF9zb2NfZGFwbV9hZGM6CisJCWNhc2Ugc25kX3NvY19kYXBtX2RhYzoKKwkJY2FzZSBzbmRfc29jX2RhcG1fcGdhOgorCQkJZGFwbV9uZXdfcGdhKGNvZGVjLCB3KTsKKwkJCWJyZWFrOworCQljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKKwkJY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgorCQljYXNlIHNuZF9zb2NfZGFwbV9taWNiaWFzOgorCQljYXNlIHNuZF9zb2NfZGFwbV9zcGs6CisJCWNhc2Ugc25kX3NvY19kYXBtX2hwOgorCQljYXNlIHNuZF9zb2NfZGFwbV9taWM6CisJCWNhc2Ugc25kX3NvY19kYXBtX2xpbmU6CisJCWNhc2Ugc25kX3NvY19kYXBtX3ZtaWQ6CisJCWNhc2Ugc25kX3NvY19kYXBtX3ByZToKKwkJY2FzZSBzbmRfc29jX2RhcG1fcG9zdDoKKwkJCWJyZWFrOworCQl9CisJCXctPm5ldyA9IDE7CisJfQorCisJZGFwbV9wb3dlcl93aWRnZXRzKGNvZGVjLCBTTkRfU09DX0RBUE1fU1RSRUFNX05PUCk7CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX25ld193aWRnZXRzKTsKKworLyoqCisgKiBzbmRfc29jX2RhcG1fZ2V0X3ZvbHN3IC0gZGFwbSBtaXhlciBnZXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgZGFwbSBtaXhlciBjb250cm9sLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfZGFwbV9nZXRfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweDAxOworCisJLyogcmV0dXJuIHRoZSBzYXZlZCB2YWx1ZSBpZiB3ZSBhcmUgcG93ZXJlZCBkb3duICovCisJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3BnYSAmJiAhd2lkZ2V0LT5wb3dlcikgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHdpZGdldC0+c2F2ZWRfdmFsdWU7CisJCXJldHVybiAwOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJKHNuZF9zb2NfcmVhZCh3aWRnZXQtPmNvZGVjLCByZWcpID4+IHNoaWZ0KSAmIG1hc2s7CisJaWYgKHNoaWZ0ICE9IHJzaGlmdCkKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQorCQkJKHNuZF9zb2NfcmVhZCh3aWRnZXQtPmNvZGVjLCByZWcpID4+IHJzaGlmdCkgJiBtYXNrOworCWlmIChpbnZlcnQpIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQkJbWFzayAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQlpZiAoc2hpZnQgIT0gcnNoaWZ0KQorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQorCQkJCW1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9nZXRfdm9sc3cpOworCisvKioKKyAqIHNuZF9zb2NfZGFwbV9wdXRfdm9sc3cgLSBkYXBtIG1peGVyIHNldCBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkYXBtIG1peGVyIGNvbnRyb2wuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19kYXBtX3B1dF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHgwZjsKKwlpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4MDE7CisJdW5zaWduZWQgc2hvcnQgdmFsLCB2YWwyLCB2YWxfbWFzazsKKwlpbnQgcmV0OworCisJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7CisKKwlpZiAoaW52ZXJ0KQorCQl2YWwgPSBtYXNrIC0gdmFsOworCXZhbF9tYXNrID0gbWFzayA8PCBzaGlmdDsKKwl2YWwgPSB2YWwgPDwgc2hpZnQ7CisJaWYgKHNoaWZ0ICE9IHJzaGlmdCkgeworCQl2YWwyID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdICYgbWFzayk7CisJCWlmIChpbnZlcnQpCisJCQl2YWwyID0gbWFzayAtIHZhbDI7CisJCXZhbF9tYXNrIHw9IG1hc2sgPDwgcnNoaWZ0OworCQl2YWwgfD0gdmFsMiA8PCByc2hpZnQ7CisJfQorCisJbXV0ZXhfbG9jaygmd2lkZ2V0LT5jb2RlYy0+bXV0ZXgpOworCXdpZGdldC0+dmFsdWUgPSB2YWw7CisKKwkvKiBzYXZlIHZvbHVtZSB2YWx1ZSBpZiB0aGUgd2lkZ2V0IGlzIHBvd2VyZWQgZG93biAqLworCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9wZ2EgJiYgIXdpZGdldC0+cG93ZXIpIHsKKwkJd2lkZ2V0LT5zYXZlZF92YWx1ZSA9IHZhbDsKKwkJbXV0ZXhfdW5sb2NrKCZ3aWRnZXQtPmNvZGVjLT5tdXRleCk7CisJCXJldHVybiAxOworCX0KKworCWRhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldCwga2NvbnRyb2wsIHJlZywgdmFsX21hc2ssIHZhbCwgaW52ZXJ0KTsKKwlpZiAod2lkZ2V0LT5ldmVudCkgeworCQlpZiAod2lkZ2V0LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QUkVfUkVHKSB7CisJCQlyZXQgPSB3aWRnZXQtPmV2ZW50KHdpZGdldCwgU05EX1NPQ19EQVBNX1BSRV9SRUcpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0gc25kX3NvY191cGRhdGVfYml0cyh3aWRnZXQtPmNvZGVjLCByZWcsIHZhbF9tYXNrLCB2YWwpOworCQlpZiAod2lkZ2V0LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QT1NUX1JFRykKKwkJCXJldCA9IHdpZGdldC0+ZXZlbnQod2lkZ2V0LCBTTkRfU09DX0RBUE1fUE9TVF9SRUcpOworCX0gZWxzZQorCQlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKHdpZGdldC0+Y29kZWMsIHJlZywgdmFsX21hc2ssIHZhbCk7CisKK291dDoKKwltdXRleF91bmxvY2soJndpZGdldC0+Y29kZWMtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX3B1dF92b2xzdyk7CisKKy8qKgorICogc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSAtIGRhcG0gZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgZ2V0IGNhbGxiYWNrCisgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKKyAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKgorICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGRhcG0gZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgY29udHJvbC4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIHNob3J0IHZhbCwgYml0bWFzazsKKworCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXNrOyBiaXRtYXNrIDw8PSAxKQorCQk7CisJdmFsID0gc25kX3NvY19yZWFkKHdpZGdldC0+Y29kZWMsIGUtPnJlZyk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICh2YWwgPj4gZS0+c2hpZnRfbCkgJiAoYml0bWFzayAtIDEpOworCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpCisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPQorCQkJKHZhbCA+PiBlLT5zaGlmdF9yKSAmIChiaXRtYXNrIC0gMSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUpOworCisvKioKKyAqIHNuZF9zb2NfZGFwbV9wdXRfZW51bV9kb3VibGUgLSBkYXBtIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIHNldCBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkYXBtIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGNvbnRyb2wuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCB2YWwsIG11eDsKKwl1bnNpZ25lZCBzaG9ydCBtYXNrLCBiaXRtYXNrOworCWludCByZXQgPSAwOworCisJZm9yIChiaXRtYXNrID0gMTsgYml0bWFzayA8IGUtPm1hc2s7IGJpdG1hc2sgPDw9IDEpCisJCTsKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IGUtPm1hc2sgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltdXggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCXZhbCA9IG11eCA8PCBlLT5zaGlmdF9sOworCW1hc2sgPSAoYml0bWFzayAtIDEpIDw8IGUtPnNoaWZ0X2w7CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1hc2sgLSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXZhbCB8PSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdIDw8IGUtPnNoaWZ0X3I7CisJCW1hc2sgfD0gKGJpdG1hc2sgLSAxKSA8PCBlLT5zaGlmdF9yOworCX0KKworCW11dGV4X2xvY2soJndpZGdldC0+Y29kZWMtPm11dGV4KTsKKwl3aWRnZXQtPnZhbHVlID0gdmFsOworCWRhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQsIGtjb250cm9sLCBtYXNrLCBtdXgsIGUpOworCWlmICh3aWRnZXQtPmV2ZW50KSB7CisJCWlmICh3aWRnZXQtPmV2ZW50X2ZsYWdzICYgU05EX1NPQ19EQVBNX1BSRV9SRUcpIHsKKwkJCXJldCA9IHdpZGdldC0+ZXZlbnQod2lkZ2V0LCBTTkRfU09DX0RBUE1fUFJFX1JFRyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKHdpZGdldC0+Y29kZWMsIGUtPnJlZywgbWFzaywgdmFsKTsKKwkJaWYgKHdpZGdldC0+ZXZlbnRfZmxhZ3MgJiBTTkRfU09DX0RBUE1fUE9TVF9SRUcpCisJCQlyZXQgPSB3aWRnZXQtPmV2ZW50KHdpZGdldCwgU05EX1NPQ19EQVBNX1BPU1RfUkVHKTsKKwl9IGVsc2UKKwkJcmV0ID0gc25kX3NvY191cGRhdGVfYml0cyh3aWRnZXQtPmNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCk7CisKK291dDoKKwltdXRleF91bmxvY2soJndpZGdldC0+Y29kZWMtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZSk7CisKKy8qKgorICogc25kX3NvY19kYXBtX25ld19jb250cm9sIC0gY3JlYXRlIG5ldyBkYXBtIGNvbnRyb2wKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqIEB3aWRnZXQ6IHdpZGdldCB0ZW1wbGF0ZQorICoKKyAqIENyZWF0ZXMgYSBuZXcgZGFwbSBjb250cm9sIGJhc2VkIHVwb24gdGhlIHRlbXBsYXRlLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBlbHNlIGVycm9yLgorICovCitpbnQgc25kX3NvY19kYXBtX25ld19jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwljb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3OworCisJaWYgKCh3ID0gZGFwbV9jbmV3X3dpZGdldCh3aWRnZXQpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXctPmNvZGVjID0gY29kZWM7CisJSU5JVF9MSVNUX0hFQUQoJnctPnNvdXJjZXMpOworCUlOSVRfTElTVF9IRUFEKCZ3LT5zaW5rcyk7CisJSU5JVF9MSVNUX0hFQUQoJnctPmxpc3QpOworCWxpc3RfYWRkKCZ3LT5saXN0LCAmY29kZWMtPmRhcG1fd2lkZ2V0cyk7CisKKwkvKiBtYWNoaW5lIGxheWVyIHNldCB1cHMgdW5jb25uZWN0ZWQgcGlucyBhbmQgaW5zZXJ0aW9ucyAqLworCXctPmNvbm5lY3RlZCA9IDE7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2wpOworCisvKioKKyAqIHNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQgLSBzZW5kIGEgc3RyZWFtIGV2ZW50IHRvIHRoZSBkYXBtIGNvcmUKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqIEBzdHJlYW06IHN0cmVhbSBuYW1lCisgKiBAZXZlbnQ6IHN0cmVhbSBldmVudAorICoKKyAqIFNlbmRzIGEgc3RyZWFtIGV2ZW50IHRvIHRoZSBkYXBtIGNvcmUuIFRoZSBjb3JlIHRoZW4gbWFrZXMgYW55CisgKiBuZWNlc3Nhcnkgd2lkZ2V0IHBvd2VyIGNoYW5nZXMuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzIGVsc2UgZXJyb3IuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwljaGFyICpzdHJlYW0sIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdzsKKworCWlmIChzdHJlYW0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNvZGVjLT5kYXBtX3dpZGdldHMsIGxpc3QpCisJeworCQlpZiAoIXctPnNuYW1lKQorCQkJY29udGludWU7CisJCWRiZygid2lkZ2V0ICVzXG4gJXMgc3RyZWFtICVzIGV2ZW50ICVkXG4iLCB3LT5uYW1lLCB3LT5zbmFtZSwKKwkJCXN0cmVhbSwgZXZlbnQpOworCQlpZiAoc3Ryc3RyKHctPnNuYW1lLCBzdHJlYW0pKSB7CisJCQlzd2l0Y2goZXZlbnQpIHsKKwkJCWNhc2UgU05EX1NPQ19EQVBNX1NUUkVBTV9TVEFSVDoKKwkJCQl3LT5hY3RpdmUgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBTTkRfU09DX0RBUE1fU1RSRUFNX1NUT1A6CisJCQkJdy0+YWN0aXZlID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU05EX1NPQ19EQVBNX1NUUkVBTV9TVVNQRU5EOgorCQkJCWlmICh3LT5hY3RpdmUpCisJCQkJCXctPnN1c3BlbmQgPSAxOworCQkJCXctPmFjdGl2ZSA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIFNORF9TT0NfREFQTV9TVFJFQU1fUkVTVU1FOgorCQkJCWlmICh3LT5zdXNwZW5kKSB7CisJCQkJCXctPmFjdGl2ZSA9IDE7CisJCQkJCXctPnN1c3BlbmQgPSAwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgU05EX1NPQ19EQVBNX1NUUkVBTV9QQVVTRV9QVVNIOgorCQkJCWJyZWFrOworCQkJY2FzZSBTTkRfU09DX0RBUE1fU1RSRUFNX1BBVVNFX1JFTEVBU0U6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCisJZGFwbV9wb3dlcl93aWRnZXRzKGNvZGVjLCBldmVudCk7CisJZHVtcF9kYXBtKGNvZGVjLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudCk7CisKKy8qKgorICogc25kX3NvY19kYXBtX3NldF9lbmRwb2ludCAtIHNldCBhdWRpbyBlbmRwb2ludCBzdGF0dXMKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqIEBlbmRwb2ludDogYXVkaW8gc2lnbmFsIGVuZHBvaW50IChvciBzdGFydCBwb2ludCkKKyAqIEBzdGF0dXM6IHBvaW50IHN0YXR1cworICoKKyAqIFNldCBhdWRpbyBlbmRwb2ludCBzdGF0dXMgLSBjb25uZWN0ZWQgb3IgZGlzY29ubmVjdGVkLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBlbHNlIGVycm9yLgorICovCitpbnQgc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJY2hhciAqZW5kcG9pbnQsIGludCBzdGF0dXMpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZjb2RlYy0+ZGFwbV93aWRnZXRzLCBsaXN0KSB7CisJCWlmICghc3RyY21wKHctPm5hbWUsIGVuZHBvaW50KSkgeworCQkJdy0+Y29ubmVjdGVkID0gc3RhdHVzOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KTsKKworLyoqCisgKiBzbmRfc29jX2RhcG1fZnJlZSAtIGZyZWUgZGFwbSByZXNvdXJjZXMKKyAqIEBzb2NkZXY6IFNvQyBkZXZpY2UKKyAqCisgKiBGcmVlIGFsbCBkYXBtIHdpZGdldHMgYW5kIHJlc291cmNlcy4KKyAqLwordm9pZCBzbmRfc29jX2RhcG1fZnJlZShzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCisJc25kX3NvY19kYXBtX3N5c19yZW1vdmUoc29jZGV2LT5kZXYpOworCWRhcG1fZnJlZV93aWRnZXRzKGNvZGVjKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9mcmVlKTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kLCBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20sIHd3dy53b2xmc29ubWljcm8uY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkR5bmFtaWMgQXVkaW8gUG93ZXIgTWFuYWdlbWVudCBjb3JlIGZvciBBTFNBIFNvQyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvZGJyaS5jIGIvc291bmQvc3BhcmMvZGJyaS5jCmluZGV4IDRjZWIwOWQuLjI1YTJhNzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2RicmkuYworKysgYi9zb3VuZC9zcGFyYy9kYnJpLmMKQEAgLTY3OCw3ICs2NzgsNyBAQAogICogVGhlIEpVTVAgY21kIHBvaW50cyB0byB0aGUgbmV3IGNtZCBzdHJpbmcuCiAgKiBJdCBhbHNvIHJlbGVhc2VzIHRoZSBjbWRsb2NrIHNwaW5sb2NrLgogICoKLSAqIExvY2sgbXVzdCBub3QgYmUgaGVsZCBiZWZvcmUgY2FsbGluZyB0aGlzLgorICogTG9jayBtdXN0IGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KICAqLwogc3RhdGljIHZvaWQgZGJyaV9jbWRzZW5kKHN0cnVjdCBzbmRfZGJyaSAqIGRicmksIHMzMiAqIGNtZCxpbnQgbGVuKQogewpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYmF1ZGlvLmMgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwppbmRleCAxOWJkY2M3Li40ZGZiOTFkIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiYXVkaW8uYworKysgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwpAQCAtMTg2LDYgKzE4Niw3IEBACiAJdTY0IGZvcm1hdHM7CQkJLyogZm9ybWF0IGJpdG1hc2tzIChhbGwgb3InZWQpICovCiAJdW5zaWduZWQgaW50IG51bV9mb3JtYXRzOwkJLyogbnVtYmVyIG9mIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzIChsaXN0KSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZm10X2xpc3Q7CS8qIGZvcm1hdCBsaXN0ICovCisJc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IHJhdGVfbGlzdDsJLyogbGltaXRlZCByYXRlcyAqLwogCXNwaW5sb2NrX3QgbG9jazsKIAogCXN0cnVjdCBzbmRfdXJiX29wcyBvcHM7CQkvKiBjYWxsYmFja3MgKG11c3QgYmUgZmlsbGVkIGF0IGluaXQpICovCkBAIC0yNTMsNyArMjU0LDcgQEAKIAkJCQkgICAgc3RydWN0IHVyYiAqdXJiKQogewogCXVuc2lnbmVkIGNoYXIgKmNwID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0Jc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSAoc3RydWN0IHNuZF91cmJfY3R4ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwogCiAJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KIAl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IDM7CkBAIC0yNzUsNyArMjc2LDcgQEAKIAkJCQkgICAgICAgc3RydWN0IHVyYiAqdXJiKQogewogCXVuc2lnbmVkIGNoYXIgKmNwID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0Jc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSAoc3RydWN0IHNuZF91cmJfY3R4ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwogCiAJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KIAl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IDQ7CkBAIC0zMTMsNyArMzE0LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJaW50IGksIG9mZnM7Ci0Jc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSAoc3RydWN0IHNuZF91cmJfY3R4ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwogCiAJb2ZmcyA9IDA7CiAJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KQEAgLTM5MSw2ICszOTIsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFByb2Nlc3MgYWZ0ZXIgY2FwdHVyZSBjb21wbGV0ZSB3aGVuIHBhdXNlZC4gIE5vdGhpbmcgdG8gZG8uCisgKi8KK3N0YXRpYyBpbnQgcmV0aXJlX3BhdXNlZF9jYXB0dXJlX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAorCQkJCSAgICAgc3RydWN0IHVyYiAqdXJiKQoreworCXJldHVybiAwOworfQorCiAKIC8qCiAgKiBwcmVwYXJlIHVyYiBmb3IgZnVsbCBzcGVlZCBwbGF5YmFjayBzeW5jIHBpcGUKQEAgLTQwMiw3ICs0MTMsNyBAQAogCQkJCSAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKIAkJCQkgICAgIHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IChzdHJ1Y3Qgc25kX3VyYl9jdHggKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7CiAKIAl1cmItPmRldiA9IGN0eC0+c3Vicy0+ZGV2OyAvKiB3ZSBuZWVkIHRvIHNldCB0aGlzIGF0IGVhY2ggdGltZSAqLwogCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ubGVuZ3RoID0gMzsKQEAgLTQyMCw3ICs0MzEsNyBAQAogCQkJCQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAogCQkJCQlzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSAoc3RydWN0IHNuZF91cmJfY3R4ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwogCiAJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KIAl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IDQ7CkBAIC00OTMsMTMgKzUwNCwxMyBAQAogfQogCiAvKgotICogUHJlcGFyZSB1cmIgZm9yIHN0cmVhbWluZyBiZWZvcmUgcGxheWJhY2sgc3RhcnRzLgorICogUHJlcGFyZSB1cmIgZm9yIHN0cmVhbWluZyBiZWZvcmUgcGxheWJhY2sgc3RhcnRzIG9yIHdoZW4gcGF1c2VkLgogICoKLSAqIFdlIGRvbid0IHlldCBoYXZlIGRhdGEsIHNvIHdlIHNlbmQgYSBmcmFtZSBvZiBzaWxlbmNlLgorICogV2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSwgc28gd2Ugc2VuZCBhIGZyYW1lIG9mIHNpbGVuY2UuCiAgKi8KLXN0YXRpYyBpbnQgcHJlcGFyZV9zdGFydHVwX3BsYXliYWNrX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCi0JCQkJCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCi0JCQkJCXN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBpbnQgcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKKwkJCQkgICAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKKwkJCQkgICAgICAgc3RydWN0IHVyYiAqdXJiKQogewogCXVuc2lnbmVkIGludCBpLCBvZmZzLCBjb3VudHM7CiAJc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7CkBAIC01MzcsNyArNTQ4LDcgQEAKIAl1bnNpZ25lZCBpbnQgY291bnRzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHBlcmlvZF9lbGFwc2VkID0gMDsKLQlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IChzdHJ1Y3Qgc25kX3VyYl9jdHggKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7CiAKIAlzdHJpZGUgPSBydW50aW1lLT5mcmFtZV9iaXRzID4+IDM7CiAKQEAgLTYyMiw3ICs2MzMsNyBAQAogICovCiBzdGF0aWMgc3RydWN0IHNuZF91cmJfb3BzIGF1ZGlvX3VyYl9vcHNbMl0gPSB7CiAJewotCQkucHJlcGFyZSA9CXByZXBhcmVfc3RhcnR1cF9wbGF5YmFja191cmIsCisJCS5wcmVwYXJlID0JcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiLAogCQkucmV0aXJlID0JcmV0aXJlX3BsYXliYWNrX3VyYiwKIAkJLnByZXBhcmVfc3luYyA9CXByZXBhcmVfcGxheWJhY2tfc3luY191cmIsCiAJCS5yZXRpcmVfc3luYyA9CXJldGlyZV9wbGF5YmFja19zeW5jX3VyYiwKQEAgLTYzNyw3ICs2NDgsNyBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF91cmJfb3BzIGF1ZGlvX3VyYl9vcHNfaGlnaF9zcGVlZFsyXSA9IHsKIAl7Ci0JCS5wcmVwYXJlID0JcHJlcGFyZV9zdGFydHVwX3BsYXliYWNrX3VyYiwKKwkJLnByZXBhcmUgPQlwcmVwYXJlX25vZGF0YV9wbGF5YmFja191cmIsCiAJCS5yZXRpcmUgPQlyZXRpcmVfcGxheWJhY2tfdXJiLAogCQkucHJlcGFyZV9zeW5jID0JcHJlcGFyZV9wbGF5YmFja19zeW5jX3VyYl9ocywKIAkJLnJldGlyZV9zeW5jID0JcmV0aXJlX3BsYXliYWNrX3N5bmNfdXJiX2hzLApAQCAtNjU1LDcgKzY2Niw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNuZF9jb21wbGV0ZV91cmIoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gKHN0cnVjdCBzbmRfdXJiX2N0eCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMgPSBjdHgtPnN1YnM7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBjdHgtPnN1YnMtPnBjbV9zdWJzdHJlYW07CiAJaW50IGVyciA9IDA7CkBAIC02NzgsNyArNjg5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgc25kX2NvbXBsZXRlX3N5bmNfdXJiKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IChzdHJ1Y3Qgc25kX3VyYl9jdHggKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzID0gY3R4LT5zdWJzOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gY3R4LT5zdWJzLT5wY21fc3Vic3RyZWFtOwogCWludCBlcnIgPSAwOwpAQCAtOTI1LDEwICs5MzYsMTQgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CiAJCXN1YnMtPm9wcy5wcmVwYXJlID0gcHJlcGFyZV9wbGF5YmFja191cmI7CiAJCXJldHVybiAwOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAkJcmV0dXJuIGRlYWN0aXZhdGVfdXJicyhzdWJzLCAwLCAwKTsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCXN1YnMtPm9wcy5wcmVwYXJlID0gcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiOworCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC05NDQsOSArOTU5LDE2IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCXN1YnMtPm9wcy5yZXRpcmUgPSByZXRpcmVfY2FwdHVyZV91cmI7CiAJCXJldHVybiBzdGFydF91cmJzKHN1YnMsIHN1YnN0cmVhbS0+cnVudGltZSk7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCQlyZXR1cm4gZGVhY3RpdmF0ZV91cmJzKHN1YnMsIDAsIDApOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJc3Vicy0+b3BzLnJldGlyZSA9IHJldGlyZV9wYXVzZWRfY2FwdHVyZV91cmI7CisJCXJldHVybiAwOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJc3Vicy0+b3BzLnJldGlyZSA9IHJldGlyZV9jYXB0dXJlX3VyYjsKKwkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTQwOCw3ICsxNDMwLDcgQEAKIHN0YXRpYyBpbnQgc25kX3VzYl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQogewotCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IChzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKilzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZtdDsKIAl1bnNpZ25lZCBpbnQgY2hhbm5lbHMsIHJhdGUsIGZvcm1hdDsKIAlpbnQgcmV0LCBjaGFuZ2VkOwpAQCAtMTQ2NCw3ICsxNDg2LDcgQEAKICAqLwogc3RhdGljIGludCBzbmRfdXNiX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0Jc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzID0gKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCiAJc3Vicy0+Y3VyX2F1ZGlvZm10ID0gTlVMTDsKIAlzdWJzLT5jdXJfcmF0ZSA9IDA7CkBAIC0xNTA1LDMzICsxNTI3LDIwIEBACiAJLyogZm9yIHBsYXliYWNrLCBzdWJtaXQgdGhlIFVSQnMgbm93OyBvdGhlcndpc2UsIHRoZSBmaXJzdCBod3B0cl9kb25lCiAJICogdXBkYXRlcyBmb3IgYWxsIFVSQnMgd291bGQgaGFwcGVuIGF0IHRoZSBzYW1lIHRpbWUgd2hlbiBzdGFydGluZyAqLwogCWlmIChzdWJzLT5kaXJlY3Rpb24gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlzdWJzLT5vcHMucHJlcGFyZSA9IHByZXBhcmVfc3RhcnR1cF9wbGF5YmFja191cmI7CisJCXN1YnMtPm9wcy5wcmVwYXJlID0gcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiOwogCQlyZXR1cm4gc3RhcnRfdXJicyhzdWJzLCBydW50aW1lKTsKIAl9IGVsc2UKIAkJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfdXNiX3BsYXliYWNrID0KK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfdXNiX2hhcmR3YXJlID0KIHsKIAkuaW5mbyA9CQkJU05EUlZfUENNX0lORk9fTU1BUCB8CiAJCQkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CiAJCQkJU05EUlZfUENNX0lORk9fQkFUQ0ggfAogCQkJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiwKLQkuYnVmZmVyX2J5dGVzX21heCA9CTEwMjQgKiAxMDI0LAotCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCi0JLnBlcmlvZF9ieXRlc19tYXggPQk1MTIgKiAxMDI0LAotCS5wZXJpb2RzX21pbiA9CQkyLAotCS5wZXJpb2RzX21heCA9CQkxMDI0LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF91c2JfY2FwdHVyZSA9Ci17Ci0JLmluZm8gPQkJCVNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCVNORFJWX1BDTV9JTkZPX0JBVENIIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8Ci0JCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIsCisJCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCVNORFJWX1BDTV9JTkZPX1BBVVNFLAogCS5idWZmZXJfYnl0ZXNfbWF4ID0JMTAyNCAqIDEwMjQsCiAJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKIAkucGVyaW9kX2J5dGVzX21heCA9CTUxMiAqIDEwMjQsCkBAIC0xODEwLDI4ICsxODE5LDMzIEBACiBzdGF0aWMgaW50IHNuZF91c2JfcGNtX2NoZWNrX2tub3Qoc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKIAkJCQkgIHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCXN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c19yYXRlczsKKwlzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwOworCWludCBjb3VudCA9IDAsIG5lZWRzX2tub3QgPSAwOwogCWludCBlcnI7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZzdWJzLT5mbXRfbGlzdCkgewotCQlzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwOwotCQlmcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGF1ZGlvZm9ybWF0LCBsaXN0KTsKLQotCQlpZiAoIWZwLT5uZWVkc19rbm90KQotCQkJY29udGludWU7Ci0KLQkJY29uc3RyYWludHNfcmF0ZXMuY291bnQgPSBmcC0+bnJfcmF0ZXM7Ci0JCWNvbnN0cmFpbnRzX3JhdGVzLmxpc3QgPSBmcC0+cmF0ZV90YWJsZTsKLQkJY29uc3RyYWludHNfcmF0ZXMubWFzayA9IDA7Ci0KLQkJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKLQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAotCQkJJmNvbnN0cmFpbnRzX3JhdGVzKTsKLQotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmcCwgJnN1YnMtPmZtdF9saXN0LCBsaXN0KSB7CisJCWlmIChmcC0+cmF0ZXMgJiBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTKQorCQkJcmV0dXJuIDA7CisJCWNvdW50ICs9IGZwLT5ucl9yYXRlczsKKwkJaWYgKGZwLT5uZWVkc19rbm90KQorCQkJbmVlZHNfa25vdCA9IDE7CiAJfQorCWlmICghbmVlZHNfa25vdCkKKwkJcmV0dXJuIDA7CisKKwlzdWJzLT5yYXRlX2xpc3QuY291bnQgPSBjb3VudDsKKwlzdWJzLT5yYXRlX2xpc3QubGlzdCA9IGttYWxsb2Moc2l6ZW9mKGludCkgKiBjb3VudCwgR0ZQX0tFUk5FTCk7CisJc3Vicy0+cmF0ZV9saXN0Lm1hc2sgPSAwOworCWNvdW50ID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZwLCAmc3Vicy0+Zm10X2xpc3QsIGxpc3QpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBmcC0+bnJfcmF0ZXM7IGkrKykKKwkJCXN1YnMtPnJhdGVfbGlzdC5saXN0W2NvdW50KytdID0gZnAtPnJhdGVfdGFibGVbaV07CisJfQorCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCQkgJnN1YnMtPnJhdGVfbGlzdCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5MDQsOCArMTkxOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX3VzYl9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGRpcmVjdGlvbiwKLQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSAqaHcpCitzdGF0aWMgaW50IHNuZF91c2JfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBkaXJlY3Rpb24pCiB7CiAJc3RydWN0IHNuZF91c2Jfc3RyZWFtICphcyA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwpAQCAtMTkxMyw3ICsxOTI2LDcgQEAKIAogCXN1YnMtPmludGVyZmFjZSA9IC0xOwogCXN1YnMtPmZvcm1hdCA9IDA7Ci0JcnVudGltZS0+aHcgPSAqaHc7CisJcnVudGltZS0+aHcgPSBzbmRfdXNiX2hhcmR3YXJlOwogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHN1YnM7CiAJc3Vicy0+cGNtX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAlyZXR1cm4gc2V0dXBfaHdfaW5mbyhydW50aW1lLCBzdWJzKTsKQEAgLTE5MzQsNyArMTk0Nyw3IEBACiAKIHN0YXRpYyBpbnQgc25kX3VzYl9wbGF5YmFja19vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCXJldHVybiBzbmRfdXNiX3BjbV9vcGVuKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF91c2JfcGxheWJhY2spOworCXJldHVybiBzbmRfdXNiX3BjbV9vcGVuKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyk7CiB9CiAKIHN0YXRpYyBpbnQgc25kX3VzYl9wbGF5YmFja19jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKQEAgLTE5NDQsNyArMTk1Nyw3IEBACiAKIHN0YXRpYyBpbnQgc25kX3VzYl9jYXB0dXJlX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0JcmV0dXJuIHNuZF91c2JfcGNtX29wZW4oc3Vic3RyZWFtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfdXNiX2NhcHR1cmUpOworCXJldHVybiBzbmRfdXNiX3BjbV9vcGVuKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKIH0KIAogc3RhdGljIGludCBzbmRfdXNiX2NhcHR1cmVfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCkBAIC0yMjMxLDYgKzIyNDQsNyBAQAogCQlrZnJlZShmcC0+cmF0ZV90YWJsZSk7CiAJCWtmcmVlKGZwKTsKIAl9CisJa2ZyZWUoc3Vicy0+cmF0ZV9saXN0Lmxpc3QpOwogfQogCiAKQEAgLTI0NTYsNiArMjQ3MCw3IEBACiAJCSAqIGJ1aWxkIHRoZSByYXRlIHRhYmxlIGFuZCBiaXRtYXAgZmxhZ3MKIAkJICovCiAJCWludCByLCBpZHgsIGM7CisJCXVuc2lnbmVkIGludCBub256ZXJvX3JhdGVzID0gMDsKIAkJLyogdGhpcyB0YWJsZSBjb3JyZXNwb25kcyB0byB0aGUgU05EUlZfUENNX1JBVEVfWFhYIGJpdCAqLwogCQlzdGF0aWMgdW5zaWduZWQgaW50IGNvbnZfcmF0ZXNbXSA9IHsKIAkJCTU1MTIsIDgwMDAsIDExMDI1LCAxNjAwMCwgMjIwNTAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsCkBAIC0yNDc4LDYgKzI0OTMsNyBAQAogCQkJICAgIGZwLT5hbHRzZXR0aW5nID09IDUgJiYgZnAtPm1heHBhY2tzaXplID09IDM5MikKIAkJCQlyYXRlID0gOTYwMDA7CiAJCQlmcC0+cmF0ZV90YWJsZVtyXSA9IHJhdGU7CisJCQlub256ZXJvX3JhdGVzIHw9IHJhdGU7CiAJCQlpZiAocmF0ZSA8IGZwLT5yYXRlX21pbikKIAkJCQlmcC0+cmF0ZV9taW4gPSByYXRlOwogCQkJZWxzZSBpZiAocmF0ZSA+IGZwLT5yYXRlX21heCkKQEAgLTI0OTMsNiArMjUwOSwxMCBAQAogCQkJaWYgKCFmb3VuZCkKIAkJCQlmcC0+bmVlZHNfa25vdCA9IDE7CiAJCX0KKwkJaWYgKCFub256ZXJvX3JhdGVzKSB7CisJCQlod2NfZGVidWcoIkFsbCByYXRlcyB3ZXJlIHplcm8uIFNraXBwaW5nIGZvcm1hdCFcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CiAJCWlmIChmcC0+bmVlZHNfa25vdCkKIAkJCWZwLT5yYXRlcyB8PSBTTkRSVl9QQ01fUkFURV9LTk9UOwogCX0gZWxzZSB7CkBAIC0zMDU3LDYgKzMwNzcsNTggQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIENyZWF0ZSBhIHN0cmVhbSBmb3IgYW4gRWRpcm9sIFVBLTEwMSBpbnRlcmZhY2UuCisgKiBDb3B5LCBwYXN0ZSBhbmQgbW9kaWZ5IGZyb20gRWRpcm9sIFVBLTEwMDAKKyAqLworc3RhdGljIGludCBjcmVhdGVfdWExMDFfcXVpcmsoc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAsCisJCQkgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrICpxdWlyaykKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF1ZGlvZm9ybWF0IHVhMTAxX2Zvcm1hdCA9IHsKKwkJLmZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFLAorCQkuZm10X3R5cGUgPSBVU0JfRk9STUFUX1RZUEVfSSwKKwkJLmFsdHNldHRpbmcgPSAxLAorCQkuYWx0c2V0X2lkeCA9IDEsCisJCS5hdHRyaWJ1dGVzID0gMCwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUywKKwl9OworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdHM7CisJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqYWx0c2Q7CisJc3RydWN0IGF1ZGlvZm9ybWF0ICpmcDsKKwlpbnQgc3RyZWFtLCBlcnI7CisKKwlpZiAoaWZhY2UtPm51bV9hbHRzZXR0aW5nICE9IDIpCisJCXJldHVybiAtRU5YSU87CisJYWx0cyA9ICZpZmFjZS0+YWx0c2V0dGluZ1sxXTsKKwlhbHRzZCA9IGdldF9pZmFjZV9kZXNjKGFsdHMpOworCWlmIChhbHRzLT5leHRyYWxlbiAhPSAxOCB8fCBhbHRzLT5leHRyYVsxXSAhPSBVU0JfRFRfQ1NfSU5URVJGQUNFIHx8CisJICAgIGFsdHNkLT5iTnVtRW5kcG9pbnRzICE9IDEpCisJCXJldHVybiAtRU5YSU87CisKKwlmcCA9IGttZW1kdXAoJnVhMTAxX2Zvcm1hdCwgc2l6ZW9mKCpmcCksIEdGUF9LRVJORUwpOworCWlmICghZnApCisJCXJldHVybiAtRU5PTUVNOworCisJZnAtPmNoYW5uZWxzID0gYWx0cy0+ZXh0cmFbMTFdOworCWZwLT5pZmFjZSA9IGFsdHNkLT5iSW50ZXJmYWNlTnVtYmVyOworCWZwLT5lbmRwb2ludCA9IGdldF9lbmRwb2ludChhbHRzLCAwKS0+YkVuZHBvaW50QWRkcmVzczsKKwlmcC0+ZXBfYXR0ciA9IGdldF9lbmRwb2ludChhbHRzLCAwKS0+Ym1BdHRyaWJ1dGVzOworCWZwLT5tYXhwYWNrc2l6ZSA9IGxlMTZfdG9fY3B1KGdldF9lbmRwb2ludChhbHRzLCAwKS0+d01heFBhY2tldFNpemUpOworCWZwLT5yYXRlX21heCA9IGZwLT5yYXRlX21pbiA9IGNvbWJpbmVfdHJpcGxlKCZhbHRzLT5leHRyYVsxNV0pOworCisJc3RyZWFtID0gKGZwLT5lbmRwb2ludCAmIFVTQl9ESVJfSU4pCisJCT8gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFIDogU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKKwllcnIgPSBhZGRfYXVkaW9fZW5kcG9pbnQoY2hpcCwgc3RyZWFtLCBmcCk7CisJaWYgKGVyciA8IDApIHsKKwkJa2ZyZWUoZnApOworCQlyZXR1cm4gZXJyOworCX0KKwkvKiBGSVhNRTogcGxheWJhY2sgbXVzdCBiZSBzeW5jaHJvbml6ZWQgdG8gY2FwdHVyZSAqLworCXVzYl9zZXRfaW50ZXJmYWNlKGNoaXAtPmRldiwgZnAtPmlmYWNlLCAwKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzbmRfdXNiX2NyZWF0ZV9xdWlyayhzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwKIAkJCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UsCiAJCQkJY29uc3Qgc3RydWN0IHNuZF91c2JfYXVkaW9fcXVpcmsgKnF1aXJrKTsKQEAgLTMyMzgsNiArMzMxMCw3IEBACiAJCVtRVUlSS19BVURJT19GSVhFRF9FTkRQT0lOVF0gPSBjcmVhdGVfZml4ZWRfc3RyZWFtX3F1aXJrLAogCQlbUVVJUktfQVVESU9fRURJUk9MX1VBNzAwX1VBMjVdID0gY3JlYXRlX3VhNzAwX3VhMjVfcXVpcmssCiAJCVtRVUlSS19BVURJT19FRElST0xfVUExMDAwXSA9IGNyZWF0ZV91YTEwMDBfcXVpcmssCisJCVtRVUlSS19BVURJT19FRElST0xfVUExMDFdID0gY3JlYXRlX3VhMTAxX3F1aXJrLAogCX07CiAKIAlpZiAocXVpcmstPnR5cGUgPCBRVUlSS19UWVBFX0NPVU5UKSB7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXNiYXVkaW8uaCBiL3NvdW5kL3VzYi91c2JhdWRpby5oCmluZGV4IDBmNGIyYjguLjIyNzJmNDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JhdWRpby5oCisrKyBiL3NvdW5kL3VzYi91c2JhdWRpby5oCkBAIC0xNTksNiArMTU5LDcgQEAKIAlRVUlSS19BVURJT19GSVhFRF9FTkRQT0lOVCwKIAlRVUlSS19BVURJT19FRElST0xfVUE3MDBfVUEyNSwKIAlRVUlSS19BVURJT19FRElST0xfVUExMDAwLAorCVFVSVJLX0FVRElPX0VESVJPTF9VQTEwMSwKIAogCVFVSVJLX1RZUEVfQ09VTlQKIH07CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXNicXVpcmtzLmggYi9zb3VuZC91c2IvdXNicXVpcmtzLmgKaW5kZXggYTdlOTU2My4uMjViNGFiNGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JxdWlya3MuaAorKysgYi9zb3VuZC91c2IvdXNicXVpcmtzLmgKQEAgLTEwOTgsNyArMTA5OCwzNyBAQAogCQl9CiAJfQogfSwKLQkvKiBUT0RPOiBhZGQgRWRpcm9sIFVBLTEwMSBzdXBwb3J0ICovCisvKiBSb2xhbmQgVUEtMTAxIGluIEhpZ2gtU3BlZWQgTW9kZSBvbmx5ICovCit7CisJVVNCX0RFVklDRSgweDA1ODIsIDB4MDA3ZCksCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICYgKGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrKSB7CisJCS52ZW5kb3JfbmFtZSA9ICJSb2xhbmQiLAorCQkucHJvZHVjdF9uYW1lID0gIlVBLTEwMSIsCisJCS5pZm51bSA9IFFVSVJLX0FOWV9JTlRFUkZBQ0UsCisJCS50eXBlID0gUVVJUktfQ09NUE9TSVRFLAorCQkuZGF0YSA9IChjb25zdCBzdHJ1Y3Qgc25kX3VzYl9hdWRpb19xdWlya1tdKSB7CisJCQl7CisJCQkJLmlmbnVtID0gMCwKKwkJCQkudHlwZSA9IFFVSVJLX0FVRElPX0VESVJPTF9VQTEwMQorCQkJfSwKKwkJCXsKKwkJCQkuaWZudW0gPSAxLAorCQkJCS50eXBlID0gUVVJUktfQVVESU9fRURJUk9MX1VBMTAxCisJCQl9LAorCQkJeworCQkJCS5pZm51bSA9IDIsCisJCQkJLnR5cGUgPSBRVUlSS19NSURJX0ZJWEVEX0VORFBPSU5ULAorCQkJCS5kYXRhID0gJiAoY29uc3Qgc3RydWN0IHNuZF91c2JfbWlkaV9lbmRwb2ludF9pbmZvKSB7CisJCQkJCS5vdXRfY2FibGVzID0gMHgwMDAxLAorCQkJCQkuaW5fY2FibGVzICA9IDB4MDAwMQorCQkJCX0KKwkJCX0sCisJCQl7CisJCQkJLmlmbnVtID0gLTEKKwkJCX0KKwkJfQorCX0KK30sCiB7CiAJLyogaGFzIElEIDB4MDA4MSB3aGVuIG5vdCBpbiAiQWR2YW5jZWQgRHJpdmVyIiBtb2RlICovCiAJVVNCX0RFVklDRSgweDA1ODIsIDB4MDA4MCksCg==